diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e376427..7d29319 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,3 +25,17 @@ jobs: - name: Run Forge tests run: forge test -vvv + + - name: Setup NodeJS 20.5.0 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.4.0 + with: + node-version: 20.5.0 + + - name: Show NodeJS version + run: npm --version + + - name: Install Project Dependencies + run: npm install + + - name: Run Hardhat Test + run: npx hardhat test diff --git a/.gitignore b/.gitignore index cba5dca..f9c867e 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,9 @@ cache_hardhat/ *.bkp *.dtmp #claude +history INSTRUCTION.md PLAN.md SUMMARY.md FEEDBACK.md +.codex diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..0057a7d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,258 @@ +# AI Agent Guide for RuleEngine + +This file helps AI agents (Cursor, Claude Code, etc.) understand and work with this codebase. + +AGENTS.md and CLAUDE.md files must always be identical + +## Project Summary + +**RuleEngine** is a Solidity smart contract system that enforces transfer restrictions for [CMTAT](https://github.com/CMTA/CMTAT) and [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) tokens. It acts as an external controller that calls pluggable rule contracts on each token transfer, mint, or burn. + +- **Version:** 3.0.0 (defined in `src/modules/VersionModule.sol`) +- **Solidity:** ^0.8.20 (compiled with 0.8.34) +- **EVM target:** Prague +- **License:** MPL-2.0 + +## Build & Test Commands + +```bash +forge build # Compile all contracts +forge test # Run all tests +forge test -vvv # Verbose test output +forge test --match-contract --match-test # Run specific test +forge coverage # Code coverage +forge coverage --no-match-coverage "(script|mocks|test)" --report lcov # Production coverage +forge fmt # Format code +``` + +Dependencies are git submodules. Initialize with `forge install`, update with `forge update`. +CMTAT submodule also needs `cd lib/CMTAT && npm install` for its OpenZeppelin deps. + +## Import Remappings + +| Alias | Path | +|-------|------| +| `CMTAT/` | `lib/CMTAT/contracts/` | +| `CMTATv3.0.0/` | `lib/CMTATv3.0.0/contracts/` | +| `@openzeppelin/contracts/` | `lib/openzeppelin-contracts/contracts` | + +Use `@openzeppelin/contracts/` for OpenZeppelin imports, `CMTAT/` for CMTAT imports, `src/` for local imports. + +## Architecture + +### Three Deployable Contracts + +``` +RuleEngine — RBAC via AccessControl (multi-operator) +RuleEngineOwnable — ERC-173 Ownable (single-owner) +RuleEngineOwnable2Step — ERC-173 Ownable2Step (single-owner, two-step handover) +``` + +All three share their core logic through `RuleEngineBase` directly or via `RuleEngineOwnableShared`. + +### Inheritance Hierarchy + +``` +RuleEngineBase (abstract) +├── VersionModule → version() returns "3.0.0" +├── RulesManagementModule → add/remove/set/clear rules +│ ├── AccessControl (OZ) +│ └── RulesManagementModuleInvariantStorage → errors, events, roles +├── ERC3643ComplianceModule → bind/unbind tokens +│ └── IERC3643Compliance +├── RuleEngineInvariantStorage → errors +└── IRuleEngineERC1404 → CMTAT interface + +RuleEngine +├── ERC2771ModuleStandalone → gasless support +└── RuleEngineBase + +RuleEngineOwnable +├── ERC2771ModuleStandalone → gasless support +├── RuleEngineOwnableShared +│ └── RuleEngineBase +└── Ownable (OZ) → ERC-173 + +RuleEngineOwnable2Step +├── ERC2771ModuleStandalone → gasless support +├── RuleEngineOwnableShared +│ └── RuleEngineBase +└── Ownable2Step (OZ) → ERC-173 +``` + +### Access Control Pattern + +Modules define **virtual internal hooks** for access control. Concrete contracts override them: + +```solidity +// In RulesManagementModule (abstract): +function _onlyRulesManager() internal virtual; + +// In ERC3643ComplianceModule (abstract): +function _onlyComplianceManager() internal virtual; + +// RuleEngine overrides with RBAC: +function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {} +function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {} + +// RuleEngineOwnable overrides with Ownable: +function _onlyRulesManager() internal virtual override onlyOwner {} +function _onlyComplianceManager() internal virtual override onlyOwner {} +``` + +**When adding a new protected function**, follow this pattern: define a virtual hook in the module, then override it in `RuleEngine`, `RuleEngineOwnable`, and `RuleEngineOwnable2Step`. + +### `_checkRule` Override Chain + +Rule validation uses a two-layer override: + +1. **`RulesManagementModule._checkRule()`** — checks zero address + duplicates +2. **`RuleEngineBase._checkRule()`** — calls `super._checkRule()` then validates ERC-165 interface + +```solidity +// RulesManagementModule (generic checks): +function _checkRule(address rule_) internal view virtual { + if (rule_ == address(0x0)) revert ...ZeroNotAllowed(); + if (_rules.contains(rule_)) revert ...AlreadyExists(); +} + +// RuleEngineBase (adds ERC-165 check): +function _checkRule(address rule_) internal view virtual override { + super._checkRule(rule_); + if (!ERC165Checker.supportsInterface(rule_, RuleInterfaceId.IRULE_INTERFACE_ID)) + revert RuleEngine_RuleInvalidInterface(); +} +``` + +### Rule Execution Flow + +``` +Token.transfer() → RuleEngine.transferred(from, to, value) + ├── onlyBoundToken modifier (caller must be bound) + └── for each rule in _rules: + rule.transferred(from, to, value) // reverts if disallowed +``` + +View path: `detectTransferRestriction()` iterates rules, returns first non-zero code. + +### Storage: EnumerableSet + +Both rules and bound tokens use `EnumerableSet.AddressSet`: +- `_rules` in `RulesManagementModule` — the set of active rules +- `_boundTokens` in `ERC3643ComplianceModule` — tokens allowed to call `transferred` + +This gives O(1) add/remove/contains and iterable storage. + +## Key Interfaces + +| Interface | Purpose | Where Defined | +|-----------|---------|---------------| +| `IRule` | What every rule must implement (extends `IRuleEngineERC1404`) | `src/interfaces/IRule.sol` | +| `IRulesManagementModule` | Rule CRUD operations | `src/interfaces/IRulesManagementModule.sol` | +| `IERC3643Compliance` | Token binding + compliance hooks | `src/interfaces/IERC3643Compliance.sol` | +| `IRuleEngine` | Full CMTAT integration interface | `lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol` | + +**ERC-165 interface IDs:** +- `IRule`: `0x2497d6cb` (defined in `src/modules/library/RuleInterfaceId.sol`) +- `IRuleEngine`: from `CMTAT/library/RuleEngineInterfaceId.sol` +- `IERC1404Extend`: from `CMTAT/library/ERC1404ExtendInterfaceId.sol` +- `ERC-173`: `0x7f5828d0` (hardcoded in `RuleEngineOwnable`) + +## Invariant Storage Pattern + +Errors, events, and role constants are centralized in "invariant storage" abstract contracts: + +| Contract | Contains | +|----------|----------| +| `RuleEngineInvariantStorage` | `RuleEngine_AdminWithAddressZeroNotAllowed`, `RuleEngine_RuleInvalidInterface` | +| `RulesManagementModuleInvariantStorage` | Rule errors, `AddRule`/`RemoveRule`/`ClearRules` events, `RULES_MANAGEMENT_ROLE` | + +**Convention:** Error names follow `Contract_Module_ErrorName` pattern. Test contracts inherit these to access `.selector` for `vm.expectRevert`. + +## Project Structure + +``` +src/ +├── deployment/ +│ ├── RuleEngine.sol # RBAC variant (deploy this) +│ ├── RuleEngineOwnable.sol # Ownable variant (deploy this) +│ └── RuleEngineOwnable2Step.sol # Ownable2Step variant (deploy this) +├── RuleEngineBase.sol # Abstract core logic (do not deploy) +├── RuleEngineOwnableShared.sol # Shared logic for ownable variants +├── interfaces/ # IRule, IRulesManagementModule, IERC3643Compliance +├── modules/ # VersionModule, RulesManagementModule, ERC3643ComplianceModule, ERC2771ModuleStandalone +│ └── library/ # InvariantStorage contracts, RuleInterfaceId +└── mocks/ # Test-only/reference contracts + +test/ +├── HelperContract.sol # Base helper for RuleEngine tests +├── HelperContractOwnable.sol # Base helper for RuleEngineOwnable tests +├── HelperContractOwnable2Step.sol # Base helper for RuleEngineOwnable2Step tests +├── utils/ # CMTAT deployment helpers +├── RuleEngine/ # Tests for RuleEngine (RBAC) +├── RuleEngineOwnable/ # Tests for RuleEngineOwnable +├── RuleEngineOwnable2Step/ # Tests for RuleEngineOwnable2Step +└── RuleWhitelist/ # Tests for the whitelist mock rule + +script/ # Foundry example/deployment scripts +``` + +## Test Conventions + +For detailed test conventions, templates, helper contracts, test addresses, naming patterns, and the base test pattern, see the **testing skill**: `.claude/skills/testing/SKILL.md`. + +Key points: +- Tests for `RuleEngine` go in `test/RuleEngine/`, tests for `RuleEngineOwnable` go in `test/RuleEngineOwnable/` +- Tests for `RuleEngineOwnable2Step` go in `test/RuleEngineOwnable2Step/` +- Use `HelperContract` for RBAC tests, `HelperContractOwnable` for Ownable tests +- Use `HelperContractOwnable2Step` for `RuleEngineOwnable2Step` tests +- Always use specific error selectors in `vm.expectRevert()` +- When adding a feature to `RuleEngineBase`, add tests for **all deployable variants** + +## RBAC Roles (RuleEngine only) + +| Role | Identifier | Purpose | +|------|-----------|---------| +| `DEFAULT_ADMIN_ROLE` | `0x00...00` | Has all roles (via `hasRole` override) | +| `RULES_MANAGEMENT_ROLE` | `keccak256("RULES_MANAGEMENT_ROLE")` | Add/remove/set/clear rules | +| `COMPLIANCE_MANAGER_ROLE` | `keccak256("COMPLIANCE_MANAGER_ROLE")` | Bind/unbind tokens | + +## Key Invariants + +1. **Only bound tokens** can call `transferred()`, `created()`, `destroyed()` +2. **Rules are validated via ERC-165** before being added — they must support `IRULE_INTERFACE_ID` +3. **No duplicate rules** — `EnumerableSet` prevents this +4. **No zero-address rules** — checked in `_checkRule` +5. **Admin has all roles** in `RuleEngine` (the `hasRole` override) +6. **Forwarder is immutable** — set at construction, cannot be changed +7. **Rule contracts in `src/mocks/` are reference implementations** — they are useful for testing and examples, not as production rule contracts. Production rules live in a [separate repository](https://github.com/CMTA/Rules). + +## Solidity Style + +- Follow the [Solidity style guide](https://docs.soliditylang.org/en/latest/style-guide.html) +- NatSpec comments on all public/external functions +- Function ordering: constructor, receive, fallback, external, public, internal, private (view/pure last within each group) +- Function declaration order: visibility, mutability, virtual, override, custom modifiers +- Section headers: `/* ============ SECTION ============ */` +- Run `forge fmt` before committing + +## Common Tasks + +### Adding a new module +1. Create the module in `src/modules/` +2. Create an invariant storage contract in `src/modules/library/` for errors/events +3. Add a virtual access control hook (e.g., `_onlyNewManager()`) +4. Have `RuleEngineBase` inherit the module +5. Override the hook in both `RuleEngine` and `RuleEngineOwnable` +6. Add tests in `test/RuleEngine/`, `test/RuleEngineOwnable/`, and `test/RuleEngineOwnable2Step/` + +### Adding a new rule (mock) +1. Create the rule in `src/mocks/rules/` +2. Implement `IRule` (which extends `IRuleEngineERC1404`) +3. Implement ERC-165 with `IRULE_INTERFACE_ID` +4. Add tests using the existing `HelperContract` base + +### Modifying access control +1. Update the virtual hook in the relevant module +2. Update overrides in **both** `RuleEngine.sol` and `RuleEngineOwnable.sol` +3. Update tests in all affected test directories diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a4f705..5fe9b7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,51 @@ forge lint - Update surya doc by running the 3 scripts in [./doc/script](./doc/script) - Update changelog -## v3.0.0-rc1 - 2026-02-16 + + +### v3.0.0-rc2 - 2026-04-13 + +### Dependencies + +- Update CMTAT submodule to [v3.2.0](https://github.com/CMTA/CMTAT/releases/tag/v3.2.0). +- Update OpenZeppelin Contracts and OpenZeppelin Contracts Upgradeable submodules to [v5.6.1](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.6.1). +- Set Solidity version to [0.8.34](https://docs.soliditylang.org/en/v0.8.34/) in `hardhat.config.js` and `foundry.toml`. + +### Fixed + +- `RuleEngineOwnable.supportsInterface` incorrectly advertised `IAccessControl` via the inherited `AccessControl.supportsInterface` fallback. Replaced with an explicit whitelist; `supportsInterface(IAccessControl)` now returns `false` as expected (Nethermind AuditAgent finding 2). +- Remove `AccessControl` inheritance from `RulesManagementModule`; RBAC responsibilities are now explicitly held by `RuleEngine`, while the module remains access-control agnostic. +- Switch `RuleEngine` RBAC base from OpenZeppelin `AccessControl` to `AccessControlEnumerable` while keeping the custom "default admin has all roles" behavior. + +### Added + +- Advertise ERC-3643 compliance interface ID (`0x3144991c`) and IERC7551Compliance subset interface ID (`0x7157797f`) in `supportsInterface` for both `RuleEngine` and `RuleEngineOwnable` (Nethermind AuditAgent finding 6). +- Move deployable contracts to `src/deployment/` and rename RBAC deployable contract `RuleEngine` to `RuleEngine`. +- `RuleEngine.supportsInterface` now advertises `IAccessControlEnumerable`. + +### Security + +- Add NatSpec and README warnings on `bindToken` / `unbindToken`: in a multi-tenant setup (multiple tokens sharing one engine), all bound tokens must be equally trusted and governed together; ERC-3643 callbacks do not carry the token address to rules (Nethermind AuditAgent finding 1). +- Add NatSpec warnings on `addRule`, `setRules`, and `_transferred`: rule contracts must not be granted `RULES_MANAGEMENT_ROLE` or admin privileges (Nethermind AuditAgent finding 5). +- Add NatSpec warnings on `addRule`, `setRules`, and `_transferred`: no on-chain maximum rule count is enforced; operators are responsible for sizing the rule set for the target chain gas limits (Nethermind AuditAgent finding 3). +- Add restriction-code uniqueness convention to `IRule.canReturnTransferRestrictionCode` and `_messageForTransferRestriction`: codes must be unique across rules, or rules sharing a code must return the same message (Nethermind AuditAgent finding 4). +- Add NatSpec on `setRules` documenting the empty-array rejection by design and referring to `clearRules` for explicit removal (Nethermind AuditAgent finding 7). + +### Testing + +- Add `testDoesNotSupportIAccessControlInterface` to `RuleEngineOwnableCoverage` asserting `IAccessControl` is not advertised. +- Add ERC-3643 and IERC7551Compliance `supportsInterface` coverage tests to both `RuleEngineCoverage` and `RuleEngineOwnableCoverage`. +- Add mock interfaces `src/mocks/ICompliance.sol` and `src/mocks/IERC7551ComplianceSubset.sol` used by coverage tests. +- Extend `RuleEngineDeployment` interface coverage to assert support for `IAccessControlEnumerable`. + +### Documentation + +- Add Nethermind AuditAgent scan #1 report and remediation assessment (`doc/security/audits/tools/nethermind-audit-agent/`). +- Update README Security section with Nethermind AuditAgent findings summary table. + +### v3.0.0-rc1 - 2026-02-16 + +Commit: `f3e27c190635e91a64215276f4757d65eb2d2b2c` ### Added @@ -89,7 +133,7 @@ forge lint ## v3.0.0-rc0 - 2025-08-15 -Commit: f3283c3b8a99089c3c6f674150831003a6bd2927 +Commit: `f3283c3b8a99089c3c6f674150831003a6bd2927` - Rule contracts, requires to perform compliance check, have now their own dedicated [GitHub repository](https://github.com/CMTA/Rules). It means that these contract will be developed and audited separately from the `RuleEngine`. This provides more flexibility and makes it easier to manage audits. - There is now only one type of rule (read-write rules). Before that: diff --git a/CLAUDE.md b/CLAUDE.md index 63a96b3..0057a7d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,13 +1,15 @@ -# CLAUDE.md — AI Agent Guide for RuleEngine +# AI Agent Guide for RuleEngine This file helps AI agents (Cursor, Claude Code, etc.) understand and work with this codebase. +AGENTS.md and CLAUDE.md files must always be identical + ## Project Summary **RuleEngine** is a Solidity smart contract system that enforces transfer restrictions for [CMTAT](https://github.com/CMTA/CMTAT) and [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) tokens. It acts as an external controller that calls pluggable rule contracts on each token transfer, mint, or burn. - **Version:** 3.0.0 (defined in `src/modules/VersionModule.sol`) -- **Solidity:** ^0.8.20 (compiled with 0.8.33) +- **Solidity:** ^0.8.20 (compiled with 0.8.34) - **EVM target:** Prague - **License:** MPL-2.0 @@ -30,23 +32,23 @@ CMTAT submodule also needs `cd lib/CMTAT && npm install` for its OpenZeppelin de | Alias | Path | |-------|------| -| `OZ/` | `lib/openzeppelin-contracts/contracts` | | `CMTAT/` | `lib/CMTAT/contracts/` | | `CMTATv3.0.0/` | `lib/CMTATv3.0.0/contracts/` | | `@openzeppelin/contracts/` | `lib/openzeppelin-contracts/contracts` | -Use `OZ/` for OpenZeppelin imports, `CMTAT/` for CMTAT imports, `src/` for local imports. +Use `@openzeppelin/contracts/` for OpenZeppelin imports, `CMTAT/` for CMTAT imports, `src/` for local imports. ## Architecture -### Two Deployable Contracts +### Three Deployable Contracts ``` -RuleEngine — RBAC via AccessControl (multi-operator) -RuleEngineOwnable — ERC-173 Ownable (single-owner) +RuleEngine — RBAC via AccessControl (multi-operator) +RuleEngineOwnable — ERC-173 Ownable (single-owner) +RuleEngineOwnable2Step — ERC-173 Ownable2Step (single-owner, two-step handover) ``` -Both share 100% of their core logic through `RuleEngineBase`. +All three share their core logic through `RuleEngineBase` directly or via `RuleEngineOwnableShared`. ### Inheritance Hierarchy @@ -67,8 +69,15 @@ RuleEngine RuleEngineOwnable ├── ERC2771ModuleStandalone → gasless support -├── RuleEngineBase +├── RuleEngineOwnableShared +│ └── RuleEngineBase └── Ownable (OZ) → ERC-173 + +RuleEngineOwnable2Step +├── ERC2771ModuleStandalone → gasless support +├── RuleEngineOwnableShared +│ └── RuleEngineBase +└── Ownable2Step (OZ) → ERC-173 ``` ### Access Control Pattern @@ -91,7 +100,7 @@ function _onlyRulesManager() internal virtual override onlyOwner {} function _onlyComplianceManager() internal virtual override onlyOwner {} ``` -**When adding a new protected function**, follow this pattern: define a virtual hook in the module, then override it in both `RuleEngine` and `RuleEngineOwnable`. +**When adding a new protected function**, follow this pattern: define a virtual hook in the module, then override it in `RuleEngine`, `RuleEngineOwnable`, and `RuleEngineOwnable2Step`. ### `_checkRule` Override Chain @@ -164,23 +173,28 @@ Errors, events, and role constants are centralized in "invariant storage" abstra ``` src/ -├── RuleEngine.sol # RBAC variant (deploy this) -├── RuleEngineOwnable.sol # Ownable variant (deploy this) +├── deployment/ +│ ├── RuleEngine.sol # RBAC variant (deploy this) +│ ├── RuleEngineOwnable.sol # Ownable variant (deploy this) +│ └── RuleEngineOwnable2Step.sol # Ownable2Step variant (deploy this) ├── RuleEngineBase.sol # Abstract core logic (do not deploy) +├── RuleEngineOwnableShared.sol # Shared logic for ownable variants ├── interfaces/ # IRule, IRulesManagementModule, IERC3643Compliance ├── modules/ # VersionModule, RulesManagementModule, ERC3643ComplianceModule, ERC2771ModuleStandalone │ └── library/ # InvariantStorage contracts, RuleInterfaceId -└── mocks/ # Test-only contracts (RuleWhitelist, RuleConditionalTransferLight, etc.) +└── mocks/ # Test-only/reference contracts test/ ├── HelperContract.sol # Base helper for RuleEngine tests ├── HelperContractOwnable.sol # Base helper for RuleEngineOwnable tests +├── HelperContractOwnable2Step.sol # Base helper for RuleEngineOwnable2Step tests ├── utils/ # CMTAT deployment helpers ├── RuleEngine/ # Tests for RuleEngine (RBAC) ├── RuleEngineOwnable/ # Tests for RuleEngineOwnable +├── RuleEngineOwnable2Step/ # Tests for RuleEngineOwnable2Step └── RuleWhitelist/ # Tests for the whitelist mock rule -script/ # Foundry deployment scripts +script/ # Foundry example/deployment scripts ``` ## Test Conventions @@ -189,9 +203,11 @@ For detailed test conventions, templates, helper contracts, test addresses, nami Key points: - Tests for `RuleEngine` go in `test/RuleEngine/`, tests for `RuleEngineOwnable` go in `test/RuleEngineOwnable/` +- Tests for `RuleEngineOwnable2Step` go in `test/RuleEngineOwnable2Step/` - Use `HelperContract` for RBAC tests, `HelperContractOwnable` for Ownable tests +- Use `HelperContractOwnable2Step` for `RuleEngineOwnable2Step` tests - Always use specific error selectors in `vm.expectRevert()` -- When adding a feature to `RuleEngineBase`, add tests for **both** variants +- When adding a feature to `RuleEngineBase`, add tests for **all deployable variants** ## RBAC Roles (RuleEngine only) @@ -209,7 +225,7 @@ Key points: 4. **No zero-address rules** — checked in `_checkRule` 5. **Admin has all roles** in `RuleEngine` (the `hasRole` override) 6. **Forwarder is immutable** — set at construction, cannot be changed -7. **Rule contracts are in `src/mocks/`** — they are reference implementations for testing, not production rules. Production rules live in a [separate repository](https://github.com/CMTA/Rules). +7. **Rule contracts in `src/mocks/` are reference implementations** — they are useful for testing and examples, not as production rule contracts. Production rules live in a [separate repository](https://github.com/CMTA/Rules). ## Solidity Style @@ -228,7 +244,7 @@ Key points: 3. Add a virtual access control hook (e.g., `_onlyNewManager()`) 4. Have `RuleEngineBase` inherit the module 5. Override the hook in both `RuleEngine` and `RuleEngineOwnable` -6. Add tests in both `test/RuleEngine/` and `test/RuleEngineOwnable/` +6. Add tests in `test/RuleEngine/`, `test/RuleEngineOwnable/`, and `test/RuleEngineOwnable2Step/` ### Adding a new rule (mock) 1. Create the rule in `src/mocks/rules/` @@ -239,4 +255,4 @@ Key points: ### Modifying access control 1. Update the virtual hook in the relevant module 2. Update overrides in **both** `RuleEngine.sol` and `RuleEngineOwnable.sol` -3. Update tests in **both** test directories +3. Update tests in all affected test directories diff --git a/README.md b/README.md index a75560c..9932ed7 100644 --- a/README.md +++ b/README.md @@ -6,26 +6,31 @@ This repository includes the RuleEngine contracts for [CMTAT](https://github.com The RuleEngine is an external contract used to apply transfer restrictions to another contract, such as CMTAT and ERC-3643 tokens. Acting as a controller, it can call different contract rules and apply these rules on each transfer. +[TOC] + ## Contract Variants -Two deployable contracts are available, differing in their access control mechanism: +Three deployable contracts are available: | Contract | Access Control | Interface | Use Case | |----------|---------------|-----------|----------| -| `RuleEngine` | Role-Based (AccessControl) | RBAC roles | Multi-operator environments with granular permissions | +| `RuleEngine` | Role-Based (AccessControlEnumerable) | RBAC roles | Multi-operator environments with granular permissions | | `RuleEngineOwnable` | ERC-173 Ownership | `Ownable` | Single-owner setups, simpler administration | +| `RuleEngineOwnable2Step` | ERC-173 Ownership (two-step transfer) | `Ownable2Step` | Single-owner setups with safer ownership handover | ERC-3643 compliance specification indicates the use of ERC-173. > The standard relies on ERC-173 to define contract ownership, with the owner having the responsibility of setting the Compliance parameters and binding the Compliance to a Token contract. -Both contracts share the same core functionality through `RuleEngineBase` and support: +All deployable contracts share the same core functionality (`RuleEngineBase`, directly or through `RuleEngineOwnableShared`) and support: - ERC-1404 transfer restrictions - ERC-3643 compliance interface - ERC-2771 meta-transactions (gasless) - Multiple token bindings +> **Warning (shared engine across multiple tokens):** A "multi-tenant" setup here means one RuleEngine instance is shared by several token contracts (all bound through `bindToken`). In this setup, tokens must be equally trusted and governed together. ERC-3643 callbacks (`transferred`, `created`, `destroyed`) do not pass the token address to rules, so stateful/accounting rules are not safe for mutually untrusted tokens sharing the same engine. + [TOC] ## Motivation @@ -64,7 +69,9 @@ This diagram illustrates how a transfer with a CMTAT or ERC-3643 token with a Ru 2. The transfer function inside the token calls the ERC-3643 function `transferred` from the RuleEngine with the following parameters inside: `from, to, value`. 3. The Rule Engine calls each rule separately. If the transfer is not authorized by the rule, the rule must directly revert (no return value). -> **Warning:** The RuleEngine iterates over all configured rules on every transfer (and on every call to `detectTransferRestriction`, `canTransfer`, etc.). Adding a large number of rules increases gas consumption for each transfer and may eventually exceed the block gas limit, effectively preventing any transfer from succeeding. Administrators should keep the rule set small and be mindful that a misconfigured or gas-heavy rule can also impact all transfers. +> **Warning:** The RuleEngine iterates over all configured rules on every transfer (and on every call to `detectTransferRestriction`, `canTransfer`, etc.). Adding a large number of rules increases gas consumption for each transfer and may eventually exceed the block gas limit, effectively preventing any transfer from succeeding. There is no hard on-chain maximum rule count; administrators are responsible for sizing the rule set for their target blockchain and should keep it small. A misconfigured or gas-heavy rule can also impact all transfers. + +> **Warning (restriction code conventions):** Rule implementations should use unique ERC-1404 restriction codes across the rule set. If several rules intentionally share the same restriction code, they should return the exact same `messageForTransferRestriction` text for that code to avoid inconsistent operator/user feedback. ### How to set it @@ -72,7 +79,8 @@ This diagram illustrates how a transfer with a CMTAT or ERC-3643 token with a Ru | RuleEngine version | Compatible Versions | | ------------------------------------------------------------ | ------------------------------------------------------------ | -| **v3.0.0-rc1** | CMTAT ≥ v3.0.0
CMTAT target version: [v3.2.0-rc2](https://github.com/CMTA/CMTAT/releases/tag/v3.2.0-rc2) | +| **v3.0.0-rc2** | CMTAT ≥ v3.0.0
CMTAT target version: [v3.2.0](https://github.com/CMTA/CMTAT/releases/tag/v3.2.0) | +| **v3.0.0-rc1** | CMTAT ≥ v3.0.0
CMTAT target version: [v3.2.0](https://github.com/CMTA/CMTAT/releases/tag/v3.2.0) | | **v3.0.0-rc0** | CMTAT ≥ v3.0.0
| | **[v1.0.2.1](https://github.com/CMTA/RuleEngine/releases/tag/v1.0.2.1)** | CMTAT v2.3.0 (audited) | @@ -200,13 +208,15 @@ function transferred(address from, address to, uint256 value) external; ``` +> Note: `IERC7551Compliance` comes from `draft-IERC7551` (not final) and, in this project, is used as a subset compliance interface focused on `canTransferFrom`. + ### ERC-3643 The [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) compliance interface is defined in [IERC3643Compliance.sol](src/interfaces/IERC3643Compliance.sol). -A specific module implements this interface for the RuleEngine: [ERC3643Compliance.sol](src/modules/ERC3643Compliance.sol) +A specific module implements this interface for the RuleEngine: [ERC3643ComplianceModule.sol](src/modules/ERC3643ComplianceModule.sol) ![ERC3643ComplianceModuleUML](./doc/schema/vscode-uml/ERC3643ComplianceModuleUML.png) @@ -216,22 +226,24 @@ A specific module implements this interface for the RuleEngine: [ERC3643Complian The toolchain includes the following components, where the versions are the latest ones that we tested: -- Foundry (forge-std) [v1.14.0](https://github.com/foundry-rs/forge-std/releases/tag/v1.10.0) -- Solidity [0.8.33](https://docs.soliditylang.org/en/v0.8.33/) -- OpenZeppelin Contracts (submodule) [v5.5.0](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.5.0) -- CMTAT [v3.2.0-rc2](https://github.com/CMTA/CMTAT/releases/tag/v3.0.0-rc7) +- Foundry (forge-std) [v1.14.0](https://github.com/foundry-rs/forge-std/releases/tag/v1.14.0) +- Solidity [0.8.34](https://docs.soliditylang.org/en/v0.8.34/) +- OpenZeppelin Contracts (submodule) [v5.6.1](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.6.1) +- CMTAT [v3.2.0](https://github.com/CMTA/CMTAT/releases/tag/v3.2.0) ### Access Control Two access control mechanisms are available depending on which contract you deploy: -#### RuleEngine (RBAC - AccessControl) +#### RuleEngine (RBAC - AccessControlEnumerable) -The `RuleEngine` contract uses Role-Based Access Control (RBAC) via OpenZeppelin's `AccessControl`. +The `RuleEngine` contract uses Role-Based Access Control (RBAC) via OpenZeppelin's `AccessControlEnumerable`. Each module defines the roles useful to restrict its functions. The contract overrides the OpenZeppelin function `hasRole` to give by default all the roles to the `admin`. +`RulesManagementModule` itself is access-control agnostic; RBAC is wired at the concrete `RuleEngine` level. +Note: this `hasRole` override does not add the admin address to each role's enumerable member set. As a result, `getRoleMember` / `getRoleMemberCount` for a specific role do not include the admin unless that role is explicitly granted. -See also [docs.openzeppelin.com - AccessControl](https://docs.openzeppelin.com/contracts/5.x/api/access#AccessControl) +See also [docs.openzeppelin.com - AccessControlEnumerable](https://docs.openzeppelin.com/contracts/5.x/api/access#AccessControlEnumerable) #### RuleEngineOwnable (ERC-173 Ownership) @@ -245,6 +257,12 @@ This is a simpler access control model suitable for single-owner deployments. See also [docs.openzeppelin.com - Ownable](https://docs.openzeppelin.com/contracts/5.x/api/access#Ownable) +#### RuleEngineOwnable2Step (ERC-173 Ownership, two-step transfer) + +The `RuleEngineOwnable2Step` contract uses OpenZeppelin's `Ownable2Step`, which keeps the same owner-only protections and adds safer ownership handover with `transferOwnership(address)` + `acceptOwnership()`. + +See also [docs.openzeppelin.com - Ownable2Step](https://docs.openzeppelin.com/contracts/5.x/api/access#Ownable2Step) + #### Role list (RuleEngine only) Here is the list of roles and their 32 bytes identifier for the `RuleEngine` contract. @@ -253,14 +271,16 @@ The default admin is the address put in argument (`admin`) inside the constructo It is set in the constructor when the contract is deployed. -> Note: For `RuleEngineOwnable`, all protected functions are controlled by the single `owner` address instead of roles. +> Note: For `RuleEngineOwnable` and `RuleEngineOwnable2Step`, all protected functions are controlled by the single `owner` address instead of roles. + +> **Warning (role assignment):** Rule contracts should be treated as trusted logic components, but they should not be granted `RULES_MANAGEMENT_ROLE` (or admin privileges). Keep rule-management roles on dedicated operator/admin accounts only. | | Defined in | 32 bytes identifier | | ----------------------- | -------------------------------- | ------------------------------------------------------------ | | DEFAULT_ADMIN_ROLE | OpenZeppelin
AccessControl | 0x0000000000000000000000000000000000000000000000000000000000000000 | | **Modules** | | | -| COMPLIANCE_MANAGER_ROLE | ERC3643Compliance | 0xe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede600028568 | -| RULES_MANAGEMENT_ROLE | RuleEngineInvariantStorageCommon | 0xea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e | +| COMPLIANCE_MANAGER_ROLE | ERC3643ComplianceModule | 0xe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede600028568 | +| RULES_MANAGEMENT_ROLE | RulesManagementModuleInvariantStorage | 0xea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e | @@ -274,7 +294,7 @@ Here is a schema of the Access Control for `RuleEngine`. Here is a summary table for each restricted function defined in a module. For function signatures, struct arguments are represented with their corresponding native type. -> Note: For `RuleEngineOwnable`, replace the role requirement with `onlyOwner` for all protected functions. +> Note: For `RuleEngineOwnable` and `RuleEngineOwnable2Step`, replace the role requirement with `onlyOwner` for all protected functions. | | Function signature | Visibility [public/external] | Input variables (Function arguments) | Output variables
(return value) | Role Required | | -------------------- | ------------------ | ---------------------------- | ------------------------------------ | ------------------------------------ | ------------- | @@ -302,6 +322,8 @@ Here is the UML of the main contracts: #### RuleEngineOwnable +![RuleEngineOwnableUML](./doc/schema/vscode-uml/RuleEngineOwnableUML.png) + `RuleEngineOwnable` shares the same base functionality as `RuleEngine` but uses ERC-173 ownership instead of RBAC. ``` @@ -321,6 +343,30 @@ RuleEngineOwnable - Supports `transferOwnership()` and `renounceOwnership()` - Implements ERC-173 interface (`supportsInterface(0x7f5828d0)` returns `true`) +#### RuleEngineOwnable2Step + +![RuleEngineOwnable2StepUML](./doc/schema/vscode-uml/RuleEngineOwnable2StepUML.png) + +`RuleEngineOwnable2Step` shares the same base functionality as `RuleEngineOwnable` but uses OpenZeppelin's `Ownable2Step` for safer ownership handover. + +``` +RuleEngineOwnable2Step +├── ERC2771ModuleStandalone (gasless support) +├── RuleEngineOwnableShared (shared ownable deployment logic) +│ └── RuleEngineBase +│ ├── VersionModule +│ ├── RulesManagementModule +│ ├── ERC3643ComplianceModule +│ └── IRuleEngineERC1404 +└── Ownable2Step (ERC-173 access control with pending owner) +``` + +**Key differences from RuleEngineOwnable:** +- Uses a two-step ownership transfer flow: `transferOwnership()` then `acceptOwnership()` +- The current owner retains privileges until the pending owner accepts ownership +- Reuses `RuleEngineOwnableShared` for constructor, ERC-165, and ERC-2771 behavior +- Implements ERC-173 interface (`supportsInterface(0x7f5828d0)` returns `true`) + @@ -342,23 +388,48 @@ The RuleEngine can be removed from the main token contract by calling these dedi ### Available Rules -Rules have their own dedicated repository: [github.com/CMTA/Rules](https://github.com/CMTA/Rules) +Rules are maintained in a dedicated repository: [github.com/CMTA/Rules](https://github.com/CMTA/Rules). + +Rules can be used in two ways: + +- Directly on CMTAT (single-rule setup, no RuleEngine orchestration). +- Through this RuleEngine (multi-rule orchestration with sequential execution). + +Rule families: + +| Family | Behavior | Examples | +| --- | --- | --- | +| Validation rules (read-only) | Evaluate transfer eligibility without mutating rule state | `RuleWhitelist`, `RuleBlacklist`, `RuleSanctionList`, `RuleIdentityRegistry`, `RuleSpenderWhitelist`, `RuleERC2980`, `RuleMaxTotalSupply` | +| Operation rules (read-write) | Evaluate transfer eligibility and can update rule-specific state on transfer | `RuleConditionalTransferLight` | -The following rules are available: +Additional integration notes: -| Rule | Type
[read-only / read-write] | Audit planned | Description | -| ----------------------- | ----------------------------------- | --------------------------------- | ------------------------------------------------------------ | -| RuleWhitelist | Read-only | ☑ | This rule can be used to restrict transfers from/to only addresses inside a whitelist. | -| RuleWhitelistWrapper | Read-only | ☑ | This rule can be used to restrict transfers from/to only addresses inside a group of whitelist rules managed by different operators. | -| RuleBlacklist | Read-only | ☑ | This rule can be used to forbid transfer from/to addresses in the blacklist | -| RuleSanctionList | Read-only | ☑ | The purpose of this contract is to use the oracle contract from Chainalysis to forbid transfer from/to an address included in a sanctions designation (US, EU, or UN). | -| RuleConditionalTransfer | Read-Write | ☒
(experimental rule) | This rule requires that transfers have to be approved before being executed by the token holders. | +- For RuleEngine integration, a rule must implement `IRule` (including ERC-165 support for the Rule interface ID). +- RuleEngine executes configured rules in order and reverts on the first failing rule in state-changing paths. +- Restriction codes should remain unique across the composed rule set. Keep CMTAT-reserved ranges free and use dedicated code ranges per rule +- For the latest list of production rules, audits, and status, use the Rules repository as the source of truth. +#### Rules details +Here is a summary tab of available rules, see [github.com/CMTA/Rules](https://github.com/CMTA/Rules) + +| Rule | Type
[read-only / read-write] | Description | +| ------------------------------------------------------------ | ----------------------------------- | ------------------------------------------------------------ | +| RuleWhitelist | Read-only | This rule can be used to restrict transfers from/to only addresses inside a whitelist. | +| RuleWhitelistWrapper | Read-Only | This rule can be used to restrict transfers from/to only addresses inside a group of whitelist rules managed by different operators. | +| RuleBlacklist | Read-Only | This rule can be used to forbid transfer from/to addresses in the blacklist | +| 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 sender, recipient, and spender for `transferFrom`). 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 | 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. | +| [RuleSelf](https://github.com/rya-sge/ruleself) (community) | — | Use [Self](https://self.xyz), a zero-knowledge identity solution to determine which is allowed to interact with the token.
Community-maintained rule project. Not developed or maintained by CMTA. | ### Gasless support (ERC-2771) -![ERC2771ModuleUML](./doc/schema/vscode-uml/ERC2771ModuleUML.png) +![surya_inheritance_ERC2771ModuleStandalone.sol](./doc/schema/surya/surya_inheritance/surya_inheritance_ERC2771ModuleStandalone.sol.png) The RuleEngine supports client-side gasless transactions using the standard [ERC-2771](https://eips.ethereum.org/EIPS/eip-2771). @@ -495,6 +566,8 @@ Must revert if the transfer is invalid. ![IERC7551ComplianceUML](./doc/schema/vscode-uml/IERC7551ComplianceUML.png) +> Note: ERC-7551 is draft (not final). The `IERC7551Compliance` interface used here is a subset interface exposing the compliance check `canTransferFrom`. + ##### canTransferFrom(address spender, address from, address to, uint256 value) -> bool Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules. @@ -788,7 +861,7 @@ Useful for identifying which version of the smart contract is deployed and in us | :-------------------------: | :---------------: | :-------------------------------: | :------------: | :-----------: | | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | | | | | | | -| **ERC3643ComplianceModule** | Implementation | IERC3643Compliance, AccessControl | | | +| **ERC3643ComplianceModule** | Implementation | Context, IERC3643Compliance | | | | └ | bindToken | Public ❗️ | 🛑 | onlyRole | | └ | unbindToken | Public ❗️ | 🛑 | onlyRole | | └ | isTokenBound | Public ❗️ | | NO❗️ | @@ -1206,12 +1279,12 @@ Checks whether a specific rule is currently configured. Please see [SECURITY.md](https://github.com/CMTA/CMTAT/blob/master/SECURITY.md) (CMTAT main repository). -The contracts have been audited by [ABDKConsulting](https://www.abdk.consulting/), a globally recognized firm specialized in smart contracts' security. - ### Audit #### First Audit - March 2022 +> The contracts (v.1.0.2) have been audited by [ABDK Consulting](https://www.abdk.consulting/), a globally recognized firm specialized in smart contracts' security. + Fixed version : [v1.0.2](https://github.com/CMTA/RuleEngine/releases/tag/v1.0.2) The first audit was performed by ABDK on the version [1.0.1](https://github.com/CMTA/RuleEngine/releases/tag/1.0.1). @@ -1222,19 +1295,44 @@ The final report is available in [ABDK_CMTA_CMTATRuleEngine_v_1_0.pdf](https://g ### Tools +#### Nethermind AuditAgent + +> **Note:** This scan was performed by an AI-powered automated tool, not a formal human-led audit. + +| Version | Report | Assessment | +|---------|--------|------------| +| Scan #1 (Feb 2026) | [audit_agent_report_1_v3.0.0-rc1.pdf](./doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1.pdf) | [feedback.md](./doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1-feedback.md) | + +7 findings — 0 High · 1 Medium · 1 Low · 4 Info · 1 Best Practices + +| # | Severity | Finding | Status | +|---|----------|---------|--------| +| 1 | Medium | Cross-token rule state pollution in multi-tenant deployments | NatSpec + README warnings. Interface fix deferred (requires CMTAT coordination). | +| 2 | Low | `RuleEngineOwnable` misreports `IAccessControl` via ERC-165 | Fixed: explicit interface whitelist + negative test added. | +| 3 | Info | Unbounded rules loop — potential permanent DoS | NatSpec + README operator warnings (no hard cap by design). | +| 4 | Info | Restriction code and message can come from different rules | Convention documented in NatSpec and README (no logic change by design). | +| 5 | Info | Re-entrant rule can modify rule set during `transferred()` | NatSpec + README warning — rules must not hold `RULES_MANAGEMENT_ROLE`. | +| 6 | Info | Missing ERC-3643 and IERC7551Compliance interface IDs | Fixed: both IDs added to `supportsInterface` in both contracts, with tests. | +| 7 | Best Practices | `setRules` does not allow an empty array | NatSpec clarification added (behavior unchanged by design). | + #### Slither Here is the list of report performed with [Slither](https://github.com/crytic/slither) -| Version | File | -| ------- | ------------------------------------------------------------ | -| latest | [slither-report.md](./doc/security/audits/tools/slither-report.md) | +| Version | Report | Assessment | +| ------- | ------ | ---------- | +| v3.0.0-rc2 | [slither-report.md](./doc/security/audits/tools/slither-report.md) | [slither-report-feedback.md](./doc/security/audits/tools/slither-report-feedback.md) | ```bash slither . --checklist --filter-paths "openzeppelin-contracts|test|CMTAT|forge-std|mocks" > slither-report.md ``` +2 finding categories — 0 High · 0 Medium · 10 Low · 2 Informational +| ID | Detector | Impact | Instances | Assessment | +|----|----------|--------|-----------|------------| +| 0–9 | `calls-loop` | Low | 10 | Accepted by design — fan-out to rule contracts is the core architecture | +| 10–11 | `unindexed-event-address` | Informational | 2 | Accepted — adding `indexed` to `TokenBound`/`TokenUnbound` is interface-breaking | #### Aderyn @@ -1244,9 +1342,23 @@ Here is the list of report performed with [Aderyn](https://github.com/Cyfrin/ade aderyn -x mocks --output aderyn-report.md ``` -| Version | File | -| ------- | ------------------------------------------------------------ | -| latest | [aderyn-report.md](./doc/security/audits/tools/aderyn-report.md) | +| Version | Report | Assessment | +| ------- | ------ | ---------- | +| v3.0.0-rc2 | [aderyn-report.md](./doc/security/audits/tools/aderyn-report.md) | [aderyn-report-feedback.md](./doc/security/audits/tools/aderyn-report-feedback.md) | + +Report scope: 14 Solidity files, 425 nSLOC. + +0 High · 7 Low + +| ID | Finding | Instances | Assessment | +|----|---------|-----------|------------| +| L-1 | Centralization Risk | 6 | Accepted by design — privileged compliance tool | +| L-2 | Unspecific Solidity Pragma | 12 | Accepted by design — intentional for library reusability | +| L-3 | PUSH0 Opcode | 14 | Not applicable — project targets Prague EVM | +| L-4 | Empty Block | 4 | Accepted by design — access-control hook pattern | +| L-5 | Loop Contains `require`/`revert` | 1 | Accepted by design — `setRules` is an atomic batch operation | +| L-6 | Costly Operations Inside Loop | 1 | Accepted — unavoidable `SSTORE` in `setRules` | +| L-7 | Unchecked Return | 1 | Accepted — `_grantRole` return is irrelevant in constructor | ## Documentation @@ -1261,19 +1373,21 @@ See also [Taurus - Token Transfer Management: How to Apply Restrictions with CMT ## Toolchains and Usage -*Explain how it works.* +This repository is primarily developed and tested with Foundry. + +Hardhat configuration is also present to allow compiling the contracts and running a small smoke test with Hardhat. ### Configuration Here are the settings for [Hardhat](https://hardhat.org) and [Foundry](https://getfoundry.sh). - `hardhat.config.js` - - Solidity [v0.8.33](https://docs.soliditylang.org/en/v0.8.33/) + - Solidity [v0.8.34](https://docs.soliditylang.org/en/v0.8.34/) - EVM version: Prague (Pectra upgrade) - Optimizer: true, 200 runs - `foundry.toml` - - Solidity [v0.8.33](https://docs.soliditylang.org/en/v0.8.33/) + - Solidity [v0.8.34](https://docs.soliditylang.org/en/v0.8.34/) - EVM version: Prague (Pectra upgrade) - Optimizer: true, 200 runs @@ -1312,8 +1426,9 @@ The official documentation is available in the Foundry [website](https://book.ge forge build # Build specific contract -forge build --contracts src/RuleEngine.sol -forge build --contracts src/RuleEngineOwnable.sol +forge build --contracts src/deployment/RuleEngine.sol +forge build --contracts src/deployment/RuleEngineOwnable.sol +forge build --contracts src/deployment/RuleEngineOwnable2Step.sol ``` ### Contract size @@ -1321,11 +1436,14 @@ forge build --contracts src/RuleEngineOwnable.sol forge build --sizes ``` -Both `RuleEngine` and `RuleEngineOwnable` have similar bytecode sizes since they share the same base functionality. The `RuleEngineOwnable` contract is slightly smaller as `Ownable` has less overhead than `AccessControl`. - +Latest output (`2026-03-18`) for the main RuleEngine contracts: +| Contract | Runtime Size (B) | Initcode Size (B) | Runtime Margin (B) | Initcode Margin (B) | +|----------|------------------:|------------------:|--------------------:|---------------------:| +| RuleEngine | 6,756 | 7,805 | 17,820 | 41,347 | +| RuleEngineOwnable | 6,170 | 6,833 | 18,406 | 42,319 | -![contract-size](./doc/compilation/contract-size.png) +Both `RuleEngine` and `RuleEngineOwnable` remain well below the EIP-170 runtime limit. `RuleEngineOwnable` is slightly smaller because `Ownable` has less overhead than `AccessControl`. ### Testing @@ -1349,6 +1467,12 @@ forge test --gas-report See also the test framework's [official documentation](https://book.getfoundry.sh/forge/tests), and that of the [test commands](https://book.getfoundry.sh/reference/forge/test-commands). +There is also a small Hardhat smoke test to confirm the main `RuleEngine` contract can be compiled and deployed through Hardhat: + +```bash +npx hardhat test test/hardhat/RuleEngine.smoke.js +``` + ### Coverage A code coverage is available in [index.html](./doc/coverage/coverage/index.html). @@ -1382,22 +1506,29 @@ The official documentation is available in the Foundry [website](https://getfoun |----------|---------------------| | Multiple operators with different permissions | `RuleEngine` | | Single administrator | `RuleEngineOwnable` | +| Single administrator with safer ownership handover | `RuleEngineOwnable2Step` | | Integration with existing RBAC systems | `RuleEngine` | | Simpler deployment and management | `RuleEngineOwnable` | #### Script -> This documentation has been written for the version v1.0.2 +The scripts in `script/` are example deployment flows. -To run the script for deployment, you need to create a .env file. The value for CMTAT_ADDRESS is required only to use the script **RuleEngine.s.sol** +> Warning: `RuleEngineScript.s.sol` and `CMTATWithRuleEngineScript.s.sol` deploy `RuleWhitelist` from `src/mocks/`. That contract is a reference/mock rule for testing and demos, not a production rule contract. + +For production deployments, source rule contracts from the dedicated [CMTA/Rules](https://github.com/CMTA/Rules) repository and adapt the script parameters accordingly. + +To run the example scripts, create a `.env` file. The value for `CMTAT_ADDRESS` is required only for `RuleEngineScript.s.sol`. Warning: putting your private key in a .env file is not the most secure approach. -* File .env +* File `.env` ``` PRIVATE_KEY= CMTAT_ADDRESS= ``` +**Private Keys**: Never expose your private keys. The `.env` file here used in this project should not be used for production. See [getfoundry.sh - Key Management](https://getfoundry.sh/guides/best-practices/key-management/) + * Command CMTAT with RuleEngine @@ -1413,7 +1544,7 @@ forge script script/CMTATWithRuleEngineScript.s.sol:CMTATWithRuleEngineScript -- forge script script/CMTATWithRuleEngineScript.s.sol:CMTATWithRuleEngineScript --rpc-url=127.0.0.1:8545 --broadcast --verify -vvv ``` -Only RuleEngine with a Whitelist contract +Only RuleEngine with the mock/reference `RuleWhitelist` contract ```bash forge script script/RuleEngineScript.s.sol:RuleEngineScript --rpc-url=$RPC_URL --broadcast --verify -vvv @@ -1425,6 +1556,14 @@ forge script script/RuleEngineScript.s.sol:RuleEngineScript --rpc-url=$RPC_URL forge script script/RuleEngineScript.s.sol:RuleEngineScript --rpc-url=127.0.0.1:8545 --broadcast --verify -vvv ``` +#### Production Deployment Checklist + +- Choose the deployable variant: `RuleEngine`, `RuleEngineOwnable`, or `RuleEngineOwnable2Step`. +- Choose the trusted forwarder address, or use `address(0)` if ERC-2771 support is not needed. +- Decide whether the token should be bound in the constructor or later via `bindToken`. +- Source production rule contracts from the [CMTA/Rules](https://github.com/CMTA/Rules) repository, not from `src/mocks/`. +- Verify post-deployment permissions: owner for ownable variants, or admin plus role assignments for the RBAC variant. + ### Solidity style guideline RuleEngine follows the [solidity style guideline](https://docs.soliditylang.org/en/latest/style-guide.html) and the [natspec format](https://docs.soliditylang.org/en/latest/natspec-format.html) for comments diff --git a/doc/TOOLCHAIN.md b/doc/TOOLCHAIN.md index 90f8204..51256bc 100644 --- a/doc/TOOLCHAIN.md +++ b/doc/TOOLCHAIN.md @@ -42,12 +42,20 @@ Utility tool for smart contract systems. **[OpenZeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts)** OpenZeppelin Contracts -The version of the library used is available in the [READEME](../README.md) +The version of the library used is available in the [README](../README.md) Warning: - Submodules are not automatically updated when the host repository is updated. - Only update the module to a specific version, not an intermediary commit. +## Tested versions + +The current tested baseline is: + +- Solidity: [0.8.34](https://docs.soliditylang.org/en/v0.8.34/) +- OpenZeppelin Contracts (submodule): [v5.6.1](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.6.1) +- CMTAT: [v3.2.0](https://github.com/CMTA/CMTAT/releases/tag/v3.2.0) + ## Generate documentation @@ -122,10 +130,14 @@ 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 ``` +### [Aderyn](https://github.com/Cyfrin/aderyn) +```bash +aderyn -x mocks --output aderyn-report.md +``` ## Code style guidelines diff --git a/doc/compilation/contract-size.png b/doc/compilation/contract-size.png deleted file mode 100644 index 01f8e46..0000000 Binary files a/doc/compilation/contract-size.png and /dev/null differ diff --git a/doc/compilation/flatten/RuleEngineFlatten.sol b/doc/compilation/flatten/RuleEngineFlatten.sol deleted file mode 100644 index e1899d0..0000000 --- a/doc/compilation/flatten/RuleEngineFlatten.sol +++ /dev/null @@ -1,5494 +0,0 @@ -// SPDX-License-Identifier: MPL-2.0 -pragma solidity >=0.4.16 >=0.8.4 ^0.8.20; - -// lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol - -/** -* Note: -* Parameter names may differ slightly from the original ERC3643 spec -* to align with OpenZeppelin v5.3.0 naming conventions -* (e.g., `amount` → `value`). -*/ - -/** - * @title IERC3643Pause - * @dev Interface for pausing and unpausing token transfers. - * Common interface shared between CMTAT and ERC3643 implementations. - * - */ -interface IERC3643Pause { - /** - * @notice Indicates whether the contract is currently paused. - * @dev When paused, token transfers are disabled. - * @return True if the contract is paused, false otherwise. - */ - function paused() external view returns (bool); - /** - * @notice Pauses all token transfers. - * @dev Once paused, calls to transfer-related functions will revert. - * Can only be called by an account with the appropriate permission. - * - * Emits a {Paused} event. - */ - function pause() external; - - /** - * @notice Unpauses token transfers. - * @dev Restores normal token transfer behavior after a pause. - * Can only be called by an account with the appropriate permission. - * - * Emits an {Unpaused} event. - */ - function unpause() external; -} -/** - * @title ERC-3643 Base Interface for ERC-20 Token Metadata - * @dev Provides functions to update token name and symbol. - */ -interface IERC3643ERC20Base { - /** - * @notice Updates the name of the token. - * @dev Can be used to rename the token post-deployment. - * @param name The new name to assign to the token. - */ - function setName(string calldata name) external; - - /** - * @notice Updates the symbol of the token. - * @dev Can be used to change the token's symbol (e.g. for branding or reissuance). - * @param symbol The new symbol to assign to the token. - */ - function setSymbol(string calldata symbol) external; -} - -/** - * @title IERC3643BatchTransfer - * @notice Interface for batch token transfers under the ERC-3643 standard. - */ -interface IERC3643BatchTransfer { - /** - * @notice Transfers tokens to multiple recipient addresses in a single transaction. - * @dev - * Batch version of `transfer` - * - Each recipient receives the number of tokens specified in the `values` array. - * Requirement: - * - The `tos` array must not be empty. - * - `tos.length` must equal `values.length`. - * - `tos`cannot contain a zero address - * - the caller must have a balance cooresponding to the total values - * Events: - * - Emits one `Transfer` event per recipient (i.e., `tos.length` total). - * - * Enforcement-specific behavior: - * - If `IERC3643Enforcement` is implemented: - * - The sender (`msg.sender`) and each recipient in `tos` MUST NOT be frozen. - * - If `IERC3643ERC20Enforcement` is implemented: - * - The total amount transferred MUST NOT exceed the sender's available (unfrozen) balance. - * - * Note: This implementation differs from the base ERC-3643 specification by returning a `bool` - * value for compatibility with the ERC-20 `transfer` function semantics. - * - * @param tos The list of recipient addresses. - * @param values The list of token amounts corresponding to each recipient. - * @return success_ A boolean indicating whether the batch transfer was successful. - */ - function batchTransfer(address[] calldata tos,uint256[] calldata values) external returns (bool success_); -} - -/** - * @title IERC3643Base - * @notice Interface to retrieve version - */ -interface IERC3643Base { - /** - * @notice Returns the current version of the token contract. - * @dev This value is useful to know which smart contract version has been used - * @return version_ A string representing the version of the token implementation (e.g., "1.0.0"). - */ - function version() external view returns (string memory version_); -} - -/** - * @title IERC3643EnforcementEvent - * @notice Interface defining the event for account freezing and unfreezing. - */ -interface IERC3643EnforcementEvent { - /** - * @notice Emitted when an account's frozen status is changed. - * @dev - * - `account` is the address whose status changed. - * - `isFrozen` reflects the new status after the function execution: - * - `true`: account is frozen. - * - `false`: account is unfrozen. - * - `enforcer` is the address that executed the freezing/unfreezing. - * - `data` provides optional contextual information for auditing or documentation purposes. - * The event is emitted by `setAddressFrozen` and `batchSetAddressFrozen` functions - * Note: This event extends the ERC-3643 specification by including the `data` field. - * - * @param account The address that was frozen or unfrozen. - * @param isFrozen The resulting freeze status of the account. - * @param enforcer The address that initiated the change. - * @param data Additional data related to the freezing action. - */ - event AddressFrozen(address indexed account, bool indexed isFrozen, address indexed enforcer, bytes data); -} - -/** - * @title IERC3643Enforcement - * @notice Interface for account-level freezing logic. - * @dev Provides methods to check and update whether an address is frozen. - */ -interface IERC3643Enforcement { - /** - * @notice Checks whether a given account is currently frozen. - * @param account The address to query. - * @return isFrozen_ A boolean indicating if the account is frozen (`true`) or not (`false`). - */ - function isFrozen(address account) external view returns (bool isFrozen_); - /** - * @notice Sets the frozen status of a specific address. - * @dev Emits an `AddressFrozen` event. - * @param account The address whose frozen status is being updated. - * @param freeze The new frozen status (`true` to freeze, `false` to unfreeze). - */ - function setAddressFrozen(address account, bool freeze) external; - /** - * @notice Batch version of {setAddressFrozen}, allowing multiple addresses to be updated in one call. - * @param accounts An array of addresses to update. - * @param freeze An array of corresponding frozen statuses for each address. - * Requirements: - * - `accounts.length` must be equal to `freeze.length`. - */ - function batchSetAddressFrozen(address[] calldata accounts, bool[] calldata freeze) external; -} - -/** - * @title IERC3643ERC20Enforcement - * @notice Interface for enforcing partial token freezes and forced transfers, typically used in compliance-sensitive ERC-1400 scenarios. - * @dev For event definitions, see {IERC7551ERC20Enforcement}. - */ -interface IERC3643ERC20Enforcement { - /* ============ View Functions ============ */ - /** - * @notice Returns the number of tokens that are currently frozen (i.e., non-transferable) for a given account. - * @dev The frozen amount is always less than or equal to the total balance of the account. - * @param account The address of the wallet being queried. - * @return frozenBalance_ The amount of frozen tokens held by the account. - */ - function getFrozenTokens(address account) external view returns (uint256 frozenBalance_); - - /* ============ State Functions ============ */ - - /** - * @notice Freezes a specific amount of tokens for a given account. - * @dev Emits a `TokensFrozen` event. Prevents the frozen amount from being transferred. - * @param account The wallet address whose tokens are to be frozen. - * @param value The amount of tokens to freeze. - */ - function freezePartialTokens(address account, uint256 value) external; - - /** - * @notice unfreezes token amount specified for given address - * @dev Emits a TokensUnfrozen event - * @param account The address for which to update frozen tokens - * @param value Amount of Tokens to be unfrozen - */ - function unfreezePartialTokens(address account, uint256 value) external; - /** - * - * @notice Triggers a forced transfer. - * @dev -* * Force a transfer of tokens between 2 token holders - * If IERC364320Enforcement is implemented: - * Require that the total value should not exceed available balance. - * In case the `from` address has not enough free tokens (unfrozen tokens) - * but has a total balance higher or equal to the `amount` - * the amount of frozen tokens is reduced in order to have enough free tokens - * to proceed the transfer, in such a case, the remaining balance on the `from` - * account is 100% composed of frozen tokens post-transfer. - * emits a `TokensUnfrozen` event if `value` is higher than the free balance of `from` - * Emits a `Transfer` event - * @param from The address of the token holder - * @param to The address of the receiver - * @param value amount of tokens to transfer - * @return success_ `true` if successful and revert if unsuccessful - - */ - function forcedTransfer(address from, address to, uint256 value) external returns (bool success_); - -} -/** -* @title IERC3643Mint — Token Minting Interface -* @dev Interface for mintint ERC-20 compatible tokens under the ERC-3643 standard. -* Implements both single and batch mint functionalities, with support for frozen address logic if enforced. -*/ -interface IERC3643Mint{ - /** - * @notice Creates (`mints`) a specified `value` of tokens and assigns them to the `account`. - * @dev Tokens are minted by transferring them from the zero address (`address(0)`). - * Emits a {Mint} event and a {Transfer} event with `from` set to `address(0)`. - * Requirement: - * Account must not be the zero address. - * @param account The address that will receive the newly minted tokens. - * @param value The amount of tokens to mint to `account`. - */ - function mint(address account, uint256 value) external; - /** - * @notice Batch version of {mint}, allowing multiple mint operations in a single transaction. - * @dev - * For each mint action: - * - Emits a {Mint} event. - * - Emits a {Transfer} event with `from` set to the zero address. - * - Requires that `accounts` and `values` arrays have the same length. - * - None of the addresses in `accounts` can be the zero address. - * - Be cautious with large arrays as the transaction may run out of gas. - * @param accounts The list of recipient addresses for the minted tokens. - * @param values The respective amounts of tokens to mint for each recipient. - */ - function batchMint( address[] calldata accounts,uint256[] calldata values) external; -} - -/** -* @title IERC3643Burn — Token Burning Interface -* @dev Interface for burning ERC-20 compatible tokens under the ERC-3643 standard. -* Implements both single and batch burn functionalities, with support for frozen token logic if enforced. -*/ -interface IERC3643Burn{ - /** - * @notice Burns a specified amount of tokens from a given account by transferring them to `address(0)`. - * @dev - * - Decreases the total token supply by the specified `value`. - * - Emits a `Transfer` event to indicate the burn (with `to` set to `address(0)`). - * - If `IERC364320Enforcement` is implemented: - * - If the account has insufficient free (unfrozen) tokens but a sufficient total balance, - * frozen tokens are reduced to complete the burn. - * - The remaining balance on the account will consist entirely of frozen tokens after the burn. - * - Emits a `TokensUnfrozen` event if frozen tokens are unfrozen to allow the burn. - * - * @param account The address from which tokens will be burned. - * @param value The amount of tokens to burn. - */ - function burn(address account,uint256 value) external; - /** - * @notice Performs a batch burn operation, removing tokens from multiple accounts in a single transaction. - * @dev - * - Batch version of {burn} - * - Executes the burn operation for each account in the `accounts` array, using corresponding amounts in the `values` array. - * - Emits a `Transfer` event for each burn (with `to` set to `address(0)`). - * - This operation is gas-intensive and may fail if the number of accounts (`accounts.length`) is too large, causing an "out of gas" error. - * - Use with caution to avoid unnecessary transaction fees. - * Requirement: - * - `accounts` and `values` must have the same length - * @param accounts An array of addresses from which tokens will be burned. - * @param values An array of token amounts to burn, corresponding to each address in `accounts`. - */ - function batchBurn(address[] calldata accounts,uint256[] calldata values) external; -} - -interface IERC3643ComplianceRead { - /** - * @notice Returns true if the transfer is valid, and false otherwise. - * @dev Don't check the balance and the user's right (access control) - */ - function canTransfer( - address from, - address to, - uint256 value - ) external view returns (bool isValid); -} - -interface IERC3643IComplianceContract { - /** - * @notice - * Function called whenever tokens are transferred - * from one wallet to another - * @dev - * This function can be used to update state variables of the compliance contract - * This function can be called ONLY by the token contract bound to the compliance - * @param from The address of the sender - * @param to The address of the receiver - * @param value value of tokens involved in the transfer - */ - function transferred(address from, address to, uint256 value) external; -} - -// lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol - -/* -* @dev Contrary to the ERC-1404, -* this interface does not inherit directly from the ERC20 interface -*/ -interface IERC1404 { - - /** - * @notice Returns a uint8 code to indicate if a transfer is restricted or not - * @dev - * See {ERC-1404} - * This function is where an issuer enforces the restriction logic of their token transfers. - * Some examples of this might include: - * - checking if the token recipient is whitelisted, - * - checking if a sender's tokens are frozen in a lock-up period, etc. - * @return uint8 restricted code, 0 means the transfer is authorized - * - */ - function detectTransferRestriction( - address from, - address to, - uint256 value - ) external view returns (uint8); - - /** - * @dev See {ERC-1404} - * This function is effectively an accessor for the "message", - * a human-readable explanation as to why a transaction is restricted. - * - */ - function messageForTransferRestriction( - uint8 restrictionCode - ) external view returns (string memory); -} - -/** -* @title IERC1404 with custom related extensions -*/ -interface IERC1404Extend is IERC1404{ - /* - * @dev leave the code 7-12 free/unused for further CMTAT additions in your ruleEngine implementation - */ - enum REJECTED_CODE_BASE { - TRANSFER_OK, - TRANSFER_REJECTED_DEACTIVATED, - TRANSFER_REJECTED_PAUSED, - TRANSFER_REJECTED_FROM_FROZEN, - TRANSFER_REJECTED_TO_FROZEN, - TRANSFER_REJECTED_SPENDER_FROZEN, - TRANSFER_REJECTED_FROM_INSUFFICIENT_ACTIVE_BALANCE - } - - /** - * @notice Returns a uint8 code to indicate if a transfer is restricted or not - * @dev - * See {ERC-1404} - * Add an additionnal argument `spender` - * This function is where an issuer enforces the restriction logic of their token transfers. - * Some examples of this might include: - * - checking if the token recipient is whitelisted, - * - checking if a sender's tokens are frozen in a lock-up period, etc. - * @return uint8 restricted code, 0 means the transfer is authorized - * - */ - function detectTransferRestrictionFrom( - address spender, - address from, - address to, - uint256 value - ) external view returns (uint8); -} - -// lib/openzeppelin-contracts/contracts/access/IAccessControl.sol - -// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol) - -/** - * @dev External interface of AccessControl declared to support ERC-165 detection. - */ -interface IAccessControl { - /** - * @dev The `account` is missing a role. - */ - error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); - - /** - * @dev The caller of a function is not the expected one. - * - * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. - */ - error AccessControlBadConfirmation(); - - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted to signal this. - */ - event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). - * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `callerConfirmation`. - */ - function renounceRole(bytes32 role, address callerConfirmation) external; -} - -// lib/openzeppelin-contracts/contracts/utils/Comparators.sol - -// OpenZeppelin Contracts (last updated v5.1.0) (utils/Comparators.sol) - -/** - * @dev Provides a set of functions to compare values. - * - * _Available since v5.1._ - */ -library Comparators { - function lt(uint256 a, uint256 b) internal pure returns (bool) { - return a < b; - } - - function gt(uint256 a, uint256 b) internal pure returns (bool) { - return a > b; - } -} - -// lib/openzeppelin-contracts/contracts/utils/Context.sol - -// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) - -/** - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address) { - return msg.sender; - } - - function _msgData() internal view virtual returns (bytes calldata) { - return msg.data; - } - - function _contextSuffixLength() internal view virtual returns (uint256) { - return 0; - } -} - -// lib/openzeppelin-contracts/contracts/utils/Panic.sol - -// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol) - -/** - * @dev Helper library for emitting standardized panic codes. - * - * ```solidity - * contract Example { - * using Panic for uint256; - * - * // Use any of the declared internal constants - * function foo() { Panic.GENERIC.panic(); } - * - * // Alternatively - * function foo() { Panic.panic(Panic.GENERIC); } - * } - * ``` - * - * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil]. - * - * _Available since v5.1._ - */ -// slither-disable-next-line unused-state -library Panic { - /// @dev generic / unspecified error - uint256 internal constant GENERIC = 0x00; - /// @dev used by the assert() builtin - uint256 internal constant ASSERT = 0x01; - /// @dev arithmetic underflow or overflow - uint256 internal constant UNDER_OVERFLOW = 0x11; - /// @dev division or modulo by zero - uint256 internal constant DIVISION_BY_ZERO = 0x12; - /// @dev enum conversion error - uint256 internal constant ENUM_CONVERSION_ERROR = 0x21; - /// @dev invalid encoding in storage - uint256 internal constant STORAGE_ENCODING_ERROR = 0x22; - /// @dev empty array pop - uint256 internal constant EMPTY_ARRAY_POP = 0x31; - /// @dev array out of bounds access - uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32; - /// @dev resource error (too large allocation or too large array) - uint256 internal constant RESOURCE_ERROR = 0x41; - /// @dev calling invalid internal function - uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51; - - /// @dev Reverts with a panic code. Recommended to use with - /// the internal constants with predefined codes. - function panic(uint256 code) internal pure { - assembly ("memory-safe") { - mstore(0x00, 0x4e487b71) - mstore(0x20, code) - revert(0x1c, 0x24) - } - } -} - -// lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol - -// OpenZeppelin Contracts (last updated v5.3.0) (utils/SlotDerivation.sol) -// This file was procedurally generated from scripts/generate/templates/SlotDerivation.js. - -/** - * @dev Library for computing storage (and transient storage) locations from namespaces and deriving slots - * corresponding to standard patterns. The derivation method for array and mapping matches the storage layout used by - * the solidity language / compiler. - * - * See https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays[Solidity docs for mappings and dynamic arrays.]. - * - * Example usage: - * ```solidity - * contract Example { - * // Add the library methods - * using StorageSlot for bytes32; - * using SlotDerivation for bytes32; - * - * // Declare a namespace - * string private constant _NAMESPACE = ""; // eg. OpenZeppelin.Slot - * - * function setValueInNamespace(uint256 key, address newValue) internal { - * _NAMESPACE.erc7201Slot().deriveMapping(key).getAddressSlot().value = newValue; - * } - * - * function getValueInNamespace(uint256 key) internal view returns (address) { - * return _NAMESPACE.erc7201Slot().deriveMapping(key).getAddressSlot().value; - * } - * } - * ``` - * - * TIP: Consider using this library along with {StorageSlot}. - * - * NOTE: This library provides a way to manipulate storage locations in a non-standard way. Tooling for checking - * upgrade safety will ignore the slots accessed through this library. - * - * _Available since v5.1._ - */ -library SlotDerivation { - /** - * @dev Derive an ERC-7201 slot from a string (namespace). - */ - function erc7201Slot(string memory namespace) internal pure returns (bytes32 slot) { - assembly ("memory-safe") { - mstore(0x00, sub(keccak256(add(namespace, 0x20), mload(namespace)), 1)) - slot := and(keccak256(0x00, 0x20), not(0xff)) - } - } - - /** - * @dev Add an offset to a slot to get the n-th element of a structure or an array. - */ - function offset(bytes32 slot, uint256 pos) internal pure returns (bytes32 result) { - unchecked { - return bytes32(uint256(slot) + pos); - } - } - - /** - * @dev Derive the location of the first element in an array from the slot where the length is stored. - */ - function deriveArray(bytes32 slot) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - mstore(0x00, slot) - result := keccak256(0x00, 0x20) - } - } - - /** - * @dev Derive the location of a mapping element from the key. - */ - function deriveMapping(bytes32 slot, address key) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - mstore(0x00, and(key, shr(96, not(0)))) - mstore(0x20, slot) - result := keccak256(0x00, 0x40) - } - } - - /** - * @dev Derive the location of a mapping element from the key. - */ - function deriveMapping(bytes32 slot, bool key) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - mstore(0x00, iszero(iszero(key))) - mstore(0x20, slot) - result := keccak256(0x00, 0x40) - } - } - - /** - * @dev Derive the location of a mapping element from the key. - */ - function deriveMapping(bytes32 slot, bytes32 key) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - mstore(0x00, key) - mstore(0x20, slot) - result := keccak256(0x00, 0x40) - } - } - - /** - * @dev Derive the location of a mapping element from the key. - */ - function deriveMapping(bytes32 slot, uint256 key) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - mstore(0x00, key) - mstore(0x20, slot) - result := keccak256(0x00, 0x40) - } - } - - /** - * @dev Derive the location of a mapping element from the key. - */ - function deriveMapping(bytes32 slot, int256 key) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - mstore(0x00, key) - mstore(0x20, slot) - result := keccak256(0x00, 0x40) - } - } - - /** - * @dev Derive the location of a mapping element from the key. - */ - function deriveMapping(bytes32 slot, string memory key) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - let length := mload(key) - let begin := add(key, 0x20) - let end := add(begin, length) - let cache := mload(end) - mstore(end, slot) - result := keccak256(begin, add(length, 0x20)) - mstore(end, cache) - } - } - - /** - * @dev Derive the location of a mapping element from the key. - */ - function deriveMapping(bytes32 slot, bytes memory key) internal pure returns (bytes32 result) { - assembly ("memory-safe") { - let length := mload(key) - let begin := add(key, 0x20) - let end := add(begin, length) - let cache := mload(end) - mstore(end, slot) - result := keccak256(begin, add(length, 0x20)) - mstore(end, cache) - } - } -} - -// lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol - -// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol) -// This file was procedurally generated from scripts/generate/templates/StorageSlot.js. - -/** - * @dev Library for reading and writing primitive types to specific storage slots. - * - * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. - * This library helps with reading and writing to such slots without the need for inline assembly. - * - * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. - * - * Example usage to set ERC-1967 implementation slot: - * ```solidity - * contract ERC1967 { - * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. - * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - * - * function _getImplementation() internal view returns (address) { - * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; - * } - * - * function _setImplementation(address newImplementation) internal { - * require(newImplementation.code.length > 0); - * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; - * } - * } - * ``` - * - * TIP: Consider using this library along with {SlotDerivation}. - */ -library StorageSlot { - struct AddressSlot { - address value; - } - - struct BooleanSlot { - bool value; - } - - struct Bytes32Slot { - bytes32 value; - } - - struct Uint256Slot { - uint256 value; - } - - struct Int256Slot { - int256 value; - } - - struct StringSlot { - string value; - } - - struct BytesSlot { - bytes value; - } - - /** - * @dev Returns an `AddressSlot` with member `value` located at `slot`. - */ - function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { - assembly ("memory-safe") { - r.slot := slot - } - } - - /** - * @dev Returns a `BooleanSlot` with member `value` located at `slot`. - */ - function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { - assembly ("memory-safe") { - r.slot := slot - } - } - - /** - * @dev Returns a `Bytes32Slot` with member `value` located at `slot`. - */ - function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { - assembly ("memory-safe") { - r.slot := slot - } - } - - /** - * @dev Returns a `Uint256Slot` with member `value` located at `slot`. - */ - function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { - assembly ("memory-safe") { - r.slot := slot - } - } - - /** - * @dev Returns a `Int256Slot` with member `value` located at `slot`. - */ - function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) { - assembly ("memory-safe") { - r.slot := slot - } - } - - /** - * @dev Returns a `StringSlot` with member `value` located at `slot`. - */ - function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { - assembly ("memory-safe") { - r.slot := slot - } - } - - /** - * @dev Returns an `StringSlot` representation of the string storage pointer `store`. - */ - function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { - assembly ("memory-safe") { - r.slot := store.slot - } - } - - /** - * @dev Returns a `BytesSlot` with member `value` located at `slot`. - */ - function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { - assembly ("memory-safe") { - r.slot := slot - } - } - - /** - * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. - */ - function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { - assembly ("memory-safe") { - r.slot := store.slot - } - } -} - -// lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol - -// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol) - -/** - * @dev Interface of the ERC-165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[ERC]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165 { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} - -// lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol - -// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol) -// This file was procedurally generated from scripts/generate/templates/SafeCast.js. - -/** - * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - */ -library SafeCast { - /** - * @dev Value doesn't fit in an uint of `bits` size. - */ - error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value); - - /** - * @dev An int value doesn't fit in an uint of `bits` size. - */ - error SafeCastOverflowedIntToUint(int256 value); - - /** - * @dev Value doesn't fit in an int of `bits` size. - */ - error SafeCastOverflowedIntDowncast(uint8 bits, int256 value); - - /** - * @dev An uint value doesn't fit in an int of `bits` size. - */ - error SafeCastOverflowedUintToInt(uint256 value); - - /** - * @dev Returns the downcasted uint248 from uint256, reverting on - * overflow (when the input is greater than largest uint248). - * - * Counterpart to Solidity's `uint248` operator. - * - * Requirements: - * - * - input must fit into 248 bits - */ - function toUint248(uint256 value) internal pure returns (uint248) { - if (value > type(uint248).max) { - revert SafeCastOverflowedUintDowncast(248, value); - } - return uint248(value); - } - - /** - * @dev Returns the downcasted uint240 from uint256, reverting on - * overflow (when the input is greater than largest uint240). - * - * Counterpart to Solidity's `uint240` operator. - * - * Requirements: - * - * - input must fit into 240 bits - */ - function toUint240(uint256 value) internal pure returns (uint240) { - if (value > type(uint240).max) { - revert SafeCastOverflowedUintDowncast(240, value); - } - return uint240(value); - } - - /** - * @dev Returns the downcasted uint232 from uint256, reverting on - * overflow (when the input is greater than largest uint232). - * - * Counterpart to Solidity's `uint232` operator. - * - * Requirements: - * - * - input must fit into 232 bits - */ - function toUint232(uint256 value) internal pure returns (uint232) { - if (value > type(uint232).max) { - revert SafeCastOverflowedUintDowncast(232, value); - } - return uint232(value); - } - - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - if (value > type(uint224).max) { - revert SafeCastOverflowedUintDowncast(224, value); - } - return uint224(value); - } - - /** - * @dev Returns the downcasted uint216 from uint256, reverting on - * overflow (when the input is greater than largest uint216). - * - * Counterpart to Solidity's `uint216` operator. - * - * Requirements: - * - * - input must fit into 216 bits - */ - function toUint216(uint256 value) internal pure returns (uint216) { - if (value > type(uint216).max) { - revert SafeCastOverflowedUintDowncast(216, value); - } - return uint216(value); - } - - /** - * @dev Returns the downcasted uint208 from uint256, reverting on - * overflow (when the input is greater than largest uint208). - * - * Counterpart to Solidity's `uint208` operator. - * - * Requirements: - * - * - input must fit into 208 bits - */ - function toUint208(uint256 value) internal pure returns (uint208) { - if (value > type(uint208).max) { - revert SafeCastOverflowedUintDowncast(208, value); - } - return uint208(value); - } - - /** - * @dev Returns the downcasted uint200 from uint256, reverting on - * overflow (when the input is greater than largest uint200). - * - * Counterpart to Solidity's `uint200` operator. - * - * Requirements: - * - * - input must fit into 200 bits - */ - function toUint200(uint256 value) internal pure returns (uint200) { - if (value > type(uint200).max) { - revert SafeCastOverflowedUintDowncast(200, value); - } - return uint200(value); - } - - /** - * @dev Returns the downcasted uint192 from uint256, reverting on - * overflow (when the input is greater than largest uint192). - * - * Counterpart to Solidity's `uint192` operator. - * - * Requirements: - * - * - input must fit into 192 bits - */ - function toUint192(uint256 value) internal pure returns (uint192) { - if (value > type(uint192).max) { - revert SafeCastOverflowedUintDowncast(192, value); - } - return uint192(value); - } - - /** - * @dev Returns the downcasted uint184 from uint256, reverting on - * overflow (when the input is greater than largest uint184). - * - * Counterpart to Solidity's `uint184` operator. - * - * Requirements: - * - * - input must fit into 184 bits - */ - function toUint184(uint256 value) internal pure returns (uint184) { - if (value > type(uint184).max) { - revert SafeCastOverflowedUintDowncast(184, value); - } - return uint184(value); - } - - /** - * @dev Returns the downcasted uint176 from uint256, reverting on - * overflow (when the input is greater than largest uint176). - * - * Counterpart to Solidity's `uint176` operator. - * - * Requirements: - * - * - input must fit into 176 bits - */ - function toUint176(uint256 value) internal pure returns (uint176) { - if (value > type(uint176).max) { - revert SafeCastOverflowedUintDowncast(176, value); - } - return uint176(value); - } - - /** - * @dev Returns the downcasted uint168 from uint256, reverting on - * overflow (when the input is greater than largest uint168). - * - * Counterpart to Solidity's `uint168` operator. - * - * Requirements: - * - * - input must fit into 168 bits - */ - function toUint168(uint256 value) internal pure returns (uint168) { - if (value > type(uint168).max) { - revert SafeCastOverflowedUintDowncast(168, value); - } - return uint168(value); - } - - /** - * @dev Returns the downcasted uint160 from uint256, reverting on - * overflow (when the input is greater than largest uint160). - * - * Counterpart to Solidity's `uint160` operator. - * - * Requirements: - * - * - input must fit into 160 bits - */ - function toUint160(uint256 value) internal pure returns (uint160) { - if (value > type(uint160).max) { - revert SafeCastOverflowedUintDowncast(160, value); - } - return uint160(value); - } - - /** - * @dev Returns the downcasted uint152 from uint256, reverting on - * overflow (when the input is greater than largest uint152). - * - * Counterpart to Solidity's `uint152` operator. - * - * Requirements: - * - * - input must fit into 152 bits - */ - function toUint152(uint256 value) internal pure returns (uint152) { - if (value > type(uint152).max) { - revert SafeCastOverflowedUintDowncast(152, value); - } - return uint152(value); - } - - /** - * @dev Returns the downcasted uint144 from uint256, reverting on - * overflow (when the input is greater than largest uint144). - * - * Counterpart to Solidity's `uint144` operator. - * - * Requirements: - * - * - input must fit into 144 bits - */ - function toUint144(uint256 value) internal pure returns (uint144) { - if (value > type(uint144).max) { - revert SafeCastOverflowedUintDowncast(144, value); - } - return uint144(value); - } - - /** - * @dev Returns the downcasted uint136 from uint256, reverting on - * overflow (when the input is greater than largest uint136). - * - * Counterpart to Solidity's `uint136` operator. - * - * Requirements: - * - * - input must fit into 136 bits - */ - function toUint136(uint256 value) internal pure returns (uint136) { - if (value > type(uint136).max) { - revert SafeCastOverflowedUintDowncast(136, value); - } - return uint136(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - if (value > type(uint128).max) { - revert SafeCastOverflowedUintDowncast(128, value); - } - return uint128(value); - } - - /** - * @dev Returns the downcasted uint120 from uint256, reverting on - * overflow (when the input is greater than largest uint120). - * - * Counterpart to Solidity's `uint120` operator. - * - * Requirements: - * - * - input must fit into 120 bits - */ - function toUint120(uint256 value) internal pure returns (uint120) { - if (value > type(uint120).max) { - revert SafeCastOverflowedUintDowncast(120, value); - } - return uint120(value); - } - - /** - * @dev Returns the downcasted uint112 from uint256, reverting on - * overflow (when the input is greater than largest uint112). - * - * Counterpart to Solidity's `uint112` operator. - * - * Requirements: - * - * - input must fit into 112 bits - */ - function toUint112(uint256 value) internal pure returns (uint112) { - if (value > type(uint112).max) { - revert SafeCastOverflowedUintDowncast(112, value); - } - return uint112(value); - } - - /** - * @dev Returns the downcasted uint104 from uint256, reverting on - * overflow (when the input is greater than largest uint104). - * - * Counterpart to Solidity's `uint104` operator. - * - * Requirements: - * - * - input must fit into 104 bits - */ - function toUint104(uint256 value) internal pure returns (uint104) { - if (value > type(uint104).max) { - revert SafeCastOverflowedUintDowncast(104, value); - } - return uint104(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - if (value > type(uint96).max) { - revert SafeCastOverflowedUintDowncast(96, value); - } - return uint96(value); - } - - /** - * @dev Returns the downcasted uint88 from uint256, reverting on - * overflow (when the input is greater than largest uint88). - * - * Counterpart to Solidity's `uint88` operator. - * - * Requirements: - * - * - input must fit into 88 bits - */ - function toUint88(uint256 value) internal pure returns (uint88) { - if (value > type(uint88).max) { - revert SafeCastOverflowedUintDowncast(88, value); - } - return uint88(value); - } - - /** - * @dev Returns the downcasted uint80 from uint256, reverting on - * overflow (when the input is greater than largest uint80). - * - * Counterpart to Solidity's `uint80` operator. - * - * Requirements: - * - * - input must fit into 80 bits - */ - function toUint80(uint256 value) internal pure returns (uint80) { - if (value > type(uint80).max) { - revert SafeCastOverflowedUintDowncast(80, value); - } - return uint80(value); - } - - /** - * @dev Returns the downcasted uint72 from uint256, reverting on - * overflow (when the input is greater than largest uint72). - * - * Counterpart to Solidity's `uint72` operator. - * - * Requirements: - * - * - input must fit into 72 bits - */ - function toUint72(uint256 value) internal pure returns (uint72) { - if (value > type(uint72).max) { - revert SafeCastOverflowedUintDowncast(72, value); - } - return uint72(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - if (value > type(uint64).max) { - revert SafeCastOverflowedUintDowncast(64, value); - } - return uint64(value); - } - - /** - * @dev Returns the downcasted uint56 from uint256, reverting on - * overflow (when the input is greater than largest uint56). - * - * Counterpart to Solidity's `uint56` operator. - * - * Requirements: - * - * - input must fit into 56 bits - */ - function toUint56(uint256 value) internal pure returns (uint56) { - if (value > type(uint56).max) { - revert SafeCastOverflowedUintDowncast(56, value); - } - return uint56(value); - } - - /** - * @dev Returns the downcasted uint48 from uint256, reverting on - * overflow (when the input is greater than largest uint48). - * - * Counterpart to Solidity's `uint48` operator. - * - * Requirements: - * - * - input must fit into 48 bits - */ - function toUint48(uint256 value) internal pure returns (uint48) { - if (value > type(uint48).max) { - revert SafeCastOverflowedUintDowncast(48, value); - } - return uint48(value); - } - - /** - * @dev Returns the downcasted uint40 from uint256, reverting on - * overflow (when the input is greater than largest uint40). - * - * Counterpart to Solidity's `uint40` operator. - * - * Requirements: - * - * - input must fit into 40 bits - */ - function toUint40(uint256 value) internal pure returns (uint40) { - if (value > type(uint40).max) { - revert SafeCastOverflowedUintDowncast(40, value); - } - return uint40(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - if (value > type(uint32).max) { - revert SafeCastOverflowedUintDowncast(32, value); - } - return uint32(value); - } - - /** - * @dev Returns the downcasted uint24 from uint256, reverting on - * overflow (when the input is greater than largest uint24). - * - * Counterpart to Solidity's `uint24` operator. - * - * Requirements: - * - * - input must fit into 24 bits - */ - function toUint24(uint256 value) internal pure returns (uint24) { - if (value > type(uint24).max) { - revert SafeCastOverflowedUintDowncast(24, value); - } - return uint24(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - if (value > type(uint16).max) { - revert SafeCastOverflowedUintDowncast(16, value); - } - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits - */ - function toUint8(uint256 value) internal pure returns (uint8) { - if (value > type(uint8).max) { - revert SafeCastOverflowedUintDowncast(8, value); - } - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - if (value < 0) { - revert SafeCastOverflowedIntToUint(value); - } - return uint256(value); - } - - /** - * @dev Returns the downcasted int248 from int256, reverting on - * overflow (when the input is less than smallest int248 or - * greater than largest int248). - * - * Counterpart to Solidity's `int248` operator. - * - * Requirements: - * - * - input must fit into 248 bits - */ - function toInt248(int256 value) internal pure returns (int248 downcasted) { - downcasted = int248(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(248, value); - } - } - - /** - * @dev Returns the downcasted int240 from int256, reverting on - * overflow (when the input is less than smallest int240 or - * greater than largest int240). - * - * Counterpart to Solidity's `int240` operator. - * - * Requirements: - * - * - input must fit into 240 bits - */ - function toInt240(int256 value) internal pure returns (int240 downcasted) { - downcasted = int240(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(240, value); - } - } - - /** - * @dev Returns the downcasted int232 from int256, reverting on - * overflow (when the input is less than smallest int232 or - * greater than largest int232). - * - * Counterpart to Solidity's `int232` operator. - * - * Requirements: - * - * - input must fit into 232 bits - */ - function toInt232(int256 value) internal pure returns (int232 downcasted) { - downcasted = int232(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(232, value); - } - } - - /** - * @dev Returns the downcasted int224 from int256, reverting on - * overflow (when the input is less than smallest int224 or - * greater than largest int224). - * - * Counterpart to Solidity's `int224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toInt224(int256 value) internal pure returns (int224 downcasted) { - downcasted = int224(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(224, value); - } - } - - /** - * @dev Returns the downcasted int216 from int256, reverting on - * overflow (when the input is less than smallest int216 or - * greater than largest int216). - * - * Counterpart to Solidity's `int216` operator. - * - * Requirements: - * - * - input must fit into 216 bits - */ - function toInt216(int256 value) internal pure returns (int216 downcasted) { - downcasted = int216(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(216, value); - } - } - - /** - * @dev Returns the downcasted int208 from int256, reverting on - * overflow (when the input is less than smallest int208 or - * greater than largest int208). - * - * Counterpart to Solidity's `int208` operator. - * - * Requirements: - * - * - input must fit into 208 bits - */ - function toInt208(int256 value) internal pure returns (int208 downcasted) { - downcasted = int208(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(208, value); - } - } - - /** - * @dev Returns the downcasted int200 from int256, reverting on - * overflow (when the input is less than smallest int200 or - * greater than largest int200). - * - * Counterpart to Solidity's `int200` operator. - * - * Requirements: - * - * - input must fit into 200 bits - */ - function toInt200(int256 value) internal pure returns (int200 downcasted) { - downcasted = int200(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(200, value); - } - } - - /** - * @dev Returns the downcasted int192 from int256, reverting on - * overflow (when the input is less than smallest int192 or - * greater than largest int192). - * - * Counterpart to Solidity's `int192` operator. - * - * Requirements: - * - * - input must fit into 192 bits - */ - function toInt192(int256 value) internal pure returns (int192 downcasted) { - downcasted = int192(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(192, value); - } - } - - /** - * @dev Returns the downcasted int184 from int256, reverting on - * overflow (when the input is less than smallest int184 or - * greater than largest int184). - * - * Counterpart to Solidity's `int184` operator. - * - * Requirements: - * - * - input must fit into 184 bits - */ - function toInt184(int256 value) internal pure returns (int184 downcasted) { - downcasted = int184(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(184, value); - } - } - - /** - * @dev Returns the downcasted int176 from int256, reverting on - * overflow (when the input is less than smallest int176 or - * greater than largest int176). - * - * Counterpart to Solidity's `int176` operator. - * - * Requirements: - * - * - input must fit into 176 bits - */ - function toInt176(int256 value) internal pure returns (int176 downcasted) { - downcasted = int176(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(176, value); - } - } - - /** - * @dev Returns the downcasted int168 from int256, reverting on - * overflow (when the input is less than smallest int168 or - * greater than largest int168). - * - * Counterpart to Solidity's `int168` operator. - * - * Requirements: - * - * - input must fit into 168 bits - */ - function toInt168(int256 value) internal pure returns (int168 downcasted) { - downcasted = int168(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(168, value); - } - } - - /** - * @dev Returns the downcasted int160 from int256, reverting on - * overflow (when the input is less than smallest int160 or - * greater than largest int160). - * - * Counterpart to Solidity's `int160` operator. - * - * Requirements: - * - * - input must fit into 160 bits - */ - function toInt160(int256 value) internal pure returns (int160 downcasted) { - downcasted = int160(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(160, value); - } - } - - /** - * @dev Returns the downcasted int152 from int256, reverting on - * overflow (when the input is less than smallest int152 or - * greater than largest int152). - * - * Counterpart to Solidity's `int152` operator. - * - * Requirements: - * - * - input must fit into 152 bits - */ - function toInt152(int256 value) internal pure returns (int152 downcasted) { - downcasted = int152(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(152, value); - } - } - - /** - * @dev Returns the downcasted int144 from int256, reverting on - * overflow (when the input is less than smallest int144 or - * greater than largest int144). - * - * Counterpart to Solidity's `int144` operator. - * - * Requirements: - * - * - input must fit into 144 bits - */ - function toInt144(int256 value) internal pure returns (int144 downcasted) { - downcasted = int144(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(144, value); - } - } - - /** - * @dev Returns the downcasted int136 from int256, reverting on - * overflow (when the input is less than smallest int136 or - * greater than largest int136). - * - * Counterpart to Solidity's `int136` operator. - * - * Requirements: - * - * - input must fit into 136 bits - */ - function toInt136(int256 value) internal pure returns (int136 downcasted) { - downcasted = int136(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(136, value); - } - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toInt128(int256 value) internal pure returns (int128 downcasted) { - downcasted = int128(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(128, value); - } - } - - /** - * @dev Returns the downcasted int120 from int256, reverting on - * overflow (when the input is less than smallest int120 or - * greater than largest int120). - * - * Counterpart to Solidity's `int120` operator. - * - * Requirements: - * - * - input must fit into 120 bits - */ - function toInt120(int256 value) internal pure returns (int120 downcasted) { - downcasted = int120(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(120, value); - } - } - - /** - * @dev Returns the downcasted int112 from int256, reverting on - * overflow (when the input is less than smallest int112 or - * greater than largest int112). - * - * Counterpart to Solidity's `int112` operator. - * - * Requirements: - * - * - input must fit into 112 bits - */ - function toInt112(int256 value) internal pure returns (int112 downcasted) { - downcasted = int112(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(112, value); - } - } - - /** - * @dev Returns the downcasted int104 from int256, reverting on - * overflow (when the input is less than smallest int104 or - * greater than largest int104). - * - * Counterpart to Solidity's `int104` operator. - * - * Requirements: - * - * - input must fit into 104 bits - */ - function toInt104(int256 value) internal pure returns (int104 downcasted) { - downcasted = int104(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(104, value); - } - } - - /** - * @dev Returns the downcasted int96 from int256, reverting on - * overflow (when the input is less than smallest int96 or - * greater than largest int96). - * - * Counterpart to Solidity's `int96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toInt96(int256 value) internal pure returns (int96 downcasted) { - downcasted = int96(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(96, value); - } - } - - /** - * @dev Returns the downcasted int88 from int256, reverting on - * overflow (when the input is less than smallest int88 or - * greater than largest int88). - * - * Counterpart to Solidity's `int88` operator. - * - * Requirements: - * - * - input must fit into 88 bits - */ - function toInt88(int256 value) internal pure returns (int88 downcasted) { - downcasted = int88(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(88, value); - } - } - - /** - * @dev Returns the downcasted int80 from int256, reverting on - * overflow (when the input is less than smallest int80 or - * greater than largest int80). - * - * Counterpart to Solidity's `int80` operator. - * - * Requirements: - * - * - input must fit into 80 bits - */ - function toInt80(int256 value) internal pure returns (int80 downcasted) { - downcasted = int80(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(80, value); - } - } - - /** - * @dev Returns the downcasted int72 from int256, reverting on - * overflow (when the input is less than smallest int72 or - * greater than largest int72). - * - * Counterpart to Solidity's `int72` operator. - * - * Requirements: - * - * - input must fit into 72 bits - */ - function toInt72(int256 value) internal pure returns (int72 downcasted) { - downcasted = int72(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(72, value); - } - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toInt64(int256 value) internal pure returns (int64 downcasted) { - downcasted = int64(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(64, value); - } - } - - /** - * @dev Returns the downcasted int56 from int256, reverting on - * overflow (when the input is less than smallest int56 or - * greater than largest int56). - * - * Counterpart to Solidity's `int56` operator. - * - * Requirements: - * - * - input must fit into 56 bits - */ - function toInt56(int256 value) internal pure returns (int56 downcasted) { - downcasted = int56(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(56, value); - } - } - - /** - * @dev Returns the downcasted int48 from int256, reverting on - * overflow (when the input is less than smallest int48 or - * greater than largest int48). - * - * Counterpart to Solidity's `int48` operator. - * - * Requirements: - * - * - input must fit into 48 bits - */ - function toInt48(int256 value) internal pure returns (int48 downcasted) { - downcasted = int48(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(48, value); - } - } - - /** - * @dev Returns the downcasted int40 from int256, reverting on - * overflow (when the input is less than smallest int40 or - * greater than largest int40). - * - * Counterpart to Solidity's `int40` operator. - * - * Requirements: - * - * - input must fit into 40 bits - */ - function toInt40(int256 value) internal pure returns (int40 downcasted) { - downcasted = int40(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(40, value); - } - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toInt32(int256 value) internal pure returns (int32 downcasted) { - downcasted = int32(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(32, value); - } - } - - /** - * @dev Returns the downcasted int24 from int256, reverting on - * overflow (when the input is less than smallest int24 or - * greater than largest int24). - * - * Counterpart to Solidity's `int24` operator. - * - * Requirements: - * - * - input must fit into 24 bits - */ - function toInt24(int256 value) internal pure returns (int24 downcasted) { - downcasted = int24(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(24, value); - } - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toInt16(int256 value) internal pure returns (int16 downcasted) { - downcasted = int16(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(16, value); - } - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits - */ - function toInt8(int256 value) internal pure returns (int8 downcasted) { - downcasted = int8(value); - if (downcasted != value) { - revert SafeCastOverflowedIntDowncast(8, value); - } - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - if (value > uint256(type(int256).max)) { - revert SafeCastOverflowedUintToInt(value); - } - return int256(value); - } - - /** - * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump. - */ - function toUint(bool b) internal pure returns (uint256 u) { - assembly ("memory-safe") { - u := iszero(iszero(b)) - } - } -} - -// src/modules/library/RuleEngineInvariantStorage.sol - -abstract contract RuleEngineInvariantStorage { - /* ==== Errors === */ - error RuleEngine_AdminWithAddressZeroNotAllowed(); -} - -// lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7551.sol - -/** - * @title IERC7551Mint - * @dev Interface for token minting operations. - */ -interface IERC7551Mint { - /** - * @notice Emitted when new tokens are minted and assigned to an account. - * @param minter The address that initiated the mint operation. - * @param account The address receiving the newly minted tokens. - * @param value The amount of tokens created. - * @param data Optional metadata associated with the mint (e.g., reason, reference ID). - */ - event Mint(address indexed minter, address indexed account, uint256 value, bytes data); - /** - * @notice Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0) - * @dev - * - Increases the total supply of tokens. - * - Emits both a `Mint` event and a standard ERC-20 `Transfer` event (with `from` set to the zero address). - * - The `data` parameter can be used to attach off-chain metadata or audit information. - * - If {IERC7551Pause} is implemented: - * - Token issuance MUST NOT be blocked by paused transfer state. - * Requirements: - * - `account` cannot be the zero address - * @param account The address that will receive the newly minted tokens. - * @param value The amount of tokens to mint. - * @param data Additional contextual data to include with the mint (optional). - */ - function mint(address account, uint256 value, bytes calldata data) external; -} - -/** -* @title interface for burn operation -*/ -interface IERC7551Burn { - /** - * @notice Emitted when tokens are burned from an account. - * @param burner The address that initiated the burn. - * @param account The address from which tokens were burned. - * @param value The amount of tokens burned. - * @param data Additional data related to the burn. - */ - event Burn(address indexed burner, address indexed account, uint256 value, bytes data); - - /** - * @notice Burns a specific number of tokens from the given account by transferring it to address(0) - * @dev - * - The account's balance is decreased by the specified amount. - * - Emits a `Burn` event and a standard `Transfer` event with `to` set to `address(0)`. - * - If the account balance (including frozen tokens) is less than the burn amount, the transaction MUST revert. - * - If the token contract supports {IERC7551Pause}, paused transfers MUST NOT prevent this burn operation. - * - The `data` parameter MAY be used to provide additional context (e.g., audit trail or documentation). - * @param account The address whose tokens will be burned. - * @param amount The number of tokens to remove from circulation. - * @param data Arbitrary additional data to document the burn. - */ - function burn(address account, uint256 amount, bytes calldata data) external; -} - -interface IERC7551Pause { - /** - * @notice Returns true if token transfers are currently paused. - * @return True if paused, false otherwise. - * @dev - * If this function returns true, it MUST NOT be possible to transfer tokens to other accounts - * and the function canTransfer() MUST return false. - */ - function paused() external view returns (bool); - /** - * @notice Pauses token transfers. - * @dev Reverts if already paused. - * Emits a `Paused` event - */ - function pause() external; - /** - * @notice Unpauses token transfers. - * @dev Reverts if token is not in pause state. - * emits an `Unpaused` event - */ - function unpause() external; -} -interface IERC7551ERC20EnforcementEvent { - /** - * @notice Emitted when a forced transfer or burn occurs. - * @param enforcer The address that initiated the enforcement. - * @param account The address affected by the enforcement. - * @param amount The number of tokens involved. - * @param data Additional data related to the enforcement. - */ - event Enforcement (address indexed enforcer, address indexed account, uint256 amount, bytes data); -} - -interface IERC7551ERC20EnforcementTokenFrozenEvent { - /** - * @notice Emitted when a specific amount of tokens are frozen on an address. - * @param account The address whose tokens are frozen. - * @param value The number of tokens frozen. - * @param data Additional data related to the freezing action. - * @dev - * Same name as ERC-3643 but with a supplementary data parameter - * The event is emitted by freezePartialTokens and batchFreezePartialTokens functions - */ - event TokensFrozen(address indexed account, uint256 value, bytes data); - - /** - * @notice Emitted when a specific amount of tokens are unfrozen on an address. - * @param account The address whose tokens are unfrozen. - * @param value The number of tokens unfrozen. - * @param data Additional data related to the unfreezing action. - * @dev - * Same name as ERC-3643 but with a supplementary data parameter - * The event is emitted by `unfreezePartialTokens`, `batchUnfreezePartialTokens`and potentially `forcedTransfer` functions - */ - event TokensUnfrozen(address indexed account, uint256 value, bytes data); -} - -interface IERC7551ERC20Enforcement { - /* ============ View Functions ============ */ - /** - * @notice Returns the active (unfrozen) token balance of a given account. - * @param account The address to query. - * @return activeBalance_ The amount of tokens that can be transferred using standard ERC-20 functions. - */ - function getActiveBalanceOf(address account) external view returns (uint256 activeBalance_); - - /** - * @notice Returns the frozen token balance of a given account. - * @dev Frozen tokens cannot be transferred using standard ERC-20 functions. - * Implementations MAY support transferring frozen tokens using other mechanisms like `forcedTransfer`. - * If the active balance is insufficient to cover a transfer, `canTransfer` and `canTransferFrom` MUST return false. - * @param account The address to query. - * @return frozenBalance_ The amount of tokens that are frozen and non-transferable via ERC-20 `transfer` and `transferFrom`. - */ - function getFrozenTokens(address account) external view returns (uint256 frozenBalance_); - - /* ============ State Functions ============ */ - /** - * @notice Freezes a specified amount of tokens for a given account. - * @dev Emits a `TokensFrozen` event. - * @param account The address whose tokens will be frozen. - * @param amount The number of tokens to freeze. - * @param data Arbitrary additional data for logging or business logic. - */ - function freezePartialTokens(address account, uint256 amount, bytes memory data) external; - - - /** - * @notice Unfreezes a specified amount of tokens for a given account. - * @dev Emits a `TokensUnfrozen` event. - * @param account The address whose tokens will be unfrozen. - * @param amount The number of tokens to unfreeze. - * @param data Arbitrary additional data for logging or business logic. - */ - function unfreezePartialTokens(address account, uint256 amount, bytes memory data) external; - /** - * @notice Executes a forced transfer of tokens from one account to another. - * @dev Transfers `value` tokens from `account` to `to` without requiring the account’s consent. - * If the `account` does not have enough active (unfrozen) tokens, frozen tokens may be automatically unfrozen to fulfill the transfer. - * Emits a `Transfer` event. Emits a `TokensUnfrozen` event if frozen tokens are used. - * @param account The address to debit tokens from. - * @param to The address to credit tokens to. - * @param value The amount of tokens to transfer. - * @param data Optional additional metadata to accompany the transfer. - * @return success_ Returns true if the transfer was successful. - */ - function forcedTransfer(address account, address to, uint256 value, bytes calldata data) external returns (bool success_); -} - -interface IERC7551Compliance is IERC3643ComplianceRead { - /** - * @notice Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules. - * @dev Does not check balances or access rights (Access Control). - * @param spender The address performing the transfer. - * @param from The source address. - * @param to The destination address. - * @param value The number of tokens to transfer. - * @return isCompliant True if the transfer complies with policy. - */ - function canTransferFrom( - address spender, - address from, - address to, - uint256 value - ) external view returns (bool); -} - -interface IERC7551Document { - /** - * @notice Returns the hash of the "Terms" document. - * @return hash_ The `bytes32` hash of the terms document. - */ - function termsHash() external view returns (bytes32 hash_); - - /** - * @notice Sets the terms hash and URI. - * @param _hash The new hash of the document. - * @param _uri The corresponding URI. - */ - function setTerms(bytes32 _hash, string calldata _uri) external; - - /** - * @notice Returns the metadata string (e.g. URL). - * @return metadata_ The metadata string. - */ - function metaData() external view returns (string memory metadata_); - - /** - * @notice Sets a new metadata string (e.g. URL). - * @param metaData_ The new metadata value. - */ - function setMetaData(string calldata metaData_) external; -} - -// lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol - -// OpenZeppelin Contracts (last updated v5.4.0) (metatx/ERC2771Context.sol) - -/** - * @dev Context variant with ERC-2771 support. - * - * WARNING: Avoid using this pattern in contracts that rely in a specific calldata length as they'll - * be affected by any forwarder whose `msg.data` is suffixed with the `from` address according to the ERC-2771 - * specification adding the address size in bytes (20) to the calldata size. An example of an unexpected - * behavior could be an unintended fallback (or another function) invocation while trying to invoke the `receive` - * function only accessible if `msg.data.length == 0`. - * - * WARNING: The usage of `delegatecall` in this contract is dangerous and may result in context corruption. - * Any forwarded request to this contract triggering a `delegatecall` to itself will result in an invalid {_msgSender} - * recovery. - */ -abstract contract ERC2771Context is Context { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _trustedForwarder; - - /** - * @dev Initializes the contract with a trusted forwarder, which will be able to - * invoke functions on this contract on behalf of other accounts. - * - * NOTE: The trusted forwarder can be replaced by overriding {trustedForwarder}. - */ - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address trustedForwarder_) { - _trustedForwarder = trustedForwarder_; - } - - /** - * @dev Returns the address of the trusted forwarder. - */ - function trustedForwarder() public view virtual returns (address) { - return _trustedForwarder; - } - - /** - * @dev Indicates whether any particular address is the trusted forwarder. - */ - function isTrustedForwarder(address forwarder) public view virtual returns (bool) { - return forwarder == trustedForwarder(); - } - - /** - * @dev Override for `msg.sender`. Defaults to the original `msg.sender` whenever - * a call is not performed by the trusted forwarder or the calldata length is less than - * 20 bytes (an address length). - */ - function _msgSender() internal view virtual override returns (address) { - uint256 calldataLength = msg.data.length; - uint256 contextSuffixLength = _contextSuffixLength(); - if (calldataLength >= contextSuffixLength && isTrustedForwarder(msg.sender)) { - unchecked { - return address(bytes20(msg.data[calldataLength - contextSuffixLength:])); - } - } else { - return super._msgSender(); - } - } - - /** - * @dev Override for `msg.data`. Defaults to the original `msg.data` whenever - * a call is not performed by the trusted forwarder or the calldata length is less than - * 20 bytes (an address length). - */ - function _msgData() internal view virtual override returns (bytes calldata) { - uint256 calldataLength = msg.data.length; - uint256 contextSuffixLength = _contextSuffixLength(); - if (calldataLength >= contextSuffixLength && isTrustedForwarder(msg.sender)) { - unchecked { - return msg.data[:calldataLength - contextSuffixLength]; - } - } else { - return super._msgData(); - } - } - - /** - * @dev ERC-2771 specifies the context as being a single address (20 bytes). - */ - function _contextSuffixLength() internal view virtual override returns (uint256) { - return 20; - } -} - -// lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol - -// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol) - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - */ -abstract contract ERC165 is IERC165 { - /// @inheritdoc IERC165 - function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { - return interfaceId == type(IERC165).interfaceId; - } -} - -// src/interfaces/IERC3643Compliance.sol - -/* ==== CMTAT === */ - -interface IERC3643Compliance is IERC3643ComplianceRead, IERC3643IComplianceContract { - /* ============ Events ============ */ - /** - * @notice Emitted when a token is successfully bound to the compliance contract. - * @param token The address of the token that was bound. - */ - event TokenBound(address token); - - /** - * @notice Emitted when a token is successfully unbound from the compliance contract. - * @param token The address of the token that was unbound. - */ - event TokenUnbound(address token); - - /* ============ Functions ============ */ - /** - * @notice Associates a token contract with this compliance contract. - * @dev The compliance contract may restrict operations on the bound token - * according to the compliance logic. - * Reverts if the token is already bound. - * Complexity: O(1). - * @param token The address of the token to bind. - */ - function bindToken(address token) external; - /** - * @notice Removes the association of a token contract from this compliance contract. - * @dev Reverts if the token is not currently bound. - * Complexity: O(1). - * @param token The address of the token to unbind. - */ - function unbindToken(address token) external; - - /** - * @notice Checks whether a token is currently bound to this compliance contract. - * @dev - * Complexity: O(1). - * Note that there are no guarantees on the ordering of values inside the array, - * and it may change when more values are added or removed. - * @param token The token address to verify. - * @return isBound True if the token is bound, false otherwise. - */ - function isTokenBound(address token) external view returns (bool isBound); - /** - * @notice Returns the single token currently bound to this compliance contract. - * @dev If multiple tokens are supported, consider using getTokenBounds(). - * @return token The address of the currently bound token. - */ - function getTokenBound() external view returns (address token); - - /** - * @notice Returns all tokens currently bound to this compliance contract. - * @dev This is a view-only function and does not modify state. - * This function is not part of the original ERC-3643 specification - * This operation will copy the entire storage to memory, which can be quite expensive. - * This is designed to mostly be used by view accessors that are queried without any gas fees. - * @return tokens An array of addresses of bound token contracts. - */ - function getTokenBounds() external view returns (address[] memory tokens); - - /** - * @notice Updates the compliance contract state when tokens are created (minted). - * @dev Called by the token contract when new tokens are issued to an account. - * Reverts if the minting does not comply with the rules. - * @param to The address receiving the minted tokens. - * @param value The number of tokens created. - */ - function created(address to, uint256 value) external; - - /** - * @notice Updates the compliance contract state when tokens are destroyed (burned). - * @dev Called by the token contract when tokens are redeemed or burned. - * Reverts if the burning does not comply with the rules. - * @param from The address whose tokens are being destroyed. - * @param value The number of tokens destroyed. - */ - function destroyed(address from, uint256 value) external; -} - -// src/modules/VersionModule.sol - -/* ==== CMTAT === */ - -abstract contract VersionModule is IERC3643Base { - /* ============ State Variables ============ */ - /** - * @dev - * Get the current version of the smart contract - */ - string private constant VERSION = "3.0.0"; - /* ============ Events ============ */ - /*////////////////////////////////////////////////////////////// - PUBLIC/EXTERNAL FUNCTIONS - //////////////////////////////////////////////////////////////*/ - /** - * @inheritdoc IERC3643Base - */ - function version() public view virtual override(IERC3643Base) returns (string memory version_) { - return VERSION; - } -} - -// lib/openzeppelin-contracts/contracts/utils/math/Math.sol - -// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol) - -/** - * @dev Standard math utilities missing in the Solidity language. - */ -library Math { - enum Rounding { - Floor, // Toward negative infinity - Ceil, // Toward positive infinity - Trunc, // Toward zero - Expand // Away from zero - } - - /** - * @dev Return the 512-bit addition of two uint256. - * - * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low. - */ - function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) { - assembly ("memory-safe") { - low := add(a, b) - high := lt(low, a) - } - } - - /** - * @dev Return the 512-bit multiplication of two uint256. - * - * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low. - */ - function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) { - // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use - // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 - // variables such that product = high * 2²⁵⁶ + low. - assembly ("memory-safe") { - let mm := mulmod(a, b, not(0)) - low := mul(a, b) - high := sub(sub(mm, low), lt(mm, low)) - } - } - - /** - * @dev Returns the addition of two unsigned integers, with a success flag (no overflow). - */ - function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { - unchecked { - uint256 c = a + b; - success = c >= a; - result = c * SafeCast.toUint(success); - } - } - - /** - * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow). - */ - function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { - unchecked { - uint256 c = a - b; - success = c <= a; - result = c * SafeCast.toUint(success); - } - } - - /** - * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow). - */ - function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { - unchecked { - uint256 c = a * b; - assembly ("memory-safe") { - // Only true when the multiplication doesn't overflow - // (c / a == b) || (a == 0) - success := or(eq(div(c, a), b), iszero(a)) - } - // equivalent to: success ? c : 0 - result = c * SafeCast.toUint(success); - } - } - - /** - * @dev Returns the division of two unsigned integers, with a success flag (no division by zero). - */ - function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { - unchecked { - success = b > 0; - assembly ("memory-safe") { - // The `DIV` opcode returns zero when the denominator is 0. - result := div(a, b) - } - } - } - - /** - * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero). - */ - function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { - unchecked { - success = b > 0; - assembly ("memory-safe") { - // The `MOD` opcode returns zero when the denominator is 0. - result := mod(a, b) - } - } - } - - /** - * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing. - */ - function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) { - (bool success, uint256 result) = tryAdd(a, b); - return ternary(success, result, type(uint256).max); - } - - /** - * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing. - */ - function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) { - (, uint256 result) = trySub(a, b); - return result; - } - - /** - * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing. - */ - function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) { - (bool success, uint256 result) = tryMul(a, b); - return ternary(success, result, type(uint256).max); - } - - /** - * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant. - * - * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone. - * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute - * one branch when needed, making this function more expensive. - */ - function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) { - unchecked { - // branchless ternary works because: - // b ^ (a ^ b) == a - // b ^ 0 == b - return b ^ ((a ^ b) * SafeCast.toUint(condition)); - } - } - - /** - * @dev Returns the largest of two numbers. - */ - function max(uint256 a, uint256 b) internal pure returns (uint256) { - return ternary(a > b, a, b); - } - - /** - * @dev Returns the smallest of two numbers. - */ - function min(uint256 a, uint256 b) internal pure returns (uint256) { - return ternary(a < b, a, b); - } - - /** - * @dev Returns the average of two numbers. The result is rounded towards - * zero. - */ - function average(uint256 a, uint256 b) internal pure returns (uint256) { - // (a + b) / 2 can overflow. - return (a & b) + (a ^ b) / 2; - } - - /** - * @dev Returns the ceiling of the division of two numbers. - * - * This differs from standard division with `/` in that it rounds towards infinity instead - * of rounding towards zero. - */ - function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { - if (b == 0) { - // Guarantee the same behavior as in a regular Solidity division. - Panic.panic(Panic.DIVISION_BY_ZERO); - } - - // The following calculation ensures accurate ceiling division without overflow. - // Since a is non-zero, (a - 1) / b will not overflow. - // The largest possible result occurs when (a - 1) / b is type(uint256).max, - // but the largest value we can obtain is type(uint256).max - 1, which happens - // when a = type(uint256).max and b = 1. - unchecked { - return SafeCast.toUint(a > 0) * ((a - 1) / b + 1); - } - } - - /** - * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or - * denominator == 0. - * - * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by - * Uniswap Labs also under MIT license. - */ - function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { - unchecked { - (uint256 high, uint256 low) = mul512(x, y); - - // Handle non-overflow cases, 256 by 256 division. - if (high == 0) { - // Solidity will revert if denominator == 0, unlike the div opcode on its own. - // The surrounding unchecked block does not change this fact. - // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. - return low / denominator; - } - - // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0. - if (denominator <= high) { - Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW)); - } - - /////////////////////////////////////////////// - // 512 by 256 division. - /////////////////////////////////////////////// - - // Make division exact by subtracting the remainder from [high low]. - uint256 remainder; - assembly ("memory-safe") { - // Compute remainder using mulmod. - remainder := mulmod(x, y, denominator) - - // Subtract 256 bit number from 512 bit number. - high := sub(high, gt(remainder, low)) - low := sub(low, remainder) - } - - // Factor powers of two out of denominator and compute largest power of two divisor of denominator. - // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. - - uint256 twos = denominator & (0 - denominator); - assembly ("memory-safe") { - // Divide denominator by twos. - denominator := div(denominator, twos) - - // Divide [high low] by twos. - low := div(low, twos) - - // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one. - twos := add(div(sub(0, twos), twos), 1) - } - - // Shift in bits from high into low. - low |= high * twos; - - // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such - // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for - // four bits. That is, denominator * inv ≡ 1 mod 2⁴. - uint256 inverse = (3 * denominator) ^ 2; - - // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also - // works in modular arithmetic, doubling the correct bits in each step. - inverse *= 2 - denominator * inverse; // inverse mod 2⁸ - inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶ - inverse *= 2 - denominator * inverse; // inverse mod 2³² - inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴ - inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸ - inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶ - - // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. - // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is - // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high - // is no longer required. - result = low * inverse; - return result; - } - } - - /** - * @dev Calculates x * y / denominator with full precision, following the selected rounding direction. - */ - function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { - return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0); - } - - /** - * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256. - */ - function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) { - unchecked { - (uint256 high, uint256 low) = mul512(x, y); - if (high >= 1 << n) { - Panic.panic(Panic.UNDER_OVERFLOW); - } - return (high << (256 - n)) | (low >> n); - } - } - - /** - * @dev Calculates x * y >> n with full precision, following the selected rounding direction. - */ - function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) { - return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0); - } - - /** - * @dev Calculate the modular multiplicative inverse of a number in Z/nZ. - * - * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0. - * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible. - * - * If the input value is not inversible, 0 is returned. - * - * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the - * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}. - */ - function invMod(uint256 a, uint256 n) internal pure returns (uint256) { - unchecked { - if (n == 0) return 0; - - // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version) - // Used to compute integers x and y such that: ax + ny = gcd(a, n). - // When the gcd is 1, then the inverse of a modulo n exists and it's x. - // ax + ny = 1 - // ax = 1 + (-y)n - // ax ≡ 1 (mod n) # x is the inverse of a modulo n - - // If the remainder is 0 the gcd is n right away. - uint256 remainder = a % n; - uint256 gcd = n; - - // Therefore the initial coefficients are: - // ax + ny = gcd(a, n) = n - // 0a + 1n = n - int256 x = 0; - int256 y = 1; - - while (remainder != 0) { - uint256 quotient = gcd / remainder; - - (gcd, remainder) = ( - // The old remainder is the next gcd to try. - remainder, - // Compute the next remainder. - // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd - // where gcd is at most n (capped to type(uint256).max) - gcd - remainder * quotient - ); - - (x, y) = ( - // Increment the coefficient of a. - y, - // Decrement the coefficient of n. - // Can overflow, but the result is casted to uint256 so that the - // next value of y is "wrapped around" to a value between 0 and n - 1. - x - y * int256(quotient) - ); - } - - if (gcd != 1) return 0; // No inverse exists. - return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative. - } - } - - /** - * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`. - * - * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is - * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that - * `a**(p-2)` is the modular multiplicative inverse of a in Fp. - * - * NOTE: this function does NOT check that `p` is a prime greater than `2`. - */ - function invModPrime(uint256 a, uint256 p) internal view returns (uint256) { - unchecked { - return Math.modExp(a, p - 2, p); - } - } - - /** - * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m) - * - * Requirements: - * - modulus can't be zero - * - underlying staticcall to precompile must succeed - * - * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make - * sure the chain you're using it on supports the precompiled contract for modular exponentiation - * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, - * the underlying function will succeed given the lack of a revert, but the result may be incorrectly - * interpreted as 0. - */ - function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) { - (bool success, uint256 result) = tryModExp(b, e, m); - if (!success) { - Panic.panic(Panic.DIVISION_BY_ZERO); - } - return result; - } - - /** - * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m). - * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying - * to operate modulo 0 or if the underlying precompile reverted. - * - * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain - * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in - * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack - * of a revert, but the result may be incorrectly interpreted as 0. - */ - function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) { - if (m == 0) return (false, 0); - assembly ("memory-safe") { - let ptr := mload(0x40) - // | Offset | Content | Content (Hex) | - // |-----------|------------|--------------------------------------------------------------------| - // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 | - // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 | - // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 | - // | 0x60:0x7f | value of b | 0x<.............................................................b> | - // | 0x80:0x9f | value of e | 0x<.............................................................e> | - // | 0xa0:0xbf | value of m | 0x<.............................................................m> | - mstore(ptr, 0x20) - mstore(add(ptr, 0x20), 0x20) - mstore(add(ptr, 0x40), 0x20) - mstore(add(ptr, 0x60), b) - mstore(add(ptr, 0x80), e) - mstore(add(ptr, 0xa0), m) - - // Given the result < m, it's guaranteed to fit in 32 bytes, - // so we can use the memory scratch space located at offset 0. - success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20) - result := mload(0x00) - } - } - - /** - * @dev Variant of {modExp} that supports inputs of arbitrary length. - */ - function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) { - (bool success, bytes memory result) = tryModExp(b, e, m); - if (!success) { - Panic.panic(Panic.DIVISION_BY_ZERO); - } - return result; - } - - /** - * @dev Variant of {tryModExp} that supports inputs of arbitrary length. - */ - function tryModExp( - bytes memory b, - bytes memory e, - bytes memory m - ) internal view returns (bool success, bytes memory result) { - if (_zeroBytes(m)) return (false, new bytes(0)); - - uint256 mLen = m.length; - - // Encode call args in result and move the free memory pointer - result = abi.encodePacked(b.length, e.length, mLen, b, e, m); - - assembly ("memory-safe") { - let dataPtr := add(result, 0x20) - // Write result on top of args to avoid allocating extra memory. - success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen) - // Overwrite the length. - // result.length > returndatasize() is guaranteed because returndatasize() == m.length - mstore(result, mLen) - // Set the memory pointer after the returned data. - mstore(0x40, add(dataPtr, mLen)) - } - } - - /** - * @dev Returns whether the provided byte array is zero. - */ - function _zeroBytes(bytes memory byteArray) private pure returns (bool) { - for (uint256 i = 0; i < byteArray.length; ++i) { - if (byteArray[i] != 0) { - return false; - } - } - return true; - } - - /** - * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded - * towards zero. - * - * This method is based on Newton's method for computing square roots; the algorithm is restricted to only - * using integer operations. - */ - function sqrt(uint256 a) internal pure returns (uint256) { - unchecked { - // Take care of easy edge cases when a == 0 or a == 1 - if (a <= 1) { - return a; - } - - // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a - // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between - // the current value as `ε_n = | x_n - sqrt(a) |`. - // - // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root - // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is - // bigger than any uint256. - // - // By noticing that - // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)` - // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar - // to the msb function. - uint256 aa = a; - uint256 xn = 1; - - if (aa >= (1 << 128)) { - aa >>= 128; - xn <<= 64; - } - if (aa >= (1 << 64)) { - aa >>= 64; - xn <<= 32; - } - if (aa >= (1 << 32)) { - aa >>= 32; - xn <<= 16; - } - if (aa >= (1 << 16)) { - aa >>= 16; - xn <<= 8; - } - if (aa >= (1 << 8)) { - aa >>= 8; - xn <<= 4; - } - if (aa >= (1 << 4)) { - aa >>= 4; - xn <<= 2; - } - if (aa >= (1 << 2)) { - xn <<= 1; - } - - // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1). - // - // We can refine our estimation by noticing that the middle of that interval minimizes the error. - // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2). - // This is going to be our x_0 (and ε_0) - xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2) - - // From here, Newton's method give us: - // x_{n+1} = (x_n + a / x_n) / 2 - // - // One should note that: - // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a - // = ((x_n² + a) / (2 * x_n))² - a - // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a - // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²) - // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²) - // = (x_n² - a)² / (2 * x_n)² - // = ((x_n² - a) / (2 * x_n))² - // ≥ 0 - // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n - // - // This gives us the proof of quadratic convergence of the sequence: - // ε_{n+1} = | x_{n+1} - sqrt(a) | - // = | (x_n + a / x_n) / 2 - sqrt(a) | - // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) | - // = | (x_n - sqrt(a))² / (2 * x_n) | - // = | ε_n² / (2 * x_n) | - // = ε_n² / | (2 * x_n) | - // - // For the first iteration, we have a special case where x_0 is known: - // ε_1 = ε_0² / | (2 * x_0) | - // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2))) - // ≤ 2**(2*e-4) / (3 * 2**(e-1)) - // ≤ 2**(e-3) / 3 - // ≤ 2**(e-3-log2(3)) - // ≤ 2**(e-4.5) - // - // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n: - // ε_{n+1} = ε_n² / | (2 * x_n) | - // ≤ (2**(e-k))² / (2 * 2**(e-1)) - // ≤ 2**(2*e-2*k) / 2**e - // ≤ 2**(e-2*k) - xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above - xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5 - xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9 - xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18 - xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36 - xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72 - - // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision - // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either - // sqrt(a) or sqrt(a) + 1. - return xn - SafeCast.toUint(xn > a / xn); - } - } - - /** - * @dev Calculates sqrt(a), following the selected rounding direction. - */ - function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = sqrt(a); - return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a); - } - } - - /** - * @dev Return the log in base 2 of a positive value rounded towards zero. - * Returns 0 if given 0. - */ - function log2(uint256 x) internal pure returns (uint256 r) { - // If value has upper 128 bits set, log2 result is at least 128 - r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7; - // If upper 64 bits of 128-bit half set, add 64 to result - r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6; - // If upper 32 bits of 64-bit half set, add 32 to result - r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5; - // If upper 16 bits of 32-bit half set, add 16 to result - r |= SafeCast.toUint((x >> r) > 0xffff) << 4; - // If upper 8 bits of 16-bit half set, add 8 to result - r |= SafeCast.toUint((x >> r) > 0xff) << 3; - // If upper 4 bits of 8-bit half set, add 4 to result - r |= SafeCast.toUint((x >> r) > 0xf) << 2; - - // Shifts value right by the current result and use it as an index into this lookup table: - // - // | x (4 bits) | index | table[index] = MSB position | - // |------------|---------|-----------------------------| - // | 0000 | 0 | table[0] = 0 | - // | 0001 | 1 | table[1] = 0 | - // | 0010 | 2 | table[2] = 1 | - // | 0011 | 3 | table[3] = 1 | - // | 0100 | 4 | table[4] = 2 | - // | 0101 | 5 | table[5] = 2 | - // | 0110 | 6 | table[6] = 2 | - // | 0111 | 7 | table[7] = 2 | - // | 1000 | 8 | table[8] = 3 | - // | 1001 | 9 | table[9] = 3 | - // | 1010 | 10 | table[10] = 3 | - // | 1011 | 11 | table[11] = 3 | - // | 1100 | 12 | table[12] = 3 | - // | 1101 | 13 | table[13] = 3 | - // | 1110 | 14 | table[14] = 3 | - // | 1111 | 15 | table[15] = 3 | - // - // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes. - assembly ("memory-safe") { - r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000)) - } - } - - /** - * @dev Return the log in base 2, following the selected rounding direction, of a positive value. - * Returns 0 if given 0. - */ - function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = log2(value); - return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value); - } - } - - /** - * @dev Return the log in base 10 of a positive value rounded towards zero. - * Returns 0 if given 0. - */ - function log10(uint256 value) internal pure returns (uint256) { - uint256 result = 0; - unchecked { - if (value >= 10 ** 64) { - value /= 10 ** 64; - result += 64; - } - if (value >= 10 ** 32) { - value /= 10 ** 32; - result += 32; - } - if (value >= 10 ** 16) { - value /= 10 ** 16; - result += 16; - } - if (value >= 10 ** 8) { - value /= 10 ** 8; - result += 8; - } - if (value >= 10 ** 4) { - value /= 10 ** 4; - result += 4; - } - if (value >= 10 ** 2) { - value /= 10 ** 2; - result += 2; - } - if (value >= 10 ** 1) { - result += 1; - } - } - return result; - } - - /** - * @dev Return the log in base 10, following the selected rounding direction, of a positive value. - * Returns 0 if given 0. - */ - function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = log10(value); - return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value); - } - } - - /** - * @dev Return the log in base 256 of a positive value rounded towards zero. - * Returns 0 if given 0. - * - * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. - */ - function log256(uint256 x) internal pure returns (uint256 r) { - // If value has upper 128 bits set, log2 result is at least 128 - r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7; - // If upper 64 bits of 128-bit half set, add 64 to result - r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6; - // If upper 32 bits of 64-bit half set, add 32 to result - r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5; - // If upper 16 bits of 32-bit half set, add 16 to result - r |= SafeCast.toUint((x >> r) > 0xffff) << 4; - // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8 - return (r >> 3) | SafeCast.toUint((x >> r) > 0xff); - } - - /** - * @dev Return the log in base 256, following the selected rounding direction, of a positive value. - * Returns 0 if given 0. - */ - function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = log256(value); - return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value); - } - } - - /** - * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. - */ - function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { - return uint8(rounding) % 2 == 1; - } -} - -// src/modules/ERC2771ModuleStandalone.sol - -/* ==== OpenZeppelin === */ - -/** - * @dev Meta transaction (gasless) module. - */ -abstract contract ERC2771ModuleStandalone is ERC2771Context { - constructor(address trustedForwarder) ERC2771Context(trustedForwarder) { - // Nothing to do - } -} - -// lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol - -/* -* @title Minimum interface to define a RuleEngine -*/ -interface IRuleEngine is IERC1404Extend, IERC7551Compliance, IERC3643IComplianceContract { - /** - * @notice - * Function called whenever tokens are transferred from one wallet to another - * @dev - * Must revert if the transfer is invalid - * Same name as ERC-3643 but with one supplementary argument `spender` - * This function can be used to update state variables of the RuleEngine contract - * This function can be called ONLY by the token contract bound to the RuleEngine - * @param spender spender address (sender) - * @param from token holder address - * @param to receiver address - * @param value value of tokens involved in the transfer - */ - function transferred(address spender, address from, address to, uint256 value) external; -} - -// lib/openzeppelin-contracts/contracts/access/AccessControl.sol - -// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol) - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ```solidity - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ```solidity - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} - * to enforce additional security measures for this role. - */ -abstract contract AccessControl is Context, IAccessControl, ERC165 { - struct RoleData { - mapping(address account => bool) hasRole; - bytes32 adminRole; - } - - mapping(bytes32 role => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with an {AccessControlUnauthorizedAccount} error including the required role. - */ - modifier onlyRole(bytes32 role) { - _checkRole(role); - _; - } - - /// @inheritdoc IERC165 - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view virtual returns (bool) { - return _roles[role].hasRole[account]; - } - - /** - * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` - * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. - */ - function _checkRole(bytes32 role) internal view virtual { - _checkRole(role, _msgSender()); - } - - /** - * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` - * is missing `role`. - */ - function _checkRole(bytes32 role, address account) internal view virtual { - if (!hasRole(role, account)) { - revert AccessControlUnauthorizedAccount(account, role); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - * - * May emit a {RoleGranted} event. - */ - function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - * - * May emit a {RoleRevoked} event. - */ - function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been revoked `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `callerConfirmation`. - * - * May emit a {RoleRevoked} event. - */ - function renounceRole(bytes32 role, address callerConfirmation) public virtual { - if (callerConfirmation != _msgSender()) { - revert AccessControlBadConfirmation(); - } - - _revokeRole(role, callerConfirmation); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - /** - * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. - * - * Internal function without access restriction. - * - * May emit a {RoleGranted} event. - */ - function _grantRole(bytes32 role, address account) internal virtual returns (bool) { - if (!hasRole(role, account)) { - _roles[role].hasRole[account] = true; - emit RoleGranted(role, account, _msgSender()); - return true; - } else { - return false; - } - } - - /** - * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked. - * - * Internal function without access restriction. - * - * May emit a {RoleRevoked} event. - */ - function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { - if (hasRole(role, account)) { - _roles[role].hasRole[account] = false; - emit RoleRevoked(role, account, _msgSender()); - return true; - } else { - return false; - } - } -} - -// src/interfaces/IRule.sol - -/* ==== CMTAT === */ - -/* ==== Interfaces === */ - -interface IRule is IRuleEngine { - /** - * @dev Returns true if the restriction code exists, and false otherwise. - */ - function canReturnTransferRestrictionCode( - uint8 restrictionCode - ) external view returns (bool); -} - -// src/interfaces/IRulesManagementModule.sol - -/* ==== Interfaces === */ - -interface IRulesManagementModule { - /** - * @notice Defines the rules for the rule engine. - * @dev Sets the list of rule contract addresses for s. - * Any previously set rules will be completely overwritten by the new list. - * Rules should be deployed contracts that implement the expected interface. - * @param rules_ The array of addresses representing the new rules to be set. - * @dev Revert if one rule is a zero address or if the rule is already present - * This function calls _clearRules if at least one rule is still configured - */ - function setRules(IRule[] calldata rules_) external; - - /** - * @notice Returns the total number of currently configured rules. - * @dev Equivalent to the length of the internal rules array. - * Complexity: O(1) - * @return numberOfrules The number of active rules. - */ - function rulesCount() external view returns (uint256 numberOfrules); - - /** - * @notice Retrieves the rule address at a specific index. - * @dev Reverts if `ruleId` is out of bounds. - * Complexity: O(1). - * Note that there are no guarantees on the ordering of values inside the array, - * and it may change when more values are added or removed. - * @param ruleId The index of the desired rule in the array. - * @return ruleAddress The address of the corresponding IRule contract, return the `zero address` is out of bounds. - */ - function rule(uint256 ruleId) external view returns (address ruleAddress); - - /** - * @notice Returns the full list of currently configured rules. - * @dev This is a view-only function that does not modify state. - * This operation will copy the entire storage to memory, which can be quite expensive. - * This is designed to mostly be used by view accessors that are queried without any gas fees. - * @return ruleAddresses An array of all active rule contract addresses. - */ - function rules() external view returns (address[] memory ruleAddresses); - - /** - * @notice Removes all configured rules. - * @dev After calling this function, no rules will remain set. - * Developers should keep in mind that this function has an unbounded cost - * and using it may render the function uncallable if the set grows to the point - * where clearing it consumes too much gas to fit in a block. - */ - function clearRules() external; - - /** - * @notice Adds a new rule to the current rule set. - * @dev Reverts if the rule address is zero or already exists in the set. - * Complexity: O(1). - * @param rule_ The IRule contract to add. - */ - function addRule( - IRule rule_ - ) external; - - /** - * @notice Removes a specific rule from the current rule set. - * @dev Reverts if the provided rule is not found or does not match the stored rule at its index. - * Complexity: O(1). - * @param rule_ The IRule contract to remove. - */ - function removeRule( - IRule rule_ - ) external; - - /** - * @notice Checks whether a specific rule is currently configured. - * @param rule_ The IRule contract to check for membership. - * @dev Complexity: O(1). - * @return exists True if the rule is present, false otherwise. - */ - function containsRule(IRule rule_) external returns (bool exists); -} - -// src/modules/library/RulesManagementModuleInvariantStorage.sol - -abstract contract RulesManagementModuleInvariantStorage { - /* ==== Errors === */ - error RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed(); - error RuleEngine_RulesManagementModule_RuleAlreadyExists(); - error RuleEngine_RulesManagementModule_RuleDoNotMatch(); - error RuleEngine_RulesManagementModule_ArrayIsEmpty(); - error RuleEngine_RulesManagementModule_OperationNotSuccessful(); - - /* ============ Events ============ */ - /** - * @notice Emitted when a new rule is added to the rule set. - * @param rule The address of the rule contract that was added. - */ - event AddRule(IRule indexed rule); - - /** - * @notice Emitted when a rule is removed from the rule set. - * @param rule The address of the rule contract that was removed. - */ - event RemoveRule(IRule indexed rule); - - /** - * @notice Emitted when all rules are cleared from the rule set. - */ - event ClearRules(); - - /* ==== Constant === */ - /// @notice Role to manage the ruleEngine - bytes32 public constant RULES_MANAGEMENT_ROLE = - keccak256("RULES_MANAGEMENT_ROLE"); -} - -// lib/openzeppelin-contracts/contracts/utils/Arrays.sol - -// OpenZeppelin Contracts (last updated v5.4.0) (utils/Arrays.sol) -// This file was procedurally generated from scripts/generate/templates/Arrays.js. - -/** - * @dev Collection of functions related to array types. - */ -library Arrays { - using SlotDerivation for bytes32; - using StorageSlot for bytes32; - - /** - * @dev Sort an array of uint256 (in memory) following the provided comparator function. - * - * This function does the sorting "in place", meaning that it overrides the input. The object is returned for - * convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array. - * - * NOTE: this function's cost is `O(n · log(n))` in average and `O(n²)` in the worst case, with n the length of the - * array. Using it in view functions that are executed through `eth_call` is safe, but one should be very careful - * when executing this as part of a transaction. If the array being sorted is too large, the sort operation may - * consume more gas than is available in a block, leading to potential DoS. - * - * IMPORTANT: Consider memory side-effects when using custom comparator functions that access memory in an unsafe way. - */ - function sort( - uint256[] memory array, - function(uint256, uint256) pure returns (bool) comp - ) internal pure returns (uint256[] memory) { - _quickSort(_begin(array), _end(array), comp); - return array; - } - - /** - * @dev Variant of {sort} that sorts an array of uint256 in increasing order. - */ - function sort(uint256[] memory array) internal pure returns (uint256[] memory) { - sort(array, Comparators.lt); - return array; - } - - /** - * @dev Sort an array of address (in memory) following the provided comparator function. - * - * This function does the sorting "in place", meaning that it overrides the input. The object is returned for - * convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array. - * - * NOTE: this function's cost is `O(n · log(n))` in average and `O(n²)` in the worst case, with n the length of the - * array. Using it in view functions that are executed through `eth_call` is safe, but one should be very careful - * when executing this as part of a transaction. If the array being sorted is too large, the sort operation may - * consume more gas than is available in a block, leading to potential DoS. - * - * IMPORTANT: Consider memory side-effects when using custom comparator functions that access memory in an unsafe way. - */ - function sort( - address[] memory array, - function(address, address) pure returns (bool) comp - ) internal pure returns (address[] memory) { - sort(_castToUint256Array(array), _castToUint256Comp(comp)); - return array; - } - - /** - * @dev Variant of {sort} that sorts an array of address in increasing order. - */ - function sort(address[] memory array) internal pure returns (address[] memory) { - sort(_castToUint256Array(array), Comparators.lt); - return array; - } - - /** - * @dev Sort an array of bytes32 (in memory) following the provided comparator function. - * - * This function does the sorting "in place", meaning that it overrides the input. The object is returned for - * convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array. - * - * NOTE: this function's cost is `O(n · log(n))` in average and `O(n²)` in the worst case, with n the length of the - * array. Using it in view functions that are executed through `eth_call` is safe, but one should be very careful - * when executing this as part of a transaction. If the array being sorted is too large, the sort operation may - * consume more gas than is available in a block, leading to potential DoS. - * - * IMPORTANT: Consider memory side-effects when using custom comparator functions that access memory in an unsafe way. - */ - function sort( - bytes32[] memory array, - function(bytes32, bytes32) pure returns (bool) comp - ) internal pure returns (bytes32[] memory) { - sort(_castToUint256Array(array), _castToUint256Comp(comp)); - return array; - } - - /** - * @dev Variant of {sort} that sorts an array of bytes32 in increasing order. - */ - function sort(bytes32[] memory array) internal pure returns (bytes32[] memory) { - sort(_castToUint256Array(array), Comparators.lt); - return array; - } - - /** - * @dev Performs a quick sort of a segment of memory. The segment sorted starts at `begin` (inclusive), and stops - * at end (exclusive). Sorting follows the `comp` comparator. - * - * Invariant: `begin <= end`. This is the case when initially called by {sort} and is preserved in subcalls. - * - * IMPORTANT: Memory locations between `begin` and `end` are not validated/zeroed. This function should - * be used only if the limits are within a memory array. - */ - function _quickSort(uint256 begin, uint256 end, function(uint256, uint256) pure returns (bool) comp) private pure { - unchecked { - if (end - begin < 0x40) return; - - // Use first element as pivot - uint256 pivot = _mload(begin); - // Position where the pivot should be at the end of the loop - uint256 pos = begin; - - for (uint256 it = begin + 0x20; it < end; it += 0x20) { - if (comp(_mload(it), pivot)) { - // If the value stored at the iterator's position comes before the pivot, we increment the - // position of the pivot and move the value there. - pos += 0x20; - _swap(pos, it); - } - } - - _swap(begin, pos); // Swap pivot into place - _quickSort(begin, pos, comp); // Sort the left side of the pivot - _quickSort(pos + 0x20, end, comp); // Sort the right side of the pivot - } - } - - /** - * @dev Pointer to the memory location of the first element of `array`. - */ - function _begin(uint256[] memory array) private pure returns (uint256 ptr) { - assembly ("memory-safe") { - ptr := add(array, 0x20) - } - } - - /** - * @dev Pointer to the memory location of the first memory word (32bytes) after `array`. This is the memory word - * that comes just after the last element of the array. - */ - function _end(uint256[] memory array) private pure returns (uint256 ptr) { - unchecked { - return _begin(array) + array.length * 0x20; - } - } - - /** - * @dev Load memory word (as a uint256) at location `ptr`. - */ - function _mload(uint256 ptr) private pure returns (uint256 value) { - assembly { - value := mload(ptr) - } - } - - /** - * @dev Swaps the elements memory location `ptr1` and `ptr2`. - */ - function _swap(uint256 ptr1, uint256 ptr2) private pure { - assembly { - let value1 := mload(ptr1) - let value2 := mload(ptr2) - mstore(ptr1, value2) - mstore(ptr2, value1) - } - } - - /// @dev Helper: low level cast address memory array to uint256 memory array - function _castToUint256Array(address[] memory input) private pure returns (uint256[] memory output) { - assembly { - output := input - } - } - - /// @dev Helper: low level cast bytes32 memory array to uint256 memory array - function _castToUint256Array(bytes32[] memory input) private pure returns (uint256[] memory output) { - assembly { - output := input - } - } - - /// @dev Helper: low level cast address comp function to uint256 comp function - function _castToUint256Comp( - function(address, address) pure returns (bool) input - ) private pure returns (function(uint256, uint256) pure returns (bool) output) { - assembly { - output := input - } - } - - /// @dev Helper: low level cast bytes32 comp function to uint256 comp function - function _castToUint256Comp( - function(bytes32, bytes32) pure returns (bool) input - ) private pure returns (function(uint256, uint256) pure returns (bool) output) { - assembly { - output := input - } - } - - /** - * @dev Searches a sorted `array` and returns the first index that contains - * a value greater or equal to `element`. If no such index exists (i.e. all - * values in the array are strictly less than `element`), the array length is - * returned. Time complexity O(log n). - * - * NOTE: The `array` is expected to be sorted in ascending order, and to - * contain no repeated elements. - * - * IMPORTANT: Deprecated. This implementation behaves as {lowerBound} but lacks - * support for repeated elements in the array. The {lowerBound} function should - * be used instead. - */ - function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { - uint256 low = 0; - uint256 high = array.length; - - if (high == 0) { - return 0; - } - - while (low < high) { - uint256 mid = Math.average(low, high); - - // Note that mid will always be strictly less than high (i.e. it will be a valid array index) - // because Math.average rounds towards zero (it does integer division with truncation). - if (unsafeAccess(array, mid).value > element) { - high = mid; - } else { - low = mid + 1; - } - } - - // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. - if (low > 0 && unsafeAccess(array, low - 1).value == element) { - return low - 1; - } else { - return low; - } - } - - /** - * @dev Searches an `array` sorted in ascending order and returns the first - * index that contains a value greater or equal than `element`. If no such index - * exists (i.e. all values in the array are strictly less than `element`), the array - * length is returned. Time complexity O(log n). - * - * See C++'s https://en.cppreference.com/w/cpp/algorithm/lower_bound[lower_bound]. - */ - function lowerBound(uint256[] storage array, uint256 element) internal view returns (uint256) { - uint256 low = 0; - uint256 high = array.length; - - if (high == 0) { - return 0; - } - - while (low < high) { - uint256 mid = Math.average(low, high); - - // Note that mid will always be strictly less than high (i.e. it will be a valid array index) - // because Math.average rounds towards zero (it does integer division with truncation). - if (unsafeAccess(array, mid).value < element) { - // this cannot overflow because mid < high - unchecked { - low = mid + 1; - } - } else { - high = mid; - } - } - - return low; - } - - /** - * @dev Searches an `array` sorted in ascending order and returns the first - * index that contains a value strictly greater than `element`. If no such index - * exists (i.e. all values in the array are strictly less than `element`), the array - * length is returned. Time complexity O(log n). - * - * See C++'s https://en.cppreference.com/w/cpp/algorithm/upper_bound[upper_bound]. - */ - function upperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { - uint256 low = 0; - uint256 high = array.length; - - if (high == 0) { - return 0; - } - - while (low < high) { - uint256 mid = Math.average(low, high); - - // Note that mid will always be strictly less than high (i.e. it will be a valid array index) - // because Math.average rounds towards zero (it does integer division with truncation). - if (unsafeAccess(array, mid).value > element) { - high = mid; - } else { - // this cannot overflow because mid < high - unchecked { - low = mid + 1; - } - } - } - - return low; - } - - /** - * @dev Same as {lowerBound}, but with an array in memory. - */ - function lowerBoundMemory(uint256[] memory array, uint256 element) internal pure returns (uint256) { - uint256 low = 0; - uint256 high = array.length; - - if (high == 0) { - return 0; - } - - while (low < high) { - uint256 mid = Math.average(low, high); - - // Note that mid will always be strictly less than high (i.e. it will be a valid array index) - // because Math.average rounds towards zero (it does integer division with truncation). - if (unsafeMemoryAccess(array, mid) < element) { - // this cannot overflow because mid < high - unchecked { - low = mid + 1; - } - } else { - high = mid; - } - } - - return low; - } - - /** - * @dev Same as {upperBound}, but with an array in memory. - */ - function upperBoundMemory(uint256[] memory array, uint256 element) internal pure returns (uint256) { - uint256 low = 0; - uint256 high = array.length; - - if (high == 0) { - return 0; - } - - while (low < high) { - uint256 mid = Math.average(low, high); - - // Note that mid will always be strictly less than high (i.e. it will be a valid array index) - // because Math.average rounds towards zero (it does integer division with truncation). - if (unsafeMemoryAccess(array, mid) > element) { - high = mid; - } else { - // this cannot overflow because mid < high - unchecked { - low = mid + 1; - } - } - } - - return low; - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) { - bytes32 slot; - assembly ("memory-safe") { - slot := arr.slot - } - return slot.deriveArray().offset(pos).getAddressSlot(); - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) { - bytes32 slot; - assembly ("memory-safe") { - slot := arr.slot - } - return slot.deriveArray().offset(pos).getBytes32Slot(); - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) { - bytes32 slot; - assembly ("memory-safe") { - slot := arr.slot - } - return slot.deriveArray().offset(pos).getUint256Slot(); - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(bytes[] storage arr, uint256 pos) internal pure returns (StorageSlot.BytesSlot storage) { - bytes32 slot; - assembly ("memory-safe") { - slot := arr.slot - } - return slot.deriveArray().offset(pos).getBytesSlot(); - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(string[] storage arr, uint256 pos) internal pure returns (StorageSlot.StringSlot storage) { - bytes32 slot; - assembly ("memory-safe") { - slot := arr.slot - } - return slot.deriveArray().offset(pos).getStringSlot(); - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeMemoryAccess(address[] memory arr, uint256 pos) internal pure returns (address res) { - assembly { - res := mload(add(add(arr, 0x20), mul(pos, 0x20))) - } - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeMemoryAccess(bytes32[] memory arr, uint256 pos) internal pure returns (bytes32 res) { - assembly { - res := mload(add(add(arr, 0x20), mul(pos, 0x20))) - } - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeMemoryAccess(uint256[] memory arr, uint256 pos) internal pure returns (uint256 res) { - assembly { - res := mload(add(add(arr, 0x20), mul(pos, 0x20))) - } - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeMemoryAccess(bytes[] memory arr, uint256 pos) internal pure returns (bytes memory res) { - assembly { - res := mload(add(add(arr, 0x20), mul(pos, 0x20))) - } - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeMemoryAccess(string[] memory arr, uint256 pos) internal pure returns (string memory res) { - assembly { - res := mload(add(add(arr, 0x20), mul(pos, 0x20))) - } - } - - /** - * @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden. - * - * WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased. - */ - function unsafeSetLength(address[] storage array, uint256 len) internal { - assembly ("memory-safe") { - sstore(array.slot, len) - } - } - - /** - * @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden. - * - * WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased. - */ - function unsafeSetLength(bytes32[] storage array, uint256 len) internal { - assembly ("memory-safe") { - sstore(array.slot, len) - } - } - - /** - * @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden. - * - * WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased. - */ - function unsafeSetLength(uint256[] storage array, uint256 len) internal { - assembly ("memory-safe") { - sstore(array.slot, len) - } - } - - /** - * @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden. - * - * WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased. - */ - function unsafeSetLength(bytes[] storage array, uint256 len) internal { - assembly ("memory-safe") { - sstore(array.slot, len) - } - } - - /** - * @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden. - * - * WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased. - */ - function unsafeSetLength(string[] storage array, uint256 len) internal { - assembly ("memory-safe") { - sstore(array.slot, len) - } - } -} - -// lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol - -// OpenZeppelin Contracts (last updated v5.4.0) (utils/structs/EnumerableSet.sol) -// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. - -/** - * @dev Library for managing - * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive - * types. - * - * Sets have the following properties: - * - * - Elements are added, removed, and checked for existence in constant time - * (O(1)). - * - Elements are enumerated in O(n). No guarantees are made on the ordering. - * - Set can be cleared (all elements removed) in O(n). - * - * ```solidity - * contract Example { - * // Add the library methods - * using EnumerableSet for EnumerableSet.AddressSet; - * - * // Declare a set state variable - * EnumerableSet.AddressSet private mySet; - * } - * ``` - * - * The following types are supported: - * - * - `bytes32` (`Bytes32Set`) since v3.3.0 - * - `address` (`AddressSet`) since v3.3.0 - * - `uint256` (`UintSet`) since v3.3.0 - * - `string` (`StringSet`) since v5.4.0 - * - `bytes` (`BytesSet`) since v5.4.0 - * - * [WARNING] - * ==== - * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure - * unusable. - * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. - * - * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an - * array of EnumerableSet. - * ==== - */ -library EnumerableSet { - // To implement this library for multiple types with as little code - // repetition as possible, we write it in terms of a generic Set type with - // bytes32 values. - // The Set implementation uses private functions, and user-facing - // implementations (such as AddressSet) are just wrappers around the - // underlying Set. - // This means that we can only create new EnumerableSets for types that fit - // in bytes32. - - struct Set { - // Storage of set values - bytes32[] _values; - // Position is the index of the value in the `values` array plus 1. - // Position 0 is used to mean a value is not in the set. - mapping(bytes32 value => uint256) _positions; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function _add(Set storage set, bytes32 value) private returns (bool) { - if (!_contains(set, value)) { - set._values.push(value); - // The value is stored at length-1, but we add 1 to all indexes - // and use 0 as a sentinel value - set._positions[value] = set._values.length; - return true; - } else { - return false; - } - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function _remove(Set storage set, bytes32 value) private returns (bool) { - // We cache the value's position to prevent multiple reads from the same storage slot - uint256 position = set._positions[value]; - - if (position != 0) { - // Equivalent to contains(set, value) - // To delete an element from the _values array in O(1), we swap the element to delete with the last one in - // the array, and then remove the last element (sometimes called as 'swap and pop'). - // This modifies the order of the array, as noted in {at}. - - uint256 valueIndex = position - 1; - uint256 lastIndex = set._values.length - 1; - - if (valueIndex != lastIndex) { - bytes32 lastValue = set._values[lastIndex]; - - // Move the lastValue to the index where the value to delete is - set._values[valueIndex] = lastValue; - // Update the tracked position of the lastValue (that was just moved) - set._positions[lastValue] = position; - } - - // Delete the slot where the moved value was stored - set._values.pop(); - - // Delete the tracked position for the deleted slot - delete set._positions[value]; - - return true; - } else { - return false; - } - } - - /** - * @dev Removes all the values from a set. O(n). - * - * WARNING: This function has an unbounded cost that scales with set size. Developers should keep in mind that - * using it may render the function uncallable if the set grows to the point where clearing it consumes too much - * gas to fit in a block. - */ - function _clear(Set storage set) private { - uint256 len = _length(set); - for (uint256 i = 0; i < len; ++i) { - delete set._positions[set._values[i]]; - } - Arrays.unsafeSetLength(set._values, 0); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function _contains(Set storage set, bytes32 value) private view returns (bool) { - return set._positions[value] != 0; - } - - /** - * @dev Returns the number of values on the set. O(1). - */ - function _length(Set storage set) private view returns (uint256) { - return set._values.length; - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function _at(Set storage set, uint256 index) private view returns (bytes32) { - return set._values[index]; - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function _values(Set storage set) private view returns (bytes32[] memory) { - return set._values; - } - - /** - * @dev Return a slice of the set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function _values(Set storage set, uint256 start, uint256 end) private view returns (bytes32[] memory) { - unchecked { - end = Math.min(end, _length(set)); - start = Math.min(start, end); - - uint256 len = end - start; - bytes32[] memory result = new bytes32[](len); - for (uint256 i = 0; i < len; ++i) { - result[i] = Arrays.unsafeAccess(set._values, start + i).value; - } - return result; - } - } - - // Bytes32Set - - struct Bytes32Set { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { - return _add(set._inner, value); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { - return _remove(set._inner, value); - } - - /** - * @dev Removes all the values from a set. O(n). - * - * WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the - * function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block. - */ - function clear(Bytes32Set storage set) internal { - _clear(set._inner); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { - return _contains(set._inner, value); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(Bytes32Set storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { - return _at(set._inner, index); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { - bytes32[] memory store = _values(set._inner); - bytes32[] memory result; - - assembly ("memory-safe") { - result := store - } - - return result; - } - - /** - * @dev Return a slice of the set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(Bytes32Set storage set, uint256 start, uint256 end) internal view returns (bytes32[] memory) { - bytes32[] memory store = _values(set._inner, start, end); - bytes32[] memory result; - - assembly ("memory-safe") { - result := store - } - - return result; - } - - // AddressSet - - struct AddressSet { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(AddressSet storage set, address value) internal returns (bool) { - return _add(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(AddressSet storage set, address value) internal returns (bool) { - return _remove(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Removes all the values from a set. O(n). - * - * WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the - * function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block. - */ - function clear(AddressSet storage set) internal { - _clear(set._inner); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(AddressSet storage set, address value) internal view returns (bool) { - return _contains(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(AddressSet storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(AddressSet storage set, uint256 index) internal view returns (address) { - return address(uint160(uint256(_at(set._inner, index)))); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(AddressSet storage set) internal view returns (address[] memory) { - bytes32[] memory store = _values(set._inner); - address[] memory result; - - assembly ("memory-safe") { - result := store - } - - return result; - } - - /** - * @dev Return a slice of the set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(AddressSet storage set, uint256 start, uint256 end) internal view returns (address[] memory) { - bytes32[] memory store = _values(set._inner, start, end); - address[] memory result; - - assembly ("memory-safe") { - result := store - } - - return result; - } - - // UintSet - - struct UintSet { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(UintSet storage set, uint256 value) internal returns (bool) { - return _add(set._inner, bytes32(value)); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(UintSet storage set, uint256 value) internal returns (bool) { - return _remove(set._inner, bytes32(value)); - } - - /** - * @dev Removes all the values from a set. O(n). - * - * WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the - * function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block. - */ - function clear(UintSet storage set) internal { - _clear(set._inner); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(UintSet storage set, uint256 value) internal view returns (bool) { - return _contains(set._inner, bytes32(value)); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(UintSet storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(UintSet storage set, uint256 index) internal view returns (uint256) { - return uint256(_at(set._inner, index)); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(UintSet storage set) internal view returns (uint256[] memory) { - bytes32[] memory store = _values(set._inner); - uint256[] memory result; - - assembly ("memory-safe") { - result := store - } - - return result; - } - - /** - * @dev Return a slice of the set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(UintSet storage set, uint256 start, uint256 end) internal view returns (uint256[] memory) { - bytes32[] memory store = _values(set._inner, start, end); - uint256[] memory result; - - assembly ("memory-safe") { - result := store - } - - return result; - } - - struct StringSet { - // Storage of set values - string[] _values; - // Position is the index of the value in the `values` array plus 1. - // Position 0 is used to mean a value is not in the set. - mapping(string value => uint256) _positions; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(StringSet storage set, string memory value) internal returns (bool) { - if (!contains(set, value)) { - set._values.push(value); - // The value is stored at length-1, but we add 1 to all indexes - // and use 0 as a sentinel value - set._positions[value] = set._values.length; - return true; - } else { - return false; - } - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(StringSet storage set, string memory value) internal returns (bool) { - // We cache the value's position to prevent multiple reads from the same storage slot - uint256 position = set._positions[value]; - - if (position != 0) { - // Equivalent to contains(set, value) - // To delete an element from the _values array in O(1), we swap the element to delete with the last one in - // the array, and then remove the last element (sometimes called as 'swap and pop'). - // This modifies the order of the array, as noted in {at}. - - uint256 valueIndex = position - 1; - uint256 lastIndex = set._values.length - 1; - - if (valueIndex != lastIndex) { - string memory lastValue = set._values[lastIndex]; - - // Move the lastValue to the index where the value to delete is - set._values[valueIndex] = lastValue; - // Update the tracked position of the lastValue (that was just moved) - set._positions[lastValue] = position; - } - - // Delete the slot where the moved value was stored - set._values.pop(); - - // Delete the tracked position for the deleted slot - delete set._positions[value]; - - return true; - } else { - return false; - } - } - - /** - * @dev Removes all the values from a set. O(n). - * - * WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the - * function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block. - */ - function clear(StringSet storage set) internal { - uint256 len = length(set); - for (uint256 i = 0; i < len; ++i) { - delete set._positions[set._values[i]]; - } - Arrays.unsafeSetLength(set._values, 0); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(StringSet storage set, string memory value) internal view returns (bool) { - return set._positions[value] != 0; - } - - /** - * @dev Returns the number of values on the set. O(1). - */ - function length(StringSet storage set) internal view returns (uint256) { - return set._values.length; - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(StringSet storage set, uint256 index) internal view returns (string memory) { - return set._values[index]; - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(StringSet storage set) internal view returns (string[] memory) { - return set._values; - } - - /** - * @dev Return a slice of the set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(StringSet storage set, uint256 start, uint256 end) internal view returns (string[] memory) { - unchecked { - end = Math.min(end, length(set)); - start = Math.min(start, end); - - uint256 len = end - start; - string[] memory result = new string[](len); - for (uint256 i = 0; i < len; ++i) { - result[i] = Arrays.unsafeAccess(set._values, start + i).value; - } - return result; - } - } - - struct BytesSet { - // Storage of set values - bytes[] _values; - // Position is the index of the value in the `values` array plus 1. - // Position 0 is used to mean a value is not in the set. - mapping(bytes value => uint256) _positions; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(BytesSet storage set, bytes memory value) internal returns (bool) { - if (!contains(set, value)) { - set._values.push(value); - // The value is stored at length-1, but we add 1 to all indexes - // and use 0 as a sentinel value - set._positions[value] = set._values.length; - return true; - } else { - return false; - } - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(BytesSet storage set, bytes memory value) internal returns (bool) { - // We cache the value's position to prevent multiple reads from the same storage slot - uint256 position = set._positions[value]; - - if (position != 0) { - // Equivalent to contains(set, value) - // To delete an element from the _values array in O(1), we swap the element to delete with the last one in - // the array, and then remove the last element (sometimes called as 'swap and pop'). - // This modifies the order of the array, as noted in {at}. - - uint256 valueIndex = position - 1; - uint256 lastIndex = set._values.length - 1; - - if (valueIndex != lastIndex) { - bytes memory lastValue = set._values[lastIndex]; - - // Move the lastValue to the index where the value to delete is - set._values[valueIndex] = lastValue; - // Update the tracked position of the lastValue (that was just moved) - set._positions[lastValue] = position; - } - - // Delete the slot where the moved value was stored - set._values.pop(); - - // Delete the tracked position for the deleted slot - delete set._positions[value]; - - return true; - } else { - return false; - } - } - - /** - * @dev Removes all the values from a set. O(n). - * - * WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the - * function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block. - */ - function clear(BytesSet storage set) internal { - uint256 len = length(set); - for (uint256 i = 0; i < len; ++i) { - delete set._positions[set._values[i]]; - } - Arrays.unsafeSetLength(set._values, 0); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(BytesSet storage set, bytes memory value) internal view returns (bool) { - return set._positions[value] != 0; - } - - /** - * @dev Returns the number of values on the set. O(1). - */ - function length(BytesSet storage set) internal view returns (uint256) { - return set._values.length; - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(BytesSet storage set, uint256 index) internal view returns (bytes memory) { - return set._values[index]; - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(BytesSet storage set) internal view returns (bytes[] memory) { - return set._values; - } - - /** - * @dev Return a slice of the set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(BytesSet storage set, uint256 start, uint256 end) internal view returns (bytes[] memory) { - unchecked { - end = Math.min(end, length(set)); - start = Math.min(start, end); - - uint256 len = end - start; - bytes[] memory result = new bytes[](len); - for (uint256 i = 0; i < len; ++i) { - result[i] = Arrays.unsafeAccess(set._values, start + i).value; - } - return result; - } - } -} - -// src/modules/ERC3643ComplianceModule.sol - -/* ==== OpenZeppelin === */ - -/* ==== Interface and other library === */ - -abstract contract ERC3643ComplianceModule is IERC3643Compliance, AccessControl { - /* ==== Type declaration === */ - using EnumerableSet for EnumerableSet.AddressSet; - /* ==== State Variables === */ - // Token binding tracking - EnumerableSet.AddressSet private _boundTokens; - // Access Control - bytes32 public constant COMPLIANCE_MANAGER_ROLE = keccak256("COMPLIANCE_MANAGER_ROLE"); - - /* ==== Errors === */ - error RuleEngine_ERC3643Compliance_InvalidTokenAddress(); - error RuleEngine_ERC3643Compliance_TokenAlreadyBound(); - error RuleEngine_ERC3643Compliance_TokenNotBound(); - error RuleEngine_ERC3643Compliance_UnauthorizedCaller(); - error RuleEngine_ERC3643Compliance_OperationNotSuccessful(); - - /* ==== Modifier === */ - modifier onlyBoundToken() { - if (!_boundTokens.contains(_msgSender())) { - revert RuleEngine_ERC3643Compliance_UnauthorizedCaller(); - } - _; - } - - /*////////////////////////////////////////////////////////////// - PUBLIC/public FUNCTIONS - //////////////////////////////////////////////////////////////*/ - - /* ============ State functions ============ */ - /// @inheritdoc IERC3643Compliance - function bindToken(address token) public override virtual onlyRole(COMPLIANCE_MANAGER_ROLE) { - _bindToken(token); - } - - /// @inheritdoc IERC3643Compliance - function unbindToken(address token) public override virtual onlyRole(COMPLIANCE_MANAGER_ROLE) { - _unbindToken(token); - } - - /// @inheritdoc IERC3643Compliance - function isTokenBound(address token) public view virtual override returns (bool) { - return _boundTokens.contains(token); - } - - /// @inheritdoc IERC3643Compliance - function getTokenBound() public view virtual override returns (address) { - if(_boundTokens.length() > 0){ - // Note that there are no guarantees on the ordering of values inside the array, - // and it may change when more values are added or removed. - return _boundTokens.at(0); - } else { - return address(0); - } - } - - /// @inheritdoc IERC3643Compliance - function getTokenBounds() public view override returns (address[] memory) { - return _boundTokens.values(); - } - - /*////////////////////////////////////////////////////////////// - INTERNAL/PRIVATE FUNCTIONS - //////////////////////////////////////////////////////////////*/ - - function _unbindToken(address token) internal { - require (_boundTokens.contains(token), RuleEngine_ERC3643Compliance_TokenNotBound()); - // Should never revert because we check if the token address is already set before - require(_boundTokens.remove(token), RuleEngine_ERC3643Compliance_OperationNotSuccessful()); - - emit TokenUnbound(token); - } - function _bindToken(address token) internal{ - require(token != address(0), RuleEngine_ERC3643Compliance_InvalidTokenAddress()); - require(!_boundTokens.contains(token), RuleEngine_ERC3643Compliance_TokenAlreadyBound()); - // Should never revert because we check if the token address is already set before - require(_boundTokens.add(token), RuleEngine_ERC3643Compliance_OperationNotSuccessful()); - emit TokenBound(token); - } -} - -// src/modules/RulesManagementModule.sol - -/* ==== OpenZeppelin === */ - -/* ==== Interface and other library === */ - -/** - * @title RuleEngine - part - */ -abstract contract RulesManagementModule is - AccessControl, - RulesManagementModuleInvariantStorage, - IRulesManagementModule -{ - /* ==== Type declaration === */ - using EnumerableSet for EnumerableSet.AddressSet; - - /* ==== State Variables === */ - /// @dev Array of rules - EnumerableSet.AddressSet internal _rules; - - /*////////////////////////////////////////////////////////////// - PUBLIC/EXTERNAL FUNCTIONS - //////////////////////////////////////////////////////////////*/ - - /* ============ State functions ============ */ - - /** - * @inheritdoc IRulesManagementModule - */ - function setRules( - IRule[] calldata rules_ - ) public virtual override(IRulesManagementModule) onlyRole(RULES_MANAGEMENT_ROLE) { - if (rules_.length == 0) { - revert RuleEngine_RulesManagementModule_ArrayIsEmpty(); - } - if (_rules.length() > 0) { - _clearRules(); - } - for(uint256 i = 0; i < rules_.length; ++i){ - _checkRule(address(rules_[i])); - // Should never revert because we check the presence of the rule before - require(_rules.add(address(rules_[i])), RuleEngine_RulesManagementModule_OperationNotSuccessful()); - emit AddRule(rules_[i]); - } - } - - /** - * @inheritdoc IRulesManagementModule - */ - function clearRules() public virtual override(IRulesManagementModule) onlyRole(RULES_MANAGEMENT_ROLE) { - _clearRules(); - } - - /** - * @inheritdoc IRulesManagementModule - */ - function addRule( - IRule rule_ - ) public virtual override(IRulesManagementModule) onlyRole(RULES_MANAGEMENT_ROLE) { - _checkRule(address(rule_)); - require(_rules.add(address(rule_)), RuleEngine_RulesManagementModule_OperationNotSuccessful()); - emit AddRule(rule_); - } - - /** - * @inheritdoc IRulesManagementModule - */ - function removeRule( - IRule rule_ - ) public virtual override(IRulesManagementModule) onlyRole(RULES_MANAGEMENT_ROLE) { - require(_rules.contains(address(rule_)), RuleEngine_RulesManagementModule_RuleDoNotMatch()); - _removeRule(rule_); - } - - /* ============ View functions ============ */ - - /** - * @inheritdoc IRulesManagementModule - */ - function rulesCount() public view virtual override(IRulesManagementModule) returns (uint256) { - return _rules.length(); - } - - /** - * @inheritdoc IRulesManagementModule - */ - function containsRule(IRule rule_) public view virtual override(IRulesManagementModule) returns (bool){ - return _rules.contains(address(rule_)); - } - - /** - * @inheritdoc IRulesManagementModule - */ - function rule( - uint256 ruleId - ) public view virtual override(IRulesManagementModule) returns (address) { - if(ruleId < _rules.length()){ - // Note that there are no guarantees on the ordering of values inside the array, - // and it may change when more values are added or removed. - return _rules.at(ruleId); - } else { - return address(0); - } - } - - /** - * @inheritdoc IRulesManagementModule - */ - function rules() - public - view - virtual - override(IRulesManagementModule) - returns (address[] memory) - { - return _rules.values(); - } - - /*////////////////////////////////////////////////////////////// - INTERNAL/PRIVATE FUNCTIONS - //////////////////////////////////////////////////////////////*/ - /** - * @notice Clear all the rules of the array of rules - * - */ - function _clearRules() internal virtual { - emit ClearRules(); - _rules.clear(); - } - - /** - * @notice Remove a rule from the array of rules - * Revert if the rule found at the specified index does not match the rule in argument - * @param rule_ address of the target rule - * - * - */ - function _removeRule(IRule rule_) internal virtual { - // Should never revert because we check the presence of the rule before - require(_rules.remove(address(rule_)), RuleEngine_RulesManagementModule_OperationNotSuccessful()); - emit RemoveRule(rule_); - } - - /** - * @dev check if a rule is valid, revert otherwise - */ - function _checkRule(address rule_) internal view{ - if (rule_ == address(0x0)) { - revert RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed(); - } - if (_rules.contains(rule_)) { - revert RuleEngine_RulesManagementModule_RuleAlreadyExists(); - } - } - - /* ============ Transferred functions ============ */ - - /** - * @notice Go through all the rule to know if a restriction exists on the transfer - * @param from the origin address - * @param to the destination address - * @param value to transfer - **/ - function _transferred( - address from, - address to, - uint256 value - ) internal virtual{ - uint256 rulesLength = _rules.length(); - for (uint256 i = 0; i < rulesLength; ++i) { - IRule(_rules.at(i)).transferred( - from, - to, - value - ); - } - } - - /** - * @notice Go through all the rule to know if a restriction exists on the transfer - * @param spender the spender address (transferFrom) - * @param from the origin address - * @param to the destination address - * @param value to transfer - **/ - function _transferred( - address spender, - address from, - address to, - uint256 value - ) internal virtual{ - uint256 rulesLength = _rules.length(); - for (uint256 i = 0; i < rulesLength; ++i) { - IRule(_rules.at(i)).transferred( - spender, - from, - to, - value - ); - } - } -} - -// src/RuleEngineBase.sol - -/* ==== OpenZeppelin === */ - -/* ==== CMTAT === */ - -/* ==== Modules === */ - -/* ==== Interface and other library === */ - -/** - * @title Implementation of a ruleEngine as defined by the CMTAT - */ -abstract contract RuleEngineBase is - VersionModule, - RulesManagementModule, - ERC3643ComplianceModule, - RuleEngineInvariantStorage, - IRuleEngine -{ - /* ============ State functions ============ */ - /* - * @inheritdoc IRuleEngine - */ - function transferred( - address spender, - address from, - address to, - uint256 value - ) public virtual override(IRuleEngine) onlyBoundToken { - // Apply on RuleEngine - RulesManagementModule._transferred(spender, from, to, value); - } - - /** - * @inheritdoc IERC3643IComplianceContract - */ - function transferred( - address from, - address to, - uint256 value - ) public virtual override(IERC3643IComplianceContract) onlyBoundToken { - _transferred(from, to, value); - } - - /// @inheritdoc IERC3643Compliance - function created(address to, uint256 value) public virtual override(IERC3643Compliance) onlyBoundToken{ - _transferred(address(0), to, value); - } - - /// @inheritdoc IERC3643Compliance - function destroyed(address from, uint256 value) public virtual override(IERC3643Compliance) onlyBoundToken { - _transferred(from, address(0), value); - } - - /* ============ View functions ============ */ - /** - * @notice Go through all the rule to know if a restriction exists on the transfer - * @param from the origin address - * @param to the destination address - * @param value to transfer - * @return The restricion code or REJECTED_CODE_BASE.TRANSFER_OK (0) if the transfer is valid - **/ - function detectTransferRestriction( - address from, - address to, - uint256 value - ) public view virtual override returns (uint8) { - uint256 rulesLength = rulesCount(); - for (uint256 i = 0; i < rulesLength; ++i) { - uint8 restriction = IRule(rule(i)) - .detectTransferRestriction(from, to, value); - if (restriction > 0) { - return restriction; - } - } - return uint8(REJECTED_CODE_BASE.TRANSFER_OK); - } - - /** - * @inheritdoc IERC1404Extend - */ - function detectTransferRestrictionFrom( - address spender, - address from, - address to, - uint256 value - ) public view virtual override(IERC1404Extend) returns (uint8) { - uint256 rulesLength = rulesCount(); - for (uint256 i = 0; i < rulesLength; ++i) { - uint8 restriction = IRule(rule(i)) - .detectTransferRestrictionFrom(spender,from, to, value); - if (restriction > 0) { - return restriction; - } - } - - return uint8(REJECTED_CODE_BASE.TRANSFER_OK); - } - - /** - * @inheritdoc IERC1404 - */ - function messageForTransferRestriction( - uint8 restrictionCode - ) public virtual view override(IERC1404) returns (string memory) { - // - uint256 rulesLength = rulesCount(); - for (uint256 i = 0; i < rulesLength; ++i) { - if ( - IRule(rule(i)) - .canReturnTransferRestrictionCode(restrictionCode) - ) { - return - IRule(rule(i)) - .messageForTransferRestriction(restrictionCode); - } - } - return "Unknown restriction code"; - } - - /** - * @inheritdoc IERC3643ComplianceRead - */ - function canTransfer( - address from, - address to, - uint256 value - ) public virtual view override(IERC3643ComplianceRead) returns (bool) { - return - detectTransferRestriction(from, to, value) == - uint8(REJECTED_CODE_BASE.TRANSFER_OK); - } - - /** - * @inheritdoc IERC7551Compliance - */ - function canTransferFrom( - address spender, - address from, - address to, - uint256 value - ) public virtual view override(IERC7551Compliance) returns (bool) { - return - detectTransferRestrictionFrom(spender, from, to, value) == - uint8(REJECTED_CODE_BASE.TRANSFER_OK); - } - - /* ============ ACCESS CONTROL ============ */ - /** - * @notice Returns `true` if `account` has been granted `role`. - * @dev The Default Admin has all roles - */ - function hasRole( - bytes32 role, - address account - ) public view virtual override(AccessControl) returns (bool) { - if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) { - return true; - } else { - return AccessControl.hasRole(role, account); - } - } -} - -// src/RuleEngine.sol - -/* ==== OpenZeppelin === */ - -/* ==== Modules === */ - -/* ==== Base contract === */ - -/** - * @title Implementation of a ruleEngine as defined by the CMTAT - */ -contract RuleEngine is - ERC2771ModuleStandalone, - RuleEngineBase -{ - /** - * @param admin Address of the contract (Access Control) - * @param forwarderIrrevocable Address of the forwarder, required for the gasless support - */ - constructor( - address admin, - address forwarderIrrevocable, - address tokenContract - ) ERC2771ModuleStandalone(forwarderIrrevocable) { - if (admin == address(0)) { - revert RuleEngine_AdminWithAddressZeroNotAllowed(); - } - if (tokenContract != address(0)) { - _bindToken(tokenContract); - } - _grantRole(DEFAULT_ADMIN_ROLE, admin); - } - - /*////////////////////////////////////////////////////////////// - ERC-2771 - //////////////////////////////////////////////////////////////*/ - - /** - * @dev This surcharge is not necessary if you do not use the MetaTxModule - */ - function _msgSender() - internal - view - virtual - override(ERC2771Context, Context) - returns (address sender) - { - return ERC2771Context._msgSender(); - } - - /** - * @dev This surcharge is not necessary if you do not use the MetaTxModule - */ - function _msgData() - internal - view - virtual - override(ERC2771Context, Context) - returns (bytes calldata) - { - return ERC2771Context._msgData(); - } - - /** - * @dev This surcharge is not necessary if you do not use the MetaTxModule - */ - function _contextSuffixLength() - internal - view - virtual - override(ERC2771Context, Context) - returns (uint256) - { - return ERC2771Context._contextSuffixLength(); - } -} - diff --git a/doc/compilation/hardhat/src/RuleEngine.sol/RuleEngine.dbg.json b/doc/compilation/hardhat/src/RuleEngine.sol/RuleEngine.dbg.json deleted file mode 100644 index 4d68568..0000000 --- a/doc/compilation/hardhat/src/RuleEngine.sol/RuleEngine.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/RuleEngine.sol/RuleEngine.json b/doc/compilation/hardhat/src/RuleEngine.sol/RuleEngine.json deleted file mode 100644 index 884035d..0000000 --- a/doc/compilation/hardhat/src/RuleEngine.sol/RuleEngine.json +++ /dev/null @@ -1,854 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleEngine", - "sourceName": "src/RuleEngine.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - }, - { - "internalType": "address", - "name": "forwarderIrrevocable", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenContract", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_AdminWithAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_InvalidTokenAddress", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_OperationNotSuccessful", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_TokenAlreadyBound", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_TokenNotBound", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_UnauthorizedCaller", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_ArrayIsEmpty", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_OperationNotSuccessful", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAlreadyExists", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleDoNotMatch", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "AddRule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "ClearRules", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "RemoveRule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenBound", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenUnbound", - "type": "event" - }, - { - "inputs": [], - "name": "COMPLIANCE_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RULES_MANAGEMENT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "addRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "bindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "clearRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "containsRule", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "created", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "destroyed", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestriction", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestrictionFrom", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBound", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBounds", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "isTokenBound", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "forwarder", - "type": "address" - } - ], - "name": "isTrustedForwarder", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "messageForTransferRestriction", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "removeRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "ruleId", - "type": "uint256" - } - ], - "name": "rule", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rules", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rulesCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule[]", - "name": "rules_", - "type": "address[]" - } - ], - "name": "setRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "trustedForwarder", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "unbindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "version_", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x60a060405234801561000f575f5ffd5b5060405161316338038061316383398181016040528101906100319190610641565b81808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036100ce576040517f21c89ccc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610111576101108161012c60201b60201c565b5b6101235f5f1b8461026060201b60201c565b5050505061079a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610191576040517fdc418b8000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101a581600361035560201b90919060201c565b156101dc576040517ff423354700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101f081600361038860201b90919060201c565b610226576040517f369bb9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b8160405161025591906106a0565b60405180910390a150565b5f61027183836103bb60201b60201c565b61034b5760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506102e86103f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905061034f565b5f90505b92915050565b5f610380835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61040960201b60201c565b905092915050565b5f6103b3835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61042960201b60201c565b905092915050565b5f6103ce5f5f1b8361049660201b60201c565b156103dc57600190506103ef565b6103ec838361049660201b60201c565b90505b92915050565b5f6104046104f960201b60201c565b905090565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f61043a838361040960201b60201c565b61048c57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050610490565b5f90505b92915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f5f36905090505f61051061057360201b60201c565b905080821015801561052d575061052c3361058760201b60201c565b5b1561055d575f36828403908092610546939291906106c1565b90610551919061073c565b60601c92505050610570565b61056b6105cb60201b60201c565b925050505b90565b5f6105826105d260201b60201c565b905090565b5f6105966105da60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f33905090565b5f6014905090565b5f608051905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610610826105e7565b9050919050565b61062081610606565b811461062a575f5ffd5b50565b5f8151905061063b81610617565b92915050565b5f5f5f60608486031215610658576106576105e3565b5b5f6106658682870161062d565b93505060206106768682870161062d565b92505060406106878682870161062d565b9150509250925092565b61069a81610606565b82525050565b5f6020820190506106b35f830184610691565b92915050565b5f5ffd5b5f5ffd5b5f5f858511156106d4576106d36106b9565b5b838611156106e5576106e46106bd565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b5f82821b905092915050565b5f61074783836106fb565b826107528135610705565b925060148210156107925761078d7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802610730565b831692505b505092915050565b6080516129b16107b25f395f610a4701526129b15ff3fe608060405234801561000f575f5ffd5b5060043610610204575f3560e01c80638baf29b411610118578063bc13eacc116100ab578063db18af6c1161007a578063db18af6c146105fa578063df21950f1461062a578063e3c4602c14610646578063e46638e614610662578063e54621d21461069257610204565b8063bc13eacc14610560578063d32c7bb51461057e578063d4ce1415146105ae578063d547741f146105de57610204565b80639b11c115116100e75780639b11c115146104fe578063a217fddf1461051c578063b043572e1461053a578063b27aef3a1461054457610204565b80638baf29b4146104665780638d2ea7721461048257806391d148541461049e578063993e8b95146104ce57610204565b806352f6747a1161019b5780635f8dead31161016a5780635f8dead3146103ae5780636a3edf28146103ca5780637157797f146103e85780637da0a877146104185780637f4ab1dd1461043657610204565b806352f6747a1461031257806354e4b9451461033057806354fd4d5014610360578063572b6c051461037e57610204565b806336568abe116101d757806336568abe146102a25780633e5af4ca146102be5780633ff5aa02146102da57806340db3b50146102f657610204565b806301ffc9a71461020857806303c26bcd14610238578063248a9ca3146102565780632f2ff15d14610286575b5f5ffd5b610222600480360381019061021d9190611ed6565b6106b0565b60405161022f9190611f1b565b60405180910390f35b610240610729565b60405161024d9190611f4c565b60405180910390f35b610270600480360381019061026b9190611f8f565b61074d565b60405161027d9190611f4c565b60405180910390f35b6102a0600480360381019061029b9190612014565b610769565b005b6102bc60048036038101906102b79190612014565b61078b565b005b6102d860048036038101906102d39190612085565b610806565b005b6102f460048036038101906102ef91906120e9565b610869565b005b610310600480360381019061030b91906120e9565b6108a0565b005b61031a6108d7565b60405161032791906121cb565b60405180910390f35b61034a60048036038101906103459190612226565b6108e8565b6040516103579190611f1b565b60405180910390f35b610368610904565b60405161037591906122c1565b60405180910390f35b610398600480360381019061039391906120e9565b610941565b6040516103a59190611f1b565b60405180910390f35b6103c860048036038101906103c391906122e1565b61097f565b005b6103d26109df565b6040516103df919061232e565b60405180910390f35b61040260048036038101906103fd9190612085565b610a13565b60405161040f9190611f1b565b60405180910390f35b610420610a44565b60405161042d919061232e565b60405180910390f35b610450600480360381019061044b919061237d565b610a6b565b60405161045d91906122c1565b60405180910390f35b610480600480360381019061047b91906123a8565b610be1565b005b61049c600480360381019061049791906122e1565b610c42565b005b6104b860048036038101906104b39190612014565b610ca2565b6040516104c59190611f1b565b60405180910390f35b6104e860048036038101906104e391906120e9565b610cd0565b6040516104f59190611f1b565b60405180910390f35b610506610cec565b6040516105139190611f4c565b60405180910390f35b610524610d10565b6040516105319190611f4c565b60405180910390f35b610542610d16565b005b61055e60048036038101906105599190612459565b610d4b565b005b610568610ef7565b60405161057591906124b3565b60405180910390f35b61059860048036038101906105939190612085565b610f07565b6040516105a591906124db565b60405180910390f35b6105c860048036038101906105c391906123a8565b610feb565b6040516105d591906124db565b60405180910390f35b6105f860048036038101906105f39190612014565b6110cc565b005b610614600480360381019061060f91906124f4565b6110ee565b604051610621919061232e565b60405180910390f35b610644600480360381019061063f9190612226565b611124565b005b610660600480360381019061065b9190612226565b6111a5565b005b61067c600480360381019061067791906123a8565b611269565b6040516106899190611f1b565b60405180910390f35b61069a611298565b6040516106a791906121cb565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107225750610721826112a9565b5b9050919050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b5f5f5f8381526020019081526020015f20600101549050919050565b6107728261074d565b61077b81611312565b6107858383611326565b50505050565b61079361140f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107f7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610801828261141d565b505050565b61082161081161140f565b600361150690919063ffffffff16565b610857576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61086384848484611533565b50505050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856861089381611312565b61089c826115df565b5050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede6000285686108ca81611312565b6108d382611713565b5050565b60606108e360016117e1565b905090565b5f6108fd82600161150690919063ffffffff16565b9050919050565b60606040518060400160405280600581526020017f332e302e30000000000000000000000000000000000000000000000000000000815250905090565b5f61094a610a44565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b61099a61098a61140f565b600361150690919063ffffffff16565b6109d0576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db5f8383611800565b5050565b5f5f6109eb60036118a9565b1115610a0c57610a055f60036118bc90919063ffffffff16565b9050610a10565b5f90505b90565b5f5f6006811115610a2757610a2661251f565b5b60ff16610a3686868686610f07565b60ff16149050949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b60605f610a76610ef7565b90505f5f90505b81811015610ba157610a8e816110ee565b73ffffffffffffffffffffffffffffffffffffffff16637d045df6856040518263ffffffff1660e01b8152600401610ac691906124db565b602060405180830381865afa158015610ae1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190612576565b15610b9657610b13816110ee565b73ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd856040518263ffffffff1660e01b8152600401610b4b91906124db565b5f60405180830381865afa158015610b65573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610b8d91906126bb565b92505050610bdc565b806001019050610a7d565b506040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f646500000000000000008152509150505b919050565b610bfc610bec61140f565b600361150690919063ffffffff16565b610c32576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3d838383611800565b505050565b610c5d610c4d61140f565b600361150690919063ffffffff16565b610c93576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9e825f83611800565b5050565b5f610caf5f5f1b836118d3565b15610cbd5760019050610cca565b610cc783836118d3565b90505b92915050565b5f610ce582600361150690919063ffffffff16565b9050919050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b5f5f1b81565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e610d4081611312565b610d48611936565b50565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e610d7581611312565b5f8383905003610db1576040517f59203cb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610dbc60016118a9565b1115610dcb57610dca611936565b5b5f5f90505b83839050811015610ef157610e0b848483818110610df157610df0612702565b5b9050602002016020810190610e069190612226565b61196e565b610e46848483818110610e2157610e20612702565b5b9050602002016020810190610e369190612226565b6001611a2190919063ffffffff16565b610e7c576040517ff280d16100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b838382818110610e8f57610e8e612702565b5b9050602002016020810190610ea49190612226565b73ffffffffffffffffffffffffffffffffffffffff167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2806001019050610dd0565b50505050565b5f610f0260016118a9565b905090565b5f5f610f11610ef7565b90505f5f90505b81811015610fcb575f610f2a826110ee565b73ffffffffffffffffffffffffffffffffffffffff1663d32c7bb5898989896040518563ffffffff1660e01b8152600401610f68949392919061272f565b602060405180830381865afa158015610f83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa79190612786565b90505f8160ff161115610fbf57809350505050610fe3565b50806001019050610f18565b505f6006811115610fdf57610fde61251f565b5b9150505b949350505050565b5f5f610ff5610ef7565b90505f5f90505b818110156110ad575f61100e826110ee565b73ffffffffffffffffffffffffffffffffffffffff1663d4ce14158888886040518463ffffffff1660e01b815260040161104a939291906127b1565b602060405180830381865afa158015611065573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110899190612786565b90505f8160ff1611156110a1578093505050506110c5565b50806001019050610ffc565b505f60068111156110c1576110c061251f565b5b9150505b9392505050565b6110d58261074d565b6110de81611312565b6110e8838361141d565b50505050565b5f6110f960016118a9565b82101561111b576111148260016118bc90919063ffffffff16565b905061111f565b5f90505b919050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e61114e81611312565b61116282600161150690919063ffffffff16565b611198576040517fb370e90400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a182611a4e565b5050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e6111cf81611312565b6111d88261196e565b6111ec826001611a2190919063ffffffff16565b611222576040517ff280d16100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a25050565b5f5f600681111561127d5761127c61251f565b5b60ff1661128b858585610feb565b60ff161490509392505050565b60606112a460036117e1565b905090565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113238161131e61140f565b611ade565b50565b5f6113318383610ca2565b6114055760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506113a261140f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611409565b5f90505b92915050565b5f611418611b2f565b905090565b5f6114288383610ca2565b156114fc575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061149961140f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611500565b5f90505b92915050565b5f61152b835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611b97565b905092915050565b5f61153e60016118a9565b90505f5f90505b818110156115d7576115618160016118bc90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16633e5af4ca878787876040518563ffffffff1660e01b815260040161159f949392919061272f565b5f604051808303815f87803b1580156115b6575f5ffd5b505af11580156115c8573d5f5f3e3d5ffd5b50505050806001019050611545565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611644576040517fdc418b8000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61165881600361150690919063ffffffff16565b1561168f576040517ff423354700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116a3816003611a2190919063ffffffff16565b6116d9576040517f369bb9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b81604051611708919061232e565b60405180910390a150565b61172781600361150690919063ffffffff16565b61175d576040517fd456910600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611771816003611bb790919063ffffffff16565b6117a7576040517f369bb9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a816040516117d6919061232e565b60405180910390a150565b60605f6117ef835f01611be4565b905060608190508092505050919050565b5f61180b60016118a9565b90505f5f90505b818110156118a25761182e8160016118bc90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16638baf29b48686866040518463ffffffff1660e01b815260040161186a939291906127b1565b5f604051808303815f87803b158015611881575f5ffd5b505af1158015611893573d5f5f3e3d5ffd5b50505050806001019050611812565b5050505050565b5f6118b5825f01611c3d565b9050919050565b5f6118c9835f0183611c4c565b5f1c905092915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b7fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b260405160405180910390a161196c6001611c73565b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119d3576040517ff9d152fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119e781600161150690919063ffffffff16565b15611a1e576040517fcc790a4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f611a46835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611c81565b905092915050565b611a62816001611bb790919063ffffffff16565b611a98576040517ff280d16100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc460405160405180910390a250565b611ae88282610ca2565b611b2b5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611b229291906127e6565b60405180910390fd5b5050565b5f5f5f36905090505f611b40611ce8565b9050808210158015611b575750611b5633610941565b5b15611b87575f36828403908092611b7093929190612815565b90611b7b9190612890565b60601c92505050611b94565b611b8f611cf6565b925050505b90565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f611bdc835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611cfd565b905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015611c3157602002820191905f5260205f20905b815481526020019060010190808311611c1d575b50505050509050919050565b5f815f01805490509050919050565b5f825f018281548110611c6257611c61612702565b5b905f5260205f200154905092915050565b611c7e815f01611df9565b50565b5f611c8c8383611b97565b611cde57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611ce2565b5f90505b92915050565b5f611cf1611e61565b905090565b5f33905090565b5f5f836001015f8481526020019081526020015f205490505f8114611dee575f600182611d2a919061291b565b90505f6001865f0180549050611d40919061291b565b9050808214611da6575f865f018281548110611d5f57611d5e612702565b5b905f5260205f200154905080875f018481548110611d8057611d7f612702565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611db957611db861294e565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611df3565b5f9150505b92915050565b5f611e0382611c3d565b90505f5f90505b81811015611e5057826001015f845f018381548110611e2c57611e2b612702565b5b905f5260205f20015481526020019081526020015f205f9055806001019050611e0a565b50611e5d825f015f611e69565b5050565b5f6014905090565b8082555050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb581611e81565b8114611ebf575f5ffd5b50565b5f81359050611ed081611eac565b92915050565b5f60208284031215611eeb57611eea611e79565b5b5f611ef884828501611ec2565b91505092915050565b5f8115159050919050565b611f1581611f01565b82525050565b5f602082019050611f2e5f830184611f0c565b92915050565b5f819050919050565b611f4681611f34565b82525050565b5f602082019050611f5f5f830184611f3d565b92915050565b611f6e81611f34565b8114611f78575f5ffd5b50565b5f81359050611f8981611f65565b92915050565b5f60208284031215611fa457611fa3611e79565b5b5f611fb184828501611f7b565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611fe382611fba565b9050919050565b611ff381611fd9565b8114611ffd575f5ffd5b50565b5f8135905061200e81611fea565b92915050565b5f5f6040838503121561202a57612029611e79565b5b5f61203785828601611f7b565b925050602061204885828601612000565b9150509250929050565b5f819050919050565b61206481612052565b811461206e575f5ffd5b50565b5f8135905061207f8161205b565b92915050565b5f5f5f5f6080858703121561209d5761209c611e79565b5b5f6120aa87828801612000565b94505060206120bb87828801612000565b93505060406120cc87828801612000565b92505060606120dd87828801612071565b91505092959194509250565b5f602082840312156120fe576120fd611e79565b5b5f61210b84828501612000565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61214681611fd9565b82525050565b5f612157838361213d565b60208301905092915050565b5f602082019050919050565b5f61217982612114565b612183818561211e565b935061218e8361212e565b805f5b838110156121be5781516121a5888261214c565b97506121b083612163565b925050600181019050612191565b5085935050505092915050565b5f6020820190508181035f8301526121e3818461216f565b905092915050565b5f6121f582611fd9565b9050919050565b612205816121eb565b811461220f575f5ffd5b50565b5f81359050612220816121fc565b92915050565b5f6020828403121561223b5761223a611e79565b5b5f61224884828501612212565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61229382612251565b61229d818561225b565b93506122ad81856020860161226b565b6122b681612279565b840191505092915050565b5f6020820190508181035f8301526122d98184612289565b905092915050565b5f5f604083850312156122f7576122f6611e79565b5b5f61230485828601612000565b925050602061231585828601612071565b9150509250929050565b61232881611fd9565b82525050565b5f6020820190506123415f83018461231f565b92915050565b5f60ff82169050919050565b61235c81612347565b8114612366575f5ffd5b50565b5f8135905061237781612353565b92915050565b5f6020828403121561239257612391611e79565b5b5f61239f84828501612369565b91505092915050565b5f5f5f606084860312156123bf576123be611e79565b5b5f6123cc86828701612000565b93505060206123dd86828701612000565b92505060406123ee86828701612071565b9150509250925092565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112612419576124186123f8565b5b8235905067ffffffffffffffff811115612436576124356123fc565b5b60208301915083602082028301111561245257612451612400565b5b9250929050565b5f5f6020838503121561246f5761246e611e79565b5b5f83013567ffffffffffffffff81111561248c5761248b611e7d565b5b61249885828601612404565b92509250509250929050565b6124ad81612052565b82525050565b5f6020820190506124c65f8301846124a4565b92915050565b6124d581612347565b82525050565b5f6020820190506124ee5f8301846124cc565b92915050565b5f6020828403121561250957612508611e79565b5b5f61251684828501612071565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b61255581611f01565b811461255f575f5ffd5b50565b5f815190506125708161254c565b92915050565b5f6020828403121561258b5761258a611e79565b5b5f61259884828501612562565b91505092915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6125db82612279565b810181811067ffffffffffffffff821117156125fa576125f96125a5565b5b80604052505050565b5f61260c611e70565b905061261882826125d2565b919050565b5f67ffffffffffffffff821115612637576126366125a5565b5b61264082612279565b9050602081019050919050565b5f61265f61265a8461261d565b612603565b90508281526020810184848401111561267b5761267a6125a1565b5b61268684828561226b565b509392505050565b5f82601f8301126126a2576126a16123f8565b5b81516126b284826020860161264d565b91505092915050565b5f602082840312156126d0576126cf611e79565b5b5f82015167ffffffffffffffff8111156126ed576126ec611e7d565b5b6126f98482850161268e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080820190506127425f83018761231f565b61274f602083018661231f565b61275c604083018561231f565b61276960608301846124a4565b95945050505050565b5f8151905061278081612353565b92915050565b5f6020828403121561279b5761279a611e79565b5b5f6127a884828501612772565b91505092915050565b5f6060820190506127c45f83018661231f565b6127d1602083018561231f565b6127de60408301846124a4565b949350505050565b5f6040820190506127f95f83018561231f565b6128066020830184611f3d565b9392505050565b5f5ffd5b5f5ffd5b5f5f858511156128285761282761280d565b5b8386111561283957612838612811565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b5f82821b905092915050565b5f61289b838361284f565b826128a68135612859565b925060148210156128e6576128e17fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802612884565b831692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61292582612052565b915061293083612052565b9250828203905081811115612948576129476128ee565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220424f0794bba77302c7f954fbeba7cfe1f1e71aaf9ccfb51c88b7fc8c64e5082264736f6c634300081e0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610204575f3560e01c80638baf29b411610118578063bc13eacc116100ab578063db18af6c1161007a578063db18af6c146105fa578063df21950f1461062a578063e3c4602c14610646578063e46638e614610662578063e54621d21461069257610204565b8063bc13eacc14610560578063d32c7bb51461057e578063d4ce1415146105ae578063d547741f146105de57610204565b80639b11c115116100e75780639b11c115146104fe578063a217fddf1461051c578063b043572e1461053a578063b27aef3a1461054457610204565b80638baf29b4146104665780638d2ea7721461048257806391d148541461049e578063993e8b95146104ce57610204565b806352f6747a1161019b5780635f8dead31161016a5780635f8dead3146103ae5780636a3edf28146103ca5780637157797f146103e85780637da0a877146104185780637f4ab1dd1461043657610204565b806352f6747a1461031257806354e4b9451461033057806354fd4d5014610360578063572b6c051461037e57610204565b806336568abe116101d757806336568abe146102a25780633e5af4ca146102be5780633ff5aa02146102da57806340db3b50146102f657610204565b806301ffc9a71461020857806303c26bcd14610238578063248a9ca3146102565780632f2ff15d14610286575b5f5ffd5b610222600480360381019061021d9190611ed6565b6106b0565b60405161022f9190611f1b565b60405180910390f35b610240610729565b60405161024d9190611f4c565b60405180910390f35b610270600480360381019061026b9190611f8f565b61074d565b60405161027d9190611f4c565b60405180910390f35b6102a0600480360381019061029b9190612014565b610769565b005b6102bc60048036038101906102b79190612014565b61078b565b005b6102d860048036038101906102d39190612085565b610806565b005b6102f460048036038101906102ef91906120e9565b610869565b005b610310600480360381019061030b91906120e9565b6108a0565b005b61031a6108d7565b60405161032791906121cb565b60405180910390f35b61034a60048036038101906103459190612226565b6108e8565b6040516103579190611f1b565b60405180910390f35b610368610904565b60405161037591906122c1565b60405180910390f35b610398600480360381019061039391906120e9565b610941565b6040516103a59190611f1b565b60405180910390f35b6103c860048036038101906103c391906122e1565b61097f565b005b6103d26109df565b6040516103df919061232e565b60405180910390f35b61040260048036038101906103fd9190612085565b610a13565b60405161040f9190611f1b565b60405180910390f35b610420610a44565b60405161042d919061232e565b60405180910390f35b610450600480360381019061044b919061237d565b610a6b565b60405161045d91906122c1565b60405180910390f35b610480600480360381019061047b91906123a8565b610be1565b005b61049c600480360381019061049791906122e1565b610c42565b005b6104b860048036038101906104b39190612014565b610ca2565b6040516104c59190611f1b565b60405180910390f35b6104e860048036038101906104e391906120e9565b610cd0565b6040516104f59190611f1b565b60405180910390f35b610506610cec565b6040516105139190611f4c565b60405180910390f35b610524610d10565b6040516105319190611f4c565b60405180910390f35b610542610d16565b005b61055e60048036038101906105599190612459565b610d4b565b005b610568610ef7565b60405161057591906124b3565b60405180910390f35b61059860048036038101906105939190612085565b610f07565b6040516105a591906124db565b60405180910390f35b6105c860048036038101906105c391906123a8565b610feb565b6040516105d591906124db565b60405180910390f35b6105f860048036038101906105f39190612014565b6110cc565b005b610614600480360381019061060f91906124f4565b6110ee565b604051610621919061232e565b60405180910390f35b610644600480360381019061063f9190612226565b611124565b005b610660600480360381019061065b9190612226565b6111a5565b005b61067c600480360381019061067791906123a8565b611269565b6040516106899190611f1b565b60405180910390f35b61069a611298565b6040516106a791906121cb565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107225750610721826112a9565b5b9050919050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b5f5f5f8381526020019081526020015f20600101549050919050565b6107728261074d565b61077b81611312565b6107858383611326565b50505050565b61079361140f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107f7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610801828261141d565b505050565b61082161081161140f565b600361150690919063ffffffff16565b610857576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61086384848484611533565b50505050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856861089381611312565b61089c826115df565b5050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede6000285686108ca81611312565b6108d382611713565b5050565b60606108e360016117e1565b905090565b5f6108fd82600161150690919063ffffffff16565b9050919050565b60606040518060400160405280600581526020017f332e302e30000000000000000000000000000000000000000000000000000000815250905090565b5f61094a610a44565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b61099a61098a61140f565b600361150690919063ffffffff16565b6109d0576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db5f8383611800565b5050565b5f5f6109eb60036118a9565b1115610a0c57610a055f60036118bc90919063ffffffff16565b9050610a10565b5f90505b90565b5f5f6006811115610a2757610a2661251f565b5b60ff16610a3686868686610f07565b60ff16149050949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b60605f610a76610ef7565b90505f5f90505b81811015610ba157610a8e816110ee565b73ffffffffffffffffffffffffffffffffffffffff16637d045df6856040518263ffffffff1660e01b8152600401610ac691906124db565b602060405180830381865afa158015610ae1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190612576565b15610b9657610b13816110ee565b73ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd856040518263ffffffff1660e01b8152600401610b4b91906124db565b5f60405180830381865afa158015610b65573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610b8d91906126bb565b92505050610bdc565b806001019050610a7d565b506040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f646500000000000000008152509150505b919050565b610bfc610bec61140f565b600361150690919063ffffffff16565b610c32576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3d838383611800565b505050565b610c5d610c4d61140f565b600361150690919063ffffffff16565b610c93576040517fe39b3c8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9e825f83611800565b5050565b5f610caf5f5f1b836118d3565b15610cbd5760019050610cca565b610cc783836118d3565b90505b92915050565b5f610ce582600361150690919063ffffffff16565b9050919050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b5f5f1b81565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e610d4081611312565b610d48611936565b50565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e610d7581611312565b5f8383905003610db1576040517f59203cb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610dbc60016118a9565b1115610dcb57610dca611936565b5b5f5f90505b83839050811015610ef157610e0b848483818110610df157610df0612702565b5b9050602002016020810190610e069190612226565b61196e565b610e46848483818110610e2157610e20612702565b5b9050602002016020810190610e369190612226565b6001611a2190919063ffffffff16565b610e7c576040517ff280d16100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b838382818110610e8f57610e8e612702565b5b9050602002016020810190610ea49190612226565b73ffffffffffffffffffffffffffffffffffffffff167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2806001019050610dd0565b50505050565b5f610f0260016118a9565b905090565b5f5f610f11610ef7565b90505f5f90505b81811015610fcb575f610f2a826110ee565b73ffffffffffffffffffffffffffffffffffffffff1663d32c7bb5898989896040518563ffffffff1660e01b8152600401610f68949392919061272f565b602060405180830381865afa158015610f83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa79190612786565b90505f8160ff161115610fbf57809350505050610fe3565b50806001019050610f18565b505f6006811115610fdf57610fde61251f565b5b9150505b949350505050565b5f5f610ff5610ef7565b90505f5f90505b818110156110ad575f61100e826110ee565b73ffffffffffffffffffffffffffffffffffffffff1663d4ce14158888886040518463ffffffff1660e01b815260040161104a939291906127b1565b602060405180830381865afa158015611065573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110899190612786565b90505f8160ff1611156110a1578093505050506110c5565b50806001019050610ffc565b505f60068111156110c1576110c061251f565b5b9150505b9392505050565b6110d58261074d565b6110de81611312565b6110e8838361141d565b50505050565b5f6110f960016118a9565b82101561111b576111148260016118bc90919063ffffffff16565b905061111f565b5f90505b919050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e61114e81611312565b61116282600161150690919063ffffffff16565b611198576040517fb370e90400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a182611a4e565b5050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e6111cf81611312565b6111d88261196e565b6111ec826001611a2190919063ffffffff16565b611222576040517ff280d16100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a25050565b5f5f600681111561127d5761127c61251f565b5b60ff1661128b858585610feb565b60ff161490509392505050565b60606112a460036117e1565b905090565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113238161131e61140f565b611ade565b50565b5f6113318383610ca2565b6114055760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506113a261140f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611409565b5f90505b92915050565b5f611418611b2f565b905090565b5f6114288383610ca2565b156114fc575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061149961140f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611500565b5f90505b92915050565b5f61152b835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611b97565b905092915050565b5f61153e60016118a9565b90505f5f90505b818110156115d7576115618160016118bc90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16633e5af4ca878787876040518563ffffffff1660e01b815260040161159f949392919061272f565b5f604051808303815f87803b1580156115b6575f5ffd5b505af11580156115c8573d5f5f3e3d5ffd5b50505050806001019050611545565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611644576040517fdc418b8000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61165881600361150690919063ffffffff16565b1561168f576040517ff423354700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116a3816003611a2190919063ffffffff16565b6116d9576040517f369bb9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b81604051611708919061232e565b60405180910390a150565b61172781600361150690919063ffffffff16565b61175d576040517fd456910600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611771816003611bb790919063ffffffff16565b6117a7576040517f369bb9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a816040516117d6919061232e565b60405180910390a150565b60605f6117ef835f01611be4565b905060608190508092505050919050565b5f61180b60016118a9565b90505f5f90505b818110156118a25761182e8160016118bc90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16638baf29b48686866040518463ffffffff1660e01b815260040161186a939291906127b1565b5f604051808303815f87803b158015611881575f5ffd5b505af1158015611893573d5f5f3e3d5ffd5b50505050806001019050611812565b5050505050565b5f6118b5825f01611c3d565b9050919050565b5f6118c9835f0183611c4c565b5f1c905092915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b7fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b260405160405180910390a161196c6001611c73565b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119d3576040517ff9d152fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119e781600161150690919063ffffffff16565b15611a1e576040517fcc790a4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f611a46835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611c81565b905092915050565b611a62816001611bb790919063ffffffff16565b611a98576040517ff280d16100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc460405160405180910390a250565b611ae88282610ca2565b611b2b5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611b229291906127e6565b60405180910390fd5b5050565b5f5f5f36905090505f611b40611ce8565b9050808210158015611b575750611b5633610941565b5b15611b87575f36828403908092611b7093929190612815565b90611b7b9190612890565b60601c92505050611b94565b611b8f611cf6565b925050505b90565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f611bdc835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611cfd565b905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015611c3157602002820191905f5260205f20905b815481526020019060010190808311611c1d575b50505050509050919050565b5f815f01805490509050919050565b5f825f018281548110611c6257611c61612702565b5b905f5260205f200154905092915050565b611c7e815f01611df9565b50565b5f611c8c8383611b97565b611cde57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611ce2565b5f90505b92915050565b5f611cf1611e61565b905090565b5f33905090565b5f5f836001015f8481526020019081526020015f205490505f8114611dee575f600182611d2a919061291b565b90505f6001865f0180549050611d40919061291b565b9050808214611da6575f865f018281548110611d5f57611d5e612702565b5b905f5260205f200154905080875f018481548110611d8057611d7f612702565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611db957611db861294e565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611df3565b5f9150505b92915050565b5f611e0382611c3d565b90505f5f90505b81811015611e5057826001015f845f018381548110611e2c57611e2b612702565b5b905f5260205f20015481526020019081526020015f205f9055806001019050611e0a565b50611e5d825f015f611e69565b5050565b5f6014905090565b8082555050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb581611e81565b8114611ebf575f5ffd5b50565b5f81359050611ed081611eac565b92915050565b5f60208284031215611eeb57611eea611e79565b5b5f611ef884828501611ec2565b91505092915050565b5f8115159050919050565b611f1581611f01565b82525050565b5f602082019050611f2e5f830184611f0c565b92915050565b5f819050919050565b611f4681611f34565b82525050565b5f602082019050611f5f5f830184611f3d565b92915050565b611f6e81611f34565b8114611f78575f5ffd5b50565b5f81359050611f8981611f65565b92915050565b5f60208284031215611fa457611fa3611e79565b5b5f611fb184828501611f7b565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611fe382611fba565b9050919050565b611ff381611fd9565b8114611ffd575f5ffd5b50565b5f8135905061200e81611fea565b92915050565b5f5f6040838503121561202a57612029611e79565b5b5f61203785828601611f7b565b925050602061204885828601612000565b9150509250929050565b5f819050919050565b61206481612052565b811461206e575f5ffd5b50565b5f8135905061207f8161205b565b92915050565b5f5f5f5f6080858703121561209d5761209c611e79565b5b5f6120aa87828801612000565b94505060206120bb87828801612000565b93505060406120cc87828801612000565b92505060606120dd87828801612071565b91505092959194509250565b5f602082840312156120fe576120fd611e79565b5b5f61210b84828501612000565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61214681611fd9565b82525050565b5f612157838361213d565b60208301905092915050565b5f602082019050919050565b5f61217982612114565b612183818561211e565b935061218e8361212e565b805f5b838110156121be5781516121a5888261214c565b97506121b083612163565b925050600181019050612191565b5085935050505092915050565b5f6020820190508181035f8301526121e3818461216f565b905092915050565b5f6121f582611fd9565b9050919050565b612205816121eb565b811461220f575f5ffd5b50565b5f81359050612220816121fc565b92915050565b5f6020828403121561223b5761223a611e79565b5b5f61224884828501612212565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61229382612251565b61229d818561225b565b93506122ad81856020860161226b565b6122b681612279565b840191505092915050565b5f6020820190508181035f8301526122d98184612289565b905092915050565b5f5f604083850312156122f7576122f6611e79565b5b5f61230485828601612000565b925050602061231585828601612071565b9150509250929050565b61232881611fd9565b82525050565b5f6020820190506123415f83018461231f565b92915050565b5f60ff82169050919050565b61235c81612347565b8114612366575f5ffd5b50565b5f8135905061237781612353565b92915050565b5f6020828403121561239257612391611e79565b5b5f61239f84828501612369565b91505092915050565b5f5f5f606084860312156123bf576123be611e79565b5b5f6123cc86828701612000565b93505060206123dd86828701612000565b92505060406123ee86828701612071565b9150509250925092565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112612419576124186123f8565b5b8235905067ffffffffffffffff811115612436576124356123fc565b5b60208301915083602082028301111561245257612451612400565b5b9250929050565b5f5f6020838503121561246f5761246e611e79565b5b5f83013567ffffffffffffffff81111561248c5761248b611e7d565b5b61249885828601612404565b92509250509250929050565b6124ad81612052565b82525050565b5f6020820190506124c65f8301846124a4565b92915050565b6124d581612347565b82525050565b5f6020820190506124ee5f8301846124cc565b92915050565b5f6020828403121561250957612508611e79565b5b5f61251684828501612071565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b61255581611f01565b811461255f575f5ffd5b50565b5f815190506125708161254c565b92915050565b5f6020828403121561258b5761258a611e79565b5b5f61259884828501612562565b91505092915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6125db82612279565b810181811067ffffffffffffffff821117156125fa576125f96125a5565b5b80604052505050565b5f61260c611e70565b905061261882826125d2565b919050565b5f67ffffffffffffffff821115612637576126366125a5565b5b61264082612279565b9050602081019050919050565b5f61265f61265a8461261d565b612603565b90508281526020810184848401111561267b5761267a6125a1565b5b61268684828561226b565b509392505050565b5f82601f8301126126a2576126a16123f8565b5b81516126b284826020860161264d565b91505092915050565b5f602082840312156126d0576126cf611e79565b5b5f82015167ffffffffffffffff8111156126ed576126ec611e7d565b5b6126f98482850161268e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080820190506127425f83018761231f565b61274f602083018661231f565b61275c604083018561231f565b61276960608301846124a4565b95945050505050565b5f8151905061278081612353565b92915050565b5f6020828403121561279b5761279a611e79565b5b5f6127a884828501612772565b91505092915050565b5f6060820190506127c45f83018661231f565b6127d1602083018561231f565b6127de60408301846124a4565b949350505050565b5f6040820190506127f95f83018561231f565b6128066020830184611f3d565b9392505050565b5f5ffd5b5f5ffd5b5f5f858511156128285761282761280d565b5b8386111561283957612838612811565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b5f82821b905092915050565b5f61289b838361284f565b826128a68135612859565b925060148210156128e6576128e17fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802612884565b831692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61292582612052565b915061293083612052565b9250828203905081811115612948576129476128ee565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220424f0794bba77302c7f954fbeba7cfe1f1e71aaf9ccfb51c88b7fc8c64e5082264736f6c634300081e0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/RuleEngineBase.sol/RuleEngineBase.dbg.json b/doc/compilation/hardhat/src/RuleEngineBase.sol/RuleEngineBase.dbg.json deleted file mode 100644 index 4d68568..0000000 --- a/doc/compilation/hardhat/src/RuleEngineBase.sol/RuleEngineBase.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/RuleEngineBase.sol/RuleEngineBase.json b/doc/compilation/hardhat/src/RuleEngineBase.sol/RuleEngineBase.json deleted file mode 100644 index 2c66cc2..0000000 --- a/doc/compilation/hardhat/src/RuleEngineBase.sol/RuleEngineBase.json +++ /dev/null @@ -1,801 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleEngineBase", - "sourceName": "src/RuleEngineBase.sol", - "abi": [ - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_AdminWithAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_InvalidTokenAddress", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_OperationNotSuccessful", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_TokenAlreadyBound", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_TokenNotBound", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_UnauthorizedCaller", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_ArrayIsEmpty", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_OperationNotSuccessful", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAlreadyExists", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleDoNotMatch", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "AddRule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "ClearRules", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "RemoveRule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenBound", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenUnbound", - "type": "event" - }, - { - "inputs": [], - "name": "COMPLIANCE_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RULES_MANAGEMENT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "addRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "bindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "clearRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "containsRule", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "created", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "destroyed", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestriction", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestrictionFrom", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBound", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBounds", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "isTokenBound", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "messageForTransferRestriction", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "removeRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "ruleId", - "type": "uint256" - } - ], - "name": "rule", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rules", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rulesCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule[]", - "name": "rules_", - "type": "address[]" - } - ], - "name": "setRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "unbindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "version_", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/interfaces/IERC3643Compliance.sol/IERC3643Compliance.dbg.json b/doc/compilation/hardhat/src/interfaces/IERC3643Compliance.sol/IERC3643Compliance.dbg.json deleted file mode 100644 index 30bf738..0000000 --- a/doc/compilation/hardhat/src/interfaces/IERC3643Compliance.sol/IERC3643Compliance.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/interfaces/IERC3643Compliance.sol/IERC3643Compliance.json b/doc/compilation/hardhat/src/interfaces/IERC3643Compliance.sol/IERC3643Compliance.json deleted file mode 100644 index 120674e..0000000 --- a/doc/compilation/hardhat/src/interfaces/IERC3643Compliance.sol/IERC3643Compliance.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IERC3643Compliance", - "sourceName": "src/interfaces/IERC3643Compliance.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenBound", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenUnbound", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "bindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "created", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "destroyed", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBound", - "outputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBounds", - "outputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "isTokenBound", - "outputs": [ - { - "internalType": "bool", - "name": "isBound", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "unbindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/interfaces/IRule.sol/IRule.dbg.json b/doc/compilation/hardhat/src/interfaces/IRule.sol/IRule.dbg.json deleted file mode 100644 index 30bf738..0000000 --- a/doc/compilation/hardhat/src/interfaces/IRule.sol/IRule.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/interfaces/IRule.sol/IRule.json b/doc/compilation/hardhat/src/interfaces/IRule.sol/IRule.json deleted file mode 100644 index 6af72d9..0000000 --- a/doc/compilation/hardhat/src/interfaces/IRule.sol/IRule.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IRule", - "sourceName": "src/interfaces/IRule.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "canReturnTransferRestrictionCode", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestriction", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestrictionFrom", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "messageForTransferRestriction", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/interfaces/IRulesManagementModule.sol/IRulesManagementModule.dbg.json b/doc/compilation/hardhat/src/interfaces/IRulesManagementModule.sol/IRulesManagementModule.dbg.json deleted file mode 100644 index 30bf738..0000000 --- a/doc/compilation/hardhat/src/interfaces/IRulesManagementModule.sol/IRulesManagementModule.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/interfaces/IRulesManagementModule.sol/IRulesManagementModule.json b/doc/compilation/hardhat/src/interfaces/IRulesManagementModule.sol/IRulesManagementModule.json deleted file mode 100644 index 0d1057e..0000000 --- a/doc/compilation/hardhat/src/interfaces/IRulesManagementModule.sol/IRulesManagementModule.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IRulesManagementModule", - "sourceName": "src/interfaces/IRulesManagementModule.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "addRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "clearRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "containsRule", - "outputs": [ - { - "internalType": "bool", - "name": "exists", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "removeRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "ruleId", - "type": "uint256" - } - ], - "name": "rule", - "outputs": [ - { - "internalType": "address", - "name": "ruleAddress", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rules", - "outputs": [ - { - "internalType": "address[]", - "name": "ruleAddresses", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rulesCount", - "outputs": [ - { - "internalType": "uint256", - "name": "numberOfrules", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule[]", - "name": "rules_", - "type": "address[]" - } - ], - "name": "setRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/operation/RuleConditionalTransferLight.sol/RuleConditionalTransferLight.dbg.json b/doc/compilation/hardhat/src/mocks/rules/operation/RuleConditionalTransferLight.sol/RuleConditionalTransferLight.dbg.json deleted file mode 100644 index 603ee8f..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/operation/RuleConditionalTransferLight.sol/RuleConditionalTransferLight.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/operation/RuleConditionalTransferLight.sol/RuleConditionalTransferLight.json b/doc/compilation/hardhat/src/mocks/rules/operation/RuleConditionalTransferLight.sol/RuleConditionalTransferLight.json deleted file mode 100644 index 926f9f6..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/operation/RuleConditionalTransferLight.sol/RuleConditionalTransferLight.json +++ /dev/null @@ -1,644 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleConditionalTransferLight", - "sourceName": "src/mocks/rules/operation/RuleConditionalTransferLight.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - }, - { - "internalType": "contract IRuleEngine", - "name": "ruleEngineContract", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "TransferNotApproved", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "count", - "type": "uint256" - } - ], - "name": "TransferApproved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "remaining", - "type": "uint256" - } - ], - "name": "TransferExecuted", - "type": "event" - }, - { - "inputs": [], - "name": "CODE_TRANSFER_REQUEST_NOT_APPROVED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "OPERATOR_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RULE_ENGINE_CONTRACT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "approvalCounts", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approveTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approvedCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "canReturnTransferRestrictionCode", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestriction", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestrictionFrom", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "messageForTransferRestriction", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161174138038061174183398181016040528101906100319190610347565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361009f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610096906103df565b60405180910390fd5b6100b15f5f1b3361014f60201b60201c565b506100e27f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298361014f60201b60201c565b505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610148576101467f5007339590b47d4786f4ab2ef7ffa0ec54bc5fe7244dd97bc6efa6ab3799807b8261014f60201b60201c565b505b50506103fd565b5f610160838361024460201b60201c565b61023a5760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506101d76102a760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905061023e565b5f90505b92915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102db826102b2565b9050919050565b6102eb816102d1565b81146102f5575f5ffd5b50565b5f81519050610306816102e2565b92915050565b5f610316826102d1565b9050919050565b6103268161030c565b8114610330575f5ffd5b50565b5f815190506103418161031d565b92915050565b5f5f6040838503121561035d5761035c6102ae565b5b5f61036a858286016102f8565b925050602061037b85828601610333565b9150509250929050565b5f82825260208201905092915050565b7f496e76616c6964206f70657261746f72000000000000000000000000000000005f82015250565b5f6103c9601083610385565b91506103d482610395565b602082019050919050565b5f6020820190508181035f8301526103f6816103bd565b9050919050565b6113378061040a5f395ff3fe608060405234801561000f575f5ffd5b5060043610610135575f3560e01c80638abed32b116100b6578063d4ce14151161007a578063d4ce141514610393578063d547741f146103c3578063dfdc49b9146103df578063e46638e6146103fd578063f02322f01461042d578063f5b541a61461044b57610135565b80638abed32b146102c95780638baf29b4146102f957806391d1485414610315578063a217fddf14610345578063d32c7bb51461036357610135565b80633e5af4ca116100fd5780633e5af4ca146102015780637157797f1461021d5780637d045df61461024d5780637f4ab1dd1461027d57806382580805146102ad57610135565b806301ffc9a714610139578063248a9ca31461016957806325005a41146101995780632f2ff15d146101c957806336568abe146101e5575b5f5ffd5b610153600480360381019061014e9190610d6a565b610469565b6040516101609190610daf565b60405180910390f35b610183600480360381019061017e9190610dfb565b6104e2565b6040516101909190610e35565b60405180910390f35b6101b360048036038101906101ae9190610edb565b6104fe565b6040516101c09190610f3a565b60405180910390f35b6101e360048036038101906101de9190610f53565b610549565b005b6101ff60048036038101906101fa9190610f53565b61056b565b005b61021b60048036038101906102169190610f91565b6105e6565b005b61023760048036038101906102329190610f91565b6105f7565b6040516102449190610daf565b60405180910390f35b6102676004803603810190610262919061102b565b610628565b6040516102749190610daf565b60405180910390f35b6102976004803603810190610292919061102b565b61063a565b6040516102a491906110c6565b60405180910390f35b6102c760048036038101906102c29190610edb565b6106a8565b005b6102e360048036038101906102de9190610dfb565b6107a6565b6040516102f09190610f3a565b60405180910390f35b610313600480360381019061030e9190610edb565b6107bb565b005b61032f600480360381019061032a9190610f53565b6108d8565b60405161033c9190610daf565b60405180910390f35b61034d61093b565b60405161035a9190610e35565b60405180910390f35b61037d60048036038101906103789190610f91565b610941565b60405161038a91906110f5565b60405180910390f35b6103ad60048036038101906103a89190610edb565b610957565b6040516103ba91906110f5565b60405180910390f35b6103dd60048036038101906103d89190610f53565b6109cc565b005b6103e76109ee565b6040516103f491906110f5565b60405180910390f35b61041760048036038101906104129190610edb565b6109f3565b6040516104249190610daf565b60405180910390f35b610435610a22565b6040516104429190610e35565b60405180910390f35b610453610a46565b6040516104609190610e35565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104db57506104da82610a6a565b5b9050919050565b5f5f5f8381526020019081526020015f20600101549050919050565b5f5f84848460405160200161051593929190611173565b60405160208183030381529060405280519060200120905060015f8281526020019081526020015f20549150509392505050565b610552826104e2565b61055b81610ad3565b6105658383610ae7565b50505050565b610573610bd0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105d7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105e18282610bd7565b505050565b6105f18383836107bb565b50505050565b5f5f600681111561060b5761060a6111af565b5b60ff1661061a86868686610941565b60ff16149050949350505050565b5f604760ff168260ff16149050919050565b6060604760ff168260ff160361066a576040518060600160405280603581526020016112cd6035913990506106a3565b6040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f6465000000000000000081525090505b919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296106d281610ad3565b5f8484846040516020016106e893929190611173565b6040516020818303038152906040528051906020012090506001805f8381526020019081526020015f205f8282546107209190611209565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167feccbdf7c486b88cbffbd8100b22951057ab0de2b73f27f625cc468ccabc3d08a8560015f8681526020019081526020015f205460405161079792919061123c565b60405180910390a35050505050565b6001602052805f5260405f205f915090505481565b5f8383836040516020016107d193929190611173565b6040516020818303038152906040528051906020012090505f60015f8381526020019081526020015f205490505f8103610837576040517ff82ba75a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001816108449190611263565b60015f8481526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8e386ea29f37964fdbdb87193d773dea74e258b0f6108461c88c712051fb27bc8560015f8781526020019081526020015f20546040516108c992919061123c565b60405180910390a35050505050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f1b81565b5f61094d848484610957565b9050949350505050565b5f5f84848460405160200161096e93929190611173565b6040516020818303038152906040528051906020012090505f60015f8381526020019081526020015f205490505f81036109ad576047925050506109c5565b5f60068111156109c0576109bf6111af565b5b925050505b9392505050565b6109d5826104e2565b6109de81610ad3565b6109e88383610bd7565b50505050565b604781565b5f5f6006811115610a0757610a066111af565b5b60ff16610a15858585610957565b60ff161490509392505050565b7f5007339590b47d4786f4ab2ef7ffa0ec54bc5fe7244dd97bc6efa6ab3799807b81565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ae481610adf610bd0565b610cc0565b50565b5f610af283836108d8565b610bc65760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610b63610bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610bca565b5f90505b92915050565b5f33905090565b5f610be283836108d8565b15610cb6575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610c53610bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050610cba565b5f90505b92915050565b610cca82826108d8565b610d0d5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401610d049291906112a5565b60405180910390fd5b5050565b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610d4981610d15565b8114610d53575f5ffd5b50565b5f81359050610d6481610d40565b92915050565b5f60208284031215610d7f57610d7e610d11565b5b5f610d8c84828501610d56565b91505092915050565b5f8115159050919050565b610da981610d95565b82525050565b5f602082019050610dc25f830184610da0565b92915050565b5f819050919050565b610dda81610dc8565b8114610de4575f5ffd5b50565b5f81359050610df581610dd1565b92915050565b5f60208284031215610e1057610e0f610d11565b5b5f610e1d84828501610de7565b91505092915050565b610e2f81610dc8565b82525050565b5f602082019050610e485f830184610e26565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e7782610e4e565b9050919050565b610e8781610e6d565b8114610e91575f5ffd5b50565b5f81359050610ea281610e7e565b92915050565b5f819050919050565b610eba81610ea8565b8114610ec4575f5ffd5b50565b5f81359050610ed581610eb1565b92915050565b5f5f5f60608486031215610ef257610ef1610d11565b5b5f610eff86828701610e94565b9350506020610f1086828701610e94565b9250506040610f2186828701610ec7565b9150509250925092565b610f3481610ea8565b82525050565b5f602082019050610f4d5f830184610f2b565b92915050565b5f5f60408385031215610f6957610f68610d11565b5b5f610f7685828601610de7565b9250506020610f8785828601610e94565b9150509250929050565b5f5f5f5f60808587031215610fa957610fa8610d11565b5b5f610fb687828801610e94565b9450506020610fc787828801610e94565b9350506040610fd887828801610e94565b9250506060610fe987828801610ec7565b91505092959194509250565b5f60ff82169050919050565b61100a81610ff5565b8114611014575f5ffd5b50565b5f8135905061102581611001565b92915050565b5f602082840312156110405761103f610d11565b5b5f61104d84828501611017565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61109882611056565b6110a28185611060565b93506110b2818560208601611070565b6110bb8161107e565b840191505092915050565b5f6020820190508181035f8301526110de818461108e565b905092915050565b6110ef81610ff5565b82525050565b5f6020820190506111085f8301846110e6565b92915050565b5f8160601b9050919050565b5f6111248261110e565b9050919050565b5f6111358261111a565b9050919050565b61114d61114882610e6d565b61112b565b82525050565b5f819050919050565b61116d61116882610ea8565b611153565b82525050565b5f61117e828661113c565b60148201915061118e828561113c565b60148201915061119e828461115c565b602082019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61121382610ea8565b915061121e83610ea8565b9250828201905080821115611236576112356111dc565b5b92915050565b5f60408201905061124f5f830185610f2b565b61125c6020830184610f2b565b9392505050565b5f61126d82610ea8565b915061127883610ea8565b92508282039050818111156112905761128f6111dc565b5b92915050565b61129f81610e6d565b82525050565b5f6040820190506112b85f830185611296565b6112c56020830184610e26565b939250505056fe436f6e646974696f6e616c5472616e736665724c696768743a205468652072657175657374206973206e6f7420617070726f766564a264697066735822122037b97360116ec69b2e625d68757383c571efc8b26affda74da34e99c87ee96d864736f6c634300081e0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610135575f3560e01c80638abed32b116100b6578063d4ce14151161007a578063d4ce141514610393578063d547741f146103c3578063dfdc49b9146103df578063e46638e6146103fd578063f02322f01461042d578063f5b541a61461044b57610135565b80638abed32b146102c95780638baf29b4146102f957806391d1485414610315578063a217fddf14610345578063d32c7bb51461036357610135565b80633e5af4ca116100fd5780633e5af4ca146102015780637157797f1461021d5780637d045df61461024d5780637f4ab1dd1461027d57806382580805146102ad57610135565b806301ffc9a714610139578063248a9ca31461016957806325005a41146101995780632f2ff15d146101c957806336568abe146101e5575b5f5ffd5b610153600480360381019061014e9190610d6a565b610469565b6040516101609190610daf565b60405180910390f35b610183600480360381019061017e9190610dfb565b6104e2565b6040516101909190610e35565b60405180910390f35b6101b360048036038101906101ae9190610edb565b6104fe565b6040516101c09190610f3a565b60405180910390f35b6101e360048036038101906101de9190610f53565b610549565b005b6101ff60048036038101906101fa9190610f53565b61056b565b005b61021b60048036038101906102169190610f91565b6105e6565b005b61023760048036038101906102329190610f91565b6105f7565b6040516102449190610daf565b60405180910390f35b6102676004803603810190610262919061102b565b610628565b6040516102749190610daf565b60405180910390f35b6102976004803603810190610292919061102b565b61063a565b6040516102a491906110c6565b60405180910390f35b6102c760048036038101906102c29190610edb565b6106a8565b005b6102e360048036038101906102de9190610dfb565b6107a6565b6040516102f09190610f3a565b60405180910390f35b610313600480360381019061030e9190610edb565b6107bb565b005b61032f600480360381019061032a9190610f53565b6108d8565b60405161033c9190610daf565b60405180910390f35b61034d61093b565b60405161035a9190610e35565b60405180910390f35b61037d60048036038101906103789190610f91565b610941565b60405161038a91906110f5565b60405180910390f35b6103ad60048036038101906103a89190610edb565b610957565b6040516103ba91906110f5565b60405180910390f35b6103dd60048036038101906103d89190610f53565b6109cc565b005b6103e76109ee565b6040516103f491906110f5565b60405180910390f35b61041760048036038101906104129190610edb565b6109f3565b6040516104249190610daf565b60405180910390f35b610435610a22565b6040516104429190610e35565b60405180910390f35b610453610a46565b6040516104609190610e35565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104db57506104da82610a6a565b5b9050919050565b5f5f5f8381526020019081526020015f20600101549050919050565b5f5f84848460405160200161051593929190611173565b60405160208183030381529060405280519060200120905060015f8281526020019081526020015f20549150509392505050565b610552826104e2565b61055b81610ad3565b6105658383610ae7565b50505050565b610573610bd0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105d7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105e18282610bd7565b505050565b6105f18383836107bb565b50505050565b5f5f600681111561060b5761060a6111af565b5b60ff1661061a86868686610941565b60ff16149050949350505050565b5f604760ff168260ff16149050919050565b6060604760ff168260ff160361066a576040518060600160405280603581526020016112cd6035913990506106a3565b6040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f6465000000000000000081525090505b919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296106d281610ad3565b5f8484846040516020016106e893929190611173565b6040516020818303038152906040528051906020012090506001805f8381526020019081526020015f205f8282546107209190611209565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167feccbdf7c486b88cbffbd8100b22951057ab0de2b73f27f625cc468ccabc3d08a8560015f8681526020019081526020015f205460405161079792919061123c565b60405180910390a35050505050565b6001602052805f5260405f205f915090505481565b5f8383836040516020016107d193929190611173565b6040516020818303038152906040528051906020012090505f60015f8381526020019081526020015f205490505f8103610837576040517ff82ba75a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001816108449190611263565b60015f8481526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8e386ea29f37964fdbdb87193d773dea74e258b0f6108461c88c712051fb27bc8560015f8781526020019081526020015f20546040516108c992919061123c565b60405180910390a35050505050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f1b81565b5f61094d848484610957565b9050949350505050565b5f5f84848460405160200161096e93929190611173565b6040516020818303038152906040528051906020012090505f60015f8381526020019081526020015f205490505f81036109ad576047925050506109c5565b5f60068111156109c0576109bf6111af565b5b925050505b9392505050565b6109d5826104e2565b6109de81610ad3565b6109e88383610bd7565b50505050565b604781565b5f5f6006811115610a0757610a066111af565b5b60ff16610a15858585610957565b60ff161490509392505050565b7f5007339590b47d4786f4ab2ef7ffa0ec54bc5fe7244dd97bc6efa6ab3799807b81565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ae481610adf610bd0565b610cc0565b50565b5f610af283836108d8565b610bc65760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610b63610bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610bca565b5f90505b92915050565b5f33905090565b5f610be283836108d8565b15610cb6575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610c53610bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050610cba565b5f90505b92915050565b610cca82826108d8565b610d0d5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401610d049291906112a5565b60405180910390fd5b5050565b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610d4981610d15565b8114610d53575f5ffd5b50565b5f81359050610d6481610d40565b92915050565b5f60208284031215610d7f57610d7e610d11565b5b5f610d8c84828501610d56565b91505092915050565b5f8115159050919050565b610da981610d95565b82525050565b5f602082019050610dc25f830184610da0565b92915050565b5f819050919050565b610dda81610dc8565b8114610de4575f5ffd5b50565b5f81359050610df581610dd1565b92915050565b5f60208284031215610e1057610e0f610d11565b5b5f610e1d84828501610de7565b91505092915050565b610e2f81610dc8565b82525050565b5f602082019050610e485f830184610e26565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e7782610e4e565b9050919050565b610e8781610e6d565b8114610e91575f5ffd5b50565b5f81359050610ea281610e7e565b92915050565b5f819050919050565b610eba81610ea8565b8114610ec4575f5ffd5b50565b5f81359050610ed581610eb1565b92915050565b5f5f5f60608486031215610ef257610ef1610d11565b5b5f610eff86828701610e94565b9350506020610f1086828701610e94565b9250506040610f2186828701610ec7565b9150509250925092565b610f3481610ea8565b82525050565b5f602082019050610f4d5f830184610f2b565b92915050565b5f5f60408385031215610f6957610f68610d11565b5b5f610f7685828601610de7565b9250506020610f8785828601610e94565b9150509250929050565b5f5f5f5f60808587031215610fa957610fa8610d11565b5b5f610fb687828801610e94565b9450506020610fc787828801610e94565b9350506040610fd887828801610e94565b9250506060610fe987828801610ec7565b91505092959194509250565b5f60ff82169050919050565b61100a81610ff5565b8114611014575f5ffd5b50565b5f8135905061102581611001565b92915050565b5f602082840312156110405761103f610d11565b5b5f61104d84828501611017565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61109882611056565b6110a28185611060565b93506110b2818560208601611070565b6110bb8161107e565b840191505092915050565b5f6020820190508181035f8301526110de818461108e565b905092915050565b6110ef81610ff5565b82525050565b5f6020820190506111085f8301846110e6565b92915050565b5f8160601b9050919050565b5f6111248261110e565b9050919050565b5f6111358261111a565b9050919050565b61114d61114882610e6d565b61112b565b82525050565b5f819050919050565b61116d61116882610ea8565b611153565b82525050565b5f61117e828661113c565b60148201915061118e828561113c565b60148201915061119e828461115c565b602082019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61121382610ea8565b915061121e83610ea8565b9250828201905080821115611236576112356111dc565b5b92915050565b5f60408201905061124f5f830185610f2b565b61125c6020830184610f2b565b9392505050565b5f61126d82610ea8565b915061127883610ea8565b92508282039050818111156112905761128f6111dc565b5b92915050565b61129f81610e6d565b82525050565b5f6040820190506112b85f830185611296565b6112c56020830184610e26565b939250505056fe436f6e646974696f6e616c5472616e736665724c696768743a205468652072657175657374206973206e6f7420617070726f766564a264697066735822122037b97360116ec69b2e625d68757383c571efc8b26affda74da34e99c87ee96d864736f6c634300081e0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/operation/RuleOperationRevert.sol/RuleOperationRevert.dbg.json b/doc/compilation/hardhat/src/mocks/rules/operation/RuleOperationRevert.sol/RuleOperationRevert.dbg.json deleted file mode 100644 index 603ee8f..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/operation/RuleOperationRevert.sol/RuleOperationRevert.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/operation/RuleOperationRevert.sol/RuleOperationRevert.json b/doc/compilation/hardhat/src/mocks/rules/operation/RuleOperationRevert.sol/RuleOperationRevert.json deleted file mode 100644 index 3dd23aa..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/operation/RuleOperationRevert.sol/RuleOperationRevert.json +++ /dev/null @@ -1,469 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleOperationRevert", - "sourceName": "src/mocks/rules/operation/RuleOperationRevert.sol", - "abi": [ - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "RuleConditionalTransferLight_InvalidTransfer", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "inputs": [], - "name": "CODE_TRANSFER_REQUEST_NOT_APPROVED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "canReturnTransferRestrictionCode", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "detectTransferRestriction", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestrictionFrom", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "name": "messageForTransferRestriction", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "pure", - "type": "function" - } - ], - "bytecode": "0x6080604052348015600e575f5ffd5b50610d998061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106100fe575f3560e01c80638baf29b411610095578063d4ce141511610064578063d4ce1415146102e0578063d547741f14610310578063dfdc49b91461032c578063e46638e61461034a576100fe565b80638baf29b41461024657806391d1485414610262578063a217fddf14610292578063d32c7bb5146102b0576100fe565b80633e5af4ca116100d15780633e5af4ca1461019a5780637157797f146101b65780637d045df6146101e65780637f4ab1dd14610216576100fe565b806301ffc9a714610102578063248a9ca3146101325780632f2ff15d1461016257806336568abe1461017e575b5f5ffd5b61011c60048036038101906101179190610984565b61037a565b60405161012991906109c9565b60405180910390f35b61014c60048036038101906101479190610a15565b6103f3565b6040516101599190610a4f565b60405180910390f35b61017c60048036038101906101779190610ac2565b61040f565b005b61019860048036038101906101939190610ac2565b610431565b005b6101b460048036038101906101af9190610b33565b6104ac565b005b6101d060048036038101906101cb9190610b33565b6104de565b6040516101dd91906109c9565b60405180910390f35b61020060048036038101906101fb9190610bcd565b61050f565b60405161020d91906109c9565b60405180910390f35b610230600480360381019061022b9190610bcd565b610521565b60405161023d9190610c68565b60405180910390f35b610260600480360381019061025b9190610c88565b610560565b005b61027c60048036038101906102779190610ac2565b610592565b60405161028991906109c9565b60405180910390f35b61029a6105f5565b6040516102a79190610a4f565b60405180910390f35b6102ca60048036038101906102c59190610b33565b6105fb565b6040516102d79190610ce7565b60405180910390f35b6102fa60048036038101906102f59190610c88565b610611565b6040516103079190610ce7565b60405180910390f35b61032a60048036038101906103259190610ac2565b61062e565b005b610334610650565b6040516103419190610ce7565b60405180910390f35b610364600480360381019061035f9190610c88565b610655565b60405161037191906109c9565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103ec57506103eb82610684565b5b9050919050565b5f5f5f8381526020019081526020015f20600101549050919050565b610418826103f3565b610421816106ed565b61042b8383610701565b50505050565b6104396107ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461049d576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104a782826107f1565b505050565b6040517f15ec568600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60068111156104f2576104f1610d00565b5b60ff16610501868686866105fb565b60ff16149050949350505050565b5f604760ff168260ff16149050919050565b60606040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f646500000000000000008152509050919050565b6040517f15ec568600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f1b81565b5f610607848484610611565b9050949350505050565b5f5f600681111561062557610624610d00565b5b90509392505050565b610637826103f3565b610640816106ed565b61064a83836107f1565b50505050565b604781565b5f5f600681111561066957610668610d00565b5b60ff16610677858585610611565b60ff161490509392505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6106fe816106f96107ea565b6108da565b50565b5f61070c8383610592565b6107e05760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061077d6107ea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506107e4565b5f90505b92915050565b5f33905090565b5f6107fc8383610592565b156108d0575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061086d6107ea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600190506108d4565b5f90505b92915050565b6108e48282610592565b6109275780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161091e929190610d3c565b60405180910390fd5b5050565b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6109638161092f565b811461096d575f5ffd5b50565b5f8135905061097e8161095a565b92915050565b5f602082840312156109995761099861092b565b5b5f6109a684828501610970565b91505092915050565b5f8115159050919050565b6109c3816109af565b82525050565b5f6020820190506109dc5f8301846109ba565b92915050565b5f819050919050565b6109f4816109e2565b81146109fe575f5ffd5b50565b5f81359050610a0f816109eb565b92915050565b5f60208284031215610a2a57610a2961092b565b5b5f610a3784828501610a01565b91505092915050565b610a49816109e2565b82525050565b5f602082019050610a625f830184610a40565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a9182610a68565b9050919050565b610aa181610a87565b8114610aab575f5ffd5b50565b5f81359050610abc81610a98565b92915050565b5f5f60408385031215610ad857610ad761092b565b5b5f610ae585828601610a01565b9250506020610af685828601610aae565b9150509250929050565b5f819050919050565b610b1281610b00565b8114610b1c575f5ffd5b50565b5f81359050610b2d81610b09565b92915050565b5f5f5f5f60808587031215610b4b57610b4a61092b565b5b5f610b5887828801610aae565b9450506020610b6987828801610aae565b9350506040610b7a87828801610aae565b9250506060610b8b87828801610b1f565b91505092959194509250565b5f60ff82169050919050565b610bac81610b97565b8114610bb6575f5ffd5b50565b5f81359050610bc781610ba3565b92915050565b5f60208284031215610be257610be161092b565b5b5f610bef84828501610bb9565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610c3a82610bf8565b610c448185610c02565b9350610c54818560208601610c12565b610c5d81610c20565b840191505092915050565b5f6020820190508181035f830152610c808184610c30565b905092915050565b5f5f5f60608486031215610c9f57610c9e61092b565b5b5f610cac86828701610aae565b9350506020610cbd86828701610aae565b9250506040610cce86828701610b1f565b9150509250925092565b610ce181610b97565b82525050565b5f602082019050610cfa5f830184610cd8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610d3681610a87565b82525050565b5f604082019050610d4f5f830185610d2d565b610d5c6020830184610a40565b939250505056fea26469706673582212209e6a01fafca16b63fb72447553c976985562ee8379b4b404c7ec81afe6659d5264736f6c634300081e0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106100fe575f3560e01c80638baf29b411610095578063d4ce141511610064578063d4ce1415146102e0578063d547741f14610310578063dfdc49b91461032c578063e46638e61461034a576100fe565b80638baf29b41461024657806391d1485414610262578063a217fddf14610292578063d32c7bb5146102b0576100fe565b80633e5af4ca116100d15780633e5af4ca1461019a5780637157797f146101b65780637d045df6146101e65780637f4ab1dd14610216576100fe565b806301ffc9a714610102578063248a9ca3146101325780632f2ff15d1461016257806336568abe1461017e575b5f5ffd5b61011c60048036038101906101179190610984565b61037a565b60405161012991906109c9565b60405180910390f35b61014c60048036038101906101479190610a15565b6103f3565b6040516101599190610a4f565b60405180910390f35b61017c60048036038101906101779190610ac2565b61040f565b005b61019860048036038101906101939190610ac2565b610431565b005b6101b460048036038101906101af9190610b33565b6104ac565b005b6101d060048036038101906101cb9190610b33565b6104de565b6040516101dd91906109c9565b60405180910390f35b61020060048036038101906101fb9190610bcd565b61050f565b60405161020d91906109c9565b60405180910390f35b610230600480360381019061022b9190610bcd565b610521565b60405161023d9190610c68565b60405180910390f35b610260600480360381019061025b9190610c88565b610560565b005b61027c60048036038101906102779190610ac2565b610592565b60405161028991906109c9565b60405180910390f35b61029a6105f5565b6040516102a79190610a4f565b60405180910390f35b6102ca60048036038101906102c59190610b33565b6105fb565b6040516102d79190610ce7565b60405180910390f35b6102fa60048036038101906102f59190610c88565b610611565b6040516103079190610ce7565b60405180910390f35b61032a60048036038101906103259190610ac2565b61062e565b005b610334610650565b6040516103419190610ce7565b60405180910390f35b610364600480360381019061035f9190610c88565b610655565b60405161037191906109c9565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103ec57506103eb82610684565b5b9050919050565b5f5f5f8381526020019081526020015f20600101549050919050565b610418826103f3565b610421816106ed565b61042b8383610701565b50505050565b6104396107ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461049d576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104a782826107f1565b505050565b6040517f15ec568600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60068111156104f2576104f1610d00565b5b60ff16610501868686866105fb565b60ff16149050949350505050565b5f604760ff168260ff16149050919050565b60606040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f646500000000000000008152509050919050565b6040517f15ec568600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f1b81565b5f610607848484610611565b9050949350505050565b5f5f600681111561062557610624610d00565b5b90509392505050565b610637826103f3565b610640816106ed565b61064a83836107f1565b50505050565b604781565b5f5f600681111561066957610668610d00565b5b60ff16610677858585610611565b60ff161490509392505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6106fe816106f96107ea565b6108da565b50565b5f61070c8383610592565b6107e05760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061077d6107ea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506107e4565b5f90505b92915050565b5f33905090565b5f6107fc8383610592565b156108d0575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061086d6107ea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600190506108d4565b5f90505b92915050565b6108e48282610592565b6109275780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161091e929190610d3c565b60405180910390fd5b5050565b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6109638161092f565b811461096d575f5ffd5b50565b5f8135905061097e8161095a565b92915050565b5f602082840312156109995761099861092b565b5b5f6109a684828501610970565b91505092915050565b5f8115159050919050565b6109c3816109af565b82525050565b5f6020820190506109dc5f8301846109ba565b92915050565b5f819050919050565b6109f4816109e2565b81146109fe575f5ffd5b50565b5f81359050610a0f816109eb565b92915050565b5f60208284031215610a2a57610a2961092b565b5b5f610a3784828501610a01565b91505092915050565b610a49816109e2565b82525050565b5f602082019050610a625f830184610a40565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a9182610a68565b9050919050565b610aa181610a87565b8114610aab575f5ffd5b50565b5f81359050610abc81610a98565b92915050565b5f5f60408385031215610ad857610ad761092b565b5b5f610ae585828601610a01565b9250506020610af685828601610aae565b9150509250929050565b5f819050919050565b610b1281610b00565b8114610b1c575f5ffd5b50565b5f81359050610b2d81610b09565b92915050565b5f5f5f5f60808587031215610b4b57610b4a61092b565b5b5f610b5887828801610aae565b9450506020610b6987828801610aae565b9350506040610b7a87828801610aae565b9250506060610b8b87828801610b1f565b91505092959194509250565b5f60ff82169050919050565b610bac81610b97565b8114610bb6575f5ffd5b50565b5f81359050610bc781610ba3565b92915050565b5f60208284031215610be257610be161092b565b5b5f610bef84828501610bb9565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610c3a82610bf8565b610c448185610c02565b9350610c54818560208601610c12565b610c5d81610c20565b840191505092915050565b5f6020820190508181035f830152610c808184610c30565b905092915050565b5f5f5f60608486031215610c9f57610c9e61092b565b5b5f610cac86828701610aae565b9350506020610cbd86828701610aae565b9250506040610cce86828701610b1f565b9150509250925092565b610ce181610b97565b82525050565b5f602082019050610cfa5f830184610cd8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610d3681610a87565b82525050565b5f604082019050610d4f5f830185610d2d565b610d5c6020830184610a40565b939250505056fea26469706673582212209e6a01fafca16b63fb72447553c976985562ee8379b4b404c7ec81afe6659d5264736f6c634300081e0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol/RuleConditionalTransferLightInvariantStorage.dbg.json b/doc/compilation/hardhat/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol/RuleConditionalTransferLightInvariantStorage.dbg.json deleted file mode 100644 index 00f772e..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol/RuleConditionalTransferLightInvariantStorage.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol/RuleConditionalTransferLightInvariantStorage.json b/doc/compilation/hardhat/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol/RuleConditionalTransferLightInvariantStorage.json deleted file mode 100644 index 249f8f6..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol/RuleConditionalTransferLightInvariantStorage.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleConditionalTransferLightInvariantStorage", - "sourceName": "src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol", - "abi": [ - { - "inputs": [], - "name": "TransferNotApproved", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "count", - "type": "uint256" - } - ], - "name": "TransferApproved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "remaining", - "type": "uint256" - } - ], - "name": "TransferExecuted", - "type": "event" - }, - { - "inputs": [], - "name": "CODE_TRANSFER_REQUEST_NOT_APPROVED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "OPERATOR_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RULE_ENGINE_CONTRACT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/RuleWhitelist.sol/RuleWhitelist.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/RuleWhitelist.sol/RuleWhitelist.dbg.json deleted file mode 100644 index 603ee8f..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/RuleWhitelist.sol/RuleWhitelist.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/RuleWhitelist.sol/RuleWhitelist.json b/doc/compilation/hardhat/src/mocks/rules/validation/RuleWhitelist.sol/RuleWhitelist.json deleted file mode 100644 index 6a8e028..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/RuleWhitelist.sol/RuleWhitelist.json +++ /dev/null @@ -1,760 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleWhitelist", - "sourceName": "src/mocks/rules/validation/RuleWhitelist.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - }, - { - "internalType": "address", - "name": "forwarderIrrevocable", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "RuleAddressList_AdminWithAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "code", - "type": "uint8" - } - ], - "name": "RuleWhitelist_InvalidTransfer", - "type": "error" - }, - { - "inputs": [], - "name": "Rulelist_AddressAlreadylisted", - "type": "error" - }, - { - "inputs": [], - "name": "Rulelist_AddressNotPresent", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "AddAddressToTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "AddAddressesToTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "RemoveAddressFromTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "RemoveAddressesFromTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "inputs": [], - "name": "ADDRESS_LIST_ADD_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ADDRESS_LIST_REMOVE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_SPENDER_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_TO_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "addAddressToTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "addAddressesToTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_targetAddress", - "type": "address" - } - ], - "name": "addressIsListed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_targetAddresses", - "type": "address[]" - } - ], - "name": "addressIsListedBatch", - "outputs": [ - { - "internalType": "bool[]", - "name": "", - "type": "bool[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "canReturnTransferRestrictionCode", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "detectTransferRestriction", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestrictionFrom", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "forwarder", - "type": "address" - } - ], - "name": "isTrustedForwarder", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "messageForTransferRestriction", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "numberListedAddress", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "removeAddressFromTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "removeAddressesFromTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "trustedForwarder", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x60a060405234801561000f575f5ffd5b506040516125fc3803806125fc833981810160405281019061003191906103da565b818180808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036100d0576040517f5f1a6c0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100e25f5f1b836100ec60201b60201c565b50505050506104f9565b5f6100fd83836101e160201b60201c565b6101d75760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061017461021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506101db565b5f90505b92915050565b5f6101f45f5f1b8361022f60201b60201c565b156102025760019050610215565b610212838361022f60201b60201c565b90505b92915050565b5f61022a61029260201b60201c565b905090565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f5f36905090505f6102a961030c60201b60201c565b90508082101580156102c657506102c53361032060201b60201c565b5b156102f6575f368284039080926102df93929190610420565b906102ea919061049b565b60601c92505050610309565b61030461036460201b60201c565b925050505b90565b5f61031b61036b60201b60201c565b905090565b5f61032f61037360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f33905090565b5f6014905090565b5f608051905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103a982610380565b9050919050565b6103b98161039f565b81146103c3575f5ffd5b50565b5f815190506103d4816103b0565b92915050565b5f5f604083850312156103f0576103ef61037c565b5b5f6103fd858286016103c6565b925050602061040e858286016103c6565b9150509250929050565b5f5ffd5b5f5ffd5b5f5f8585111561043357610432610418565b5b838611156104445761044361041c565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b5f82821b905092915050565b5f6104a6838361045a565b826104b18135610464565b925060148210156104f1576104ec7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360140360080261048f565b831692505b505092915050565b6080516120eb6105115f395f610a1c01526120eb5ff3fe608060405234801561000f575f5ffd5b50600436106101cd575f3560e01c80637d045df611610102578063a217fddf116100a0578063daafd1c71161006f578063daafd1c714610575578063db136dad14610591578063e46638e6146105af578063fa83a2da146105df576101cd565b8063a217fddf146104db578063d32c7bb5146104f9578063d4ce141514610529578063d547741f14610559576101cd565b8063893c1440116100dc578063893c1440146104555780638baf29b41461047157806391d148541461048d578063948b851e146104bd576101cd565b80637d045df6146103d75780637da0a877146104075780637f4ab1dd14610425576101cd565b806336568abe1161016f578063572b6c0511610149578063572b6c05146103295780635b119c0a146103595780635b577f66146103775780637157797f146103a7576101cd565b806336568abe146102d35780633e5af4ca146102ef578063421069171461030b576101cd565b806313be3212116101ab57806313be32121461024d578063248a9ca31461026b5780632f2ff15d1461029b5780633630e2ea146102b7576101cd565b806301ffc9a7146101d15780630a3640d21461020157806311d1c5ca14610231575b5f5ffd5b6101eb60048036038101906101e69190611634565b6105fd565b6040516101f89190611679565b60405180910390f35b61021b6004803603810190610216919061183c565b610676565b604051610228919061193a565b60405180910390f35b61024b600480360381019061024691906119b3565b610730565b005b6102556107a2565b6040516102629190611a16565b60405180910390f35b61028560048036038101906102809190611a62565b6107b0565b6040516102929190611a9c565b60405180910390f35b6102b560048036038101906102b09190611ab5565b6107cc565b005b6102d160048036038101906102cc91906119b3565b6107ee565b005b6102ed60048036038101906102e89190611ab5565b610860565b005b61030960048036038101906103049190611b1d565b6108db565b005b61031361095b565b6040516103209190611b9c565b60405180910390f35b610343600480360381019061033e9190611bb5565b610960565b6040516103509190611679565b60405180910390f35b61036161099e565b60405161036e9190611b9c565b60405180910390f35b610391600480360381019061038c9190611bb5565b6109a3565b60405161039e9190611679565b60405180910390f35b6103c160048036038101906103bc9190611b1d565b6109b4565b6040516103ce9190611679565b60405180910390f35b6103f160048036038101906103ec9190611c0a565b6109e5565b6040516103fe9190611679565b60405180910390f35b61040f610a19565b60405161041c9190611c44565b60405180910390f35b61043f600480360381019061043a9190611c0a565b610a40565b60405161044c9190611cbd565b60405180910390f35b61046f600480360381019061046a9190611bb5565b610b0a565b005b61048b60048036038101906104869190611cdd565b610b78565b005b6104a760048036038101906104a29190611ab5565b610bf6565b6040516104b49190611679565b60405180910390f35b6104c5610c24565b6040516104d29190611a9c565b60405180910390f35b6104e3610c48565b6040516104f09190611a9c565b60405180910390f35b610513600480360381019061050e9190611b1d565b610c4e565b6040516105209190611b9c565b60405180910390f35b610543600480360381019061053e9190611cdd565b610c7b565b6040516105509190611b9c565b60405180910390f35b610573600480360381019061056e9190611ab5565b610cc5565b005b61058f600480360381019061058a9190611bb5565b610ce7565b005b610599610d55565b6040516105a69190611b9c565b60405180910390f35b6105c960048036038101906105c49190611cdd565b610d5a565b6040516105d69190611679565b60405180910390f35b6105e7610d89565b6040516105f49190611a9c565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066f575061066e82610dad565b5b9050919050565b60605f825167ffffffffffffffff811115610694576106936116a6565b5b6040519080825280602002602001820160405280156106c25781602001602082028036833780820191505090505b5090505f5f90505b8351811015610726576106f68482815181106106e9576106e8611d2d565b5b6020026020010151610e16565b82828151811061070957610708611d2d565b5b6020026020010190151590811515815250508060010190506106ca565b5080915050919050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6161075a81610e68565b6107648383610e7c565b7f9f3dfa145deb5071c94eb9a1393634e982a46367c42dce9622f49213d8f427bd8383604051610795929190611e16565b60405180910390a1505050565b5f6107ab610fa7565b905090565b5f5f5f8381526020019081526020015f20600101549050919050565b6107d5826107b0565b6107de81610e68565b6107e88383610fb0565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61081881610e68565b6108228383611099565b7f3be9b663c544556a256ca6ed9f2f6875dba1b09a6eee2571196227f7ec8c621c8383604051610853929190611e16565b60405180910390a1505050565b6108686111c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108cc576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108d682826111d3565b505050565b5f6108e885858585610c4e565b90505f60068111156108fd576108fc611e38565b5b60ff168160ff16148484848490919293610950576040517fd9ead46f0000000000000000000000000000000000000000000000000000000081526004016109479493929190611e65565b60405180910390fd5b505050505050505050565b601781565b5f610969610a19565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b601581565b5f6109ad82610e16565b9050919050565b5f5f60068111156109c8576109c7611e38565b5b60ff166109d786868686610c4e565b60ff16149050949350505050565b5f601560ff168260ff161480610a015750601660ff168260ff16145b80610a125750601760ff168260ff16145b9050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b6060601560ff168260ff1603610a7057604051806060016040528060228152602001612094602291399050610b05565b601660ff168260ff1603610a9e5760405180606001604052806025815260200161206f602591399050610b05565b601760ff168260ff1603610acc5760405180606001604052806023815260200161204c602391399050610b05565b6040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f6465000000000000000081525090505b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec610b3481610e68565b610b3d826112bc565b7fe46e95d98efc7b1a5d9359155b9137734ac3be3f4b32eab0f697558c27f2d99c82604051610b6c9190611c44565b60405180910390a15050565b5f610b84848484610c7b565b90505f6006811115610b9957610b98611e38565b5b60ff168160ff16148484848490919293610bec576040517fd9ead46f000000000000000000000000000000000000000000000000000000008152600401610be39493929190611e65565b60405180910390fd5b5050505050505050565b5f610c035f5f1b836113a8565b15610c115760019050610c1e565b610c1b83836113a8565b90505b92915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b5f5f1b81565b5f610c58856109a3565b610c655760179050610c73565b610c70848484610c7b565b90505b949350505050565b5f610c85846109a3565b610c925760159050610cbe565b610c9b836109a3565b610ca85760169050610cbe565b5f6006811115610cbb57610cba611e38565b5b90505b9392505050565b610cce826107b0565b610cd781610e68565b610ce183836111d3565b50505050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf61610d1181610e68565b610d1a8261140b565b7f7802fa8b90d406b2eb85b620cecde734206f390fa73c61e824384474b734cd9382604051610d499190611c44565b60405180910390a15050565b601681565b5f5f6006811115610d6e57610d6d611e38565b5b60ff16610d7c858585610c7b565b60ff161490509392505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610e7981610e746111c5565b6114f8565b50565b5f60025490505f5f90505b83839050811015610f9a5760015f858584818110610ea857610ea7611d2d565b5b9050602002016020810190610ebd9190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610f8f576001805f868685818110610f1e57610f1d611d2d565b5b9050602002016020810190610f339190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081610f8c90611ed5565b91505b806001019050610e87565b5080600281905550505050565b5f600254905090565b5f610fbb8383610bf6565b61108f5760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061102c6111c5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611093565b5f90505b92915050565b5f60025490505f5f90505b838390508110156111b85760015f8585848181106110c5576110c4611d2d565b5b90506020020160208101906110da9190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156111ad575f60015f86868581811061113c5761113b611d2d565b5b90506020020160208101906111519190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816111aa90611f1c565b91505b8060010190506110a4565b5080600281905550505050565b5f6111ce611549565b905090565b5f6111de8383610bf6565b156112b2575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061124f6111c5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600190506112b6565b5f90505b92915050565b60015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661133c576040517fcfc5cc9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060025f815461139e90611f1c565b9190508190555050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561148c576040517f57845b8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060025f81546114ee90611ed5565b9190508190555050565b6115028282610bf6565b6115455780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161153c929190611f43565b60405180910390fd5b5050565b5f5f5f36905090505f61155a6115b1565b9050808210158015611571575061157033610960565b5b156115a1575f3682840390809261158a93929190611f72565b906115959190611fed565b60601c925050506115ae565b6115a96115bf565b925050505b90565b5f6115ba6115c6565b905090565b5f33905090565b5f6014905090565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611613816115df565b811461161d575f5ffd5b50565b5f8135905061162e8161160a565b92915050565b5f60208284031215611649576116486115d7565b5b5f61165684828501611620565b91505092915050565b5f8115159050919050565b6116738161165f565b82525050565b5f60208201905061168c5f83018461166a565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6116dc82611696565b810181811067ffffffffffffffff821117156116fb576116fa6116a6565b5b80604052505050565b5f61170d6115ce565b905061171982826116d3565b919050565b5f67ffffffffffffffff821115611738576117376116a6565b5b602082029050602081019050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117768261174d565b9050919050565b6117868161176c565b8114611790575f5ffd5b50565b5f813590506117a18161177d565b92915050565b5f6117b96117b48461171e565b611704565b905080838252602082019050602084028301858111156117dc576117db611749565b5b835b8181101561180557806117f18882611793565b8452602084019350506020810190506117de565b5050509392505050565b5f82601f83011261182357611822611692565b5b81356118338482602086016117a7565b91505092915050565b5f60208284031215611851576118506115d7565b5b5f82013567ffffffffffffffff81111561186e5761186d6115db565b5b61187a8482850161180f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6118b58161165f565b82525050565b5f6118c683836118ac565b60208301905092915050565b5f602082019050919050565b5f6118e882611883565b6118f2818561188d565b93506118fd8361189d565b805f5b8381101561192d57815161191488826118bb565b975061191f836118d2565b925050600181019050611900565b5085935050505092915050565b5f6020820190508181035f83015261195281846118de565b905092915050565b5f5ffd5b5f5f83601f84011261197357611972611692565b5b8235905067ffffffffffffffff8111156119905761198f61195a565b5b6020830191508360208202830111156119ac576119ab611749565b5b9250929050565b5f5f602083850312156119c9576119c86115d7565b5b5f83013567ffffffffffffffff8111156119e6576119e56115db565b5b6119f28582860161195e565b92509250509250929050565b5f819050919050565b611a10816119fe565b82525050565b5f602082019050611a295f830184611a07565b92915050565b5f819050919050565b611a4181611a2f565b8114611a4b575f5ffd5b50565b5f81359050611a5c81611a38565b92915050565b5f60208284031215611a7757611a766115d7565b5b5f611a8484828501611a4e565b91505092915050565b611a9681611a2f565b82525050565b5f602082019050611aaf5f830184611a8d565b92915050565b5f5f60408385031215611acb57611aca6115d7565b5b5f611ad885828601611a4e565b9250506020611ae985828601611793565b9150509250929050565b611afc816119fe565b8114611b06575f5ffd5b50565b5f81359050611b1781611af3565b92915050565b5f5f5f5f60808587031215611b3557611b346115d7565b5b5f611b4287828801611793565b9450506020611b5387828801611793565b9350506040611b6487828801611793565b9250506060611b7587828801611b09565b91505092959194509250565b5f60ff82169050919050565b611b9681611b81565b82525050565b5f602082019050611baf5f830184611b8d565b92915050565b5f60208284031215611bca57611bc96115d7565b5b5f611bd784828501611793565b91505092915050565b611be981611b81565b8114611bf3575f5ffd5b50565b5f81359050611c0481611be0565b92915050565b5f60208284031215611c1f57611c1e6115d7565b5b5f611c2c84828501611bf6565b91505092915050565b611c3e8161176c565b82525050565b5f602082019050611c575f830184611c35565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611c8f82611c5d565b611c998185611c67565b9350611ca9818560208601611c77565b611cb281611696565b840191505092915050565b5f6020820190508181035f830152611cd58184611c85565b905092915050565b5f5f5f60608486031215611cf457611cf36115d7565b5b5f611d0186828701611793565b9350506020611d1286828701611793565b9250506040611d2386828701611b09565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f819050919050565b611d7c8161176c565b82525050565b5f611d8d8383611d73565b60208301905092915050565b5f611da76020840184611793565b905092915050565b5f602082019050919050565b5f611dc68385611d5a565b9350611dd182611d6a565b805f5b85811015611e0957611de68284611d99565b611df08882611d82565b9750611dfb83611daf565b925050600181019050611dd4565b5085925050509392505050565b5f6020820190508181035f830152611e2f818486611dbb565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f608082019050611e785f830187611c35565b611e856020830186611c35565b611e926040830185611a07565b611e9f6060830184611b8d565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611edf826119fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f1157611f10611ea8565b5b600182019050919050565b5f611f26826119fe565b91505f8203611f3857611f37611ea8565b5b600182039050919050565b5f604082019050611f565f830185611c35565b611f636020830184611a8d565b9392505050565b5f5ffd5b5f5ffd5b5f5f85851115611f8557611f84611f6a565b5b83861115611f9657611f95611f6e565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b5f82821b905092915050565b5f611ff88383611fac565b826120038135611fb6565b925060148210156120435761203e7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802611fe1565b831692505b50509291505056fe546865207370656e646572206973206e6f7420696e207468652077686974656c69737454686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c5d9366742fb111255ac42ea02b6428161121fb7b40f452a8bf8a4365b3f041364736f6c634300081e0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106101cd575f3560e01c80637d045df611610102578063a217fddf116100a0578063daafd1c71161006f578063daafd1c714610575578063db136dad14610591578063e46638e6146105af578063fa83a2da146105df576101cd565b8063a217fddf146104db578063d32c7bb5146104f9578063d4ce141514610529578063d547741f14610559576101cd565b8063893c1440116100dc578063893c1440146104555780638baf29b41461047157806391d148541461048d578063948b851e146104bd576101cd565b80637d045df6146103d75780637da0a877146104075780637f4ab1dd14610425576101cd565b806336568abe1161016f578063572b6c0511610149578063572b6c05146103295780635b119c0a146103595780635b577f66146103775780637157797f146103a7576101cd565b806336568abe146102d35780633e5af4ca146102ef578063421069171461030b576101cd565b806313be3212116101ab57806313be32121461024d578063248a9ca31461026b5780632f2ff15d1461029b5780633630e2ea146102b7576101cd565b806301ffc9a7146101d15780630a3640d21461020157806311d1c5ca14610231575b5f5ffd5b6101eb60048036038101906101e69190611634565b6105fd565b6040516101f89190611679565b60405180910390f35b61021b6004803603810190610216919061183c565b610676565b604051610228919061193a565b60405180910390f35b61024b600480360381019061024691906119b3565b610730565b005b6102556107a2565b6040516102629190611a16565b60405180910390f35b61028560048036038101906102809190611a62565b6107b0565b6040516102929190611a9c565b60405180910390f35b6102b560048036038101906102b09190611ab5565b6107cc565b005b6102d160048036038101906102cc91906119b3565b6107ee565b005b6102ed60048036038101906102e89190611ab5565b610860565b005b61030960048036038101906103049190611b1d565b6108db565b005b61031361095b565b6040516103209190611b9c565b60405180910390f35b610343600480360381019061033e9190611bb5565b610960565b6040516103509190611679565b60405180910390f35b61036161099e565b60405161036e9190611b9c565b60405180910390f35b610391600480360381019061038c9190611bb5565b6109a3565b60405161039e9190611679565b60405180910390f35b6103c160048036038101906103bc9190611b1d565b6109b4565b6040516103ce9190611679565b60405180910390f35b6103f160048036038101906103ec9190611c0a565b6109e5565b6040516103fe9190611679565b60405180910390f35b61040f610a19565b60405161041c9190611c44565b60405180910390f35b61043f600480360381019061043a9190611c0a565b610a40565b60405161044c9190611cbd565b60405180910390f35b61046f600480360381019061046a9190611bb5565b610b0a565b005b61048b60048036038101906104869190611cdd565b610b78565b005b6104a760048036038101906104a29190611ab5565b610bf6565b6040516104b49190611679565b60405180910390f35b6104c5610c24565b6040516104d29190611a9c565b60405180910390f35b6104e3610c48565b6040516104f09190611a9c565b60405180910390f35b610513600480360381019061050e9190611b1d565b610c4e565b6040516105209190611b9c565b60405180910390f35b610543600480360381019061053e9190611cdd565b610c7b565b6040516105509190611b9c565b60405180910390f35b610573600480360381019061056e9190611ab5565b610cc5565b005b61058f600480360381019061058a9190611bb5565b610ce7565b005b610599610d55565b6040516105a69190611b9c565b60405180910390f35b6105c960048036038101906105c49190611cdd565b610d5a565b6040516105d69190611679565b60405180910390f35b6105e7610d89565b6040516105f49190611a9c565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066f575061066e82610dad565b5b9050919050565b60605f825167ffffffffffffffff811115610694576106936116a6565b5b6040519080825280602002602001820160405280156106c25781602001602082028036833780820191505090505b5090505f5f90505b8351811015610726576106f68482815181106106e9576106e8611d2d565b5b6020026020010151610e16565b82828151811061070957610708611d2d565b5b6020026020010190151590811515815250508060010190506106ca565b5080915050919050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6161075a81610e68565b6107648383610e7c565b7f9f3dfa145deb5071c94eb9a1393634e982a46367c42dce9622f49213d8f427bd8383604051610795929190611e16565b60405180910390a1505050565b5f6107ab610fa7565b905090565b5f5f5f8381526020019081526020015f20600101549050919050565b6107d5826107b0565b6107de81610e68565b6107e88383610fb0565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61081881610e68565b6108228383611099565b7f3be9b663c544556a256ca6ed9f2f6875dba1b09a6eee2571196227f7ec8c621c8383604051610853929190611e16565b60405180910390a1505050565b6108686111c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108cc576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108d682826111d3565b505050565b5f6108e885858585610c4e565b90505f60068111156108fd576108fc611e38565b5b60ff168160ff16148484848490919293610950576040517fd9ead46f0000000000000000000000000000000000000000000000000000000081526004016109479493929190611e65565b60405180910390fd5b505050505050505050565b601781565b5f610969610a19565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b601581565b5f6109ad82610e16565b9050919050565b5f5f60068111156109c8576109c7611e38565b5b60ff166109d786868686610c4e565b60ff16149050949350505050565b5f601560ff168260ff161480610a015750601660ff168260ff16145b80610a125750601760ff168260ff16145b9050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b6060601560ff168260ff1603610a7057604051806060016040528060228152602001612094602291399050610b05565b601660ff168260ff1603610a9e5760405180606001604052806025815260200161206f602591399050610b05565b601760ff168260ff1603610acc5760405180606001604052806023815260200161204c602391399050610b05565b6040518060400160405280601881526020017f556e6b6e6f776e207265737472696374696f6e20636f6465000000000000000081525090505b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec610b3481610e68565b610b3d826112bc565b7fe46e95d98efc7b1a5d9359155b9137734ac3be3f4b32eab0f697558c27f2d99c82604051610b6c9190611c44565b60405180910390a15050565b5f610b84848484610c7b565b90505f6006811115610b9957610b98611e38565b5b60ff168160ff16148484848490919293610bec576040517fd9ead46f000000000000000000000000000000000000000000000000000000008152600401610be39493929190611e65565b60405180910390fd5b5050505050505050565b5f610c035f5f1b836113a8565b15610c115760019050610c1e565b610c1b83836113a8565b90505b92915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b5f5f1b81565b5f610c58856109a3565b610c655760179050610c73565b610c70848484610c7b565b90505b949350505050565b5f610c85846109a3565b610c925760159050610cbe565b610c9b836109a3565b610ca85760169050610cbe565b5f6006811115610cbb57610cba611e38565b5b90505b9392505050565b610cce826107b0565b610cd781610e68565b610ce183836111d3565b50505050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf61610d1181610e68565b610d1a8261140b565b7f7802fa8b90d406b2eb85b620cecde734206f390fa73c61e824384474b734cd9382604051610d499190611c44565b60405180910390a15050565b601681565b5f5f6006811115610d6e57610d6d611e38565b5b60ff16610d7c858585610c7b565b60ff161490509392505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610e7981610e746111c5565b6114f8565b50565b5f60025490505f5f90505b83839050811015610f9a5760015f858584818110610ea857610ea7611d2d565b5b9050602002016020810190610ebd9190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610f8f576001805f868685818110610f1e57610f1d611d2d565b5b9050602002016020810190610f339190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081610f8c90611ed5565b91505b806001019050610e87565b5080600281905550505050565b5f600254905090565b5f610fbb8383610bf6565b61108f5760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061102c6111c5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611093565b5f90505b92915050565b5f60025490505f5f90505b838390508110156111b85760015f8585848181106110c5576110c4611d2d565b5b90506020020160208101906110da9190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156111ad575f60015f86868581811061113c5761113b611d2d565b5b90506020020160208101906111519190611bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816111aa90611f1c565b91505b8060010190506110a4565b5080600281905550505050565b5f6111ce611549565b905090565b5f6111de8383610bf6565b156112b2575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061124f6111c5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600190506112b6565b5f90505b92915050565b60015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661133c576040517fcfc5cc9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060025f815461139e90611f1c565b9190508190555050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561148c576040517f57845b8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060025f81546114ee90611ed5565b9190508190555050565b6115028282610bf6565b6115455780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161153c929190611f43565b60405180910390fd5b5050565b5f5f5f36905090505f61155a6115b1565b9050808210158015611571575061157033610960565b5b156115a1575f3682840390809261158a93929190611f72565b906115959190611fed565b60601c925050506115ae565b6115a96115bf565b925050505b90565b5f6115ba6115c6565b905090565b5f33905090565b5f6014905090565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611613816115df565b811461161d575f5ffd5b50565b5f8135905061162e8161160a565b92915050565b5f60208284031215611649576116486115d7565b5b5f61165684828501611620565b91505092915050565b5f8115159050919050565b6116738161165f565b82525050565b5f60208201905061168c5f83018461166a565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6116dc82611696565b810181811067ffffffffffffffff821117156116fb576116fa6116a6565b5b80604052505050565b5f61170d6115ce565b905061171982826116d3565b919050565b5f67ffffffffffffffff821115611738576117376116a6565b5b602082029050602081019050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117768261174d565b9050919050565b6117868161176c565b8114611790575f5ffd5b50565b5f813590506117a18161177d565b92915050565b5f6117b96117b48461171e565b611704565b905080838252602082019050602084028301858111156117dc576117db611749565b5b835b8181101561180557806117f18882611793565b8452602084019350506020810190506117de565b5050509392505050565b5f82601f83011261182357611822611692565b5b81356118338482602086016117a7565b91505092915050565b5f60208284031215611851576118506115d7565b5b5f82013567ffffffffffffffff81111561186e5761186d6115db565b5b61187a8482850161180f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6118b58161165f565b82525050565b5f6118c683836118ac565b60208301905092915050565b5f602082019050919050565b5f6118e882611883565b6118f2818561188d565b93506118fd8361189d565b805f5b8381101561192d57815161191488826118bb565b975061191f836118d2565b925050600181019050611900565b5085935050505092915050565b5f6020820190508181035f83015261195281846118de565b905092915050565b5f5ffd5b5f5f83601f84011261197357611972611692565b5b8235905067ffffffffffffffff8111156119905761198f61195a565b5b6020830191508360208202830111156119ac576119ab611749565b5b9250929050565b5f5f602083850312156119c9576119c86115d7565b5b5f83013567ffffffffffffffff8111156119e6576119e56115db565b5b6119f28582860161195e565b92509250509250929050565b5f819050919050565b611a10816119fe565b82525050565b5f602082019050611a295f830184611a07565b92915050565b5f819050919050565b611a4181611a2f565b8114611a4b575f5ffd5b50565b5f81359050611a5c81611a38565b92915050565b5f60208284031215611a7757611a766115d7565b5b5f611a8484828501611a4e565b91505092915050565b611a9681611a2f565b82525050565b5f602082019050611aaf5f830184611a8d565b92915050565b5f5f60408385031215611acb57611aca6115d7565b5b5f611ad885828601611a4e565b9250506020611ae985828601611793565b9150509250929050565b611afc816119fe565b8114611b06575f5ffd5b50565b5f81359050611b1781611af3565b92915050565b5f5f5f5f60808587031215611b3557611b346115d7565b5b5f611b4287828801611793565b9450506020611b5387828801611793565b9350506040611b6487828801611793565b9250506060611b7587828801611b09565b91505092959194509250565b5f60ff82169050919050565b611b9681611b81565b82525050565b5f602082019050611baf5f830184611b8d565b92915050565b5f60208284031215611bca57611bc96115d7565b5b5f611bd784828501611793565b91505092915050565b611be981611b81565b8114611bf3575f5ffd5b50565b5f81359050611c0481611be0565b92915050565b5f60208284031215611c1f57611c1e6115d7565b5b5f611c2c84828501611bf6565b91505092915050565b611c3e8161176c565b82525050565b5f602082019050611c575f830184611c35565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611c8f82611c5d565b611c998185611c67565b9350611ca9818560208601611c77565b611cb281611696565b840191505092915050565b5f6020820190508181035f830152611cd58184611c85565b905092915050565b5f5f5f60608486031215611cf457611cf36115d7565b5b5f611d0186828701611793565b9350506020611d1286828701611793565b9250506040611d2386828701611b09565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f819050919050565b611d7c8161176c565b82525050565b5f611d8d8383611d73565b60208301905092915050565b5f611da76020840184611793565b905092915050565b5f602082019050919050565b5f611dc68385611d5a565b9350611dd182611d6a565b805f5b85811015611e0957611de68284611d99565b611df08882611d82565b9750611dfb83611daf565b925050600181019050611dd4565b5085925050509392505050565b5f6020820190508181035f830152611e2f818486611dbb565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f608082019050611e785f830187611c35565b611e856020830186611c35565b611e926040830185611a07565b611e9f6060830184611b8d565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611edf826119fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f1157611f10611ea8565b5b600182019050919050565b5f611f26826119fe565b91505f8203611f3857611f37611ea8565b5b600182039050919050565b5f604082019050611f565f830185611c35565b611f636020830184611a8d565b9392505050565b5f5ffd5b5f5ffd5b5f5f85851115611f8557611f84611f6a565b5b83861115611f9657611f95611f6e565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b5f82821b905092915050565b5f611ff88383611fac565b826120038135611fb6565b925060148210156120435761203e7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802611fe1565b831692505b50509291505056fe546865207370656e646572206973206e6f7420696e207468652077686974656c69737454686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c5d9366742fb111255ac42ea02b6428161121fb7b40f452a8bf8a4365b3f041364736f6c634300081e0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol/RuleAddressList.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol/RuleAddressList.dbg.json deleted file mode 100644 index c4bdbe7..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol/RuleAddressList.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol/RuleAddressList.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol/RuleAddressList.json deleted file mode 100644 index 22e00ec..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol/RuleAddressList.json +++ /dev/null @@ -1,464 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleAddressList", - "sourceName": "src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol", - "abi": [ - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "RuleAddressList_AdminWithAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "Rulelist_AddressAlreadylisted", - "type": "error" - }, - { - "inputs": [], - "name": "Rulelist_AddressNotPresent", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "AddAddressToTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "AddAddressesToTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "RemoveAddressFromTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "RemoveAddressesFromTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "inputs": [], - "name": "ADDRESS_LIST_ADD_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ADDRESS_LIST_REMOVE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "addAddressToTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "addAddressesToTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_targetAddress", - "type": "address" - } - ], - "name": "addressIsListed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_targetAddresses", - "type": "address[]" - } - ], - "name": "addressIsListedBatch", - "outputs": [ - { - "internalType": "bool[]", - "name": "", - "type": "bool[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "forwarder", - "type": "address" - } - ], - "name": "isTrustedForwarder", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "numberListedAddress", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "removeAddressFromTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "removeAddressesFromTheList", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "trustedForwarder", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol/RuleAddressListInternal.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol/RuleAddressListInternal.dbg.json deleted file mode 100644 index c4bdbe7..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol/RuleAddressListInternal.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol/RuleAddressListInternal.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol/RuleAddressListInternal.json deleted file mode 100644 index 85304d6..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol/RuleAddressListInternal.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleAddressListInternal", - "sourceName": "src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol", - "abi": [ - { - "inputs": [], - "name": "Rulelist_AddressAlreadylisted", - "type": "error" - }, - { - "inputs": [], - "name": "Rulelist_AddressNotPresent", - "type": "error" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol/RuleAddressListInvariantStorage.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol/RuleAddressListInvariantStorage.dbg.json deleted file mode 100644 index 26657ff..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol/RuleAddressListInvariantStorage.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol/RuleAddressListInvariantStorage.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol/RuleAddressListInvariantStorage.json deleted file mode 100644 index 4d9250d..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol/RuleAddressListInvariantStorage.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleAddressListInvariantStorage", - "sourceName": "src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol", - "abi": [ - { - "inputs": [], - "name": "RuleAddressList_AdminWithAddressZeroNotAllowed", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "AddAddressToTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "AddAddressesToTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "targetAddress", - "type": "address" - } - ], - "name": "RemoveAddressFromTheList", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "listTargetAddresses", - "type": "address[]" - } - ], - "name": "RemoveAddressesFromTheList", - "type": "event" - }, - { - "inputs": [], - "name": "ADDRESS_LIST_ADD_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ADDRESS_LIST_REMOVE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol/RuleBlacklistInvariantStorage.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol/RuleBlacklistInvariantStorage.dbg.json deleted file mode 100644 index 26657ff..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol/RuleBlacklistInvariantStorage.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol/RuleBlacklistInvariantStorage.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol/RuleBlacklistInvariantStorage.json deleted file mode 100644 index 4f1de1f..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol/RuleBlacklistInvariantStorage.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleBlacklistInvariantStorage", - "sourceName": "src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol", - "abi": [ - { - "inputs": [], - "name": "CODE_ADDRESS_FROM_IS_BLACKLISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_SPENDER_IS_BLACKLISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_TO_IS_BLACKLISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol/RuleWhitelistInvariantStorage.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol/RuleWhitelistInvariantStorage.dbg.json deleted file mode 100644 index 26657ff..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol/RuleWhitelistInvariantStorage.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol/RuleWhitelistInvariantStorage.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol/RuleWhitelistInvariantStorage.json deleted file mode 100644 index 3c24ddf..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol/RuleWhitelistInvariantStorage.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleWhitelistInvariantStorage", - "sourceName": "src/mocks/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol", - "abi": [ - { - "inputs": [], - "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_SPENDER_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_TO_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleCommonInvariantStorage.sol/RuleCommonInvariantStorage.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleCommonInvariantStorage.sol/RuleCommonInvariantStorage.dbg.json deleted file mode 100644 index 00f772e..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleCommonInvariantStorage.sol/RuleCommonInvariantStorage.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleCommonInvariantStorage.sol/RuleCommonInvariantStorage.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleCommonInvariantStorage.sol/RuleCommonInvariantStorage.json deleted file mode 100644 index 6ba6397..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleCommonInvariantStorage.sol/RuleCommonInvariantStorage.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleCommonInvariantStorage", - "sourceName": "src/mocks/rules/validation/abstract/RuleCommonInvariantStorage.sol", - "abi": [], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleWhitelistCommon.sol/RuleWhitelistCommon.dbg.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleWhitelistCommon.sol/RuleWhitelistCommon.dbg.json deleted file mode 100644 index 00f772e..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleWhitelistCommon.sol/RuleWhitelistCommon.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleWhitelistCommon.sol/RuleWhitelistCommon.json b/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleWhitelistCommon.sol/RuleWhitelistCommon.json deleted file mode 100644 index 43733dd..0000000 --- a/doc/compilation/hardhat/src/mocks/rules/validation/abstract/RuleWhitelistCommon.sol/RuleWhitelistCommon.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleWhitelistCommon", - "sourceName": "src/mocks/rules/validation/abstract/RuleWhitelistCommon.sol", - "abi": [ - { - "inputs": [], - "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_SPENDER_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CODE_ADDRESS_TO_NOT_WHITELISTED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "canReturnTransferRestrictionCode", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestriction", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "detectTransferRestrictionFrom", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "restrictionCode", - "type": "uint8" - } - ], - "name": "messageForTransferRestriction", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/modules/ERC2771ModuleStandalone.sol/ERC2771ModuleStandalone.dbg.json b/doc/compilation/hardhat/src/modules/ERC2771ModuleStandalone.sol/ERC2771ModuleStandalone.dbg.json deleted file mode 100644 index 30bf738..0000000 --- a/doc/compilation/hardhat/src/modules/ERC2771ModuleStandalone.sol/ERC2771ModuleStandalone.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/modules/ERC2771ModuleStandalone.sol/ERC2771ModuleStandalone.json b/doc/compilation/hardhat/src/modules/ERC2771ModuleStandalone.sol/ERC2771ModuleStandalone.json deleted file mode 100644 index 3db37a7..0000000 --- a/doc/compilation/hardhat/src/modules/ERC2771ModuleStandalone.sol/ERC2771ModuleStandalone.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "ERC2771ModuleStandalone", - "sourceName": "src/modules/ERC2771ModuleStandalone.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "forwarder", - "type": "address" - } - ], - "name": "isTrustedForwarder", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "trustedForwarder", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/modules/ERC3643ComplianceModule.sol/ERC3643ComplianceModule.dbg.json b/doc/compilation/hardhat/src/modules/ERC3643ComplianceModule.sol/ERC3643ComplianceModule.dbg.json deleted file mode 100644 index 30bf738..0000000 --- a/doc/compilation/hardhat/src/modules/ERC3643ComplianceModule.sol/ERC3643ComplianceModule.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/modules/ERC3643ComplianceModule.sol/ERC3643ComplianceModule.json b/doc/compilation/hardhat/src/modules/ERC3643ComplianceModule.sol/ERC3643ComplianceModule.json deleted file mode 100644 index 021c6e0..0000000 --- a/doc/compilation/hardhat/src/modules/ERC3643ComplianceModule.sol/ERC3643ComplianceModule.json +++ /dev/null @@ -1,459 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "ERC3643ComplianceModule", - "sourceName": "src/modules/ERC3643ComplianceModule.sol", - "abi": [ - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_InvalidTokenAddress", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_OperationNotSuccessful", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_TokenAlreadyBound", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_TokenNotBound", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_ERC3643Compliance_UnauthorizedCaller", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenBound", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenUnbound", - "type": "event" - }, - { - "inputs": [], - "name": "COMPLIANCE_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "bindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "canTransfer", - "outputs": [ - { - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "created", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "destroyed", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBound", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTokenBounds", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "isTokenBound", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferred", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "unbindToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/modules/RulesManagementModule.sol/RulesManagementModule.dbg.json b/doc/compilation/hardhat/src/modules/RulesManagementModule.sol/RulesManagementModule.dbg.json deleted file mode 100644 index 30bf738..0000000 --- a/doc/compilation/hardhat/src/modules/RulesManagementModule.sol/RulesManagementModule.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/modules/RulesManagementModule.sol/RulesManagementModule.json b/doc/compilation/hardhat/src/modules/RulesManagementModule.sol/RulesManagementModule.json deleted file mode 100644 index 3e54488..0000000 --- a/doc/compilation/hardhat/src/modules/RulesManagementModule.sol/RulesManagementModule.json +++ /dev/null @@ -1,416 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RulesManagementModule", - "sourceName": "src/modules/RulesManagementModule.sol", - "abi": [ - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_ArrayIsEmpty", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_OperationNotSuccessful", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAlreadyExists", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleDoNotMatch", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "AddRule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "ClearRules", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "RemoveRule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RULES_MANAGEMENT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "addRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "clearRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "containsRule", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule", - "name": "rule_", - "type": "address" - } - ], - "name": "removeRule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "ruleId", - "type": "uint256" - } - ], - "name": "rule", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rules", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rulesCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IRule[]", - "name": "rules_", - "type": "address[]" - } - ], - "name": "setRules", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/modules/VersionModule.sol/VersionModule.dbg.json b/doc/compilation/hardhat/src/modules/VersionModule.sol/VersionModule.dbg.json deleted file mode 100644 index 30bf738..0000000 --- a/doc/compilation/hardhat/src/modules/VersionModule.sol/VersionModule.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/modules/VersionModule.sol/VersionModule.json b/doc/compilation/hardhat/src/modules/VersionModule.sol/VersionModule.json deleted file mode 100644 index dfa523f..0000000 --- a/doc/compilation/hardhat/src/modules/VersionModule.sol/VersionModule.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "VersionModule", - "sourceName": "src/modules/VersionModule.sol", - "abi": [ - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "version_", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/modules/library/RuleEngineInvariantStorage.sol/RuleEngineInvariantStorage.dbg.json b/doc/compilation/hardhat/src/modules/library/RuleEngineInvariantStorage.sol/RuleEngineInvariantStorage.dbg.json deleted file mode 100644 index cb2dc52..0000000 --- a/doc/compilation/hardhat/src/modules/library/RuleEngineInvariantStorage.sol/RuleEngineInvariantStorage.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/modules/library/RuleEngineInvariantStorage.sol/RuleEngineInvariantStorage.json b/doc/compilation/hardhat/src/modules/library/RuleEngineInvariantStorage.sol/RuleEngineInvariantStorage.json deleted file mode 100644 index 6162b92..0000000 --- a/doc/compilation/hardhat/src/modules/library/RuleEngineInvariantStorage.sol/RuleEngineInvariantStorage.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RuleEngineInvariantStorage", - "sourceName": "src/modules/library/RuleEngineInvariantStorage.sol", - "abi": [ - { - "inputs": [], - "name": "RuleEngine_AdminWithAddressZeroNotAllowed", - "type": "error" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/hardhat/src/modules/library/RulesManagementModuleInvariantStorage.sol/RulesManagementModuleInvariantStorage.dbg.json b/doc/compilation/hardhat/src/modules/library/RulesManagementModuleInvariantStorage.sol/RulesManagementModuleInvariantStorage.dbg.json deleted file mode 100644 index cb2dc52..0000000 --- a/doc/compilation/hardhat/src/modules/library/RulesManagementModuleInvariantStorage.sol/RulesManagementModuleInvariantStorage.dbg.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/0d8630f2c04bc3d6d290fc92cebd01e5.json" -} diff --git a/doc/compilation/hardhat/src/modules/library/RulesManagementModuleInvariantStorage.sol/RulesManagementModuleInvariantStorage.json b/doc/compilation/hardhat/src/modules/library/RulesManagementModuleInvariantStorage.sol/RulesManagementModuleInvariantStorage.json deleted file mode 100644 index 74d32fe..0000000 --- a/doc/compilation/hardhat/src/modules/library/RulesManagementModuleInvariantStorage.sol/RulesManagementModuleInvariantStorage.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "RulesManagementModuleInvariantStorage", - "sourceName": "src/modules/library/RulesManagementModuleInvariantStorage.sol", - "abi": [ - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_ArrayIsEmpty", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_OperationNotSuccessful", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleAlreadyExists", - "type": "error" - }, - { - "inputs": [], - "name": "RuleEngine_RulesManagementModule_RuleDoNotMatch", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "AddRule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "ClearRules", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IRule", - "name": "rule", - "type": "address" - } - ], - "name": "RemoveRule", - "type": "event" - }, - { - "inputs": [], - "name": "RULES_MANAGEMENT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/doc/compilation/v3.0.0-rc2/foundry/RuleEngine.sol/RuleEngine.json b/doc/compilation/v3.0.0-rc2/foundry/RuleEngine.sol/RuleEngine.json new file mode 100644 index 0000000..c6d205d --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/foundry/RuleEngine.sol/RuleEngine.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"forwarderIrrevocable","type":"address","internalType":"address"},{"name":"tokenContract","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"COMPLIANCE_MANAGER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RULES_MANAGEMENT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bindToken","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canTransfer","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"canTransferFrom","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"clearRules","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"containsRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"created","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"destroyed","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"detectTransferRestriction","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"detectTransferRestrictionFrom","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleMembers","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getTokenBound","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getTokenBounds","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isTokenBound","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isTrustedForwarder","inputs":[{"name":"forwarder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageForTransferRestriction","inputs":[{"name":"restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"removeRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"rule","inputs":[{"name":"ruleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"rules","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"rulesCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"setRules","inputs":[{"name":"rules_","type":"address[]","internalType":"contract IRule[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferred","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferred","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"trustedForwarder","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"unbindToken","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"version_","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"AddRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"contract IRule"}],"anonymous":false},{"type":"event","name":"ClearRules","inputs":[],"anonymous":false},{"type":"event","name":"RemoveRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"contract IRule"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TokenBound","inputs":[{"name":"token","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TokenUnbound","inputs":[{"name":"token","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_InvalidTokenAddress","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_OperationNotSuccessful","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_TokenAlreadyBound","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_TokenNotBound","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_UnauthorizedCaller","inputs":[]},{"type":"error","name":"RuleEngine_RuleInvalidInterface","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_ArrayIsEmpty","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_OperationNotSuccessful","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleAlreadyExists","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleDoNotMatch","inputs":[]}],"bytecode":{"object":"0x60a060405234801561000f575f5ffd5b5060405161200438038061200483398101604081905261002e91610385565b6001600160a01b03808316608052831661005b57604051630872273360e21b815260040160405180910390fd5b6001600160a01b038116156100735761007381610086565b61007d5f8461013d565b50505050610424565b6001600160a01b0381166100ad576040516301b8831760e71b815260040160405180910390fd5b6100b8600282610173565b156100d65760405163f423354760e01b815260040160405180910390fd5b6100e1600282610194565b6100fe57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b9060200160405180910390a150565b5f8061014984846101a8565b9050801561016a575f8481526005602052604090206101689084610194565b505b90505b92915050565b6001600160a01b0381165f908152600183016020526040812054151561016a565b5f61016a836001600160a01b03841661023a565b5f6101b3838361027f565b610233575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101eb6102f1565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161016d565b505f61016d565b5f81815260018301602052604081205461023357508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561016d565b6001600160a01b0381165f9081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec602052604081205460ff16156102c65750600161016d565b505f8281526004602090815260408083206001600160a01b038516845290915290205460ff1661016d565b5f6102fa6102ff565b905090565b5f366014808210801590610317575061031733610345565b1561033d5761032a36828403815f6103c5565b610333916103ec565b60601c9250505090565b339250505090565b5f61034f60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b0381168114610380575f5ffd5b919050565b5f5f5f60608486031215610397575f5ffd5b6103a08461036a565b92506103ae6020850161036a565b91506103bc6040850161036a565b90509250925092565b5f5f858511156103d3575f5ffd5b838611156103df575f5ffd5b5050820193919092039150565b80356001600160601b0319811690601484101561041d576001600160601b0319601485900360031b81901b82161691505b5092915050565b608051611bba61044a5f395f8181610364015281816103dc01526113460152611bba5ff3fe608060405234801561000f575f5ffd5b506004361061021e575f3560e01c80638d2ea7721161012a578063bc13eacc116100b4578063db18af6c11610079578063db18af6c14610534578063df21950f14610547578063e3c4602c1461055a578063e46638e61461056d578063e54621d214610580575f5ffd5b8063bc13eacc146104ce578063ca15c873146104d6578063d32c7bb5146104e9578063d4ce14151461050e578063d547741f14610521575f5ffd5b80639b11c115116100fa5780639b11c11514610472578063a217fddf14610499578063a3246ad3146104a0578063b043572e146104b3578063b27aef3a146104bb575f5ffd5b80638d2ea772146104265780639010d07c1461043957806391d148541461044c578063993e8b951461045f575f5ffd5b806354e4b945116101ab5780636a3edf281161017b5780636a3edf28146103a75780637157797f146103c75780637da0a877146103da5780637f4ab1dd146104005780638baf29b414610413575f5ffd5b806354e4b9451461031757806354fd4d501461032a578063572b6c05146103545780635f8dead314610394575f5ffd5b806336568abe116101f157806336568abe146102b65780633e5af4ca146102c95780633ff5aa02146102dc57806340db3b50146102ef57806352f6747a14610302575f5ffd5b806301ffc9a71461022257806303c26bcd1461024a578063248a9ca31461027f5780632f2ff15d146102a1575b5f5ffd5b61023561023036600461174a565b610588565b60405190151581526020015b60405180910390f35b6102717fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610241565b61027161028d366004611771565b5f9081526004602052604090206001015490565b6102b46102af36600461179c565b6105a7565b005b6102b46102c436600461179c565b6105d1565b6102b46102d73660046117ca565b610619565b6102b46102ea366004611818565b61062d565b6102b46102fd366004611818565b610641565b61030a610652565b6040516102419190611833565b610235610325366004611818565b610662565b6040805180820190915260058152640332e302e360dc1b60208201525b604051610241919061187e565b610235610362366004611818565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b46103a23660046118b3565b61066d565b6103af610684565b6040516001600160a01b039091168152602001610241565b6102356103d53660046117ca565b6106a6565b7f00000000000000000000000000000000000000000000000000000000000000006103af565b61034761040e3660046118eb565b6106c3565b6102b4610421366004611906565b6106ce565b6102b46104343660046118b3565b6106e1565b6103af610447366004611944565b6106f4565b61023561045a36600461179c565b610712565b61023561046d366004611818565b610784565b6102717fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102715f81565b61030a6104ae366004611771565b610790565b6102b46107a9565b6102b46104c9366004611964565b6107bb565b6102716108e7565b6102716104e4366004611771565b6108f1565b6104fc6104f73660046117ca565b610907565b60405160ff9091168152602001610241565b6104fc61051c366004611906565b61091d565b6102b461052f36600461179c565b610929565b6103af610542366004611771565b61094d565b6102b4610555366004611818565b61096f565b6102b4610568366004611818565b6109a7565b61023561057b366004611906565b610a15565b61030a610a2e565b5f61059282610a3a565b806105a157506105a182610aa5565b92915050565b5f828152600460205260409020600101546105c181610ac9565b6105cb8383610ada565b50505050565b6105d9610b0d565b6001600160a01b0316816001600160a01b03161461060a5760405163334bd91960e11b815260040160405180910390fd5b6106148282610b16565b505050565b610621610b41565b6105cb84848484610b71565b610635610c13565b61063e81610c3d565b50565b610649610c13565b61063e81610cf5565b606061065d5f610d7e565b905090565b5f6105a18183610d8a565b610675610b41565b6106805f8383610dab565b5050565b5f5f6106906002610e44565b11156106a15761065d60025f610e4d565b505f90565b5f806106b486868686610907565b60ff161490505b949350505050565b60606105a182610e58565b6106d6610b41565b610614838383610dab565b6106e9610b41565b610680825f83610dab565b5f82815260056020526040812061070b9083610e4d565b9392505050565b6001600160a01b0381165f9081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec602052604081205460ff1615610759575060016105a1565b505f8281526004602090815260408083206001600160a01b038516845290915290205460ff166105a1565b5f6105a1600283610d8a565b5f8181526005602052604090206060906105a190610d7e565b6107b1610fa2565b6107b9610fcc565b565b6107c3610fa2565b5f8190036107e4576040516359203cb960e01b815260040160405180910390fd5b5f6107ee5f610e44565b11156107fc576107fc610fcc565b5f5b818110156106145761083583838381811061081b5761081b6119d5565b90506020020160208101906108309190611818565b610ffd565b61086683838381811061084a5761084a6119d5565b905060200201602081019061085f9190611818565b5f90611034565b6108835760405163f280d16160e01b815260040160405180910390fd5b828282818110610895576108956119d5565b90506020020160208101906108aa9190611818565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016107fe565b5f61065d5f610e44565b5f8181526005602052604081206105a190610e44565b5f61091485858585611048565b95945050505050565b5f6106bb848484611113565b5f8281526004602052604090206001015461094381610ac9565b6105cb8383610b16565b5f6109575f610e44565b821015610968576105a15f83610e4d565b505f919050565b610977610fa2565b6109815f82610d8a565b61099e57604051632cdc3a4160e21b815260040160405180910390fd5b61063e816111d5565b6109af610fa2565b6109b881610ffd565b6109c25f82611034565b6109df5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f80610a2285858561091d565b60ff1614949350505050565b606061065d6002610d7e565b5f6001600160e01b031982166320c49ce760e01b1480610a6a57506001600160e01b031982166378a8de7d60e01b145b80610a8557506001600160e01b03198216630c51264760e21b145b806105a157506001600160e01b03198216637157797f60e01b1492915050565b5f6001600160e01b03198216635a05180f60e01b14806105a157506105a182611232565b61063e81610ad5610b0d565b611266565b5f5f610ae684846112a3565b9050801561070b575f848152600560205260409020610b059084611034565b509392505050565b5f61065d611335565b5f5f610b22848461139f565b9050801561070b575f848152600560205260409020610b059084611428565b610b54610b4c610b0d565b600290610d8a565b6107b95760405163e39b3c8f60e01b815260040160405180910390fd5b5f610b7b5f610e44565b90505f5b81811015610c0b57610b915f82610e4d565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610bea575f5ffd5b505af1158015610bfc573d5f5f3e3d5ffd5b50505050806001019050610b7f565b505050505050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856861063e81610ac9565b6001600160a01b038116610c64576040516301b8831760e71b815260040160405180910390fd5b610c6f600282610d8a565b15610c8d5760405163f423354760e01b815260040160405180910390fd5b610c98600282611034565b610cb557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610d00600282610d8a565b610d1d57604051636a2b488360e11b815260040160405180910390fd5b610d28600282611428565b610d4557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610cea565b60605f61070b8361143c565b6001600160a01b0381165f908152600183016020526040812054151561070b565b5f610db55f610e44565b90505f5b81811015610e3d57610dcb5f82610e4d565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610e1c575f5ffd5b505af1158015610e2e573d5f5f3e3d5ffd5b50505050806001019050610db9565b5050505050565b5f6105a1825490565b5f61070b8383611495565b60605f610e636108e7565b90505f5b81811015610f6657610e788161094d565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610ebf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee391906119e9565b15610f5e57610ef18161094d565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610f37573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106bb9190810190611a1c565b600101610e67565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e61063e81610ac9565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16107b95f6114bb565b611006816114c4565b61101781632497d6cb60e01b611513565b61063e57604051639952e34360e01b815260040160405180910390fd5b5f61070b836001600160a01b03841661152e565b5f5f6110526108e7565b90505f5b81811015611107575f6110688261094d565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa1580156110c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e99190611acf565b905060ff8116156110fe5792506106bb915050565b50600101611056565b505f9695505050505050565b5f5f61111d6108e7565b90505f5b818110156111ca575f6111338261094d565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015611188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ac9190611acf565b905060ff8116156111c157925061070b915050565b50600101611121565b505f95945050505050565b6111df5f82611428565b6111fc5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6001600160e01b03198216637965db0b60e01b14806105a157506301ffc9a760e01b6001600160e01b03198316146105a1565b6112708282610712565b6106805760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5f6112ae8383610712565b61132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191660011790556112e6610b0d565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016105a1565b505f6105a1565b5f36601480821080159061137157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113975761138436828403815f611aea565b61138d91611b11565b60601c9250505090565b339250505090565b5f6113aa8383610712565b1561132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191690556113e0610b0d565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45060016105a1565b5f61070b836001600160a01b038416611573565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561148957602002820191905f5260205f20905b815481526020019060010190808311611475575b50505050509050919050565b5f825f0182815481106114aa576114aa6119d5565b905f5260205f200154905092915050565b61063e8161165d565b6001600160a01b0381166114eb5760405163f9d152fb60e01b815260040160405180910390fd5b6114f55f82610d8a565b1561063e5760405163cc790a4b60e01b815260040160405180910390fd5b5f61151d836116b6565b801561070b575061070b83836116f5565b5f81815260018301602052604081205461132e57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556105a1565b5f818152600183016020526040812054801561164d575f611595600183611b51565b85549091505f906115a890600190611b51565b9050808214611607575f865f0182815481106115c6576115c66119d5565b905f5260205f200154905080875f0184815481106115e6576115e66119d5565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061161857611618611b70565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506105a1565b5f9150506105a1565b5092915050565b5f611666825490565b90505f5b818110156116af57826001015f845f01838154811061168b5761168b6119d5565b905f5260205f20015481526020019081526020015f205f905580600101905061166a565b50505f9055565b5f6116c8826301ffc9a760e01b6116f5565b15610968575f806116e1846001600160e01b0319611716565b915091508180156106bb5750159392505050565b5f5f5f6117028585611716565b915091508180156109145750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f6020828403121561175a575f5ffd5b81356001600160e01b03198116811461070b575f5ffd5b5f60208284031215611781575f5ffd5b5035919050565b6001600160a01b038116811461063e575f5ffd5b5f5f604083850312156117ad575f5ffd5b8235915060208301356117bf81611788565b809150509250929050565b5f5f5f5f608085870312156117dd575f5ffd5b84356117e881611788565b935060208501356117f881611788565b9250604085013561180881611788565b9396929550929360600135925050565b5f60208284031215611828575f5ffd5b813561070b81611788565b602080825282518282018190525f918401906040840190835b818110156118735783516001600160a01b031683526020938401939092019160010161184c565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156118c4575f5ffd5b82356118cf81611788565b946020939093013593505050565b60ff8116811461063e575f5ffd5b5f602082840312156118fb575f5ffd5b813561070b816118dd565b5f5f5f60608486031215611918575f5ffd5b833561192381611788565b9250602084013561193381611788565b929592945050506040919091013590565b5f5f60408385031215611955575f5ffd5b50508035926020909101359150565b5f5f60208385031215611975575f5ffd5b823567ffffffffffffffff81111561198b575f5ffd5b8301601f8101851361199b575f5ffd5b803567ffffffffffffffff8111156119b1575f5ffd5b8560208260051b84010111156119c5575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156119f9575f5ffd5b8151801515811461070b575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611a2c575f5ffd5b815167ffffffffffffffff811115611a42575f5ffd5b8201601f81018413611a52575f5ffd5b805167ffffffffffffffff811115611a6c57611a6c611a08565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611a9b57611a9b611a08565b604052818152828201602001861015611ab2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611adf575f5ffd5b815161070b816118dd565b5f5f85851115611af8575f5ffd5b83861115611b04575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611656576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b818103818111156105a157634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b03f8c635c82b542156a657e05e1b25daf4da0550801960bc81efa2b41c0ae9d64736f6c63430008220033","sourceMap":"787:2684:163:-:0;;;1052:393;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1542:37:135;;;;;1204:19:163;::::1;1200:100;;1246:43;;-1:-1:-1::0;;;1246:43:163::1;;;;;;;;;;;1200:100;-1:-1:-1::0;;;;;1313:27:163;::::1;::::0;1309:83:::1;;1356:25;1367:13:::0;1356:10:::1;:25::i;:::-;1401:37;2232:4:126;1432:5:163::0;1401:10:::1;:37::i;:::-;;1052:393:::0;;;787:2684;;3688:459:186;-1:-1:-1;;;;;3750:19:186;;3742:80;;;;-1:-1:-1;;;3742:80:186;;;;;;;;;;;;3841:28;:12;3863:5;3841:21;:28::i;:::-;3840:29;3832:88;;;;-1:-1:-1;;;3832:88:186;;;;;;;;;;;;4029:23;:12;4046:5;4029:16;:23::i;:::-;4021:87;;;;-1:-1:-1;;;4021:87:186;;;;;;;;;;;;4123:17;;-1:-1:-1;;;;;743:32:231;;725:51;;4123:17:186;;713:2:231;698:18;4123:17:186;;;;;;;3688:459;:::o;2777:257:130:-;2863:4;;2894:31;2911:4;2917:7;2894:16;:31::i;:::-;2879:46;;2939:7;2935:69;;;2962:18;;;;:12;:18;;;;;:31;;2985:7;2962:22;:31::i;:::-;;2935:69;3020:7;-1:-1:-1;2777:257:130;;;;;:::o;16041:165:158:-;-1:-1:-1;;;;;16174:23:158;;16121:4;5238:21;;;:14;;;:21;;;;;;:26;;16144:55;5142:129;15089:150;15159:4;15182:50;15187:3;-1:-1:-1;;;;;15207:23:158;;15182:4;:50::i;6145:316:126:-;6222:4;6243:22;6251:4;6257:7;6243;:22::i;:::-;6238:217;;6281:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6281:29:126;;;;;;;;;:36;;-1:-1:-1;;6281:36:126;6313:4;6281:36;;;6363:12;:10;:12::i;:::-;-1:-1:-1;;;;;6336:40:126;6354:7;-1:-1:-1;;;;;6336:40:126;6348:4;6336:40;;;;;;;;;;-1:-1:-1;6397:4:126;6390:11;;6238:217;-1:-1:-1;6439:5:126;6432:12;;2538:406:158;2601:4;5238:21;;;:14;;;:21;;;;;;2617:321;;-1:-1:-1;2659:23:158;;;;;;;;:11;:23;;;;;;;;;;;;;2841:18;;2817:21;;;:14;;;:21;;;;;;:42;;;;2873:11;;1630:349:163;-1:-1:-1;;;;;2920:29:126;;1787:4:163;2920:29:126;;;:12;;:29;:12;:29;;;;;1807:166:163;;;-1:-1:-1;1884:4:163;1877:11;;1807:166;-1:-1:-1;2897:4:126;2920:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;2920:29:126;;;;;;;;;;;;1919:43:163;;2796:154;2883:14;2916:27;:25;:27::i;:::-;2909:34;;2796:154;:::o;2248:471:135:-;2310:7;2354:8;3609:2;2445:37;;;;;;:71;;-1:-1:-1;2486:30:135;2505:10;2486:18;:30::i;:::-;2441:272;;;2583:47;:8;2592:36;;;2583:8;;:47;:::i;:::-;2575:56;;;:::i;:::-;2567:65;;2560:72;;;;2248:471;:::o;2441:272::-;735:10:143;2677:25:135;;;;2248:471;:::o;1874:137::-;1950:4;1986:18;1749:17;;;1666:107;1986:18;-1:-1:-1;;;;;1973:31:135;:9;-1:-1:-1;;;;;1973:31:135;;1966:38;;1874:137;;;:::o;14:177:231:-;93:13;;-1:-1:-1;;;;;135:31:231;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:378::-;284:6;292;300;353:2;341:9;332:7;328:23;324:32;321:52;;;369:1;366;359:12;321:52;392:40;422:9;392:40;:::i;:::-;382:50;;451:49;496:2;485:9;481:18;451:49;:::i;:::-;441:59;;519:49;564:2;553:9;549:18;519:49;:::i;:::-;509:59;;196:378;;;;;:::o;787:331::-;892:9;903;945:8;933:10;930:24;927:44;;;967:1;964;957:12;927:44;996:6;986:8;983:20;980:40;;;1016:1;1013;1006:12;980:40;-1:-1:-1;;1042:23:231;;;1087:25;;;;;-1:-1:-1;787:331:231:o;1123:350::-;1244:19;;-1:-1:-1;;;;;;1281:32:231;;;1333:2;1325:11;;1322:145;;;-1:-1:-1;;;;;;1395:2:231;1391:12;;;1388:1;1384:20;1380:50;;;1372:59;;1368:89;;-1:-1:-1;1322:145:231;;1123:350;;;;:::o;:::-;787:2684:163;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b506004361061021e575f3560e01c80638d2ea7721161012a578063bc13eacc116100b4578063db18af6c11610079578063db18af6c14610534578063df21950f14610547578063e3c4602c1461055a578063e46638e61461056d578063e54621d214610580575f5ffd5b8063bc13eacc146104ce578063ca15c873146104d6578063d32c7bb5146104e9578063d4ce14151461050e578063d547741f14610521575f5ffd5b80639b11c115116100fa5780639b11c11514610472578063a217fddf14610499578063a3246ad3146104a0578063b043572e146104b3578063b27aef3a146104bb575f5ffd5b80638d2ea772146104265780639010d07c1461043957806391d148541461044c578063993e8b951461045f575f5ffd5b806354e4b945116101ab5780636a3edf281161017b5780636a3edf28146103a75780637157797f146103c75780637da0a877146103da5780637f4ab1dd146104005780638baf29b414610413575f5ffd5b806354e4b9451461031757806354fd4d501461032a578063572b6c05146103545780635f8dead314610394575f5ffd5b806336568abe116101f157806336568abe146102b65780633e5af4ca146102c95780633ff5aa02146102dc57806340db3b50146102ef57806352f6747a14610302575f5ffd5b806301ffc9a71461022257806303c26bcd1461024a578063248a9ca31461027f5780632f2ff15d146102a1575b5f5ffd5b61023561023036600461174a565b610588565b60405190151581526020015b60405180910390f35b6102717fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610241565b61027161028d366004611771565b5f9081526004602052604090206001015490565b6102b46102af36600461179c565b6105a7565b005b6102b46102c436600461179c565b6105d1565b6102b46102d73660046117ca565b610619565b6102b46102ea366004611818565b61062d565b6102b46102fd366004611818565b610641565b61030a610652565b6040516102419190611833565b610235610325366004611818565b610662565b6040805180820190915260058152640332e302e360dc1b60208201525b604051610241919061187e565b610235610362366004611818565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b46103a23660046118b3565b61066d565b6103af610684565b6040516001600160a01b039091168152602001610241565b6102356103d53660046117ca565b6106a6565b7f00000000000000000000000000000000000000000000000000000000000000006103af565b61034761040e3660046118eb565b6106c3565b6102b4610421366004611906565b6106ce565b6102b46104343660046118b3565b6106e1565b6103af610447366004611944565b6106f4565b61023561045a36600461179c565b610712565b61023561046d366004611818565b610784565b6102717fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102715f81565b61030a6104ae366004611771565b610790565b6102b46107a9565b6102b46104c9366004611964565b6107bb565b6102716108e7565b6102716104e4366004611771565b6108f1565b6104fc6104f73660046117ca565b610907565b60405160ff9091168152602001610241565b6104fc61051c366004611906565b61091d565b6102b461052f36600461179c565b610929565b6103af610542366004611771565b61094d565b6102b4610555366004611818565b61096f565b6102b4610568366004611818565b6109a7565b61023561057b366004611906565b610a15565b61030a610a2e565b5f61059282610a3a565b806105a157506105a182610aa5565b92915050565b5f828152600460205260409020600101546105c181610ac9565b6105cb8383610ada565b50505050565b6105d9610b0d565b6001600160a01b0316816001600160a01b03161461060a5760405163334bd91960e11b815260040160405180910390fd5b6106148282610b16565b505050565b610621610b41565b6105cb84848484610b71565b610635610c13565b61063e81610c3d565b50565b610649610c13565b61063e81610cf5565b606061065d5f610d7e565b905090565b5f6105a18183610d8a565b610675610b41565b6106805f8383610dab565b5050565b5f5f6106906002610e44565b11156106a15761065d60025f610e4d565b505f90565b5f806106b486868686610907565b60ff161490505b949350505050565b60606105a182610e58565b6106d6610b41565b610614838383610dab565b6106e9610b41565b610680825f83610dab565b5f82815260056020526040812061070b9083610e4d565b9392505050565b6001600160a01b0381165f9081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec602052604081205460ff1615610759575060016105a1565b505f8281526004602090815260408083206001600160a01b038516845290915290205460ff166105a1565b5f6105a1600283610d8a565b5f8181526005602052604090206060906105a190610d7e565b6107b1610fa2565b6107b9610fcc565b565b6107c3610fa2565b5f8190036107e4576040516359203cb960e01b815260040160405180910390fd5b5f6107ee5f610e44565b11156107fc576107fc610fcc565b5f5b818110156106145761083583838381811061081b5761081b6119d5565b90506020020160208101906108309190611818565b610ffd565b61086683838381811061084a5761084a6119d5565b905060200201602081019061085f9190611818565b5f90611034565b6108835760405163f280d16160e01b815260040160405180910390fd5b828282818110610895576108956119d5565b90506020020160208101906108aa9190611818565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016107fe565b5f61065d5f610e44565b5f8181526005602052604081206105a190610e44565b5f61091485858585611048565b95945050505050565b5f6106bb848484611113565b5f8281526004602052604090206001015461094381610ac9565b6105cb8383610b16565b5f6109575f610e44565b821015610968576105a15f83610e4d565b505f919050565b610977610fa2565b6109815f82610d8a565b61099e57604051632cdc3a4160e21b815260040160405180910390fd5b61063e816111d5565b6109af610fa2565b6109b881610ffd565b6109c25f82611034565b6109df5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f80610a2285858561091d565b60ff1614949350505050565b606061065d6002610d7e565b5f6001600160e01b031982166320c49ce760e01b1480610a6a57506001600160e01b031982166378a8de7d60e01b145b80610a8557506001600160e01b03198216630c51264760e21b145b806105a157506001600160e01b03198216637157797f60e01b1492915050565b5f6001600160e01b03198216635a05180f60e01b14806105a157506105a182611232565b61063e81610ad5610b0d565b611266565b5f5f610ae684846112a3565b9050801561070b575f848152600560205260409020610b059084611034565b509392505050565b5f61065d611335565b5f5f610b22848461139f565b9050801561070b575f848152600560205260409020610b059084611428565b610b54610b4c610b0d565b600290610d8a565b6107b95760405163e39b3c8f60e01b815260040160405180910390fd5b5f610b7b5f610e44565b90505f5b81811015610c0b57610b915f82610e4d565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610bea575f5ffd5b505af1158015610bfc573d5f5f3e3d5ffd5b50505050806001019050610b7f565b505050505050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856861063e81610ac9565b6001600160a01b038116610c64576040516301b8831760e71b815260040160405180910390fd5b610c6f600282610d8a565b15610c8d5760405163f423354760e01b815260040160405180910390fd5b610c98600282611034565b610cb557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610d00600282610d8a565b610d1d57604051636a2b488360e11b815260040160405180910390fd5b610d28600282611428565b610d4557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610cea565b60605f61070b8361143c565b6001600160a01b0381165f908152600183016020526040812054151561070b565b5f610db55f610e44565b90505f5b81811015610e3d57610dcb5f82610e4d565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610e1c575f5ffd5b505af1158015610e2e573d5f5f3e3d5ffd5b50505050806001019050610db9565b5050505050565b5f6105a1825490565b5f61070b8383611495565b60605f610e636108e7565b90505f5b81811015610f6657610e788161094d565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610ebf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee391906119e9565b15610f5e57610ef18161094d565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610f37573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106bb9190810190611a1c565b600101610e67565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e61063e81610ac9565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16107b95f6114bb565b611006816114c4565b61101781632497d6cb60e01b611513565b61063e57604051639952e34360e01b815260040160405180910390fd5b5f61070b836001600160a01b03841661152e565b5f5f6110526108e7565b90505f5b81811015611107575f6110688261094d565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa1580156110c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e99190611acf565b905060ff8116156110fe5792506106bb915050565b50600101611056565b505f9695505050505050565b5f5f61111d6108e7565b90505f5b818110156111ca575f6111338261094d565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015611188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ac9190611acf565b905060ff8116156111c157925061070b915050565b50600101611121565b505f95945050505050565b6111df5f82611428565b6111fc5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6001600160e01b03198216637965db0b60e01b14806105a157506301ffc9a760e01b6001600160e01b03198316146105a1565b6112708282610712565b6106805760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5f6112ae8383610712565b61132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191660011790556112e6610b0d565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016105a1565b505f6105a1565b5f36601480821080159061137157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113975761138436828403815f611aea565b61138d91611b11565b60601c9250505090565b339250505090565b5f6113aa8383610712565b1561132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191690556113e0610b0d565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45060016105a1565b5f61070b836001600160a01b038416611573565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561148957602002820191905f5260205f20905b815481526020019060010190808311611475575b50505050509050919050565b5f825f0182815481106114aa576114aa6119d5565b905f5260205f200154905092915050565b61063e8161165d565b6001600160a01b0381166114eb5760405163f9d152fb60e01b815260040160405180910390fd5b6114f55f82610d8a565b1561063e5760405163cc790a4b60e01b815260040160405180910390fd5b5f61151d836116b6565b801561070b575061070b83836116f5565b5f81815260018301602052604081205461132e57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556105a1565b5f818152600183016020526040812054801561164d575f611595600183611b51565b85549091505f906115a890600190611b51565b9050808214611607575f865f0182815481106115c6576115c66119d5565b905f5260205f200154905080875f0184815481106115e6576115e66119d5565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061161857611618611b70565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506105a1565b5f9150506105a1565b5092915050565b5f611666825490565b90505f5b818110156116af57826001015f845f01838154811061168b5761168b6119d5565b905f5260205f20015481526020019081526020015f205f905580600101905061166a565b50505f9055565b5f6116c8826301ffc9a760e01b6116f5565b15610968575f806116e1846001600160e01b0319611716565b915091508180156106bb5750159392505050565b5f5f5f6117028585611716565b915091508180156109145750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f6020828403121561175a575f5ffd5b81356001600160e01b03198116811461070b575f5ffd5b5f60208284031215611781575f5ffd5b5035919050565b6001600160a01b038116811461063e575f5ffd5b5f5f604083850312156117ad575f5ffd5b8235915060208301356117bf81611788565b809150509250929050565b5f5f5f5f608085870312156117dd575f5ffd5b84356117e881611788565b935060208501356117f881611788565b9250604085013561180881611788565b9396929550929360600135925050565b5f60208284031215611828575f5ffd5b813561070b81611788565b602080825282518282018190525f918401906040840190835b818110156118735783516001600160a01b031683526020938401939092019160010161184c565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156118c4575f5ffd5b82356118cf81611788565b946020939093013593505050565b60ff8116811461063e575f5ffd5b5f602082840312156118fb575f5ffd5b813561070b816118dd565b5f5f5f60608486031215611918575f5ffd5b833561192381611788565b9250602084013561193381611788565b929592945050506040919091013590565b5f5f60408385031215611955575f5ffd5b50508035926020909101359150565b5f5f60208385031215611975575f5ffd5b823567ffffffffffffffff81111561198b575f5ffd5b8301601f8101851361199b575f5ffd5b803567ffffffffffffffff8111156119b1575f5ffd5b8560208260051b84010111156119c5575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156119f9575f5ffd5b8151801515811461070b575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611a2c575f5ffd5b815167ffffffffffffffff811115611a42575f5ffd5b8201601f81018413611a52575f5ffd5b805167ffffffffffffffff811115611a6c57611a6c611a08565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611a9b57611a9b611a08565b604052818152828201602001861015611ab2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611adf575f5ffd5b815161070b816118dd565b5f5f85851115611af8575f5ffd5b83861115611b04575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611656576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b818103818111156105a157634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b03f8c635c82b542156a657e05e1b25daf4da0550801960bc81efa2b41c0ae9d64736f6c63430008220033","sourceMap":"787:2684:163:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2029:296;;;;;;:::i;:::-;;:::i;:::-;;;470:14:231;;463:22;445:41;;433:2;418:18;2029:296:163;;;;;;;;729:86:186;;779:36;729:86;;;;;643:25:231;;;631:2;616:18;729:86:186;497:177:231;3776:120:126;;;;;;:::i;:::-;3841:7;3867:12;;;:6;:12;;;;;:22;;;;3776:120;4192:136;;;;;;:::i;:::-;;:::i;:::-;;5294:245;;;;;;:::i;:::-;;:::i;1726:276:161:-;;;;;;:::i;:::-;;:::i;1846:114:186:-;;;;;;:::i;:::-;;:::i;2223:118::-;;;;;;:::i;:::-;;:::i;4499:136:187:-;;;:::i;:::-;;;;;;;:::i;3804:158::-;;;;;;:::i;:::-;;:::i;692:129:188:-;807:7;;;;;;;;;;;;-1:-1:-1;;;807:7:188;;;;692:129;;;;;;;:::i;1874:137:135:-;;;;;;:::i;:::-;1749:17;-1:-1:-1;;;;;1973:31:135;;;;;;;1874:137;2328:155:161;;;;;;:::i;:::-;;:::i;2564:382:186:-;;;:::i;:::-;;;-1:-1:-1;;;;;4193:32:231;;;4175:51;;4163:2;4148:18;2564:382:186;4029:203:231;4340:311:161;;;;;;:::i;:::-;;:::i;1666:107:135:-;1749:17;1666:107;;3695:240:161;;;;;;:::i;:::-;;:::i;2071:212::-;;;;;;:::i;:::-;;:::i;2528:161::-;;;;;;:::i;:::-;;:::i;1555:142:130:-;;;;;;:::i;:::-;;:::i;1630:349:163:-;;;;;;:::i;:::-;;:::i;2386:133:186:-;;;;;;:::i;:::-;;:::i;1199:82:192:-;;1247:34;1199:82;;2187:49:126;;2232:4;2187:49;;2539:136:130;;;;;;:::i;:::-;;:::i;2485:117:187:-;;;:::i;1781:640::-;;;;;;:::i;:::-;;:::i;3608:132::-;;;:::i;1865:131:130:-;;;;;;:::i;:::-;;:::i;3363:282:161:-;;;;;;:::i;:::-;;:::i;:::-;;;6452:4:231;6440:17;;;6422:36;;6410:2;6395:18;3363:282:161;6280:184:231;3065:242:161;;;;;;:::i;:::-;;:::i;4608:138:126:-;;;;;;:::i;:::-;;:::i;4026:409:187:-;;;;;;:::i;:::-;;:::i;3258:234::-;;;;;;:::i;:::-;;:::i;2923:271::-;;;;;;:::i;:::-;;:::i;3999:281:161:-;;;;;;:::i;:::-;;:::i;2991:119:186:-;;;:::i;2029:296:163:-;2188:4;2215:45;2248:11;2215:32;:45::i;:::-;:103;;;;2264:54;2306:11;2264:41;:54::i;:::-;2208:110;2029:296;-1:-1:-1;;2029:296:163:o;4192:136:126:-;3841:7;3867:12;;;:6;:12;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4296:25:::1;4307:4;4313:7;4296:10;:25::i;:::-;;4192:136:::0;;;:::o;5294:245::-;5409:12;:10;:12::i;:::-;-1:-1:-1;;;;;5387:34:126;:18;-1:-1:-1;;;;;5387:34:126;;5383:102;;5444:30;;-1:-1:-1;;;5444:30:126;;;;;;;;;;;5383:102;5495:37;5507:4;5513:18;5495:11;:37::i;:::-;;5294:245;;:::o;1726:276:161:-;1217:18:186;:16;:18::i;:::-;1935:60:161::1;1970:7;1979:4;1985:2;1989:5;1935:34;:60::i;1846:114:186:-:0;1302:24;:22;:24::i;:::-;1936:17:::1;1947:5;1936:10;:17::i;:::-;1846:114:::0;:::o;2223:118::-;1302:24;:22;:24::i;:::-;2315:19:::1;2328:5;2315:12;:19::i;4499:136:187:-:0;4578:16;4613:15;:6;:13;:15::i;:::-;4606:22;;4499:136;:::o;3804:158::-;3901:4;3924:31;3901:4;3948:5;3924:15;:31::i;2328:155:161:-;1217:18:186;:16;:18::i;:::-;2441:35:161::1;2462:1;2466:2;2470:5;2441:12;:35::i;:::-;2328:155:::0;;:::o;2564:382:186:-;2627:7;2674:1;2650:21;:12;:19;:21::i;:::-;:25;2646:294;;;2863:18;:12;2879:1;2863:15;:18::i;2646:294::-;-1:-1:-1;2927:1:186;;2564:382::o;4340:311:161:-;4521:4;;4548:55;4578:7;4587:4;4593:2;4597:5;4548:29;:55::i;:::-;:96;;;4541:103;;4340:311;;;;;;;:::o;3695:240::-;3845:13;3881:47;3912:15;3881:30;:47::i;2071:212::-;1217:18:186;:16;:18::i;:::-;2247:29:161::1;2260:4;2266:2;2270:5;2247:12;:29::i;2528:161::-:0;1217:18:186;:16;:18::i;:::-;2645:37:161::1;2658:4;2672:1;2676:5;2645:12;:37::i;1555:142:130:-:0;1636:7;1662:18;;;:12;:18;;;;;:28;;1684:5;1662:21;:28::i;:::-;1655:35;1555:142;-1:-1:-1;;;1555:142:130:o;1630:349:163:-;-1:-1:-1;;;;;2920:29:126;;1787:4:163;2920:29:126;;;:12;;:29;:12;:29;;;;;1807:166:163;;;-1:-1:-1;1884:4:163;1877:11;;1807:166;-1:-1:-1;2897:4:126;2920:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;2920:29:126;;;;;;;;;;;;1919:43:163;;2386:133:186;2461:4;2484:28;:12;2506:5;2484:21;:28::i;2539:136:130:-;2641:18;;;;:12;:18;;;;;2606:16;;2641:27;;:25;:27::i;2485:117:187:-;643:19;:17;:19::i;:::-;2582:13:::1;:11;:13::i;:::-;2485:117::o:0;1781:640::-;643:19;:17;:19::i;:::-;1920:1:::1;1903:18:::0;;;1899:103:::1;;1944:47;;-1:-1:-1::0;;;1944:47:187::1;;;;;;;;;;;1899:103;2033:1;2015:15;:6;:13;:15::i;:::-;:19;2011:63;;;2050:13;:11;:13::i;:::-;2088:9;2083:332;2103:17:::0;;::::1;2083:332;;;2141:30;2160:6;;2167:1;2160:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2141:10;:30::i;:::-;2277;2296:6;;2303:1;2296:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2277:6;::::0;:10:::1;:30::i;:::-;2269:98;;;;-1:-1:-1::0;;;2269:98:187::1;;;;;;;;;;;;2394:6;;2401:1;2394:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2386:18:187::1;;;;;;;;;;;2122:3;;2083:332;;3608:132:::0;3692:7;3718:15;:6;:13;:15::i;1865:131:130:-;1936:7;1962:18;;;:12;:18;;;;;:27;;:25;:27::i;3363:282:161:-;3554:5;3582:56;3613:7;3622:4;3628:2;3632:5;3582:30;:56::i;:::-;3575:63;3363:282;-1:-1:-1;;;;;3363:282:161:o;3065:242::-;3229:5;3257:43;3284:4;3290:2;3294:5;3257:26;:43::i;4608:138:126:-;3841:7;3867:12;;;:6;:12;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4713:26:::1;4725:4;4731:7;4713:11;:26::i;4026:409:187:-:0;4118:7;4150:15;:6;:13;:15::i;:::-;4141:6;:24;4137:292;;;4353:17;:6;4363;4353:9;:17::i;4137:292::-;-1:-1:-1;4416:1:187;;4026:409;-1:-1:-1;4026:409:187:o;3258:234::-;643:19;:17;:19::i;:::-;3374:31:::1;:6;3398:5:::0;3374:15:::1;:31::i;:::-;3366:91;;;;-1:-1:-1::0;;;3366:91:187::1;;;;;;;;;;;;3467:18;3479:5;3467:11;:18::i;2923:271::-:0;643:19;:17;:19::i;:::-;3028:26:::1;3047:5;3028:10;:26::i;:::-;3072;:6;3091:5:::0;3072:10:::1;:26::i;:::-;3064:94;;;;-1:-1:-1::0;;;3064:94:187::1;;;;;;;;;;;;3173:14;::::0;-1:-1:-1;;;;;3173:14:187;::::1;::::0;::::1;::::0;;;::::1;2923:271:::0;:::o;3999:281:161:-;4163:4;;4190:42;4216:4;4222:2;4226:5;4190:25;:42::i;:::-;:83;;;;3999:281;-1:-1:-1;;;;3999:281:161:o;2991:119:186:-;3047:16;3082:21;:12;:19;:21::i;7167:427:161:-;7252:4;-1:-1:-1;;;;;;7275:61:161;;-1:-1:-1;;;7275:61:161;;:143;;-1:-1:-1;;;;;;;7352:66:161;;-1:-1:-1;;;7352:66:161;7275:143;:227;;;-1:-1:-1;;;;;;;7434:68:161;;-1:-1:-1;;;7434:68:161;7275:227;:312;;;-1:-1:-1;;;;;;;7518:69:161;;-1:-1:-1;;;7518:69:161;7268:319;7167:427;-1:-1:-1;;7167:427:161:o;758:212:130:-;843:4;-1:-1:-1;;;;;;866:57:130;;-1:-1:-1;;;866:57:130;;:97;;;927:36;951:11;927:23;:36::i;3165:103:126:-;3231:30;3242:4;3248:12;:10;:12::i;:::-;3231:10;:30::i;2777:257:130:-;2863:4;2879:12;2894:31;2911:4;2917:7;2894:16;:31::i;:::-;2879:46;;2939:7;2935:69;;;2962:18;;;;:12;:18;;;;;:31;;2985:7;2962:22;:31::i;:::-;;3020:7;2777:257;-1:-1:-1;;;2777:257:130:o;2796:154:163:-;2883:14;2916:27;:25;:27::i;3137:262:130:-;3224:4;3240:12;3255:32;3273:4;3279:7;3255:17;:32::i;:::-;3240:47;;3301:7;3297:72;;;3324:18;;;;:12;:18;;;;;:34;;3350:7;3324:25;:34::i;4153:188:186:-;4217:35;4239:12;:10;:12::i;:::-;4217;;:21;:35::i;:::-;4212:123;;4275:49;;-1:-1:-1;;;4275:49:186;;;;;;;;;;;7278:284:187;7385:19;7407:15;:6;:13;:15::i;:::-;7385:37;-1:-1:-1;7437:9:187;7432:124;7456:11;7452:1;:15;7432:124;;;7494:12;:6;7504:1;7494:9;:12::i;:::-;7488:57;;-1:-1:-1;;;7488:57:187;;-1:-1:-1;;;;;7213:32:231;;;7488:57:187;;;7195:51:231;7282:32;;;7262:18;;;7255:60;7351:32;;;7331:18;;;7324:60;7400:18;;;7393:34;;;7488:31:187;;;;;;;7167:19:231;;7488:57:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7469:3;;;;;7432:124;;;;7375:187;7278:284;;;;:::o;2505:96:163:-;779:36:186;2464:16:126;2475:4;2464:10;:16::i;3688:459:186:-;-1:-1:-1;;;;;3750:19:186;;3742:80;;;;-1:-1:-1;;;3742:80:186;;;;;;;;;;;;3841:28;:12;3863:5;3841:21;:28::i;:::-;3840:29;3832:88;;;;-1:-1:-1;;;3832:88:186;;;;;;;;;;;;4029:23;:12;4046:5;4029:16;:23::i;:::-;4021:87;;;;-1:-1:-1;;;4021:87:186;;;;;;;;;;;;4123:17;;-1:-1:-1;;;;;4193:32:231;;4175:51;;4123:17:186;;4163:2:231;4148:18;4123:17:186;;;;;;;;3688:459;:::o;3310:372::-;3374:28;:12;3396:5;3374:21;:28::i;:::-;3366:83;;;;-1:-1:-1;;;3366:83:186;;;;;;;;;;;;3558:26;:12;3578:5;3558:19;:26::i;:::-;3550:90;;;;-1:-1:-1;;;3550:90:186;;;;;;;;;;;;3656:19;;-1:-1:-1;;;;;4193:32:231;;4175:51;;3656:19:186;;4163:2:231;4148:18;3656:19:186;4029:203:231;17440:273:158;17503:16;17531:22;17556:19;17564:3;17556:7;:19::i;16041:165::-;-1:-1:-1;;;;;16174:23:158;;16121:4;5238:21;;;:14;;;:21;;;;;;:26;;16144:55;5142:129;6464:258:187;6554:19;6576:15;:6;:13;:15::i;:::-;6554:37;-1:-1:-1;6606:9:187;6601:115;6625:11;6621:1;:15;6601:115;;;6663:12;:6;6673:1;6663:9;:12::i;:::-;6657:48;;-1:-1:-1;;;6657:48:187;;-1:-1:-1;;;;;7658:32:231;;;6657:48:187;;;7640:51:231;7727:32;;;7707:18;;;7700:60;7776:18;;;7769:34;;;6657:31:187;;;;;;;7613:18:231;;6657:48:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6638:3;;;;;6601:115;;;;6544:178;6464:258;;;:::o;16287:115:158:-;16350:7;16376:19;16384:3;5434:18;;5352:107;16744:156;16818:7;16868:22;16872:3;16884:5;16868:3;:22::i;6166:449:161:-;6260:13;6285:19;6307:12;:10;:12::i;:::-;6285:34;-1:-1:-1;6334:9:161;6329:237;6353:11;6349:1;:15;6329:237;;;6395:7;6400:1;6395:4;:7::i;:::-;6389:64;;-1:-1:-1;;;6389:64:161;;6452:4:231;6440:17;;6389:64:161;;;6422:36:231;-1:-1:-1;;;;;6389:47:161;;;;;;;6395:18:231;;6389:64:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6385:171;;;6486:7;6491:1;6486:4;:7::i;:::-;6480:61;;-1:-1:-1;;;6480:61:161;;6452:4:231;6440:17;;6480:61:161;;;6422:36:231;-1:-1:-1;;;;;6480:44:161;;;;;;;6395:18:231;;6480:61:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6480:61:161;;;;;;;;;;;;:::i;6385:171::-;6366:3;;6329:237;;;-1:-1:-1;;6575:33:161;;;;;;;;;;;;;;;;;;6166:449;-1:-1:-1;;6166:449:161:o;2606:89:163:-;1247:34:192;2464:16:126;2475:4;2464:10;:16::i;4914:98:187:-;4969:12;;;;;;;4991:14;:6;:12;:14::i;6719:261:161:-;6795:23;6812:5;6795:16;:23::i;:::-;6833:74;6865:5;-1:-1:-1;;;6833:31:161;:74::i;:::-;6828:146;;6930:33;;-1:-1:-1;;;6930:33:161;;;;;;;;;;;15089:150:158;15159:4;15182:50;15187:3;-1:-1:-1;;;;;15207:23:158;;15182:4;:50::i;5314:528:161:-;5475:5;5496:19;5518:12;:10;:12::i;:::-;5496:34;-1:-1:-1;5545:9:161;5540:242;5564:11;5560:1;:15;5540:242;;;5596:17;5622:7;5627:1;5622:4;:7::i;:::-;5616:70;;-1:-1:-1;;;5616:70:161;;-1:-1:-1;;;;;7213:32:231;;;5616:70:161;;;7195:51:231;7282:32;;;7262:18;;;7255:60;7351:32;;;7331:18;;;7324:60;7400:18;;;7393:34;;;5616:44:161;;;;;;;7167:19:231;;5616:70:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5596:90;-1:-1:-1;5704:15:161;;;;5700:72;;5746:11;-1:-1:-1;5739:18:161;;-1:-1:-1;;5739:18:161;5700:72;-1:-1:-1;5577:3:161;;5540:242;;;-1:-1:-1;5804:30:161;5791:44;5314:528;-1:-1:-1;;;;;;5314:528:161:o;4850:458::-;4958:5;4975:19;4997:12;:10;:12::i;:::-;4975:34;-1:-1:-1;5024:9:161;5019:229;5043:11;5039:1;:15;5019:229;;;5075:17;5101:7;5106:1;5101:4;:7::i;:::-;5095:57;;-1:-1:-1;;;5095:57:161;;-1:-1:-1;;;;;7658:32:231;;;5095:57:161;;;7640:51:231;7727:32;;;7707:18;;;7700:60;7776:18;;;7769:34;;;5095:40:161;;;;;;;7613:18:231;;5095:57:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5075:77;-1:-1:-1;5170:15:161;;;;5166:72;;5212:11;-1:-1:-1;5205:18:161;;-1:-1:-1;;5205:18:161;5166:72;-1:-1:-1;5056:3:161;;5019:229;;;-1:-1:-1;5270:30:161;5257:44;4850:458;-1:-1:-1;;;;;4850:458:161:o;5239:277:187:-;5388:29;:6;5410:5;5388:13;:29::i;:::-;5380:97;;;;-1:-1:-1;;;5380:97:187;;;;;;;;;;;;5492:17;;-1:-1:-1;;;;;5492:17:187;;;;;;;;5239:277;:::o;2531:202:126:-;2616:4;-1:-1:-1;;;;;;2639:47:126;;-1:-1:-1;;;2639:47:126;;:87;;-1:-1:-1;;;;;;;;;;829:40:152;;;2690:36:126;730:146:152;3398:197:126;3486:22;3494:4;3500:7;3486;:22::i;:::-;3481:108;;3531:47;;-1:-1:-1;;;3531:47:126;;-1:-1:-1;;;;;9612:32:231;;3531:47:126;;;9594:51:231;9661:18;;;9654:34;;;9567:18;;3531:47:126;;;;;;;6145:316;6222:4;6243:22;6251:4;6257:7;6243;:22::i;:::-;6238:217;;6281:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6281:29:126;;;;;;;;;:36;;-1:-1:-1;;6281:36:126;6313:4;6281:36;;;6363:12;:10;:12::i;:::-;-1:-1:-1;;;;;6336:40:126;6354:7;-1:-1:-1;;;;;6336:40:126;6348:4;6336:40;;;;;;;;;;-1:-1:-1;6397:4:126;6390:11;;6238:217;-1:-1:-1;6439:5:126;6432:12;;2248:471:135;2310:7;2354:8;3609:2;2445:37;;;;;;:71;;-1:-1:-1;1749:17:135;-1:-1:-1;;;;;1973:31:135;2505:10;1973:31;2486:30;2441:272;;;2583:47;:8;2592:36;;;2583:8;;:47;:::i;:::-;2575:56;;;:::i;:::-;2567:65;;2560:72;;;;2248:471;:::o;2441:272::-;735:10:143;2677:25:135;;;;2248:471;:::o;6698:317:126:-;6776:4;6796:22;6804:4;6810:7;6796;:22::i;:::-;6792:217;;;6866:5;6834:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6834:29:126;;;;;;;;;:37;;-1:-1:-1;;6834:37:126;;;6917:12;:10;:12::i;:::-;-1:-1:-1;;;;;6890:40:126;6908:7;-1:-1:-1;;;;;6890:40:126;6902:4;6890:40;;;;;;;;;;-1:-1:-1;6951:4:126;6944:11;;15407:156:158;15480:4;15503:53;15511:3;-1:-1:-1;;;;;15531:23:158;;15503:7;:53::i;6459:109::-;6515:16;6550:3;:11;;6543:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6459:109;;;:::o;5801:118::-;5868:7;5894:3;:11;;5906:5;5894:18;;;;;;;;:::i;:::-;;;;;;;;;5887:25;;5801:118;;;;:::o;15877:83::-;15935:18;15942:3;15935:6;:18::i;5593:313:187:-;-1:-1:-1;;;;;5664:21:187;;5660:119;;5708:60;;-1:-1:-1;;;5708:60:187;;;;;;;;;;;5660:119;5792:22;:6;5808:5;5792:15;:22::i;:::-;5788:112;;;5837:52;;-1:-1:-1;;;5837:52:187;;;;;;;;;;;1465:283:153;1552:4;1660:23;1675:7;1660:14;:23::i;:::-;:81;;;;;1687:54;1720:7;1729:11;1687:32;:54::i;2538:406:158:-;2601:4;5238:21;;;:14;;;:21;;;;;;2617:321;;-1:-1:-1;2659:23:158;;;;;;;;:11;:23;;;;;;;;;;;;;2841:18;;2817:21;;;:14;;;:21;;;;;;:42;;;;2873:11;;3112:1368;3178:4;3307:21;;;:14;;;:21;;;;;;3343:13;;3339:1135;;3710:18;3731:12;3742:1;3731:8;:12;:::i;:::-;3777:18;;3710:33;;-1:-1:-1;3757:17:158;;3777:22;;3798:1;;3777:22;:::i;:::-;3757:42;;3832:9;3818:10;:23;3814:378;;3861:17;3881:3;:11;;3893:9;3881:22;;;;;;;;:::i;:::-;;;;;;;;;3861:42;;4028:9;4002:3;:11;;4014:10;4002:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;4141:25;;;:14;;;:25;;;;;:36;;;3814:378;4270:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4373:3;:14;;:21;4388:5;4373:21;;;;;;;;;;;4366:28;;;4416:4;4409:11;;;;;;;3339:1135;4458:5;4451:12;;;;;3339:1135;3184:1296;3112:1368;;;;:::o;4824:237::-;4875:11;4889:12;4897:3;5434:18;;5352:107;4889:12;4875:26;-1:-1:-1;4916:9:158;4911:96;4935:3;4931:1;:7;4911:96;;;4966:3;:14;;:30;4981:3;:11;;4993:1;4981:14;;;;;;;;:::i;:::-;;;;;;;;;4966:30;;;;;;;;;;;4959:37;;;4940:3;;;;;4911:96;;;-1:-1:-1;;5039:11:158;33920:23:140;;2328:155:161:o;719:528:153:-;783:4;976:68;1009:7;-1:-1:-1;;;976:32:153;:68::i;:::-;972:269;;;1061:12;;1093:52;1115:7;-1:-1:-1;;;;;;1093:21:153;:52::i;:::-;1060:85;;;;1166:7;:21;;;;-1:-1:-1;1177:10:153;;1159:28;-1:-1:-1;;;719:528:153:o;4504:238::-;4606:4;4623:12;4637:14;4655:43;4677:7;4686:11;4655:21;:43::i;:::-;4622:76;;;;4715:7;:20;;;;-1:-1:-1;4726:9:153;4708:27;-1:-1:-1;;;;4504:238:153:o;5198:628::-;-1:-1:-1;;;5310:12:153;5452:22;;;5494:4;5487:25;;;5310:12;;;5581:4;5310:12;5569:4;5310:12;5554:7;5547:5;5536:50;5525:61;;5740:4;5734:11;5727:19;5720:27;5654:4;5636:16;5633:26;5612:198;5599:211;;5438:382;5198:628;;;;;:::o;14:286:231:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:231;;209:43;;199:71;;266:1;263;256:12;679:226;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;852:23:231;;679:226;-1:-1:-1;679:226:231:o;910:131::-;-1:-1:-1;;;;;985:31:231;;975:42;;965:70;;1031:1;1028;1021:12;1046:367;1114:6;1122;1175:2;1163:9;1154:7;1150:23;1146:32;1143:52;;;1191:1;1188;1181:12;1143:52;1236:23;;;-1:-1:-1;1335:2:231;1320:18;;1307:32;1348:33;1307:32;1348:33;:::i;:::-;1400:7;1390:17;;;1046:367;;;;;:::o;1418:650::-;1504:6;1512;1520;1528;1581:3;1569:9;1560:7;1556:23;1552:33;1549:53;;;1598:1;1595;1588:12;1549:53;1637:9;1624:23;1656:31;1681:5;1656:31;:::i;:::-;1706:5;-1:-1:-1;1763:2:231;1748:18;;1735:32;1776:33;1735:32;1776:33;:::i;:::-;1828:7;-1:-1:-1;1887:2:231;1872:18;;1859:32;1900:33;1859:32;1900:33;:::i;:::-;1418:650;;;;-1:-1:-1;1952:7:231;;2032:2;2017:18;2004:32;;-1:-1:-1;;1418:650:231:o;2073:247::-;2132:6;2185:2;2173:9;2164:7;2160:23;2156:32;2153:52;;;2201:1;2198;2191:12;2153:52;2240:9;2227:23;2259:31;2284:5;2259:31;:::i;2325:637::-;2515:2;2527:21;;;2597:13;;2500:18;;;2619:22;;;2467:4;;2698:15;;;2672:2;2657:18;;;2467:4;2741:195;2755:6;2752:1;2749:13;2741:195;;;2820:13;;-1:-1:-1;;;;;2816:39:231;2804:52;;2885:2;2911:15;;;;2876:12;;;;2852:1;2770:9;2741:195;;;-1:-1:-1;2953:3:231;;2325:637;-1:-1:-1;;;;;2325:637:231:o;3234:418::-;3383:2;3372:9;3365:21;3346:4;3415:6;3409:13;3458:6;3453:2;3442:9;3438:18;3431:34;3517:6;3512:2;3504:6;3500:15;3495:2;3484:9;3480:18;3474:50;3573:1;3568:2;3559:6;3548:9;3544:22;3540:31;3533:42;3643:2;3636;3632:7;3627:2;3619:6;3615:15;3611:29;3600:9;3596:45;3592:54;3584:62;;;3234:418;;;;:::o;3657:367::-;3725:6;3733;3786:2;3774:9;3765:7;3761:23;3757:32;3754:52;;;3802:1;3799;3792:12;3754:52;3841:9;3828:23;3860:31;3885:5;3860:31;:::i;:::-;3910:5;3988:2;3973:18;;;;3960:32;;-1:-1:-1;;;3657:367:231:o;4237:114::-;4321:4;4314:5;4310:16;4303:5;4300:27;4290:55;;4341:1;4338;4331:12;4356:243;4413:6;4466:2;4454:9;4445:7;4441:23;4437:32;4434:52;;;4482:1;4479;4472:12;4434:52;4521:9;4508:23;4540:29;4563:5;4540:29;:::i;4604:508::-;4681:6;4689;4697;4750:2;4738:9;4729:7;4725:23;4721:32;4718:52;;;4766:1;4763;4756:12;4718:52;4805:9;4792:23;4824:31;4849:5;4824:31;:::i;:::-;4874:5;-1:-1:-1;4931:2:231;4916:18;;4903:32;4944:33;4903:32;4944:33;:::i;:::-;4604:508;;4996:7;;-1:-1:-1;;;5076:2:231;5061:18;;;;5048:32;;4604:508::o;5117:346::-;5185:6;5193;5246:2;5234:9;5225:7;5221:23;5217:32;5214:52;;;5262:1;5259;5252:12;5214:52;-1:-1:-1;;5307:23:231;;;5427:2;5412:18;;;5399:32;;-1:-1:-1;5117:346:231:o;5468:625::-;5569:6;5577;5630:2;5618:9;5609:7;5605:23;5601:32;5598:52;;;5646:1;5643;5636:12;5598:52;5686:9;5673:23;5719:18;5711:6;5708:30;5705:50;;;5751:1;5748;5741:12;5705:50;5774:22;;5827:4;5819:13;;5815:27;-1:-1:-1;5805:55:231;;5856:1;5853;5846:12;5805:55;5896:2;5883:16;5922:18;5914:6;5911:30;5908:50;;;5954:1;5951;5944:12;5908:50;6007:7;6002:2;5992:6;5989:1;5985:14;5981:2;5977:23;5973:32;5970:45;5967:65;;;6028:1;6025;6018:12;5967:65;6059:2;6051:11;;;;;6081:6;;-1:-1:-1;5468:625:231;-1:-1:-1;;;5468:625:231:o;6832:127::-;6893:10;6888:3;6884:20;6881:1;6874:31;6924:4;6921:1;6914:15;6948:4;6945:1;6938:15;7814:277;7881:6;7934:2;7922:9;7913:7;7909:23;7905:32;7902:52;;;7950:1;7947;7940:12;7902:52;7982:9;7976:16;8035:5;8028:13;8021:21;8014:5;8011:32;8001:60;;8057:1;8054;8047:12;8096:127;8157:10;8152:3;8148:20;8145:1;8138:31;8188:4;8185:1;8178:15;8212:4;8209:1;8202:15;8228:935;8308:6;8361:2;8349:9;8340:7;8336:23;8332:32;8329:52;;;8377:1;8374;8367:12;8329:52;8410:9;8404:16;8443:18;8435:6;8432:30;8429:50;;;8475:1;8472;8465:12;8429:50;8498:22;;8551:4;8543:13;;8539:27;-1:-1:-1;8529:55:231;;8580:1;8577;8570:12;8529:55;8613:2;8607:9;8639:18;8631:6;8628:30;8625:56;;;8661:18;;:::i;:::-;8710:2;8704:9;8802:2;8764:17;;-1:-1:-1;;8760:31:231;;;8793:2;8756:40;8752:54;8740:67;;8837:18;8822:34;;8858:22;;;8819:62;8816:88;;;8884:18;;:::i;:::-;8920:2;8913:22;8944;;;8985:15;;;9002:2;8981:24;8978:37;-1:-1:-1;8975:57:231;;;9028:1;9025;9018:12;8975:57;9077:6;9072:2;9068;9064:11;9059:2;9051:6;9047:15;9041:43;9130:1;9104:19;;;9125:2;9100:28;9093:39;;;;9108:6;8228:935;-1:-1:-1;;;;8228:935:231:o;9168:247::-;9236:6;9289:2;9277:9;9268:7;9264:23;9260:32;9257:52;;;9305:1;9302;9295:12;9257:52;9337:9;9331:16;9356:29;9379:5;9356:29;:::i;9699:331::-;9804:9;9815;9857:8;9845:10;9842:24;9839:44;;;9879:1;9876;9869:12;9839:44;9908:6;9898:8;9895:20;9892:40;;;9928:1;9925;9918:12;9892:40;-1:-1:-1;;9954:23:231;;;9999:25;;;;;-1:-1:-1;9699:331:231:o;10035:374::-;10156:19;;-1:-1:-1;;10193:40:231;;;10253:2;10245:11;;10242:161;;;-1:-1:-1;;10315:2:231;10311:12;;;;10308:1;10304:20;10300:58;;;10292:67;10288:105;;;;10035:374;-1:-1:-1;;10035:374:231:o;10414:225::-;10481:9;;;10502:11;;;10499:134;;;10555:10;10550:3;10546:20;10543:1;10536:31;10590:4;10587:1;10580:15;10618:4;10615:1;10608:15;10644:127;10705:10;10700:3;10696:20;10693:1;10686:31;10736:4;10733:1;10726:15;10760:4;10757:1;10750:15","linkReferences":{},"immutableReferences":{"55852":[{"start":868,"length":32},{"start":988,"length":32},{"start":4934,"length":32}]}},"methodIdentifiers":{"COMPLIANCE_MANAGER_ROLE()":"03c26bcd","DEFAULT_ADMIN_ROLE()":"a217fddf","RULES_MANAGEMENT_ROLE()":"9b11c115","addRule(address)":"e3c4602c","bindToken(address)":"3ff5aa02","canTransfer(address,address,uint256)":"e46638e6","canTransferFrom(address,address,address,uint256)":"7157797f","clearRules()":"b043572e","containsRule(address)":"54e4b945","created(address,uint256)":"5f8dead3","destroyed(address,uint256)":"8d2ea772","detectTransferRestriction(address,address,uint256)":"d4ce1415","detectTransferRestrictionFrom(address,address,address,uint256)":"d32c7bb5","getRoleAdmin(bytes32)":"248a9ca3","getRoleMember(bytes32,uint256)":"9010d07c","getRoleMemberCount(bytes32)":"ca15c873","getRoleMembers(bytes32)":"a3246ad3","getTokenBound()":"6a3edf28","getTokenBounds()":"e54621d2","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTokenBound(address)":"993e8b95","isTrustedForwarder(address)":"572b6c05","messageForTransferRestriction(uint8)":"7f4ab1dd","removeRule(address)":"df21950f","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","rule(uint256)":"db18af6c","rules()":"52f6747a","rulesCount()":"bc13eacc","setRules(address[])":"b27aef3a","supportsInterface(bytes4)":"01ffc9a7","transferred(address,address,address,uint256)":"3e5af4ca","transferred(address,address,uint256)":"8baf29b4","trustedForwarder()":"7da0a877","unbindToken(address)":"40db3b50","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.34+commit.80d5c536\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_OperationNotSuccessful\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_TokenAlreadyBound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_TokenNotBound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleInvalidInterface\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_OperationNotSuccessful\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleDoNotMatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IRule\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IRule\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"RemoveRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenBound\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenUnbound\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COMPLIANCE_MANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RULES_MANAGEMENT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"bindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"canTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"canTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRules\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"containsRule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"created\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"destroyed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestrictionFrom\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenBound\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenBounds\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isTokenBound\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"removeRule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"rule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rules\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRules\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"unbindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"version_\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"AddRule(address)\":{\"params\":{\"rule\":\"The address of the rule contract that was added.\"}},\"RemoveRule(address)\":{\"params\":{\"rule\":\"The address of the rule contract that was removed.\"}},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"TokenBound(address)\":{\"params\":{\"token\":\"The address of the token that was bound.\"}},\"TokenUnbound(address)\":{\"params\":{\"token\":\"The address of the token that was unbound.\"}}},\"kind\":\"dev\",\"methods\":{\"addRule(address)\":{\"details\":\"No on-chain maximum number of rules is enforced. Adding too many rules can increase transfer-time gas usage because rule checks are linear in rule count. Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts.\",\"params\":{\"rule_\":\"The IRule contract to add.\"}},\"bindToken(address)\":{\"details\":\"Operator warning: \\\"multi-tenant\\\" means one RuleEngine is shared by multiple token contracts. In that setup, bind only tokens that are equally trusted and governed together.\",\"params\":{\"token\":\"The address of the token to bind.\"}},\"canTransfer(address,address,uint256)\":{\"details\":\"Don't check the balance and the user's right (access control)\"},\"canTransferFrom(address,address,address,uint256)\":{\"details\":\"Does not check balances or access rights (Access Control).\",\"params\":{\"from\":\"The source address.\",\"spender\":\"The address performing the transfer.\",\"to\":\"The destination address.\",\"value\":\"The number of tokens to transfer.\"},\"returns\":{\"_0\":\"isCompliant True if the transfer complies with policy.\"}},\"clearRules()\":{\"details\":\"After calling this function, no rules will remain set. Developers should keep in mind that this function has an unbounded cost and using it may render the function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.\"},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"containsRule(address)\":{\"details\":\"Complexity: O(1).\",\"params\":{\"rule_\":\"The IRule contract to check for membership.\"},\"returns\":{\"_0\":\"True if the rule is present, false otherwise.\"}},\"created(address,uint256)\":{\"details\":\"Called by the token contract when new tokens are issued to an account. Reverts if the minting does not comply with the rules.\",\"params\":{\"to\":\"The address receiving the minted tokens.\",\"value\":\"The number of tokens created.\"}},\"destroyed(address,uint256)\":{\"details\":\"Called by the token contract when tokens are redeemed or burned. Reverts if the burning does not comply with the rules.\",\"params\":{\"from\":\"The address whose tokens are being destroyed.\",\"value\":\"The number of tokens destroyed.\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"from\":\"the origin address\",\"to\":\"the destination address\",\"value\":\"to transfer\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK (0) if the transfer is valid\"}},\"detectTransferRestrictionFrom(address,address,address,uint256)\":{\"details\":\" See {ERC-1404} Add an additionnal argument `spender` This function is where an issuer enforces the restriction logic of their token transfers. Some examples of this might include: - checking if the token recipient is whitelisted, - checking if a sender's tokens are frozen in a lock-up period, etc.\",\"returns\":{\"_0\":\"uint8 restricted code, 0 means the transfer is authorized\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"getRoleMembers(bytes32)\":{\"details\":\"Return all accounts that have `role` WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getTokenBound()\":{\"details\":\"If multiple tokens are supported, consider using getTokenBounds().\",\"returns\":{\"_0\":\"The address of the currently bound token.\"}},\"getTokenBounds()\":{\"details\":\"This is a view-only function and does not modify state. This function is not part of the original ERC-3643 specification This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.\",\"returns\":{\"_0\":\"An array of addresses of bound token contracts.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"The Default Admin has all roles\"},\"isTokenBound(address)\":{\"details\":\"Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.\",\"params\":{\"token\":\"The token address to verify.\"},\"returns\":{\"_0\":\"True if the token is bound, false otherwise.\"}},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"details\":\"See {ERC-1404} This function is effectively an accessor for the \\\"message\\\", a human-readable explanation as to why a transaction is restricted. \"},\"removeRule(address)\":{\"details\":\"Reverts if the provided rule is not found or does not match the stored rule at its index. Complexity: O(1).\",\"params\":{\"rule_\":\"The IRule contract to remove.\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"rule(uint256)\":{\"details\":\"Reverts if `ruleId` is out of bounds. Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.\",\"params\":{\"ruleId\":\"The index of the desired rule in the array.\"},\"returns\":{\"_0\":\"The address of the corresponding IRule contract, return the `zero address` is out of bounds.\"}},\"rules()\":{\"details\":\"This is a view-only function that does not modify state. This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.\",\"returns\":{\"_0\":\"An array of all active rule contract addresses.\"}},\"rulesCount()\":{\"details\":\"Equivalent to the length of the internal rules array. Complexity: O(1)\",\"returns\":{\"_0\":\"The number of active rules.\"}},\"setRules(address[])\":{\"details\":\"Replaces the entire rule set atomically. Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. To transition from one non-empty set to another without an enforcement gap, call this function directly with the new set. No on-chain maximum number of rules is enforced. Operators are responsible for keeping the rule set size compatible with the target chain gas limits. Security convention: rule contracts should be treated as trusted business logic, but should not also be granted {RULES_MANAGEMENT_ROLE}.\",\"params\":{\"rules_\":\"The array of addresses representing the new rules to be set.\"}},\"transferred(address,address,address,uint256)\":{\"details\":\" Must revert if the transfer is invalid Same name as ERC-3643 but with one supplementary argument `spender` This function can be used to update state variables of the RuleEngine contract This function can be called ONLY by the token contract bound to the RuleEngine\",\"params\":{\"from\":\"token holder address\",\"spender\":\"spender address (sender)\",\"to\":\"receiver address\",\"value\":\"value of tokens involved in the transfer\"}},\"transferred(address,address,uint256)\":{\"details\":\" This function can be used to update state variables of the compliance contract This function can be called ONLY by the token contract bound to the compliance\",\"params\":{\"from\":\"The address of the sender\",\"to\":\"The address of the receiver\",\"value\":\"value of tokens involved in the transfer\"}},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"unbindToken(address)\":{\"details\":\"Operator warning: unbinding is an administrative operation and does not erase any state already stored by external rule contracts in a previously shared (\\\"multi-tenant\\\") setup.\",\"params\":{\"token\":\"The address of the token to unbind.\"}},\"version()\":{\"details\":\"This value is useful to know which smart contract version has been used\",\"returns\":{\"version_\":\"A string representing the version of the token implementation (e.g., \\\"1.0.0\\\").\"}}},\"title\":\"Implementation of a ruleEngine as defined by the CMTAT\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Emitted when a new rule is added to the rule set.\"},\"ClearRules()\":{\"notice\":\"Emitted when all rules are cleared from the rule set.\"},\"RemoveRule(address)\":{\"notice\":\"Emitted when a rule is removed from the rule set.\"},\"TokenBound(address)\":{\"notice\":\"Emitted when a token is successfully bound to the compliance contract.\"},\"TokenUnbound(address)\":{\"notice\":\"Emitted when a token is successfully unbound from the compliance contract.\"}},\"kind\":\"user\",\"methods\":{\"RULES_MANAGEMENT_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"addRule(address)\":{\"notice\":\"Adds a new rule to the current rule set.\"},\"bindToken(address)\":{\"notice\":\"Associates a token contract with this compliance contract.\"},\"canTransfer(address,address,uint256)\":{\"notice\":\"Returns true if the transfer is valid, and false otherwise.\"},\"canTransferFrom(address,address,address,uint256)\":{\"notice\":\"Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules.\"},\"clearRules()\":{\"notice\":\"Removes all configured rules.\"},\"containsRule(address)\":{\"notice\":\"Checks whether a specific rule is currently configured.\"},\"created(address,uint256)\":{\"notice\":\"Updates the compliance contract state when tokens are created (minted).\"},\"destroyed(address,uint256)\":{\"notice\":\"Updates the compliance contract state when tokens are destroyed (burned).\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"detectTransferRestrictionFrom(address,address,address,uint256)\":{\"notice\":\"Returns a uint8 code to indicate if a transfer is restricted or not\"},\"getTokenBound()\":{\"notice\":\"Returns the single token currently bound to this compliance contract.\"},\"getTokenBounds()\":{\"notice\":\"Returns all tokens currently bound to this compliance contract.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Returns `true` if `account` has been granted `role`.\"},\"isTokenBound(address)\":{\"notice\":\"Checks whether a token is currently bound to this compliance contract.\"},\"removeRule(address)\":{\"notice\":\"Removes a specific rule from the current rule set.\"},\"rule(uint256)\":{\"notice\":\"Retrieves the rule address at a specific index.\"},\"rules()\":{\"notice\":\"Returns the full list of currently configured rules.\"},\"rulesCount()\":{\"notice\":\"Returns the total number of currently configured rules.\"},\"setRules(address[])\":{\"notice\":\"Defines the rules for the rule engine.\"},\"transferred(address,address,address,uint256)\":{\"notice\":\"Function called whenever tokens are transferred from one wallet to another\"},\"transferred(address,address,uint256)\":{\"notice\":\"Function called whenever tokens are transferred from one wallet to another\"},\"unbindToken(address)\":{\"notice\":\"Removes the association of a token contract from this compliance contract.\"},\"version()\":{\"notice\":\"Returns the current version of the token contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/deployment/RuleEngine.sol\":\"RuleEngine\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":CMTATv3.0.0/=lib/CMTATv3.0.0/contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol\":{\"keccak256\":\"0x524a2cf2214a82fb96e97a18a94956fee68a419ecd6b2dc841aa1105f336c3f1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://9c4728d80b6678101586515c0308c63bcba2a78b0a3c12d37b522d59f3175a01\",\"dweb:/ipfs/QmYP9SPbe2hB69jKkSg43qkz1HVxBayKrG14i9f6hx7hh8\"]},\"lib/CMTAT/contracts/interfaces/technical/IERC5679.sol\":{\"keccak256\":\"0xcc6f2e79d1d9eabcf4c7ffcbd85c0de31bb2b3cdf17eb847dffb7c2d2a8c4695\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://d618bc2be7c6bc167037fe57ca648523c671c61791f3f0c65965ab7139d6dc33\",\"dweb:/ipfs/QmSrCKWFjpg1SQ7v2k3vRyWpcU9dB6Pbk167R4oAzUc2Te\"]},\"lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol\":{\"keccak256\":\"0x1707381177447b1a398c443c7e753942df0c5d4633e80d2864db472e89e43dc0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c4281d98847629b67222332bea67f336623937758be908ee9ca1aa40b3abe19d\",\"dweb:/ipfs/QmZQBruKJH3sStjBmCb28rxRkUkZ4EFsDCi8WZ7Y85spxS\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol\":{\"keccak256\":\"0x17fb1f64b546fd882331dffbd8c7f4e53c51738b9e2621a0dcfcf30e64d8b66e\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c35fe277d5d99a0943293b5da5622947095e6b719af35fda9ef2c714a7879a4b\",\"dweb:/ipfs/QmRV5q3XvjJE8sxJJBpEkwk1qyz3r4McH2BdX1v2ZxZGZh\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7551.sol\":{\"keccak256\":\"0x709074d96bd5d7aa07d2ba3a1c9a99ae0fd4361f7322b528b42f3b83c5dcb984\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ca67a06011b746b55bf2465988dc10a4e6371e40b5108c54531f03e938bda865\",\"dweb:/ipfs/QmbjFyDAJsUXywqzU2s96pFqFpC5DLKdfa8WjMBtQPhKGE\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7943.sol\":{\"keccak256\":\"0x1a341fc7ee7d9b8b00b6168b35a6a844d90431749d8ca694174c52c41e11763f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4fb6b13953539b99262cb299961fb8ff8a020de79b12f76c63decf33ff9d5103\",\"dweb:/ipfs/QmQ3bnkQJgD2s6xpapThCPTSMbDREokVEiM7extwQgfrv7\"]},\"lib/CMTAT/contracts/library/ERC1404ExtendInterfaceId.sol\":{\"keccak256\":\"0xe5f6f08d319d27f20989936460d3947eed5fdcb470f80e920f4fb09ccc7e1e87\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://cb654fe37c2bc6c765c67c5f94a769580312d1d4109c50262677ac406362f91e\",\"dweb:/ipfs/Qmc8ZFVANCmULNozM2wFUSGKXBgUHR5bpDC3ZVjV4XoEv7\"]},\"lib/CMTAT/contracts/library/RuleEngineInterfaceId.sol\":{\"keccak256\":\"0x759990208069b5a0862a255eff790d52d1d64bbb6c334705fc12414936825692\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0bce1c17cbbddac4bf123f602dc980246e5bec724f5ed3107e148548b930e124\",\"dweb:/ipfs/QmRZUxmRN9ji9UYueD6knhnz2nSsDRZgRTX74uenGczVjA\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sol\":{\"keccak256\":\"0xbae499c224def4d252ee766288a178769529a16ab26670a2761fd405b98c2ba0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bc24842026d827fa4a9091b4464846c280f86162521a7c16e6388ce11fced8d\",\"dweb:/ipfs/QmRtwbSbzb66Wt8Y37ocVLqckdxuSkZGNF5bHwhj9AAS5L\"]},\"lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol\":{\"keccak256\":\"0xbc97d8c0d67d4d7eba1e662f0a8671712ace9e060ab03af547c4bb321aec1d8c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://890d156f50630d52c7be57d7e0499132d6fd92b2e1365b81531f4463b3304377\",\"dweb:/ipfs/QmUHe9uL1ciePH2pQg7wdrgTAFRZWjcpBEAg8V1UNtXutd\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x9695d220b99dcf62910533bdf5d40d4cf6a4e04d5b106b6803a80586486dc7f7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://83b7aecd65882d8953643dce144efe91367082cc01830c9c4ed3c8a4837fb558\",\"dweb:/ipfs/QmQ5HxGavcCKjuhd8buv177qjG6A4kvxx4pZviceKdspdM\"]},\"lib/openzeppelin-contracts/contracts/utils/Arrays.sol\":{\"keccak256\":\"0xb3b81029526a4c3acf39e57cc446407141ebce338cc99585942af1340e1a69e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3857ce97e8f7a51ad78ea5419b3386e18fcc8af73b65803eedd8193ab7abc9df\",\"dweb:/ipfs/QmSQi6x2cYsUy76mfMNwuq151bVmh4kAND141kjume51Aq\"]},\"lib/openzeppelin-contracts/contracts/utils/Comparators.sol\":{\"keccak256\":\"0x302eecd8cf323b4690e3494a7d960b3cbce077032ab8ef655b323cdd136cec58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://49ba706f1bc476d68fe6c1fad75517acea4e9e275be0989b548e292eb3a3eacd\",\"dweb:/ipfs/QmeBpvcdGWzWMKTQESUCEhHgnEQYYATVwPxLMxa6vMT7jC\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol\":{\"keccak256\":\"0x94045fd4f268edf2b2d01ef119268548c320366d6f5294ad30c1b8f9d4f5225f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://edfda81f426f8948b3834115c21e83c48180e6db0d2a8cd2debb2185ed349337\",\"dweb:/ipfs/QmdYZneFyDAux1BuWQxLAdqtABrGS2k9WYCa7C9dvpKkWv\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0x7c7ad70641a7f8cd44def0857ec97b0e40bfd073b2d6037a5f57ce9527ee9bc5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e05c6572dfe769f7aea6f3a8002951cc12d143d980dad29f6c5feedf9408bc14\",\"dweb:/ipfs/QmXM7C8YEptxisZiEefXUrwdXt3zMaCobmkCchxTtDg1oK\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5\",\"dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9\",\"dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif\"]},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x5c298e834696707e274a71a224969d36faecd928a8076603210d67d091adb4ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a93fe967b4d55b31157164cbb7e3e1ebaf3535fc1d3f8d0156da7abb9b565d90\",\"dweb:/ipfs/QmXH7nyxwEUeMPFDDmkdUwqxLEcezaSmVyunyMAuck1WqR\"]},\"src/RuleEngineBase.sol\":{\"keccak256\":\"0x9edae8ce7df18638cf56b571be18251d4ac4c435844c8cd77d1f7f651623c568\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://9758c7256a994b371c00d9e0098be5d76d9896f2a556208dfb83768d4d4e916b\",\"dweb:/ipfs/QmdZwwiB29tzheoaoRWiJdbbGMH2nM46ojLp7WFjm9D19h\"]},\"src/deployment/RuleEngine.sol\":{\"keccak256\":\"0xa1aa57ac7e2af018dbb8a24b07028f3f6fe0bf7641574f9a579bd3c102654a41\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a18b877f001ccdd8ca27636b5ce868185f8ce83ef14b5277aedee27a389182e4\",\"dweb:/ipfs/QmYY2dU7dSkvHb5rFgHEqtNxpSaELzgnRCmkdzxWAWwJem\"]},\"src/interfaces/IERC3643Compliance.sol\":{\"keccak256\":\"0xf86e78e8f737795c3762b402b121b0f1822d6b27414aeca08ea6f036cccea07b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c795d1b89a1393b2225f6e58c0310d345d78ff534ab028353413c4a5aaf9ecf7\",\"dweb:/ipfs/QmNcJsJzLWzSAV77whMzu7je2Mj2pWoTYYn1z76kqB5mKH\"]},\"src/interfaces/IRule.sol\":{\"keccak256\":\"0x315fd1d0147d40d3cc1ee35f6ddb8c9e25e6e4f96034a285e6f342c59c3cc222\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5b0ecca410bf89169e5c6393bc4d8fce97a5b3dcf8a2bba02317da85c98f4d0c\",\"dweb:/ipfs/QmeGS5vbFwkmEvJh7s27Q9xW4xGXuUohh2zGPVbgxgjfnu\"]},\"src/interfaces/IRulesManagementModule.sol\":{\"keccak256\":\"0x1be8087ef526f664cf8ba5dd35d4d12fc1880f905e3ba2e553ee02cb7d6506c1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://545cafd73f2fe9b2b89b37e905057637f58ae2c1da7f3dc33493b515c87a720f\",\"dweb:/ipfs/QmXiTEhLSpN6sj1fiwFT9V6bGD1VCXTqQJiNnXcLrYmW7N\"]},\"src/modules/ERC2771ModuleStandalone.sol\":{\"keccak256\":\"0xecc9aec20ff41c46404f6fcb9bfb0fd5588781fbb4f2fbec351f603a31c178b0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://48674e77afe59b6c6e6aa8b0d5e370ca58c9a354b5dc294bb3c9f10fbd12a3f3\",\"dweb:/ipfs/QmY3HhbBDqsBvrGBXoRwgVpfSNtiK2XmhaxVpS1F3dSPx9\"]},\"src/modules/ERC3643ComplianceModule.sol\":{\"keccak256\":\"0xdb472471270ea23d4694ca2d2eb107ce668affc9dbe18b5a6eda312ab4800a33\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://6200e990afca50a32fb0a0ad76ffe955447a67cab6e93f64281fc9f14208aab1\",\"dweb:/ipfs/QmXXhRsBq3eGDgBqQwWL5w4Sn6pdTeeXRvpC4jZBDVb6nQ\"]},\"src/modules/RulesManagementModule.sol\":{\"keccak256\":\"0xc9c58e027874658577285de9c9bf9069cd773573a615df7c9644c6c96c69dbc3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a6c9ca74cc247b42b9852b35cb4eeadc919d383d7bbd4f4df0739ee6a8bce2c3\",\"dweb:/ipfs/QmfJCvSQjqQrQXYt9JEHiJRZATy1s7q53DKxZC1QsSYMHZ\"]},\"src/modules/VersionModule.sol\":{\"keccak256\":\"0x077070dca24da125a764111d336c0a8fb3445b82d93692ff76b22384b0f4f39f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://be8df88e667fb2de39d095f0c396d23ed263fdc51a4095fedc89a326540a03ee\",\"dweb:/ipfs/QmYfhhEvNee1XYwCYZCVAKpUUWBd5FP5qvTMYGr6ogC8kA\"]},\"src/modules/library/ComplianceInterfaceId.sol\":{\"keccak256\":\"0xa0f15ca7f9e0fa8ccb854ea2bd812f220c68c280682b56e8d1a437ddba4b6d1f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://1e01a79b4a2110a401c3d2fbead97844f7428d6dc6603dccf795d42dbc142786\",\"dweb:/ipfs/QmV88ZcDHTU33oXNLFTshUBZ7otgcZRN1HXwywda7Fgz9a\"]},\"src/modules/library/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x15005e56f8fbf8f9b8a41c4bfed6c842e37be49fa52b0dbb2edc6b08b9e50c2f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://06c90dd748d060cb1b05de978cb42fd79d9b49a2beb3a479b4e49f8edaba1195\",\"dweb:/ipfs/QmYXEQWrwJkuzWBdi5hjSaM6pWhrNUf2kH2pHX8jRu9dZS\"]},\"src/modules/library/RuleInterfaceId.sol\":{\"keccak256\":\"0x3c57987589d6205e2546d4ce332e944d1667dddfe897087028a95ed804c50882\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0e1718e500d4cb5cf4441131c57d23da788f2835e9a014e7d1f62dfb6161647a\",\"dweb:/ipfs/QmXY5cjc9Dzrp7ML7DfvDB9zg7t4cene3g4K9AAuDmLLfC\"]},\"src/modules/library/RulesManagementModuleInvariantStorage.sol\":{\"keccak256\":\"0xa6f9109698f169be74c309a1efadd48edffcb0e9585523258477bf07942c8ae6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4c28513636b660111b60a7028c9600b30dcfda291a831343d9e27e253b80856a\",\"dweb:/ipfs/QmQVSZ9N6vjPxNnJDTqEuGSWqNdoxHKhzTzP2cvgZpBSzj\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.34+commit.80d5c536"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"forwarderIrrevocable","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[],"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_InvalidTokenAddress"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_OperationNotSuccessful"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_TokenAlreadyBound"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_TokenNotBound"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_UnauthorizedCaller"},{"inputs":[],"type":"error","name":"RuleEngine_RuleInvalidInterface"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_ArrayIsEmpty"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_OperationNotSuccessful"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleAlreadyExists"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleDoNotMatch"},{"inputs":[{"internalType":"contract IRule","name":"rule","type":"address","indexed":true}],"type":"event","name":"AddRule","anonymous":false},{"inputs":[],"type":"event","name":"ClearRules","anonymous":false},{"inputs":[{"internalType":"contract IRule","name":"rule","type":"address","indexed":true}],"type":"event","name":"RemoveRule","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":false}],"type":"event","name":"TokenBound","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":false}],"type":"event","name":"TokenUnbound","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"COMPLIANCE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RULES_MANAGEMENT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRule"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"bindToken"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"canTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"canTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"clearRules"},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"view","type":"function","name":"containsRule","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"created"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"destroyed"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestrictionFrom","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getTokenBound","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getTokenBounds","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"view","type":"function","name":"isTokenBound","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"stateMutability":"view","type":"function","name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"stateMutability":"view","type":"function","name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeRule"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"uint256","name":"ruleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"rule","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rules","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract IRule[]","name":"rules_","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setRules"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferred"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferred"},{"inputs":[],"stateMutability":"view","type":"function","name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"unbindToken"},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"version_","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"addRule(address)":{"details":"No on-chain maximum number of rules is enforced. Adding too many rules can increase transfer-time gas usage because rule checks are linear in rule count. Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts.","params":{"rule_":"The IRule contract to add."}},"bindToken(address)":{"details":"Operator warning: \"multi-tenant\" means one RuleEngine is shared by multiple token contracts. In that setup, bind only tokens that are equally trusted and governed together.","params":{"token":"The address of the token to bind."}},"canTransfer(address,address,uint256)":{"details":"Don't check the balance and the user's right (access control)"},"canTransferFrom(address,address,address,uint256)":{"details":"Does not check balances or access rights (Access Control).","params":{"from":"The source address.","spender":"The address performing the transfer.","to":"The destination address.","value":"The number of tokens to transfer."},"returns":{"_0":"isCompliant True if the transfer complies with policy."}},"clearRules()":{"details":"After calling this function, no rules will remain set. Developers should keep in mind that this function has an unbounded cost and using it may render the function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block."},"constructor":{"params":{"admin":"Address of the contract (Access Control)","forwarderIrrevocable":"Address of the forwarder, required for the gasless support"}},"containsRule(address)":{"details":"Complexity: O(1).","params":{"rule_":"The IRule contract to check for membership."},"returns":{"_0":"True if the rule is present, false otherwise."}},"created(address,uint256)":{"details":"Called by the token contract when new tokens are issued to an account. Reverts if the minting does not comply with the rules.","params":{"to":"The address receiving the minted tokens.","value":"The number of tokens created."}},"destroyed(address,uint256)":{"details":"Called by the token contract when tokens are redeemed or burned. Reverts if the burning does not comply with the rules.","params":{"from":"The address whose tokens are being destroyed.","value":"The number of tokens destroyed."}},"detectTransferRestriction(address,address,uint256)":{"params":{"from":"the origin address","to":"the destination address","value":"to transfer"},"returns":{"_0":"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK (0) if the transfer is valid"}},"detectTransferRestrictionFrom(address,address,address,uint256)":{"details":" See {ERC-1404} Add an additionnal argument `spender` This function is where an issuer enforces the restriction logic of their token transfers. Some examples of this might include: - checking if the token recipient is whitelisted, - checking if a sender's tokens are frozen in a lock-up period, etc.","returns":{"_0":"uint8 restricted code, 0 means the transfer is authorized"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getRoleMember(bytes32,uint256)":{"details":"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information."},"getRoleMemberCount(bytes32)":{"details":"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role."},"getRoleMembers(bytes32)":{"details":"Return all accounts that have `role` WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block."},"getTokenBound()":{"details":"If multiple tokens are supported, consider using getTokenBounds().","returns":{"_0":"The address of the currently bound token."}},"getTokenBounds()":{"details":"This is a view-only function and does not modify state. This function is not part of the original ERC-3643 specification This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.","returns":{"_0":"An array of addresses of bound token contracts."}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"The Default Admin has all roles"},"isTokenBound(address)":{"details":"Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.","params":{"token":"The token address to verify."},"returns":{"_0":"True if the token is bound, false otherwise."}},"isTrustedForwarder(address)":{"details":"Indicates whether any particular address is the trusted forwarder."},"messageForTransferRestriction(uint8)":{"details":"See {ERC-1404} This function is effectively an accessor for the \"message\", a human-readable explanation as to why a transaction is restricted. "},"removeRule(address)":{"details":"Reverts if the provided rule is not found or does not match the stored rule at its index. Complexity: O(1).","params":{"rule_":"The IRule contract to remove."}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"rule(uint256)":{"details":"Reverts if `ruleId` is out of bounds. Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.","params":{"ruleId":"The index of the desired rule in the array."},"returns":{"_0":"The address of the corresponding IRule contract, return the `zero address` is out of bounds."}},"rules()":{"details":"This is a view-only function that does not modify state. This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.","returns":{"_0":"An array of all active rule contract addresses."}},"rulesCount()":{"details":"Equivalent to the length of the internal rules array. Complexity: O(1)","returns":{"_0":"The number of active rules."}},"setRules(address[])":{"details":"Replaces the entire rule set atomically. Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. To transition from one non-empty set to another without an enforcement gap, call this function directly with the new set. No on-chain maximum number of rules is enforced. Operators are responsible for keeping the rule set size compatible with the target chain gas limits. Security convention: rule contracts should be treated as trusted business logic, but should not also be granted {RULES_MANAGEMENT_ROLE}.","params":{"rules_":"The array of addresses representing the new rules to be set."}},"transferred(address,address,address,uint256)":{"details":" Must revert if the transfer is invalid Same name as ERC-3643 but with one supplementary argument `spender` This function can be used to update state variables of the RuleEngine contract This function can be called ONLY by the token contract bound to the RuleEngine","params":{"from":"token holder address","spender":"spender address (sender)","to":"receiver address","value":"value of tokens involved in the transfer"}},"transferred(address,address,uint256)":{"details":" This function can be used to update state variables of the compliance contract This function can be called ONLY by the token contract bound to the compliance","params":{"from":"The address of the sender","to":"The address of the receiver","value":"value of tokens involved in the transfer"}},"trustedForwarder()":{"details":"Returns the address of the trusted forwarder."},"unbindToken(address)":{"details":"Operator warning: unbinding is an administrative operation and does not erase any state already stored by external rule contracts in a previously shared (\"multi-tenant\") setup.","params":{"token":"The address of the token to unbind."}},"version()":{"details":"This value is useful to know which smart contract version has been used","returns":{"version_":"A string representing the version of the token implementation (e.g., \"1.0.0\")."}}},"version":1},"userdoc":{"kind":"user","methods":{"RULES_MANAGEMENT_ROLE()":{"notice":"Role to manage the ruleEngine"},"addRule(address)":{"notice":"Adds a new rule to the current rule set."},"bindToken(address)":{"notice":"Associates a token contract with this compliance contract."},"canTransfer(address,address,uint256)":{"notice":"Returns true if the transfer is valid, and false otherwise."},"canTransferFrom(address,address,address,uint256)":{"notice":"Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules."},"clearRules()":{"notice":"Removes all configured rules."},"containsRule(address)":{"notice":"Checks whether a specific rule is currently configured."},"created(address,uint256)":{"notice":"Updates the compliance contract state when tokens are created (minted)."},"destroyed(address,uint256)":{"notice":"Updates the compliance contract state when tokens are destroyed (burned)."},"detectTransferRestriction(address,address,uint256)":{"notice":"Go through all the rule to know if a restriction exists on the transfer"},"detectTransferRestrictionFrom(address,address,address,uint256)":{"notice":"Returns a uint8 code to indicate if a transfer is restricted or not"},"getTokenBound()":{"notice":"Returns the single token currently bound to this compliance contract."},"getTokenBounds()":{"notice":"Returns all tokens currently bound to this compliance contract."},"hasRole(bytes32,address)":{"notice":"Returns `true` if `account` has been granted `role`."},"isTokenBound(address)":{"notice":"Checks whether a token is currently bound to this compliance contract."},"removeRule(address)":{"notice":"Removes a specific rule from the current rule set."},"rule(uint256)":{"notice":"Retrieves the rule address at a specific index."},"rules()":{"notice":"Returns the full list of currently configured rules."},"rulesCount()":{"notice":"Returns the total number of currently configured rules."},"setRules(address[])":{"notice":"Defines the rules for the rule engine."},"transferred(address,address,address,uint256)":{"notice":"Function called whenever tokens are transferred from one wallet to another"},"transferred(address,address,uint256)":{"notice":"Function called whenever tokens are transferred from one wallet to another"},"unbindToken(address)":{"notice":"Removes the association of a token contract from this compliance contract."},"version()":{"notice":"Returns the current version of the token contract."}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","CMTAT/=lib/CMTAT/contracts/","CMTATv3.0.0/=lib/CMTATv3.0.0/contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/deployment/RuleEngine.sol":"RuleEngine"},"evmVersion":"prague","libraries":{}},"sources":{"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol":{"keccak256":"0x524a2cf2214a82fb96e97a18a94956fee68a419ecd6b2dc841aa1105f336c3f1","urls":["bzz-raw://9c4728d80b6678101586515c0308c63bcba2a78b0a3c12d37b522d59f3175a01","dweb:/ipfs/QmYP9SPbe2hB69jKkSg43qkz1HVxBayKrG14i9f6hx7hh8"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/technical/IERC5679.sol":{"keccak256":"0xcc6f2e79d1d9eabcf4c7ffcbd85c0de31bb2b3cdf17eb847dffb7c2d2a8c4695","urls":["bzz-raw://d618bc2be7c6bc167037fe57ca648523c671c61791f3f0c65965ab7139d6dc33","dweb:/ipfs/QmSrCKWFjpg1SQ7v2k3vRyWpcU9dB6Pbk167R4oAzUc2Te"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol":{"keccak256":"0x1707381177447b1a398c443c7e753942df0c5d4633e80d2864db472e89e43dc0","urls":["bzz-raw://c4281d98847629b67222332bea67f336623937758be908ee9ca1aa40b3abe19d","dweb:/ipfs/QmZQBruKJH3sStjBmCb28rxRkUkZ4EFsDCi8WZ7Y85spxS"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol":{"keccak256":"0x17fb1f64b546fd882331dffbd8c7f4e53c51738b9e2621a0dcfcf30e64d8b66e","urls":["bzz-raw://c35fe277d5d99a0943293b5da5622947095e6b719af35fda9ef2c714a7879a4b","dweb:/ipfs/QmRV5q3XvjJE8sxJJBpEkwk1qyz3r4McH2BdX1v2ZxZGZh"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7551.sol":{"keccak256":"0x709074d96bd5d7aa07d2ba3a1c9a99ae0fd4361f7322b528b42f3b83c5dcb984","urls":["bzz-raw://ca67a06011b746b55bf2465988dc10a4e6371e40b5108c54531f03e938bda865","dweb:/ipfs/QmbjFyDAJsUXywqzU2s96pFqFpC5DLKdfa8WjMBtQPhKGE"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7943.sol":{"keccak256":"0x1a341fc7ee7d9b8b00b6168b35a6a844d90431749d8ca694174c52c41e11763f","urls":["bzz-raw://4fb6b13953539b99262cb299961fb8ff8a020de79b12f76c63decf33ff9d5103","dweb:/ipfs/QmQ3bnkQJgD2s6xpapThCPTSMbDREokVEiM7extwQgfrv7"],"license":"MPL-2.0"},"lib/CMTAT/contracts/library/ERC1404ExtendInterfaceId.sol":{"keccak256":"0xe5f6f08d319d27f20989936460d3947eed5fdcb470f80e920f4fb09ccc7e1e87","urls":["bzz-raw://cb654fe37c2bc6c765c67c5f94a769580312d1d4109c50262677ac406362f91e","dweb:/ipfs/Qmc8ZFVANCmULNozM2wFUSGKXBgUHR5bpDC3ZVjV4XoEv7"],"license":"MPL-2.0"},"lib/CMTAT/contracts/library/RuleEngineInterfaceId.sol":{"keccak256":"0x759990208069b5a0862a255eff790d52d1d64bbb6c334705fc12414936825692","urls":["bzz-raw://0bce1c17cbbddac4bf123f602dc980246e5bec724f5ed3107e148548b930e124","dweb:/ipfs/QmRZUxmRN9ji9UYueD6knhnz2nSsDRZgRTX74uenGczVjA"],"license":"MPL-2.0"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sol":{"keccak256":"0xbae499c224def4d252ee766288a178769529a16ab26670a2761fd405b98c2ba0","urls":["bzz-raw://7bc24842026d827fa4a9091b4464846c280f86162521a7c16e6388ce11fced8d","dweb:/ipfs/QmRtwbSbzb66Wt8Y37ocVLqckdxuSkZGNF5bHwhj9AAS5L"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol":{"keccak256":"0xbc97d8c0d67d4d7eba1e662f0a8671712ace9e060ab03af547c4bb321aec1d8c","urls":["bzz-raw://890d156f50630d52c7be57d7e0499132d6fd92b2e1365b81531f4463b3304377","dweb:/ipfs/QmUHe9uL1ciePH2pQg7wdrgTAFRZWjcpBEAg8V1UNtXutd"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol":{"keccak256":"0x9695d220b99dcf62910533bdf5d40d4cf6a4e04d5b106b6803a80586486dc7f7","urls":["bzz-raw://83b7aecd65882d8953643dce144efe91367082cc01830c9c4ed3c8a4837fb558","dweb:/ipfs/QmQ5HxGavcCKjuhd8buv177qjG6A4kvxx4pZviceKdspdM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Arrays.sol":{"keccak256":"0xb3b81029526a4c3acf39e57cc446407141ebce338cc99585942af1340e1a69e0","urls":["bzz-raw://3857ce97e8f7a51ad78ea5419b3386e18fcc8af73b65803eedd8193ab7abc9df","dweb:/ipfs/QmSQi6x2cYsUy76mfMNwuq151bVmh4kAND141kjume51Aq"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Comparators.sol":{"keccak256":"0x302eecd8cf323b4690e3494a7d960b3cbce077032ab8ef655b323cdd136cec58","urls":["bzz-raw://49ba706f1bc476d68fe6c1fad75517acea4e9e275be0989b548e292eb3a3eacd","dweb:/ipfs/QmeBpvcdGWzWMKTQESUCEhHgnEQYYATVwPxLMxa6vMT7jC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol":{"keccak256":"0x94045fd4f268edf2b2d01ef119268548c320366d6f5294ad30c1b8f9d4f5225f","urls":["bzz-raw://edfda81f426f8948b3834115c21e83c48180e6db0d2a8cd2debb2185ed349337","dweb:/ipfs/QmdYZneFyDAux1BuWQxLAdqtABrGS2k9WYCa7C9dvpKkWv"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"keccak256":"0x7c7ad70641a7f8cd44def0857ec97b0e40bfd073b2d6037a5f57ce9527ee9bc5","urls":["bzz-raw://e05c6572dfe769f7aea6f3a8002951cc12d143d980dad29f6c5feedf9408bc14","dweb:/ipfs/QmXM7C8YEptxisZiEefXUrwdXt3zMaCobmkCchxTtDg1oK"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857","urls":["bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5","dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083","urls":["bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9","dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x5c298e834696707e274a71a224969d36faecd928a8076603210d67d091adb4ae","urls":["bzz-raw://a93fe967b4d55b31157164cbb7e3e1ebaf3535fc1d3f8d0156da7abb9b565d90","dweb:/ipfs/QmXH7nyxwEUeMPFDDmkdUwqxLEcezaSmVyunyMAuck1WqR"],"license":"MIT"},"src/RuleEngineBase.sol":{"keccak256":"0x9edae8ce7df18638cf56b571be18251d4ac4c435844c8cd77d1f7f651623c568","urls":["bzz-raw://9758c7256a994b371c00d9e0098be5d76d9896f2a556208dfb83768d4d4e916b","dweb:/ipfs/QmdZwwiB29tzheoaoRWiJdbbGMH2nM46ojLp7WFjm9D19h"],"license":"MPL-2.0"},"src/deployment/RuleEngine.sol":{"keccak256":"0xa1aa57ac7e2af018dbb8a24b07028f3f6fe0bf7641574f9a579bd3c102654a41","urls":["bzz-raw://a18b877f001ccdd8ca27636b5ce868185f8ce83ef14b5277aedee27a389182e4","dweb:/ipfs/QmYY2dU7dSkvHb5rFgHEqtNxpSaELzgnRCmkdzxWAWwJem"],"license":"MPL-2.0"},"src/interfaces/IERC3643Compliance.sol":{"keccak256":"0xf86e78e8f737795c3762b402b121b0f1822d6b27414aeca08ea6f036cccea07b","urls":["bzz-raw://c795d1b89a1393b2225f6e58c0310d345d78ff534ab028353413c4a5aaf9ecf7","dweb:/ipfs/QmNcJsJzLWzSAV77whMzu7je2Mj2pWoTYYn1z76kqB5mKH"],"license":"MPL-2.0"},"src/interfaces/IRule.sol":{"keccak256":"0x315fd1d0147d40d3cc1ee35f6ddb8c9e25e6e4f96034a285e6f342c59c3cc222","urls":["bzz-raw://5b0ecca410bf89169e5c6393bc4d8fce97a5b3dcf8a2bba02317da85c98f4d0c","dweb:/ipfs/QmeGS5vbFwkmEvJh7s27Q9xW4xGXuUohh2zGPVbgxgjfnu"],"license":"MPL-2.0"},"src/interfaces/IRulesManagementModule.sol":{"keccak256":"0x1be8087ef526f664cf8ba5dd35d4d12fc1880f905e3ba2e553ee02cb7d6506c1","urls":["bzz-raw://545cafd73f2fe9b2b89b37e905057637f58ae2c1da7f3dc33493b515c87a720f","dweb:/ipfs/QmXiTEhLSpN6sj1fiwFT9V6bGD1VCXTqQJiNnXcLrYmW7N"],"license":"MPL-2.0"},"src/modules/ERC2771ModuleStandalone.sol":{"keccak256":"0xecc9aec20ff41c46404f6fcb9bfb0fd5588781fbb4f2fbec351f603a31c178b0","urls":["bzz-raw://48674e77afe59b6c6e6aa8b0d5e370ca58c9a354b5dc294bb3c9f10fbd12a3f3","dweb:/ipfs/QmY3HhbBDqsBvrGBXoRwgVpfSNtiK2XmhaxVpS1F3dSPx9"],"license":"MPL-2.0"},"src/modules/ERC3643ComplianceModule.sol":{"keccak256":"0xdb472471270ea23d4694ca2d2eb107ce668affc9dbe18b5a6eda312ab4800a33","urls":["bzz-raw://6200e990afca50a32fb0a0ad76ffe955447a67cab6e93f64281fc9f14208aab1","dweb:/ipfs/QmXXhRsBq3eGDgBqQwWL5w4Sn6pdTeeXRvpC4jZBDVb6nQ"],"license":"MPL-2.0"},"src/modules/RulesManagementModule.sol":{"keccak256":"0xc9c58e027874658577285de9c9bf9069cd773573a615df7c9644c6c96c69dbc3","urls":["bzz-raw://a6c9ca74cc247b42b9852b35cb4eeadc919d383d7bbd4f4df0739ee6a8bce2c3","dweb:/ipfs/QmfJCvSQjqQrQXYt9JEHiJRZATy1s7q53DKxZC1QsSYMHZ"],"license":"MPL-2.0"},"src/modules/VersionModule.sol":{"keccak256":"0x077070dca24da125a764111d336c0a8fb3445b82d93692ff76b22384b0f4f39f","urls":["bzz-raw://be8df88e667fb2de39d095f0c396d23ed263fdc51a4095fedc89a326540a03ee","dweb:/ipfs/QmYfhhEvNee1XYwCYZCVAKpUUWBd5FP5qvTMYGr6ogC8kA"],"license":"MPL-2.0"},"src/modules/library/ComplianceInterfaceId.sol":{"keccak256":"0xa0f15ca7f9e0fa8ccb854ea2bd812f220c68c280682b56e8d1a437ddba4b6d1f","urls":["bzz-raw://1e01a79b4a2110a401c3d2fbead97844f7428d6dc6603dccf795d42dbc142786","dweb:/ipfs/QmV88ZcDHTU33oXNLFTshUBZ7otgcZRN1HXwywda7Fgz9a"],"license":"MPL-2.0"},"src/modules/library/RuleEngineInvariantStorage.sol":{"keccak256":"0x15005e56f8fbf8f9b8a41c4bfed6c842e37be49fa52b0dbb2edc6b08b9e50c2f","urls":["bzz-raw://06c90dd748d060cb1b05de978cb42fd79d9b49a2beb3a479b4e49f8edaba1195","dweb:/ipfs/QmYXEQWrwJkuzWBdi5hjSaM6pWhrNUf2kH2pHX8jRu9dZS"],"license":"MPL-2.0"},"src/modules/library/RuleInterfaceId.sol":{"keccak256":"0x3c57987589d6205e2546d4ce332e944d1667dddfe897087028a95ed804c50882","urls":["bzz-raw://0e1718e500d4cb5cf4441131c57d23da788f2835e9a014e7d1f62dfb6161647a","dweb:/ipfs/QmXY5cjc9Dzrp7ML7DfvDB9zg7t4cene3g4K9AAuDmLLfC"],"license":"MPL-2.0"},"src/modules/library/RulesManagementModuleInvariantStorage.sol":{"keccak256":"0xa6f9109698f169be74c309a1efadd48edffcb0e9585523258477bf07942c8ae6","urls":["bzz-raw://4c28513636b660111b60a7028c9600b30dcfda291a831343d9e27e253b80856a","dweb:/ipfs/QmQVSZ9N6vjPxNnJDTqEuGSWqNdoxHKhzTzP2cvgZpBSzj"],"license":"MPL-2.0"}},"version":1},"id":163} \ No newline at end of file diff --git a/doc/compilation/v3.0.0-rc2/foundry/RuleEngineOwnable.sol/RuleEngineOwnable.json b/doc/compilation/v3.0.0-rc2/foundry/RuleEngineOwnable.sol/RuleEngineOwnable.json new file mode 100644 index 0000000..d2e8c2f --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/foundry/RuleEngineOwnable.sol/RuleEngineOwnable.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"owner_","type":"address","internalType":"address"},{"name":"forwarderIrrevocable","type":"address","internalType":"address"},{"name":"tokenContract","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"COMPLIANCE_MANAGER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RULES_MANAGEMENT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bindToken","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canTransfer","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"canTransferFrom","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"clearRules","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"containsRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"created","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"destroyed","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"detectTransferRestriction","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"detectTransferRestrictionFrom","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getTokenBound","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getTokenBounds","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"isTokenBound","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isTrustedForwarder","inputs":[{"name":"forwarder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageForTransferRestriction","inputs":[{"name":"restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"removeRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"rule","inputs":[{"name":"ruleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"rules","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"rulesCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"setRules","inputs":[{"name":"rules_","type":"address[]","internalType":"contract IRule[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferred","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferred","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"trustedForwarder","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"unbindToken","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"version_","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"AddRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"contract IRule"}],"anonymous":false},{"type":"event","name":"ClearRules","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RemoveRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"contract IRule"}],"anonymous":false},{"type":"event","name":"TokenBound","inputs":[{"name":"token","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TokenUnbound","inputs":[{"name":"token","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_InvalidTokenAddress","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_OperationNotSuccessful","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_TokenAlreadyBound","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_TokenNotBound","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_UnauthorizedCaller","inputs":[]},{"type":"error","name":"RuleEngine_RuleInvalidInterface","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_ArrayIsEmpty","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_OperationNotSuccessful","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleAlreadyExists","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleDoNotMatch","inputs":[]}],"bytecode":{"object":"0x60a060405234801561000f575f5ffd5b50604051611ad2380380611ad283398101604081905261002e91610237565b6001600160a01b038083166080528390839083908116156100525761005281610093565b50506001600160a01b03811661008157604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61008a8161014a565b50505050610277565b6001600160a01b0381166100ba576040516301b8831760e71b815260040160405180910390fd5b6100c560028261019b565b156100e35760405163f423354760e01b815260040160405180910390fd5b6100ee6002826101c1565b61010b57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b9060200160405180910390a150565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f90815260018301602052604081205415155b90505b92915050565b5f6101b8836001600160a01b0384165f81815260018301602052604081205461021557508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556101bb565b505f6101bb565b80516001600160a01b0381168114610232575f5ffd5b919050565b5f5f5f60608486031215610249575f5ffd5b6102528461021c565b92506102606020850161021c565b915061026e6040850161021c565b90509250925092565b60805161183561029d5f395f81816102da0152818161035a015261138601526118355ff3fe608060405234801561000f575f5ffd5b50600436106101dc575f3560e01c80638baf29b411610109578063d32c7bb51161009e578063e3c4602c1161006e578063e3c4602c14610483578063e46638e614610496578063e54621d2146104a9578063f2fde38b146104b1575f5ffd5b8063d32c7bb514610425578063d4ce14151461044a578063db18af6c1461045d578063df21950f14610470575f5ffd5b80639b11c115116100d95780639b11c115146103db578063b043572e14610402578063b27aef3a1461040a578063bc13eacc1461041d575f5ffd5b80638baf29b4146103915780638d2ea772146103a45780638da5cb5b146103b7578063993e8b95146103c8575f5ffd5b806354fd4d501161017f578063715018a61161014f578063715018a61461033d5780637157797f146103455780637da0a877146103585780637f4ab1dd1461037e575f5ffd5b806354fd4d50146102a0578063572b6c05146102ca5780635f8dead31461030a5780636a3edf281461031d575f5ffd5b80633ff5aa02116101ba5780633ff5aa021461025257806340db3b501461026557806352f6747a1461027857806354e4b9451461028d575f5ffd5b806301ffc9a7146101e057806303c26bcd146102085780633e5af4ca1461023d575b5f5ffd5b6101f36101ee366004611413565b6104c4565b60405190151581526020015b60405180910390f35b61022f7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b6040519081526020016101ff565b61025061024b36600461144e565b61050a565b005b61025061026036600461149c565b610524565b61025061027336600461149c565b610538565b610280610549565b6040516101ff91906114b7565b6101f361029b36600461149c565b610559565b6040805180820190915260058152640332e302e360dc1b60208201525b6040516101ff9190611502565b6101f36102d836600461149c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610250610318366004611537565b610564565b61032561057b565b6040516001600160a01b0390911681526020016101ff565b61025061059d565b6101f361035336600461144e565b6105b0565b7f0000000000000000000000000000000000000000000000000000000000000000610325565b6102bd61038c36600461156f565b6105cd565b61025061039f36600461158a565b6105d8565b6102506103b2366004611537565b6105f0565b6004546001600160a01b0316610325565b6101f36103d636600461149c565b610603565b61022f7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b61025061060f565b6102506104183660046115c8565b61061f565b61022f61074b565b61043861043336600461144e565b610755565b60405160ff90911681526020016101ff565b61043861045836600461158a565b61076b565b61032561046b366004611639565b610781565b61025061047e36600461149c565b6107a3565b61025061049136600461149c565b6107db565b6101f36104a436600461158a565b610849565b610280610862565b6102506104bf36600461149c565b61086e565b5f6104ce826108ad565b806104e957506001600160e01b031982166307f5828d60e41b145b8061050457506001600160e01b031982166301ffc9a760e01b145b92915050565b610512610918565b61051e84848484610948565b50505050565b61052c6109ea565b610535816109f2565b50565b6105406109ea565b61053581610aaa565b60606105545f610b33565b905090565b5f6105048183610b3f565b61056c610918565b6105775f8383610b5f565b5050565b5f5f6105876002610bf8565b11156105985761055460025f610c01565b505f90565b6105a5610c0c565b6105ae5f610c6a565b565b5f806105be86868686610755565b60ff161490505b949350505050565b606061050482610cbb565b6105e0610918565b6105eb838383610b5f565b505050565b6105f8610918565b610577825f83610b5f565b5f610504600283610b3f565b6106176109ea565b6105ae610e05565b6106276109ea565b5f819003610648576040516359203cb960e01b815260040160405180910390fd5b5f6106525f610bf8565b111561066057610660610e05565b5f5b818110156105eb5761069983838381811061067f5761067f611650565b9050602002016020810190610694919061149c565b610e36565b6106ca8383838181106106ae576106ae611650565b90506020020160208101906106c3919061149c565b5f90610e6d565b6106e75760405163f280d16160e01b815260040160405180910390fd5b8282828181106106f9576106f9611650565b905060200201602081019061070e919061149c565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610662565b5f6105545f610bf8565b5f61076285858585610e81565b95945050505050565b5f610777848484610f4c565b90505b9392505050565b5f61078b5f610bf8565b82101561079c576105045f83610c01565b505f919050565b6107ab6109ea565b6107b55f82610b3f565b6107d257604051632cdc3a4160e21b815260040160405180910390fd5b6105358161100e565b6107e36109ea565b6107ec81610e36565b6107f65f82610e6d565b6108135760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f8061085685858561076b565b60ff1614949350505050565b60606105546002610b33565b610876610c0c565b6001600160a01b0381166108a457604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61053581610c6a565b5f6001600160e01b031982166320c49ce760e01b14806108dd57506001600160e01b031982166378a8de7d60e01b145b806108f857506001600160e01b03198216630c51264760e21b145b8061050457506001600160e01b03198216637157797f60e01b1492915050565b61092b61092361106b565b600290610b3f565b6105ae5760405163e39b3c8f60e01b815260040160405180910390fd5b5f6109525f610bf8565b90505f5b818110156109e2576109685f82610c01565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b1580156109c1575f5ffd5b505af11580156109d3573d5f5f3e3d5ffd5b50505050806001019050610956565b505050505050565b6105ae610c0c565b6001600160a01b038116610a19576040516301b8831760e71b815260040160405180910390fd5b610a24600282610b3f565b15610a425760405163f423354760e01b815260040160405180910390fd5b610a4d600282610e6d565b610a6a57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610ab5600282610b3f565b610ad257604051636a2b488360e11b815260040160405180910390fd5b610add600282611074565b610afa57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610a9f565b60605f61077a83611088565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610b695f610bf8565b90505f5b81811015610bf157610b7f5f82610c01565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610bd0575f5ffd5b505af1158015610be2573d5f5f3e3d5ffd5b50505050806001019050610b6d565b5050505050565b5f610504825490565b5f61077a83836110e1565b610c1461106b565b6001600160a01b0316610c2f6004546001600160a01b031690565b6001600160a01b0316146105ae57610c4561106b565b60405163118cdaa760e01b81526001600160a01b03909116600482015260240161089b565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60605f610cc661074b565b90505f5b81811015610dc957610cdb81610781565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610d22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d469190611664565b15610dc157610d5481610781565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610d9a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105c59190810190611697565b600101610cca565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105ae5f611107565b610e3f81611110565b610e5081632497d6cb60e01b61115f565b61053557604051639952e34360e01b815260040160405180910390fd5b5f61077a836001600160a01b03841661117a565b5f5f610e8b61074b565b90505f5b81811015610f40575f610ea182610781565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610efe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f22919061174a565b905060ff811615610f375792506105c5915050565b50600101610e8f565b505f9695505050505050565b5f5f610f5661074b565b90505f5b81811015611003575f610f6c82610781565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015610fc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe5919061174a565b905060ff811615610ffa57925061077a915050565b50600101610f5a565b505f95945050505050565b6110185f82611074565b6110355760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6105546111c6565b5f61077a836001600160a01b0384166111d4565b6060815f018054806020026020016040519081016040528092919081815260200182805480156110d557602002820191905f5260205f20905b8154815260200190600101908083116110c1575b50505050509050919050565b5f825f0182815481106110f6576110f6611650565b905f5260205f200154905092915050565b610535816112be565b6001600160a01b0381166111375760405163f9d152fb60e01b815260040160405180910390fd5b6111415f82610b3f565b156105355760405163cc790a4b60e01b815260040160405180910390fd5b5f61116983611317565b801561077a575061077a8383611356565b5f8181526001830160205260408120546111bf57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610504565b505f610504565b5f6105545f36816014611377565b5f81815260018301602052604081205480156112ae575f6111f6600183611765565b85549091505f9061120990600190611765565b9050808214611268575f865f01828154811061122757611227611650565b905f5260205f200154905080875f01848154811061124757611247611650565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061127957611279611784565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610504565b5f915050610504565b5092915050565b5f6112c7825490565b90505f5b8181101561131057826001015f845f0183815481106112ec576112ec611650565b905f5260205f20015481526020019081526020015f205f90558060010190506112cb565b50505f9055565b5f611329826301ffc9a760e01b611356565b1561079c575f80611342846001600160e01b03196113df565b915091508180156105c55750159392505050565b5f5f5f61136385856113df565b915091508180156107625750949350505050565b90508082101580156113b157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113d7576113c436828403815f611798565b6113cd916117bf565b60601c9250505090565b339250505090565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611423575f5ffd5b81356001600160e01b03198116811461077a575f5ffd5b6001600160a01b0381168114610535575f5ffd5b5f5f5f5f60808587031215611461575f5ffd5b843561146c8161143a565b9350602085013561147c8161143a565b9250604085013561148c8161143a565b9396929550929360600135925050565b5f602082840312156114ac575f5ffd5b813561077a8161143a565b602080825282518282018190525f918401906040840190835b818110156114f75783516001600160a01b03168352602093840193909201916001016114d0565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611548575f5ffd5b82356115538161143a565b946020939093013593505050565b60ff81168114610535575f5ffd5b5f6020828403121561157f575f5ffd5b813561077a81611561565b5f5f5f6060848603121561159c575f5ffd5b83356115a78161143a565b925060208401356115b78161143a565b929592945050506040919091013590565b5f5f602083850312156115d9575f5ffd5b823567ffffffffffffffff8111156115ef575f5ffd5b8301601f810185136115ff575f5ffd5b803567ffffffffffffffff811115611615575f5ffd5b8560208260051b8401011115611629575f5ffd5b6020919091019590945092505050565b5f60208284031215611649575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611674575f5ffd5b8151801515811461077a575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156116a7575f5ffd5b815167ffffffffffffffff8111156116bd575f5ffd5b8201601f810184136116cd575f5ffd5b805167ffffffffffffffff8111156116e7576116e7611683565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561171657611716611683565b60405281815282820160200186101561172d575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f6020828403121561175a575f5ffd5b815161077a81611561565b8181038181111561050457634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f858511156117a6575f5ffd5b838611156117b2575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156112b7576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea26469706673582212205a996d82474883c2a78dc00fe976f819f1cf115270e41b1abc3e59e3917604d364736f6c63430008220033","sourceMap":"356:1683:164:-:0;;;684:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1542:37:135;;;;;850:6:164;;797:20;;819:13;;956:27:162;::::1;::::0;952:83:::1;;999:25;1010:13:::0;999:10:::1;:25::i;:::-;-1:-1:-1::0;;;;;;;1273:26:128;;1269:95;;1322:31;;-1:-1:-1;;;1322:31:128;;1350:1;1322:31;;;725:51:231;698:18;;1322:31:128;;;;;;;1269:95;1373:32;1392:12;1373:18;:32::i;:::-;1225:187;684:180:164;;;356:1683;;3688:459:186;-1:-1:-1;;;;;3750:19:186;;3742:80;;;;-1:-1:-1;;;3742:80:186;;;;;;;;;;;;3841:28;:12;3863:5;3841:21;:28::i;:::-;3840:29;3832:88;;;;-1:-1:-1;;;3832:88:186;;;;;;;;;;;;4029:23;:12;4046:5;4029:16;:23::i;:::-;4021:87;;;;-1:-1:-1;;;4021:87:186;;;;;;;;;;;;4123:17;;-1:-1:-1;;;;;743:32:231;;725:51;;4123:17:186;;713:2:231;698:18;4123:17:186;;;;;;;3688:459;:::o;2912:187:128:-;3004:6;;;-1:-1:-1;;;;;3020:17:128;;;-1:-1:-1;;;;;;3020:17:128;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;16041:165:158:-;-1:-1:-1;;;;;16174:23:158;;16121:4;5238:21;;;:14;;;:21;;;;;;:26;;16144:55;16137:62;;16041:165;;;;;:::o;15089:150::-;15159:4;15182:50;15187:3;-1:-1:-1;;;;;15207:23:158;;2601:4;5238:21;;;:14;;;:21;;;;;;2617:321;;-1:-1:-1;2659:23:158;;;;;;;;:11;:23;;;;;;;;;;;;;2841:18;;2817:21;;;:14;;;:21;;;;;;:42;;;;2873:11;;2617:321;-1:-1:-1;2922:5:158;2915:12;;14:177:231;93:13;;-1:-1:-1;;;;;135:31:231;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:378::-;284:6;292;300;353:2;341:9;332:7;328:23;324:32;321:52;;;369:1;366;359:12;321:52;392:40;422:9;392:40;:::i;:::-;382:50;;451:49;496:2;485:9;481:18;451:49;:::i;:::-;441:59;;519:49;564:2;553:9;549:18;519:49;:::i;:::-;509:59;;196:378;;;;;:::o;579:203::-;356:1683:164;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b50600436106101dc575f3560e01c80638baf29b411610109578063d32c7bb51161009e578063e3c4602c1161006e578063e3c4602c14610483578063e46638e614610496578063e54621d2146104a9578063f2fde38b146104b1575f5ffd5b8063d32c7bb514610425578063d4ce14151461044a578063db18af6c1461045d578063df21950f14610470575f5ffd5b80639b11c115116100d95780639b11c115146103db578063b043572e14610402578063b27aef3a1461040a578063bc13eacc1461041d575f5ffd5b80638baf29b4146103915780638d2ea772146103a45780638da5cb5b146103b7578063993e8b95146103c8575f5ffd5b806354fd4d501161017f578063715018a61161014f578063715018a61461033d5780637157797f146103455780637da0a877146103585780637f4ab1dd1461037e575f5ffd5b806354fd4d50146102a0578063572b6c05146102ca5780635f8dead31461030a5780636a3edf281461031d575f5ffd5b80633ff5aa02116101ba5780633ff5aa021461025257806340db3b501461026557806352f6747a1461027857806354e4b9451461028d575f5ffd5b806301ffc9a7146101e057806303c26bcd146102085780633e5af4ca1461023d575b5f5ffd5b6101f36101ee366004611413565b6104c4565b60405190151581526020015b60405180910390f35b61022f7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b6040519081526020016101ff565b61025061024b36600461144e565b61050a565b005b61025061026036600461149c565b610524565b61025061027336600461149c565b610538565b610280610549565b6040516101ff91906114b7565b6101f361029b36600461149c565b610559565b6040805180820190915260058152640332e302e360dc1b60208201525b6040516101ff9190611502565b6101f36102d836600461149c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610250610318366004611537565b610564565b61032561057b565b6040516001600160a01b0390911681526020016101ff565b61025061059d565b6101f361035336600461144e565b6105b0565b7f0000000000000000000000000000000000000000000000000000000000000000610325565b6102bd61038c36600461156f565b6105cd565b61025061039f36600461158a565b6105d8565b6102506103b2366004611537565b6105f0565b6004546001600160a01b0316610325565b6101f36103d636600461149c565b610603565b61022f7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b61025061060f565b6102506104183660046115c8565b61061f565b61022f61074b565b61043861043336600461144e565b610755565b60405160ff90911681526020016101ff565b61043861045836600461158a565b61076b565b61032561046b366004611639565b610781565b61025061047e36600461149c565b6107a3565b61025061049136600461149c565b6107db565b6101f36104a436600461158a565b610849565b610280610862565b6102506104bf36600461149c565b61086e565b5f6104ce826108ad565b806104e957506001600160e01b031982166307f5828d60e41b145b8061050457506001600160e01b031982166301ffc9a760e01b145b92915050565b610512610918565b61051e84848484610948565b50505050565b61052c6109ea565b610535816109f2565b50565b6105406109ea565b61053581610aaa565b60606105545f610b33565b905090565b5f6105048183610b3f565b61056c610918565b6105775f8383610b5f565b5050565b5f5f6105876002610bf8565b11156105985761055460025f610c01565b505f90565b6105a5610c0c565b6105ae5f610c6a565b565b5f806105be86868686610755565b60ff161490505b949350505050565b606061050482610cbb565b6105e0610918565b6105eb838383610b5f565b505050565b6105f8610918565b610577825f83610b5f565b5f610504600283610b3f565b6106176109ea565b6105ae610e05565b6106276109ea565b5f819003610648576040516359203cb960e01b815260040160405180910390fd5b5f6106525f610bf8565b111561066057610660610e05565b5f5b818110156105eb5761069983838381811061067f5761067f611650565b9050602002016020810190610694919061149c565b610e36565b6106ca8383838181106106ae576106ae611650565b90506020020160208101906106c3919061149c565b5f90610e6d565b6106e75760405163f280d16160e01b815260040160405180910390fd5b8282828181106106f9576106f9611650565b905060200201602081019061070e919061149c565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610662565b5f6105545f610bf8565b5f61076285858585610e81565b95945050505050565b5f610777848484610f4c565b90505b9392505050565b5f61078b5f610bf8565b82101561079c576105045f83610c01565b505f919050565b6107ab6109ea565b6107b55f82610b3f565b6107d257604051632cdc3a4160e21b815260040160405180910390fd5b6105358161100e565b6107e36109ea565b6107ec81610e36565b6107f65f82610e6d565b6108135760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f8061085685858561076b565b60ff1614949350505050565b60606105546002610b33565b610876610c0c565b6001600160a01b0381166108a457604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61053581610c6a565b5f6001600160e01b031982166320c49ce760e01b14806108dd57506001600160e01b031982166378a8de7d60e01b145b806108f857506001600160e01b03198216630c51264760e21b145b8061050457506001600160e01b03198216637157797f60e01b1492915050565b61092b61092361106b565b600290610b3f565b6105ae5760405163e39b3c8f60e01b815260040160405180910390fd5b5f6109525f610bf8565b90505f5b818110156109e2576109685f82610c01565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b1580156109c1575f5ffd5b505af11580156109d3573d5f5f3e3d5ffd5b50505050806001019050610956565b505050505050565b6105ae610c0c565b6001600160a01b038116610a19576040516301b8831760e71b815260040160405180910390fd5b610a24600282610b3f565b15610a425760405163f423354760e01b815260040160405180910390fd5b610a4d600282610e6d565b610a6a57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610ab5600282610b3f565b610ad257604051636a2b488360e11b815260040160405180910390fd5b610add600282611074565b610afa57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610a9f565b60605f61077a83611088565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610b695f610bf8565b90505f5b81811015610bf157610b7f5f82610c01565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610bd0575f5ffd5b505af1158015610be2573d5f5f3e3d5ffd5b50505050806001019050610b6d565b5050505050565b5f610504825490565b5f61077a83836110e1565b610c1461106b565b6001600160a01b0316610c2f6004546001600160a01b031690565b6001600160a01b0316146105ae57610c4561106b565b60405163118cdaa760e01b81526001600160a01b03909116600482015260240161089b565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60605f610cc661074b565b90505f5b81811015610dc957610cdb81610781565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610d22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d469190611664565b15610dc157610d5481610781565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610d9a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105c59190810190611697565b600101610cca565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105ae5f611107565b610e3f81611110565b610e5081632497d6cb60e01b61115f565b61053557604051639952e34360e01b815260040160405180910390fd5b5f61077a836001600160a01b03841661117a565b5f5f610e8b61074b565b90505f5b81811015610f40575f610ea182610781565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610efe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f22919061174a565b905060ff811615610f375792506105c5915050565b50600101610e8f565b505f9695505050505050565b5f5f610f5661074b565b90505f5b81811015611003575f610f6c82610781565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015610fc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe5919061174a565b905060ff811615610ffa57925061077a915050565b50600101610f5a565b505f95945050505050565b6110185f82611074565b6110355760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6105546111c6565b5f61077a836001600160a01b0384166111d4565b6060815f018054806020026020016040519081016040528092919081815260200182805480156110d557602002820191905f5260205f20905b8154815260200190600101908083116110c1575b50505050509050919050565b5f825f0182815481106110f6576110f6611650565b905f5260205f200154905092915050565b610535816112be565b6001600160a01b0381166111375760405163f9d152fb60e01b815260040160405180910390fd5b6111415f82610b3f565b156105355760405163cc790a4b60e01b815260040160405180910390fd5b5f61116983611317565b801561077a575061077a8383611356565b5f8181526001830160205260408120546111bf57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610504565b505f610504565b5f6105545f36816014611377565b5f81815260018301602052604081205480156112ae575f6111f6600183611765565b85549091505f9061120990600190611765565b9050808214611268575f865f01828154811061122757611227611650565b905f5260205f200154905080875f01848154811061124757611247611650565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061127957611279611784565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610504565b5f915050610504565b5092915050565b5f6112c7825490565b90505f5b8181101561131057826001015f845f0183815481106112ec576112ec611650565b905f5260205f20015481526020019081526020015f205f90558060010190506112cb565b50505f9055565b5f611329826301ffc9a760e01b611356565b1561079c575f80611342846001600160e01b03196113df565b915091508180156105c55750159392505050565b5f5f5f61136385856113df565b915091508180156107625750949350505050565b90508082101580156113b157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113d7576113c436828403815f611798565b6113cd916117bf565b60601c9250505090565b339250505090565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611423575f5ffd5b81356001600160e01b03198116811461077a575f5ffd5b6001600160a01b0381168114610535575f5ffd5b5f5f5f5f60808587031215611461575f5ffd5b843561146c8161143a565b9350602085013561147c8161143a565b9250604085013561148c8161143a565b9396929550929360600135925050565b5f602082840312156114ac575f5ffd5b813561077a8161143a565b602080825282518282018190525f918401906040840190835b818110156114f75783516001600160a01b03168352602093840193909201916001016114d0565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611548575f5ffd5b82356115538161143a565b946020939093013593505050565b60ff81168114610535575f5ffd5b5f6020828403121561157f575f5ffd5b813561077a81611561565b5f5f5f6060848603121561159c575f5ffd5b83356115a78161143a565b925060208401356115b78161143a565b929592945050506040919091013590565b5f5f602083850312156115d9575f5ffd5b823567ffffffffffffffff8111156115ef575f5ffd5b8301601f810185136115ff575f5ffd5b803567ffffffffffffffff811115611615575f5ffd5b8560208260051b8401011115611629575f5ffd5b6020919091019590945092505050565b5f60208284031215611649575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611674575f5ffd5b8151801515811461077a575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156116a7575f5ffd5b815167ffffffffffffffff8111156116bd575f5ffd5b8201601f810184136116cd575f5ffd5b805167ffffffffffffffff8111156116e7576116e7611683565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561171657611716611683565b60405281815282820160200186101561172d575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f6020828403121561175a575f5ffd5b815161077a81611561565b8181038181111561050457634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f858511156117a6575f5ffd5b838611156117b2575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156112b7576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea26469706673582212205a996d82474883c2a78dc00fe976f819f1cf115270e41b1abc3e59e3917604d364736f6c63430008220033","sourceMap":"356:1683:164:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1091:257:162;;;;;;:::i;:::-;;:::i;:::-;;;470:14:231;;463:22;445:41;;433:2;418:18;1091:257:162;;;;;;;;729:86:186;;779:36;729:86;;;;;643:25:231;;;631:2;616:18;729:86:186;497:177:231;1726:276:161;;;;;;:::i;:::-;;:::i;:::-;;1846:114:186;;;;;;:::i;:::-;;:::i;2223:118::-;;;;;;:::i;:::-;;:::i;4499:136:187:-;;;:::i;:::-;;;;;;;:::i;3804:158::-;;;;;;:::i;:::-;;:::i;692:129:188:-;807:7;;;;;;;;;;;;-1:-1:-1;;;807:7:188;;;;692:129;;;;;;;:::i;1874:137:135:-;;;;;;:::i;:::-;1749:17;-1:-1:-1;;;;;1973:31:135;;;;;;;1874:137;2328:155:161;;;;;;:::i;:::-;;:::i;2564:382:186:-;;;:::i;:::-;;;-1:-1:-1;;;;;3590:32:231;;;3572:51;;3560:2;3545:18;2564:382:186;3426:203:231;2293:101:128;;;:::i;4340:311:161:-;;;;;;:::i;:::-;;:::i;1666:107:135:-;1749:17;1666:107;;3695:240:161;;;;;;:::i;:::-;;:::i;2071:212::-;;;;;;:::i;:::-;;:::i;2528:161::-;;;;;;:::i;:::-;;:::i;1638:85:128:-;1710:6;;-1:-1:-1;;;;;1710:6:128;1638:85;;2386:133:186;;;;;;:::i;:::-;;:::i;1199:82:192:-;;1247:34;1199:82;;2485:117:187;;;:::i;1781:640::-;;;;;;:::i;:::-;;:::i;3608:132::-;;;:::i;3363:282:161:-;;;;;;:::i;:::-;;:::i;:::-;;;5498:4:231;5486:17;;;5468:36;;5456:2;5441:18;3363:282:161;5326:184:231;3065:242:161;;;;;;:::i;:::-;;:::i;4026:409:187:-;;;;;;:::i;:::-;;:::i;3258:234::-;;;;;;:::i;:::-;;:::i;2923:271::-;;;;;;:::i;:::-;;:::i;3999:281:161:-;;;;;;:::i;:::-;;:::i;2991:119:186:-;;;:::i;2543:215:128:-;;;;;;:::i;:::-;;:::i;1091:257:162:-;1167:4;1190:45;1223:11;1190:32;:45::i;:::-;:95;;;-1:-1:-1;;;;;;;1251:34:162;;-1:-1:-1;;;1251:34:162;1190:95;:151;;;-1:-1:-1;;;;;;;1301:40:162;;-1:-1:-1;;;1301:40:162;1190:151;1183:158;1091:257;-1:-1:-1;;1091:257:162:o;1726:276:161:-;1217:18:186;:16;:18::i;:::-;1935:60:161::1;1970:7;1979:4;1985:2;1989:5;1935:34;:60::i;:::-;1726:276:::0;;;;:::o;1846:114:186:-;1302:24;:22;:24::i;:::-;1936:17:::1;1947:5;1936:10;:17::i;:::-;1846:114:::0;:::o;2223:118::-;1302:24;:22;:24::i;:::-;2315:19:::1;2328:5;2315:12;:19::i;4499:136:187:-:0;4578:16;4613:15;:6;:13;:15::i;:::-;4606:22;;4499:136;:::o;3804:158::-;3901:4;3924:31;3901:4;3948:5;3924:15;:31::i;2328:155:161:-;1217:18:186;:16;:18::i;:::-;2441:35:161::1;2462:1;2466:2;2470:5;2441:12;:35::i;:::-;2328:155:::0;;:::o;2564:382:186:-;2627:7;2674:1;2650:21;:12;:19;:21::i;:::-;:25;2646:294;;;2863:18;:12;2879:1;2863:15;:18::i;2646:294::-;-1:-1:-1;2927:1:186;;2564:382::o;2293:101:128:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;4340:311:161:-;4521:4;;4548:55;4578:7;4587:4;4593:2;4597:5;4548:29;:55::i;:::-;:96;;;4541:103;;4340:311;;;;;;;:::o;3695:240::-;3845:13;3881:47;3912:15;3881:30;:47::i;2071:212::-;1217:18:186;:16;:18::i;:::-;2247:29:161::1;2260:4;2266:2;2270:5;2247:12;:29::i;:::-;2071:212:::0;;;:::o;2528:161::-;1217:18:186;:16;:18::i;:::-;2645:37:161::1;2658:4;2672:1;2676:5;2645:12;:37::i;2386:133:186:-:0;2461:4;2484:28;:12;2506:5;2484:21;:28::i;2485:117:187:-;643:19;:17;:19::i;:::-;2582:13:::1;:11;:13::i;1781:640::-:0;643:19;:17;:19::i;:::-;1920:1:::1;1903:18:::0;;;1899:103:::1;;1944:47;;-1:-1:-1::0;;;1944:47:187::1;;;;;;;;;;;1899:103;2033:1;2015:15;:6;:13;:15::i;:::-;:19;2011:63;;;2050:13;:11;:13::i;:::-;2088:9;2083:332;2103:17:::0;;::::1;2083:332;;;2141:30;2160:6;;2167:1;2160:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2141:10;:30::i;:::-;2277;2296:6;;2303:1;2296:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2277:6;::::0;:10:::1;:30::i;:::-;2269:98;;;;-1:-1:-1::0;;;2269:98:187::1;;;;;;;;;;;;2394:6;;2401:1;2394:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2386:18:187::1;;;;;;;;;;;2122:3;;2083:332;;3608:132:::0;3692:7;3718:15;:6;:13;:15::i;3363:282:161:-;3554:5;3582:56;3613:7;3622:4;3628:2;3632:5;3582:30;:56::i;:::-;3575:63;3363:282;-1:-1:-1;;;;;3363:282:161:o;3065:242::-;3229:5;3257:43;3284:4;3290:2;3294:5;3257:26;:43::i;:::-;3250:50;;3065:242;;;;;;:::o;4026:409:187:-;4118:7;4150:15;:6;:13;:15::i;:::-;4141:6;:24;4137:292;;;4353:17;:6;4363;4353:9;:17::i;4137:292::-;-1:-1:-1;4416:1:187;;4026:409;-1:-1:-1;4026:409:187:o;3258:234::-;643:19;:17;:19::i;:::-;3374:31:::1;:6;3398:5:::0;3374:15:::1;:31::i;:::-;3366:91;;;;-1:-1:-1::0;;;3366:91:187::1;;;;;;;;;;;;3467:18;3479:5;3467:11;:18::i;2923:271::-:0;643:19;:17;:19::i;:::-;3028:26:::1;3047:5;3028:10;:26::i;:::-;3072;:6;3091:5:::0;3072:10:::1;:26::i;:::-;3064:94;;;;-1:-1:-1::0;;;3064:94:187::1;;;;;;;;;;;;3173:14;::::0;-1:-1:-1;;;;;3173:14:187;::::1;::::0;::::1;::::0;;;::::1;2923:271:::0;:::o;3999:281:161:-;4163:4;;4190:42;4216:4;4222:2;4226:5;4190:25;:42::i;:::-;:83;;;;3999:281;-1:-1:-1;;;;3999:281:161:o;2991:119:186:-;3047:16;3082:21;:12;:19;:21::i;2543:215:128:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:128;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:128;;2700:1:::1;2672:31;::::0;::::1;3572:51:231::0;3545:18;;2672:31:128::1;;;;;;;;2623:91;2723:28;2742:8;2723:18;:28::i;7167:427:161:-:0;7252:4;-1:-1:-1;;;;;;7275:61:161;;-1:-1:-1;;;7275:61:161;;:143;;-1:-1:-1;;;;;;;7352:66:161;;-1:-1:-1;;;7352:66:161;7275:143;:227;;;-1:-1:-1;;;;;;;7434:68:161;;-1:-1:-1;;;7434:68:161;7275:227;:312;;;-1:-1:-1;;;;;;;7518:69:161;;-1:-1:-1;;;7518:69:161;7268:319;7167:427;-1:-1:-1;;7167:427:161:o;4153:188:186:-;4217:35;4239:12;:10;:12::i;:::-;4217;;:21;:35::i;:::-;4212:123;;4275:49;;-1:-1:-1;;;4275:49:186;;;;;;;;;;;7278:284:187;7385:19;7407:15;:6;:13;:15::i;:::-;7385:37;-1:-1:-1;7437:9:187;7432:124;7456:11;7452:1;:15;7432:124;;;7494:12;:6;7504:1;7494:9;:12::i;:::-;7488:57;;-1:-1:-1;;;7488:57:187;;-1:-1:-1;;;;;6259:32:231;;;7488:57:187;;;6241:51:231;6328:32;;;6308:18;;;6301:60;6397:32;;;6377:18;;;6370:60;6446:18;;;6439:34;;;7488:31:187;;;;;;;6213:19:231;;7488:57:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7469:3;;;;;7432:124;;;;7375:187;7278:284;;;;:::o;1136:72:164:-;1531:13:128;:11;:13::i;3688:459:186:-;-1:-1:-1;;;;;3750:19:186;;3742:80;;;;-1:-1:-1;;;3742:80:186;;;;;;;;;;;;3841:28;:12;3863:5;3841:21;:28::i;:::-;3840:29;3832:88;;;;-1:-1:-1;;;3832:88:186;;;;;;;;;;;;4029:23;:12;4046:5;4029:16;:23::i;:::-;4021:87;;;;-1:-1:-1;;;4021:87:186;;;;;;;;;;;;4123:17;;-1:-1:-1;;;;;3590:32:231;;3572:51;;4123:17:186;;3560:2:231;3545:18;4123:17:186;;;;;;;;3688:459;:::o;3310:372::-;3374:28;:12;3396:5;3374:21;:28::i;:::-;3366:83;;;;-1:-1:-1;;;3366:83:186;;;;;;;;;;;;3558:26;:12;3578:5;3558:19;:26::i;:::-;3550:90;;;;-1:-1:-1;;;3550:90:186;;;;;;;;;;;;3656:19;;-1:-1:-1;;;;;3590:32:231;;3572:51;;3656:19:186;;3560:2:231;3545:18;3656:19:186;3426:203:231;17440:273:158;17503:16;17531:22;17556:19;17564:3;17556:7;:19::i;16041:165::-;-1:-1:-1;;;;;16174:23:158;16121:4;5238:21;;;:14;;;;;:21;;;;;;:26;;;16041:165::o;6464:258:187:-;6554:19;6576:15;:6;:13;:15::i;:::-;6554:37;-1:-1:-1;6606:9:187;6601:115;6625:11;6621:1;:15;6601:115;;;6663:12;:6;6673:1;6663:9;:12::i;:::-;6657:48;;-1:-1:-1;;;6657:48:187;;-1:-1:-1;;;;;6704:32:231;;;6657:48:187;;;6686:51:231;6773:32;;;6753:18;;;6746:60;6822:18;;;6815:34;;;6657:31:187;;;;;;;6659:18:231;;6657:48:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6638:3;;;;;6601:115;;;;6544:178;6464:258;;;:::o;16287:115:158:-;16350:7;16376:19;16384:3;5434:18;;5352:107;16744:156;16818:7;16868:22;16872:3;16884:5;16868:3;:22::i;1796:162:128:-;1866:12;:10;:12::i;:::-;-1:-1:-1;;;;;1855:23:128;:7;1710:6;;-1:-1:-1;;;;;1710:6:128;;1638:85;1855:7;-1:-1:-1;;;;;1855:23:128;;1851:101;;1928:12;:10;:12::i;:::-;1901:40;;-1:-1:-1;;;1901:40:128;;-1:-1:-1;;;;;3590:32:231;;;1901:40:128;;;3572:51:231;3545:18;;1901:40:128;3426:203:231;2912:187:128;3004:6;;;-1:-1:-1;;;;;3020:17:128;;;-1:-1:-1;;;;;;3020:17:128;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;6166:449:161:-;6260:13;6285:19;6307:12;:10;:12::i;:::-;6285:34;-1:-1:-1;6334:9:161;6329:237;6353:11;6349:1;:15;6329:237;;;6395:7;6400:1;6395:4;:7::i;:::-;6389:64;;-1:-1:-1;;;6389:64:161;;5498:4:231;5486:17;;6389:64:161;;;5468:36:231;-1:-1:-1;;;;;6389:47:161;;;;;;;5441:18:231;;6389:64:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6385:171;;;6486:7;6491:1;6486:4;:7::i;:::-;6480:61;;-1:-1:-1;;;6480:61:161;;5498:4:231;5486:17;;6480:61:161;;;5468:36:231;-1:-1:-1;;;;;6480:44:161;;;;;;;5441:18:231;;6480:61:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6480:61:161;;;;;;;;;;;;:::i;6385:171::-;6366:3;;6329:237;;;-1:-1:-1;;6575:33:161;;;;;;;;;;;;;;;;;;6166:449;-1:-1:-1;;6166:449:161:o;4914:98:187:-;4969:12;;;;;;;4991:14;:6;:12;:14::i;6719:261:161:-;6795:23;6812:5;6795:16;:23::i;:::-;6833:74;6865:5;-1:-1:-1;;;6833:31:161;:74::i;:::-;6828:146;;6930:33;;-1:-1:-1;;;6930:33:161;;;;;;;;;;;15089:150:158;15159:4;15182:50;15187:3;-1:-1:-1;;;;;15207:23:158;;15182:4;:50::i;5314:528:161:-;5475:5;5496:19;5518:12;:10;:12::i;:::-;5496:34;-1:-1:-1;5545:9:161;5540:242;5564:11;5560:1;:15;5540:242;;;5596:17;5622:7;5627:1;5622:4;:7::i;:::-;5616:70;;-1:-1:-1;;;5616:70:161;;-1:-1:-1;;;;;6259:32:231;;;5616:70:161;;;6241:51:231;6328:32;;;6308:18;;;6301:60;6397:32;;;6377:18;;;6370:60;6446:18;;;6439:34;;;5616:44:161;;;;;;;6213:19:231;;5616:70:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5596:90;-1:-1:-1;5704:15:161;;;;5700:72;;5746:11;-1:-1:-1;5739:18:161;;-1:-1:-1;;5739:18:161;5700:72;-1:-1:-1;5577:3:161;;5540:242;;;-1:-1:-1;5804:30:161;5791:44;5314:528;-1:-1:-1;;;;;;5314:528:161:o;4850:458::-;4958:5;4975:19;4997:12;:10;:12::i;:::-;4975:34;-1:-1:-1;5024:9:161;5019:229;5043:11;5039:1;:15;5019:229;;;5075:17;5101:7;5106:1;5101:4;:7::i;:::-;5095:57;;-1:-1:-1;;;5095:57:161;;-1:-1:-1;;;;;6704:32:231;;;5095:57:161;;;6686:51:231;6773:32;;;6753:18;;;6746:60;6822:18;;;6815:34;;;5095:40:161;;;;;;;6659:18:231;;5095:57:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5075:77;-1:-1:-1;5170:15:161;;;;5166:72;;5212:11;-1:-1:-1;5205:18:161;;-1:-1:-1;;5205:18:161;5166:72;-1:-1:-1;5056:3:161;;5019:229;;;-1:-1:-1;5270:30:161;5257:44;4850:458;-1:-1:-1;;;;;4850:458:161:o;5239:277:187:-;5388:29;:6;5410:5;5388:13;:29::i;:::-;5380:97;;;;-1:-1:-1;;;5380:97:187;;;;;;;;;;;;5492:17;;-1:-1:-1;;;;;5492:17:187;;;;;;;;5239:277;:::o;1309:172:164:-;1405:14;1438:36;:34;:36::i;15407:156:158:-;15480:4;15503:53;15511:3;-1:-1:-1;;;;;15531:23:158;;15503:7;:53::i;6459:109::-;6515:16;6550:3;:11;;6543:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6459:109;;;:::o;5801:118::-;5868:7;5894:3;:11;;5906:5;5894:18;;;;;;;;:::i;:::-;;;;;;;;;5887:25;;5801:118;;;;:::o;15877:83::-;15935:18;15942:3;15935:6;:18::i;5593:313:187:-;-1:-1:-1;;;;;5664:21:187;;5660:119;;5708:60;;-1:-1:-1;;;5708:60:187;;;;;;;;;;;5660:119;5792:22;:6;5808:5;5792:15;:22::i;:::-;5788:112;;;5837:52;;-1:-1:-1;;;5837:52:187;;;;;;;;;;;1465:283:153;1552:4;1660:23;1675:7;1660:14;:23::i;:::-;:81;;;;;1687:54;1720:7;1729:11;1687:32;:54::i;2538:406:158:-;2601:4;5238:21;;;:14;;;:21;;;;;;2617:321;;-1:-1:-1;2659:23:158;;;;;;;;:11;:23;;;;;;;;;;;;;2841:18;;2817:21;;;:14;;;:21;;;;;;:42;;;;2873:11;;2617:321;-1:-1:-1;2922:5:158;2915:12;;1624:154:162;1711:14;1744:27;2310:7:135;2354:8;2310:7;3609:2;2409:22;4499:136:187;3112:1368:158;3178:4;3307:21;;;:14;;;:21;;;;;;3343:13;;3339:1135;;3710:18;3731:12;3742:1;3731:8;:12;:::i;:::-;3777:18;;3710:33;;-1:-1:-1;3757:17:158;;3777:22;;3798:1;;3777:22;:::i;:::-;3757:42;;3832:9;3818:10;:23;3814:378;;3861:17;3881:3;:11;;3893:9;3881:22;;;;;;;;:::i;:::-;;;;;;;;;3861:42;;4028:9;4002:3;:11;;4014:10;4002:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;4141:25;;;:14;;;:25;;;;;:36;;;3814:378;4270:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4373:3;:14;;:21;4388:5;4373:21;;;;;;;;;;;4366:28;;;4416:4;4409:11;;;;;;;3339:1135;4458:5;4451:12;;;;;3339:1135;3184:1296;3112:1368;;;;:::o;4824:237::-;4875:11;4889:12;4897:3;5434:18;;5352:107;4889:12;4875:26;-1:-1:-1;4916:9:158;4911:96;4935:3;4931:1;:7;4911:96;;;4966:3;:14;;:30;4981:3;:11;;4993:1;4981:14;;;;;;;;:::i;:::-;;;;;;;;;4966:30;;;;;;;;;;;4959:37;;;4940:3;;;;;4911:96;;;-1:-1:-1;;5039:11:158;33920:23:140;;2328:155:161:o;719:528:153:-;783:4;976:68;1009:7;-1:-1:-1;;;976:32:153;:68::i;:::-;972:269;;;1061:12;;1093:52;1115:7;-1:-1:-1;;;;;;1093:21:153;:52::i;:::-;1060:85;;;;1166:7;:21;;;;-1:-1:-1;1177:10:153;;1159:28;-1:-1:-1;;;719:528:153:o;4504:238::-;4606:4;4623:12;4637:14;4655:43;4677:7;4686:11;4655:21;:43::i;:::-;4622:76;;;;4715:7;:20;;;;-1:-1:-1;4726:9:153;4708:27;-1:-1:-1;;;;4504:238:153:o;2409:22:135:-;2379:52;;2463:19;2445:14;:37;;:71;;;;-1:-1:-1;1749:17:135;-1:-1:-1;;;;;1973:31:135;2505:10;1973:31;2486:30;2441:272;;;2583:47;:8;2592:36;;;2583:8;;:47;:::i;:::-;2575:56;;;:::i;:::-;2567:65;;2560:72;;;;2248:471;:::o;2441:272::-;735:10:143;2677:25:135;;;;2248:471;:::o;5198:628:153:-;-1:-1:-1;;;5310:12:153;5452:22;;;5494:4;5487:25;;;5310:12;;;5581:4;5310:12;5569:4;5310:12;5554:7;5547:5;5536:50;5525:61;;5740:4;5734:11;5727:19;5720:27;5654:4;5636:16;5633:26;5612:198;5599:211;;5438:382;5198:628;;;;;:::o;14:286:231:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:231;;209:43;;199:71;;266:1;263;256:12;679:131;-1:-1:-1;;;;;754:31:231;;744:42;;734:70;;800:1;797;790:12;815:650;901:6;909;917;925;978:3;966:9;957:7;953:23;949:33;946:53;;;995:1;992;985:12;946:53;1034:9;1021:23;1053:31;1078:5;1053:31;:::i;:::-;1103:5;-1:-1:-1;1160:2:231;1145:18;;1132:32;1173:33;1132:32;1173:33;:::i;:::-;1225:7;-1:-1:-1;1284:2:231;1269:18;;1256:32;1297:33;1256:32;1297:33;:::i;:::-;815:650;;;;-1:-1:-1;1349:7:231;;1429:2;1414:18;1401:32;;-1:-1:-1;;815:650:231:o;1470:247::-;1529:6;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;1637:9;1624:23;1656:31;1681:5;1656:31;:::i;1722:637::-;1912:2;1924:21;;;1994:13;;1897:18;;;2016:22;;;1864:4;;2095:15;;;2069:2;2054:18;;;1864:4;2138:195;2152:6;2149:1;2146:13;2138:195;;;2217:13;;-1:-1:-1;;;;;2213:39:231;2201:52;;2282:2;2308:15;;;;2273:12;;;;2249:1;2167:9;2138:195;;;-1:-1:-1;2350:3:231;;1722:637;-1:-1:-1;;;;;1722:637:231:o;2631:418::-;2780:2;2769:9;2762:21;2743:4;2812:6;2806:13;2855:6;2850:2;2839:9;2835:18;2828:34;2914:6;2909:2;2901:6;2897:15;2892:2;2881:9;2877:18;2871:50;2970:1;2965:2;2956:6;2945:9;2941:22;2937:31;2930:42;3040:2;3033;3029:7;3024:2;3016:6;3012:15;3008:29;2997:9;2993:45;2989:54;2981:62;;;2631:418;;;;:::o;3054:367::-;3122:6;3130;3183:2;3171:9;3162:7;3158:23;3154:32;3151:52;;;3199:1;3196;3189:12;3151:52;3238:9;3225:23;3257:31;3282:5;3257:31;:::i;:::-;3307:5;3385:2;3370:18;;;;3357:32;;-1:-1:-1;;;3054:367:231:o;3634:114::-;3718:4;3711:5;3707:16;3700:5;3697:27;3687:55;;3738:1;3735;3728:12;3753:243;3810:6;3863:2;3851:9;3842:7;3838:23;3834:32;3831:52;;;3879:1;3876;3869:12;3831:52;3918:9;3905:23;3937:29;3960:5;3937:29;:::i;4001:508::-;4078:6;4086;4094;4147:2;4135:9;4126:7;4122:23;4118:32;4115:52;;;4163:1;4160;4153:12;4115:52;4202:9;4189:23;4221:31;4246:5;4221:31;:::i;:::-;4271:5;-1:-1:-1;4328:2:231;4313:18;;4300:32;4341:33;4300:32;4341:33;:::i;:::-;4001:508;;4393:7;;-1:-1:-1;;;4473:2:231;4458:18;;;;4445:32;;4001:508::o;4514:625::-;4615:6;4623;4676:2;4664:9;4655:7;4651:23;4647:32;4644:52;;;4692:1;4689;4682:12;4644:52;4732:9;4719:23;4765:18;4757:6;4754:30;4751:50;;;4797:1;4794;4787:12;4751:50;4820:22;;4873:4;4865:13;;4861:27;-1:-1:-1;4851:55:231;;4902:1;4899;4892:12;4851:55;4942:2;4929:16;4968:18;4960:6;4957:30;4954:50;;;5000:1;4997;4990:12;4954:50;5053:7;5048:2;5038:6;5035:1;5031:14;5027:2;5023:23;5019:32;5016:45;5013:65;;;5074:1;5071;5064:12;5013:65;5105:2;5097:11;;;;;5127:6;;-1:-1:-1;4514:625:231;-1:-1:-1;;;4514:625:231:o;5515:226::-;5574:6;5627:2;5615:9;5606:7;5602:23;5598:32;5595:52;;;5643:1;5640;5633:12;5595:52;-1:-1:-1;5688:23:231;;5515:226;-1:-1:-1;5515:226:231:o;5878:127::-;5939:10;5934:3;5930:20;5927:1;5920:31;5970:4;5967:1;5960:15;5994:4;5991:1;5984:15;6860:277;6927:6;6980:2;6968:9;6959:7;6955:23;6951:32;6948:52;;;6996:1;6993;6986:12;6948:52;7028:9;7022:16;7081:5;7074:13;7067:21;7060:5;7057:32;7047:60;;7103:1;7100;7093:12;7142:127;7203:10;7198:3;7194:20;7191:1;7184:31;7234:4;7231:1;7224:15;7258:4;7255:1;7248:15;7274:935;7354:6;7407:2;7395:9;7386:7;7382:23;7378:32;7375:52;;;7423:1;7420;7413:12;7375:52;7456:9;7450:16;7489:18;7481:6;7478:30;7475:50;;;7521:1;7518;7511:12;7475:50;7544:22;;7597:4;7589:13;;7585:27;-1:-1:-1;7575:55:231;;7626:1;7623;7616:12;7575:55;7659:2;7653:9;7685:18;7677:6;7674:30;7671:56;;;7707:18;;:::i;:::-;7756:2;7750:9;7848:2;7810:17;;-1:-1:-1;;7806:31:231;;;7839:2;7802:40;7798:54;7786:67;;7883:18;7868:34;;7904:22;;;7865:62;7862:88;;;7930:18;;:::i;:::-;7966:2;7959:22;7990;;;8031:15;;;8048:2;8027:24;8024:37;-1:-1:-1;8021:57:231;;;8074:1;8071;8064:12;8021:57;8123:6;8118:2;8114;8110:11;8105:2;8097:6;8093:15;8087:43;8176:1;8150:19;;;8171:2;8146:28;8139:39;;;;8154:6;7274:935;-1:-1:-1;;;;7274:935:231:o;8214:247::-;8282:6;8335:2;8323:9;8314:7;8310:23;8306:32;8303:52;;;8351:1;8348;8341:12;8303:52;8383:9;8377:16;8402:29;8425:5;8402:29;:::i;8466:225::-;8533:9;;;8554:11;;;8551:134;;;8607:10;8602:3;8598:20;8595:1;8588:31;8642:4;8639:1;8632:15;8670:4;8667:1;8660:15;8696:127;8757:10;8752:3;8748:20;8745:1;8738:31;8788:4;8785:1;8778:15;8812:4;8809:1;8802:15;8828:331;8933:9;8944;8986:8;8974:10;8971:24;8968:44;;;9008:1;9005;8998:12;8968:44;9037:6;9027:8;9024:20;9021:40;;;9057:1;9054;9047:12;9021:40;-1:-1:-1;;9083:23:231;;;9128:25;;;;;-1:-1:-1;8828:331:231:o;9164:374::-;9285:19;;-1:-1:-1;;9322:40:231;;;9382:2;9374:11;;9371:161;;;-1:-1:-1;;9444:2:231;9440:12;;;;9437:1;9433:20;9429:58;;;9421:67;9417:105;;;;9164:374;-1:-1:-1;;9164:374:231:o","linkReferences":{},"immutableReferences":{"55852":[{"start":730,"length":32},{"start":858,"length":32},{"start":4998,"length":32}]}},"methodIdentifiers":{"COMPLIANCE_MANAGER_ROLE()":"03c26bcd","RULES_MANAGEMENT_ROLE()":"9b11c115","addRule(address)":"e3c4602c","bindToken(address)":"3ff5aa02","canTransfer(address,address,uint256)":"e46638e6","canTransferFrom(address,address,address,uint256)":"7157797f","clearRules()":"b043572e","containsRule(address)":"54e4b945","created(address,uint256)":"5f8dead3","destroyed(address,uint256)":"8d2ea772","detectTransferRestriction(address,address,uint256)":"d4ce1415","detectTransferRestrictionFrom(address,address,address,uint256)":"d32c7bb5","getTokenBound()":"6a3edf28","getTokenBounds()":"e54621d2","isTokenBound(address)":"993e8b95","isTrustedForwarder(address)":"572b6c05","messageForTransferRestriction(uint8)":"7f4ab1dd","owner()":"8da5cb5b","removeRule(address)":"df21950f","renounceOwnership()":"715018a6","rule(uint256)":"db18af6c","rules()":"52f6747a","rulesCount()":"bc13eacc","setRules(address[])":"b27aef3a","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","transferred(address,address,address,uint256)":"3e5af4ca","transferred(address,address,uint256)":"8baf29b4","trustedForwarder()":"7da0a877","unbindToken(address)":"40db3b50","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.34+commit.80d5c536\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_OperationNotSuccessful\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_TokenAlreadyBound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_TokenNotBound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleInvalidInterface\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_OperationNotSuccessful\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleDoNotMatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IRule\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IRule\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"RemoveRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenBound\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenUnbound\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COMPLIANCE_MANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RULES_MANAGEMENT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"bindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"canTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"canTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRules\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"containsRule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"created\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"destroyed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestrictionFrom\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenBound\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenBounds\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isTokenBound\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"removeRule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"rule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rules\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRules\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"unbindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"version_\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"AddRule(address)\":{\"params\":{\"rule\":\"The address of the rule contract that was added.\"}},\"RemoveRule(address)\":{\"params\":{\"rule\":\"The address of the rule contract that was removed.\"}},\"TokenBound(address)\":{\"params\":{\"token\":\"The address of the token that was bound.\"}},\"TokenUnbound(address)\":{\"params\":{\"token\":\"The address of the token that was unbound.\"}}},\"kind\":\"dev\",\"methods\":{\"addRule(address)\":{\"details\":\"No on-chain maximum number of rules is enforced. Adding too many rules can increase transfer-time gas usage because rule checks are linear in rule count. Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts.\",\"params\":{\"rule_\":\"The IRule contract to add.\"}},\"bindToken(address)\":{\"details\":\"Operator warning: \\\"multi-tenant\\\" means one RuleEngine is shared by multiple token contracts. In that setup, bind only tokens that are equally trusted and governed together.\",\"params\":{\"token\":\"The address of the token to bind.\"}},\"canTransfer(address,address,uint256)\":{\"details\":\"Don't check the balance and the user's right (access control)\"},\"canTransferFrom(address,address,address,uint256)\":{\"details\":\"Does not check balances or access rights (Access Control).\",\"params\":{\"from\":\"The source address.\",\"spender\":\"The address performing the transfer.\",\"to\":\"The destination address.\",\"value\":\"The number of tokens to transfer.\"},\"returns\":{\"_0\":\"isCompliant True if the transfer complies with policy.\"}},\"clearRules()\":{\"details\":\"After calling this function, no rules will remain set. Developers should keep in mind that this function has an unbounded cost and using it may render the function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.\"},\"constructor\":{\"params\":{\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\",\"owner_\":\"Address of the contract owner (ERC-173)\",\"tokenContract\":\"Address of the token contract to bind (can be zero address)\"}},\"containsRule(address)\":{\"details\":\"Complexity: O(1).\",\"params\":{\"rule_\":\"The IRule contract to check for membership.\"},\"returns\":{\"_0\":\"True if the rule is present, false otherwise.\"}},\"created(address,uint256)\":{\"details\":\"Called by the token contract when new tokens are issued to an account. Reverts if the minting does not comply with the rules.\",\"params\":{\"to\":\"The address receiving the minted tokens.\",\"value\":\"The number of tokens created.\"}},\"destroyed(address,uint256)\":{\"details\":\"Called by the token contract when tokens are redeemed or burned. Reverts if the burning does not comply with the rules.\",\"params\":{\"from\":\"The address whose tokens are being destroyed.\",\"value\":\"The number of tokens destroyed.\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"from\":\"the origin address\",\"to\":\"the destination address\",\"value\":\"to transfer\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK (0) if the transfer is valid\"}},\"detectTransferRestrictionFrom(address,address,address,uint256)\":{\"details\":\" See {ERC-1404} Add an additionnal argument `spender` This function is where an issuer enforces the restriction logic of their token transfers. Some examples of this might include: - checking if the token recipient is whitelisted, - checking if a sender's tokens are frozen in a lock-up period, etc.\",\"returns\":{\"_0\":\"uint8 restricted code, 0 means the transfer is authorized\"}},\"getTokenBound()\":{\"details\":\"If multiple tokens are supported, consider using getTokenBounds().\",\"returns\":{\"_0\":\"The address of the currently bound token.\"}},\"getTokenBounds()\":{\"details\":\"This is a view-only function and does not modify state. This function is not part of the original ERC-3643 specification This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.\",\"returns\":{\"_0\":\"An array of addresses of bound token contracts.\"}},\"isTokenBound(address)\":{\"details\":\"Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.\",\"params\":{\"token\":\"The token address to verify.\"},\"returns\":{\"_0\":\"True if the token is bound, false otherwise.\"}},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"details\":\"See {ERC-1404} This function is effectively an accessor for the \\\"message\\\", a human-readable explanation as to why a transaction is restricted. \"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeRule(address)\":{\"details\":\"Reverts if the provided rule is not found or does not match the stored rule at its index. Complexity: O(1).\",\"params\":{\"rule_\":\"The IRule contract to remove.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"rule(uint256)\":{\"details\":\"Reverts if `ruleId` is out of bounds. Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.\",\"params\":{\"ruleId\":\"The index of the desired rule in the array.\"},\"returns\":{\"_0\":\"The address of the corresponding IRule contract, return the `zero address` is out of bounds.\"}},\"rules()\":{\"details\":\"This is a view-only function that does not modify state. This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.\",\"returns\":{\"_0\":\"An array of all active rule contract addresses.\"}},\"rulesCount()\":{\"details\":\"Equivalent to the length of the internal rules array. Complexity: O(1)\",\"returns\":{\"_0\":\"The number of active rules.\"}},\"setRules(address[])\":{\"details\":\"Replaces the entire rule set atomically. Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. To transition from one non-empty set to another without an enforcement gap, call this function directly with the new set. No on-chain maximum number of rules is enforced. Operators are responsible for keeping the rule set size compatible with the target chain gas limits. Security convention: rule contracts should be treated as trusted business logic, but should not also be granted {RULES_MANAGEMENT_ROLE}.\",\"params\":{\"rules_\":\"The array of addresses representing the new rules to be set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"transferred(address,address,address,uint256)\":{\"details\":\" Must revert if the transfer is invalid Same name as ERC-3643 but with one supplementary argument `spender` This function can be used to update state variables of the RuleEngine contract This function can be called ONLY by the token contract bound to the RuleEngine\",\"params\":{\"from\":\"token holder address\",\"spender\":\"spender address (sender)\",\"to\":\"receiver address\",\"value\":\"value of tokens involved in the transfer\"}},\"transferred(address,address,uint256)\":{\"details\":\" This function can be used to update state variables of the compliance contract This function can be called ONLY by the token contract bound to the compliance\",\"params\":{\"from\":\"The address of the sender\",\"to\":\"The address of the receiver\",\"value\":\"value of tokens involved in the transfer\"}},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"unbindToken(address)\":{\"details\":\"Operator warning: unbinding is an administrative operation and does not erase any state already stored by external rule contracts in a previously shared (\\\"multi-tenant\\\") setup.\",\"params\":{\"token\":\"The address of the token to unbind.\"}},\"version()\":{\"details\":\"This value is useful to know which smart contract version has been used\",\"returns\":{\"version_\":\"A string representing the version of the token implementation (e.g., \\\"1.0.0\\\").\"}}},\"title\":\"Implementation of a ruleEngine with ERC-173 Ownable access control\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Emitted when a new rule is added to the rule set.\"},\"ClearRules()\":{\"notice\":\"Emitted when all rules are cleared from the rule set.\"},\"RemoveRule(address)\":{\"notice\":\"Emitted when a rule is removed from the rule set.\"},\"TokenBound(address)\":{\"notice\":\"Emitted when a token is successfully bound to the compliance contract.\"},\"TokenUnbound(address)\":{\"notice\":\"Emitted when a token is successfully unbound from the compliance contract.\"}},\"kind\":\"user\",\"methods\":{\"RULES_MANAGEMENT_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"addRule(address)\":{\"notice\":\"Adds a new rule to the current rule set.\"},\"bindToken(address)\":{\"notice\":\"Associates a token contract with this compliance contract.\"},\"canTransfer(address,address,uint256)\":{\"notice\":\"Returns true if the transfer is valid, and false otherwise.\"},\"canTransferFrom(address,address,address,uint256)\":{\"notice\":\"Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules.\"},\"clearRules()\":{\"notice\":\"Removes all configured rules.\"},\"containsRule(address)\":{\"notice\":\"Checks whether a specific rule is currently configured.\"},\"created(address,uint256)\":{\"notice\":\"Updates the compliance contract state when tokens are created (minted).\"},\"destroyed(address,uint256)\":{\"notice\":\"Updates the compliance contract state when tokens are destroyed (burned).\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"detectTransferRestrictionFrom(address,address,address,uint256)\":{\"notice\":\"Returns a uint8 code to indicate if a transfer is restricted or not\"},\"getTokenBound()\":{\"notice\":\"Returns the single token currently bound to this compliance contract.\"},\"getTokenBounds()\":{\"notice\":\"Returns all tokens currently bound to this compliance contract.\"},\"isTokenBound(address)\":{\"notice\":\"Checks whether a token is currently bound to this compliance contract.\"},\"removeRule(address)\":{\"notice\":\"Removes a specific rule from the current rule set.\"},\"rule(uint256)\":{\"notice\":\"Retrieves the rule address at a specific index.\"},\"rules()\":{\"notice\":\"Returns the full list of currently configured rules.\"},\"rulesCount()\":{\"notice\":\"Returns the total number of currently configured rules.\"},\"setRules(address[])\":{\"notice\":\"Defines the rules for the rule engine.\"},\"transferred(address,address,address,uint256)\":{\"notice\":\"Function called whenever tokens are transferred from one wallet to another\"},\"transferred(address,address,uint256)\":{\"notice\":\"Function called whenever tokens are transferred from one wallet to another\"},\"unbindToken(address)\":{\"notice\":\"Removes the association of a token contract from this compliance contract.\"},\"version()\":{\"notice\":\"Returns the current version of the token contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/deployment/RuleEngineOwnable.sol\":\"RuleEngineOwnable\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":CMTATv3.0.0/=lib/CMTATv3.0.0/contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol\":{\"keccak256\":\"0x524a2cf2214a82fb96e97a18a94956fee68a419ecd6b2dc841aa1105f336c3f1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://9c4728d80b6678101586515c0308c63bcba2a78b0a3c12d37b522d59f3175a01\",\"dweb:/ipfs/QmYP9SPbe2hB69jKkSg43qkz1HVxBayKrG14i9f6hx7hh8\"]},\"lib/CMTAT/contracts/interfaces/technical/IERC5679.sol\":{\"keccak256\":\"0xcc6f2e79d1d9eabcf4c7ffcbd85c0de31bb2b3cdf17eb847dffb7c2d2a8c4695\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://d618bc2be7c6bc167037fe57ca648523c671c61791f3f0c65965ab7139d6dc33\",\"dweb:/ipfs/QmSrCKWFjpg1SQ7v2k3vRyWpcU9dB6Pbk167R4oAzUc2Te\"]},\"lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol\":{\"keccak256\":\"0x1707381177447b1a398c443c7e753942df0c5d4633e80d2864db472e89e43dc0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c4281d98847629b67222332bea67f336623937758be908ee9ca1aa40b3abe19d\",\"dweb:/ipfs/QmZQBruKJH3sStjBmCb28rxRkUkZ4EFsDCi8WZ7Y85spxS\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol\":{\"keccak256\":\"0x17fb1f64b546fd882331dffbd8c7f4e53c51738b9e2621a0dcfcf30e64d8b66e\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c35fe277d5d99a0943293b5da5622947095e6b719af35fda9ef2c714a7879a4b\",\"dweb:/ipfs/QmRV5q3XvjJE8sxJJBpEkwk1qyz3r4McH2BdX1v2ZxZGZh\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7551.sol\":{\"keccak256\":\"0x709074d96bd5d7aa07d2ba3a1c9a99ae0fd4361f7322b528b42f3b83c5dcb984\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ca67a06011b746b55bf2465988dc10a4e6371e40b5108c54531f03e938bda865\",\"dweb:/ipfs/QmbjFyDAJsUXywqzU2s96pFqFpC5DLKdfa8WjMBtQPhKGE\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7943.sol\":{\"keccak256\":\"0x1a341fc7ee7d9b8b00b6168b35a6a844d90431749d8ca694174c52c41e11763f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4fb6b13953539b99262cb299961fb8ff8a020de79b12f76c63decf33ff9d5103\",\"dweb:/ipfs/QmQ3bnkQJgD2s6xpapThCPTSMbDREokVEiM7extwQgfrv7\"]},\"lib/CMTAT/contracts/library/ERC1404ExtendInterfaceId.sol\":{\"keccak256\":\"0xe5f6f08d319d27f20989936460d3947eed5fdcb470f80e920f4fb09ccc7e1e87\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://cb654fe37c2bc6c765c67c5f94a769580312d1d4109c50262677ac406362f91e\",\"dweb:/ipfs/Qmc8ZFVANCmULNozM2wFUSGKXBgUHR5bpDC3ZVjV4XoEv7\"]},\"lib/CMTAT/contracts/library/RuleEngineInterfaceId.sol\":{\"keccak256\":\"0x759990208069b5a0862a255eff790d52d1d64bbb6c334705fc12414936825692\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0bce1c17cbbddac4bf123f602dc980246e5bec724f5ed3107e148548b930e124\",\"dweb:/ipfs/QmRZUxmRN9ji9UYueD6knhnz2nSsDRZgRTX74uenGczVjA\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x9695d220b99dcf62910533bdf5d40d4cf6a4e04d5b106b6803a80586486dc7f7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://83b7aecd65882d8953643dce144efe91367082cc01830c9c4ed3c8a4837fb558\",\"dweb:/ipfs/QmQ5HxGavcCKjuhd8buv177qjG6A4kvxx4pZviceKdspdM\"]},\"lib/openzeppelin-contracts/contracts/utils/Arrays.sol\":{\"keccak256\":\"0xb3b81029526a4c3acf39e57cc446407141ebce338cc99585942af1340e1a69e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3857ce97e8f7a51ad78ea5419b3386e18fcc8af73b65803eedd8193ab7abc9df\",\"dweb:/ipfs/QmSQi6x2cYsUy76mfMNwuq151bVmh4kAND141kjume51Aq\"]},\"lib/openzeppelin-contracts/contracts/utils/Comparators.sol\":{\"keccak256\":\"0x302eecd8cf323b4690e3494a7d960b3cbce077032ab8ef655b323cdd136cec58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://49ba706f1bc476d68fe6c1fad75517acea4e9e275be0989b548e292eb3a3eacd\",\"dweb:/ipfs/QmeBpvcdGWzWMKTQESUCEhHgnEQYYATVwPxLMxa6vMT7jC\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol\":{\"keccak256\":\"0x94045fd4f268edf2b2d01ef119268548c320366d6f5294ad30c1b8f9d4f5225f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://edfda81f426f8948b3834115c21e83c48180e6db0d2a8cd2debb2185ed349337\",\"dweb:/ipfs/QmdYZneFyDAux1BuWQxLAdqtABrGS2k9WYCa7C9dvpKkWv\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0x7c7ad70641a7f8cd44def0857ec97b0e40bfd073b2d6037a5f57ce9527ee9bc5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e05c6572dfe769f7aea6f3a8002951cc12d143d980dad29f6c5feedf9408bc14\",\"dweb:/ipfs/QmXM7C8YEptxisZiEefXUrwdXt3zMaCobmkCchxTtDg1oK\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5\",\"dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9\",\"dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif\"]},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x5c298e834696707e274a71a224969d36faecd928a8076603210d67d091adb4ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a93fe967b4d55b31157164cbb7e3e1ebaf3535fc1d3f8d0156da7abb9b565d90\",\"dweb:/ipfs/QmXH7nyxwEUeMPFDDmkdUwqxLEcezaSmVyunyMAuck1WqR\"]},\"src/RuleEngineBase.sol\":{\"keccak256\":\"0x9edae8ce7df18638cf56b571be18251d4ac4c435844c8cd77d1f7f651623c568\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://9758c7256a994b371c00d9e0098be5d76d9896f2a556208dfb83768d4d4e916b\",\"dweb:/ipfs/QmdZwwiB29tzheoaoRWiJdbbGMH2nM46ojLp7WFjm9D19h\"]},\"src/RuleEngineOwnableShared.sol\":{\"keccak256\":\"0xbe119365533074f6f59227e4b74432e03407f553f13c8361c21166f1fbb67f19\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://22b0689c774191b4065d1eda22d040fc79211f83e41f018dfe4bfcae7a328a57\",\"dweb:/ipfs/QmS9EgzvD45x72bNpMW3hyMQHfPyyBJN24iJmAuR1cEjpc\"]},\"src/deployment/RuleEngineOwnable.sol\":{\"keccak256\":\"0x1b602dc94079c162e897f1dbc55284aaa1a64a8790ceb91721fa0e81b5173a7b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://028c26566591036d52e08ad109eb0c42be42b054cb0b5b05f567a33320912b03\",\"dweb:/ipfs/QmQhFyQfsgcdewRz1WJVBVmr5r5pigmzeg7MsjaLNUP9kZ\"]},\"src/interfaces/IERC3643Compliance.sol\":{\"keccak256\":\"0xf86e78e8f737795c3762b402b121b0f1822d6b27414aeca08ea6f036cccea07b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c795d1b89a1393b2225f6e58c0310d345d78ff534ab028353413c4a5aaf9ecf7\",\"dweb:/ipfs/QmNcJsJzLWzSAV77whMzu7je2Mj2pWoTYYn1z76kqB5mKH\"]},\"src/interfaces/IRule.sol\":{\"keccak256\":\"0x315fd1d0147d40d3cc1ee35f6ddb8c9e25e6e4f96034a285e6f342c59c3cc222\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5b0ecca410bf89169e5c6393bc4d8fce97a5b3dcf8a2bba02317da85c98f4d0c\",\"dweb:/ipfs/QmeGS5vbFwkmEvJh7s27Q9xW4xGXuUohh2zGPVbgxgjfnu\"]},\"src/interfaces/IRulesManagementModule.sol\":{\"keccak256\":\"0x1be8087ef526f664cf8ba5dd35d4d12fc1880f905e3ba2e553ee02cb7d6506c1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://545cafd73f2fe9b2b89b37e905057637f58ae2c1da7f3dc33493b515c87a720f\",\"dweb:/ipfs/QmXiTEhLSpN6sj1fiwFT9V6bGD1VCXTqQJiNnXcLrYmW7N\"]},\"src/modules/ERC2771ModuleStandalone.sol\":{\"keccak256\":\"0xecc9aec20ff41c46404f6fcb9bfb0fd5588781fbb4f2fbec351f603a31c178b0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://48674e77afe59b6c6e6aa8b0d5e370ca58c9a354b5dc294bb3c9f10fbd12a3f3\",\"dweb:/ipfs/QmY3HhbBDqsBvrGBXoRwgVpfSNtiK2XmhaxVpS1F3dSPx9\"]},\"src/modules/ERC3643ComplianceModule.sol\":{\"keccak256\":\"0xdb472471270ea23d4694ca2d2eb107ce668affc9dbe18b5a6eda312ab4800a33\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://6200e990afca50a32fb0a0ad76ffe955447a67cab6e93f64281fc9f14208aab1\",\"dweb:/ipfs/QmXXhRsBq3eGDgBqQwWL5w4Sn6pdTeeXRvpC4jZBDVb6nQ\"]},\"src/modules/RulesManagementModule.sol\":{\"keccak256\":\"0xc9c58e027874658577285de9c9bf9069cd773573a615df7c9644c6c96c69dbc3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a6c9ca74cc247b42b9852b35cb4eeadc919d383d7bbd4f4df0739ee6a8bce2c3\",\"dweb:/ipfs/QmfJCvSQjqQrQXYt9JEHiJRZATy1s7q53DKxZC1QsSYMHZ\"]},\"src/modules/VersionModule.sol\":{\"keccak256\":\"0x077070dca24da125a764111d336c0a8fb3445b82d93692ff76b22384b0f4f39f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://be8df88e667fb2de39d095f0c396d23ed263fdc51a4095fedc89a326540a03ee\",\"dweb:/ipfs/QmYfhhEvNee1XYwCYZCVAKpUUWBd5FP5qvTMYGr6ogC8kA\"]},\"src/modules/library/ComplianceInterfaceId.sol\":{\"keccak256\":\"0xa0f15ca7f9e0fa8ccb854ea2bd812f220c68c280682b56e8d1a437ddba4b6d1f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://1e01a79b4a2110a401c3d2fbead97844f7428d6dc6603dccf795d42dbc142786\",\"dweb:/ipfs/QmV88ZcDHTU33oXNLFTshUBZ7otgcZRN1HXwywda7Fgz9a\"]},\"src/modules/library/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x15005e56f8fbf8f9b8a41c4bfed6c842e37be49fa52b0dbb2edc6b08b9e50c2f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://06c90dd748d060cb1b05de978cb42fd79d9b49a2beb3a479b4e49f8edaba1195\",\"dweb:/ipfs/QmYXEQWrwJkuzWBdi5hjSaM6pWhrNUf2kH2pHX8jRu9dZS\"]},\"src/modules/library/RuleInterfaceId.sol\":{\"keccak256\":\"0x3c57987589d6205e2546d4ce332e944d1667dddfe897087028a95ed804c50882\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0e1718e500d4cb5cf4441131c57d23da788f2835e9a014e7d1f62dfb6161647a\",\"dweb:/ipfs/QmXY5cjc9Dzrp7ML7DfvDB9zg7t4cene3g4K9AAuDmLLfC\"]},\"src/modules/library/RulesManagementModuleInvariantStorage.sol\":{\"keccak256\":\"0xa6f9109698f169be74c309a1efadd48edffcb0e9585523258477bf07942c8ae6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4c28513636b660111b60a7028c9600b30dcfda291a831343d9e27e253b80856a\",\"dweb:/ipfs/QmQVSZ9N6vjPxNnJDTqEuGSWqNdoxHKhzTzP2cvgZpBSzj\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.34+commit.80d5c536"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"forwarderIrrevocable","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_InvalidTokenAddress"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_OperationNotSuccessful"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_TokenAlreadyBound"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_TokenNotBound"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_UnauthorizedCaller"},{"inputs":[],"type":"error","name":"RuleEngine_RuleInvalidInterface"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_ArrayIsEmpty"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_OperationNotSuccessful"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleAlreadyExists"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleDoNotMatch"},{"inputs":[{"internalType":"contract IRule","name":"rule","type":"address","indexed":true}],"type":"event","name":"AddRule","anonymous":false},{"inputs":[],"type":"event","name":"ClearRules","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"contract IRule","name":"rule","type":"address","indexed":true}],"type":"event","name":"RemoveRule","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":false}],"type":"event","name":"TokenBound","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":false}],"type":"event","name":"TokenUnbound","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"COMPLIANCE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RULES_MANAGEMENT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRule"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"bindToken"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"canTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"canTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"clearRules"},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"view","type":"function","name":"containsRule","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"created"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"destroyed"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestrictionFrom","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getTokenBound","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getTokenBounds","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"view","type":"function","name":"isTokenBound","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"stateMutability":"view","type":"function","name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"stateMutability":"view","type":"function","name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeRule"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"uint256","name":"ruleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"rule","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rules","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract IRule[]","name":"rules_","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setRules"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferred"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferred"},{"inputs":[],"stateMutability":"view","type":"function","name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"unbindToken"},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"version_","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"addRule(address)":{"details":"No on-chain maximum number of rules is enforced. Adding too many rules can increase transfer-time gas usage because rule checks are linear in rule count. Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts.","params":{"rule_":"The IRule contract to add."}},"bindToken(address)":{"details":"Operator warning: \"multi-tenant\" means one RuleEngine is shared by multiple token contracts. In that setup, bind only tokens that are equally trusted and governed together.","params":{"token":"The address of the token to bind."}},"canTransfer(address,address,uint256)":{"details":"Don't check the balance and the user's right (access control)"},"canTransferFrom(address,address,address,uint256)":{"details":"Does not check balances or access rights (Access Control).","params":{"from":"The source address.","spender":"The address performing the transfer.","to":"The destination address.","value":"The number of tokens to transfer."},"returns":{"_0":"isCompliant True if the transfer complies with policy."}},"clearRules()":{"details":"After calling this function, no rules will remain set. Developers should keep in mind that this function has an unbounded cost and using it may render the function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block."},"constructor":{"params":{"forwarderIrrevocable":"Address of the forwarder, required for the gasless support","owner_":"Address of the contract owner (ERC-173)","tokenContract":"Address of the token contract to bind (can be zero address)"}},"containsRule(address)":{"details":"Complexity: O(1).","params":{"rule_":"The IRule contract to check for membership."},"returns":{"_0":"True if the rule is present, false otherwise."}},"created(address,uint256)":{"details":"Called by the token contract when new tokens are issued to an account. Reverts if the minting does not comply with the rules.","params":{"to":"The address receiving the minted tokens.","value":"The number of tokens created."}},"destroyed(address,uint256)":{"details":"Called by the token contract when tokens are redeemed or burned. Reverts if the burning does not comply with the rules.","params":{"from":"The address whose tokens are being destroyed.","value":"The number of tokens destroyed."}},"detectTransferRestriction(address,address,uint256)":{"params":{"from":"the origin address","to":"the destination address","value":"to transfer"},"returns":{"_0":"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK (0) if the transfer is valid"}},"detectTransferRestrictionFrom(address,address,address,uint256)":{"details":" See {ERC-1404} Add an additionnal argument `spender` This function is where an issuer enforces the restriction logic of their token transfers. Some examples of this might include: - checking if the token recipient is whitelisted, - checking if a sender's tokens are frozen in a lock-up period, etc.","returns":{"_0":"uint8 restricted code, 0 means the transfer is authorized"}},"getTokenBound()":{"details":"If multiple tokens are supported, consider using getTokenBounds().","returns":{"_0":"The address of the currently bound token."}},"getTokenBounds()":{"details":"This is a view-only function and does not modify state. This function is not part of the original ERC-3643 specification This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.","returns":{"_0":"An array of addresses of bound token contracts."}},"isTokenBound(address)":{"details":"Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.","params":{"token":"The token address to verify."},"returns":{"_0":"True if the token is bound, false otherwise."}},"isTrustedForwarder(address)":{"details":"Indicates whether any particular address is the trusted forwarder."},"messageForTransferRestriction(uint8)":{"details":"See {ERC-1404} This function is effectively an accessor for the \"message\", a human-readable explanation as to why a transaction is restricted. "},"owner()":{"details":"Returns the address of the current owner."},"removeRule(address)":{"details":"Reverts if the provided rule is not found or does not match the stored rule at its index. Complexity: O(1).","params":{"rule_":"The IRule contract to remove."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"rule(uint256)":{"details":"Reverts if `ruleId` is out of bounds. Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.","params":{"ruleId":"The index of the desired rule in the array."},"returns":{"_0":"The address of the corresponding IRule contract, return the `zero address` is out of bounds."}},"rules()":{"details":"This is a view-only function that does not modify state. This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.","returns":{"_0":"An array of all active rule contract addresses."}},"rulesCount()":{"details":"Equivalent to the length of the internal rules array. Complexity: O(1)","returns":{"_0":"The number of active rules."}},"setRules(address[])":{"details":"Replaces the entire rule set atomically. Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. To transition from one non-empty set to another without an enforcement gap, call this function directly with the new set. No on-chain maximum number of rules is enforced. Operators are responsible for keeping the rule set size compatible with the target chain gas limits. Security convention: rule contracts should be treated as trusted business logic, but should not also be granted {RULES_MANAGEMENT_ROLE}.","params":{"rules_":"The array of addresses representing the new rules to be set."}},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"transferred(address,address,address,uint256)":{"details":" Must revert if the transfer is invalid Same name as ERC-3643 but with one supplementary argument `spender` This function can be used to update state variables of the RuleEngine contract This function can be called ONLY by the token contract bound to the RuleEngine","params":{"from":"token holder address","spender":"spender address (sender)","to":"receiver address","value":"value of tokens involved in the transfer"}},"transferred(address,address,uint256)":{"details":" This function can be used to update state variables of the compliance contract This function can be called ONLY by the token contract bound to the compliance","params":{"from":"The address of the sender","to":"The address of the receiver","value":"value of tokens involved in the transfer"}},"trustedForwarder()":{"details":"Returns the address of the trusted forwarder."},"unbindToken(address)":{"details":"Operator warning: unbinding is an administrative operation and does not erase any state already stored by external rule contracts in a previously shared (\"multi-tenant\") setup.","params":{"token":"The address of the token to unbind."}},"version()":{"details":"This value is useful to know which smart contract version has been used","returns":{"version_":"A string representing the version of the token implementation (e.g., \"1.0.0\")."}}},"version":1},"userdoc":{"kind":"user","methods":{"RULES_MANAGEMENT_ROLE()":{"notice":"Role to manage the ruleEngine"},"addRule(address)":{"notice":"Adds a new rule to the current rule set."},"bindToken(address)":{"notice":"Associates a token contract with this compliance contract."},"canTransfer(address,address,uint256)":{"notice":"Returns true if the transfer is valid, and false otherwise."},"canTransferFrom(address,address,address,uint256)":{"notice":"Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules."},"clearRules()":{"notice":"Removes all configured rules."},"containsRule(address)":{"notice":"Checks whether a specific rule is currently configured."},"created(address,uint256)":{"notice":"Updates the compliance contract state when tokens are created (minted)."},"destroyed(address,uint256)":{"notice":"Updates the compliance contract state when tokens are destroyed (burned)."},"detectTransferRestriction(address,address,uint256)":{"notice":"Go through all the rule to know if a restriction exists on the transfer"},"detectTransferRestrictionFrom(address,address,address,uint256)":{"notice":"Returns a uint8 code to indicate if a transfer is restricted or not"},"getTokenBound()":{"notice":"Returns the single token currently bound to this compliance contract."},"getTokenBounds()":{"notice":"Returns all tokens currently bound to this compliance contract."},"isTokenBound(address)":{"notice":"Checks whether a token is currently bound to this compliance contract."},"removeRule(address)":{"notice":"Removes a specific rule from the current rule set."},"rule(uint256)":{"notice":"Retrieves the rule address at a specific index."},"rules()":{"notice":"Returns the full list of currently configured rules."},"rulesCount()":{"notice":"Returns the total number of currently configured rules."},"setRules(address[])":{"notice":"Defines the rules for the rule engine."},"transferred(address,address,address,uint256)":{"notice":"Function called whenever tokens are transferred from one wallet to another"},"transferred(address,address,uint256)":{"notice":"Function called whenever tokens are transferred from one wallet to another"},"unbindToken(address)":{"notice":"Removes the association of a token contract from this compliance contract."},"version()":{"notice":"Returns the current version of the token contract."}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","CMTAT/=lib/CMTAT/contracts/","CMTATv3.0.0/=lib/CMTATv3.0.0/contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/deployment/RuleEngineOwnable.sol":"RuleEngineOwnable"},"evmVersion":"prague","libraries":{}},"sources":{"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol":{"keccak256":"0x524a2cf2214a82fb96e97a18a94956fee68a419ecd6b2dc841aa1105f336c3f1","urls":["bzz-raw://9c4728d80b6678101586515c0308c63bcba2a78b0a3c12d37b522d59f3175a01","dweb:/ipfs/QmYP9SPbe2hB69jKkSg43qkz1HVxBayKrG14i9f6hx7hh8"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/technical/IERC5679.sol":{"keccak256":"0xcc6f2e79d1d9eabcf4c7ffcbd85c0de31bb2b3cdf17eb847dffb7c2d2a8c4695","urls":["bzz-raw://d618bc2be7c6bc167037fe57ca648523c671c61791f3f0c65965ab7139d6dc33","dweb:/ipfs/QmSrCKWFjpg1SQ7v2k3vRyWpcU9dB6Pbk167R4oAzUc2Te"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol":{"keccak256":"0x1707381177447b1a398c443c7e753942df0c5d4633e80d2864db472e89e43dc0","urls":["bzz-raw://c4281d98847629b67222332bea67f336623937758be908ee9ca1aa40b3abe19d","dweb:/ipfs/QmZQBruKJH3sStjBmCb28rxRkUkZ4EFsDCi8WZ7Y85spxS"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol":{"keccak256":"0x17fb1f64b546fd882331dffbd8c7f4e53c51738b9e2621a0dcfcf30e64d8b66e","urls":["bzz-raw://c35fe277d5d99a0943293b5da5622947095e6b719af35fda9ef2c714a7879a4b","dweb:/ipfs/QmRV5q3XvjJE8sxJJBpEkwk1qyz3r4McH2BdX1v2ZxZGZh"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7551.sol":{"keccak256":"0x709074d96bd5d7aa07d2ba3a1c9a99ae0fd4361f7322b528b42f3b83c5dcb984","urls":["bzz-raw://ca67a06011b746b55bf2465988dc10a4e6371e40b5108c54531f03e938bda865","dweb:/ipfs/QmbjFyDAJsUXywqzU2s96pFqFpC5DLKdfa8WjMBtQPhKGE"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7943.sol":{"keccak256":"0x1a341fc7ee7d9b8b00b6168b35a6a844d90431749d8ca694174c52c41e11763f","urls":["bzz-raw://4fb6b13953539b99262cb299961fb8ff8a020de79b12f76c63decf33ff9d5103","dweb:/ipfs/QmQ3bnkQJgD2s6xpapThCPTSMbDREokVEiM7extwQgfrv7"],"license":"MPL-2.0"},"lib/CMTAT/contracts/library/ERC1404ExtendInterfaceId.sol":{"keccak256":"0xe5f6f08d319d27f20989936460d3947eed5fdcb470f80e920f4fb09ccc7e1e87","urls":["bzz-raw://cb654fe37c2bc6c765c67c5f94a769580312d1d4109c50262677ac406362f91e","dweb:/ipfs/Qmc8ZFVANCmULNozM2wFUSGKXBgUHR5bpDC3ZVjV4XoEv7"],"license":"MPL-2.0"},"lib/CMTAT/contracts/library/RuleEngineInterfaceId.sol":{"keccak256":"0x759990208069b5a0862a255eff790d52d1d64bbb6c334705fc12414936825692","urls":["bzz-raw://0bce1c17cbbddac4bf123f602dc980246e5bec724f5ed3107e148548b930e124","dweb:/ipfs/QmRZUxmRN9ji9UYueD6knhnz2nSsDRZgRTX74uenGczVjA"],"license":"MPL-2.0"},"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol":{"keccak256":"0x9695d220b99dcf62910533bdf5d40d4cf6a4e04d5b106b6803a80586486dc7f7","urls":["bzz-raw://83b7aecd65882d8953643dce144efe91367082cc01830c9c4ed3c8a4837fb558","dweb:/ipfs/QmQ5HxGavcCKjuhd8buv177qjG6A4kvxx4pZviceKdspdM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Arrays.sol":{"keccak256":"0xb3b81029526a4c3acf39e57cc446407141ebce338cc99585942af1340e1a69e0","urls":["bzz-raw://3857ce97e8f7a51ad78ea5419b3386e18fcc8af73b65803eedd8193ab7abc9df","dweb:/ipfs/QmSQi6x2cYsUy76mfMNwuq151bVmh4kAND141kjume51Aq"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Comparators.sol":{"keccak256":"0x302eecd8cf323b4690e3494a7d960b3cbce077032ab8ef655b323cdd136cec58","urls":["bzz-raw://49ba706f1bc476d68fe6c1fad75517acea4e9e275be0989b548e292eb3a3eacd","dweb:/ipfs/QmeBpvcdGWzWMKTQESUCEhHgnEQYYATVwPxLMxa6vMT7jC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol":{"keccak256":"0x94045fd4f268edf2b2d01ef119268548c320366d6f5294ad30c1b8f9d4f5225f","urls":["bzz-raw://edfda81f426f8948b3834115c21e83c48180e6db0d2a8cd2debb2185ed349337","dweb:/ipfs/QmdYZneFyDAux1BuWQxLAdqtABrGS2k9WYCa7C9dvpKkWv"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"keccak256":"0x7c7ad70641a7f8cd44def0857ec97b0e40bfd073b2d6037a5f57ce9527ee9bc5","urls":["bzz-raw://e05c6572dfe769f7aea6f3a8002951cc12d143d980dad29f6c5feedf9408bc14","dweb:/ipfs/QmXM7C8YEptxisZiEefXUrwdXt3zMaCobmkCchxTtDg1oK"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857","urls":["bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5","dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083","urls":["bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9","dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x5c298e834696707e274a71a224969d36faecd928a8076603210d67d091adb4ae","urls":["bzz-raw://a93fe967b4d55b31157164cbb7e3e1ebaf3535fc1d3f8d0156da7abb9b565d90","dweb:/ipfs/QmXH7nyxwEUeMPFDDmkdUwqxLEcezaSmVyunyMAuck1WqR"],"license":"MIT"},"src/RuleEngineBase.sol":{"keccak256":"0x9edae8ce7df18638cf56b571be18251d4ac4c435844c8cd77d1f7f651623c568","urls":["bzz-raw://9758c7256a994b371c00d9e0098be5d76d9896f2a556208dfb83768d4d4e916b","dweb:/ipfs/QmdZwwiB29tzheoaoRWiJdbbGMH2nM46ojLp7WFjm9D19h"],"license":"MPL-2.0"},"src/RuleEngineOwnableShared.sol":{"keccak256":"0xbe119365533074f6f59227e4b74432e03407f553f13c8361c21166f1fbb67f19","urls":["bzz-raw://22b0689c774191b4065d1eda22d040fc79211f83e41f018dfe4bfcae7a328a57","dweb:/ipfs/QmS9EgzvD45x72bNpMW3hyMQHfPyyBJN24iJmAuR1cEjpc"],"license":"MPL-2.0"},"src/deployment/RuleEngineOwnable.sol":{"keccak256":"0x1b602dc94079c162e897f1dbc55284aaa1a64a8790ceb91721fa0e81b5173a7b","urls":["bzz-raw://028c26566591036d52e08ad109eb0c42be42b054cb0b5b05f567a33320912b03","dweb:/ipfs/QmQhFyQfsgcdewRz1WJVBVmr5r5pigmzeg7MsjaLNUP9kZ"],"license":"MPL-2.0"},"src/interfaces/IERC3643Compliance.sol":{"keccak256":"0xf86e78e8f737795c3762b402b121b0f1822d6b27414aeca08ea6f036cccea07b","urls":["bzz-raw://c795d1b89a1393b2225f6e58c0310d345d78ff534ab028353413c4a5aaf9ecf7","dweb:/ipfs/QmNcJsJzLWzSAV77whMzu7je2Mj2pWoTYYn1z76kqB5mKH"],"license":"MPL-2.0"},"src/interfaces/IRule.sol":{"keccak256":"0x315fd1d0147d40d3cc1ee35f6ddb8c9e25e6e4f96034a285e6f342c59c3cc222","urls":["bzz-raw://5b0ecca410bf89169e5c6393bc4d8fce97a5b3dcf8a2bba02317da85c98f4d0c","dweb:/ipfs/QmeGS5vbFwkmEvJh7s27Q9xW4xGXuUohh2zGPVbgxgjfnu"],"license":"MPL-2.0"},"src/interfaces/IRulesManagementModule.sol":{"keccak256":"0x1be8087ef526f664cf8ba5dd35d4d12fc1880f905e3ba2e553ee02cb7d6506c1","urls":["bzz-raw://545cafd73f2fe9b2b89b37e905057637f58ae2c1da7f3dc33493b515c87a720f","dweb:/ipfs/QmXiTEhLSpN6sj1fiwFT9V6bGD1VCXTqQJiNnXcLrYmW7N"],"license":"MPL-2.0"},"src/modules/ERC2771ModuleStandalone.sol":{"keccak256":"0xecc9aec20ff41c46404f6fcb9bfb0fd5588781fbb4f2fbec351f603a31c178b0","urls":["bzz-raw://48674e77afe59b6c6e6aa8b0d5e370ca58c9a354b5dc294bb3c9f10fbd12a3f3","dweb:/ipfs/QmY3HhbBDqsBvrGBXoRwgVpfSNtiK2XmhaxVpS1F3dSPx9"],"license":"MPL-2.0"},"src/modules/ERC3643ComplianceModule.sol":{"keccak256":"0xdb472471270ea23d4694ca2d2eb107ce668affc9dbe18b5a6eda312ab4800a33","urls":["bzz-raw://6200e990afca50a32fb0a0ad76ffe955447a67cab6e93f64281fc9f14208aab1","dweb:/ipfs/QmXXhRsBq3eGDgBqQwWL5w4Sn6pdTeeXRvpC4jZBDVb6nQ"],"license":"MPL-2.0"},"src/modules/RulesManagementModule.sol":{"keccak256":"0xc9c58e027874658577285de9c9bf9069cd773573a615df7c9644c6c96c69dbc3","urls":["bzz-raw://a6c9ca74cc247b42b9852b35cb4eeadc919d383d7bbd4f4df0739ee6a8bce2c3","dweb:/ipfs/QmfJCvSQjqQrQXYt9JEHiJRZATy1s7q53DKxZC1QsSYMHZ"],"license":"MPL-2.0"},"src/modules/VersionModule.sol":{"keccak256":"0x077070dca24da125a764111d336c0a8fb3445b82d93692ff76b22384b0f4f39f","urls":["bzz-raw://be8df88e667fb2de39d095f0c396d23ed263fdc51a4095fedc89a326540a03ee","dweb:/ipfs/QmYfhhEvNee1XYwCYZCVAKpUUWBd5FP5qvTMYGr6ogC8kA"],"license":"MPL-2.0"},"src/modules/library/ComplianceInterfaceId.sol":{"keccak256":"0xa0f15ca7f9e0fa8ccb854ea2bd812f220c68c280682b56e8d1a437ddba4b6d1f","urls":["bzz-raw://1e01a79b4a2110a401c3d2fbead97844f7428d6dc6603dccf795d42dbc142786","dweb:/ipfs/QmV88ZcDHTU33oXNLFTshUBZ7otgcZRN1HXwywda7Fgz9a"],"license":"MPL-2.0"},"src/modules/library/RuleEngineInvariantStorage.sol":{"keccak256":"0x15005e56f8fbf8f9b8a41c4bfed6c842e37be49fa52b0dbb2edc6b08b9e50c2f","urls":["bzz-raw://06c90dd748d060cb1b05de978cb42fd79d9b49a2beb3a479b4e49f8edaba1195","dweb:/ipfs/QmYXEQWrwJkuzWBdi5hjSaM6pWhrNUf2kH2pHX8jRu9dZS"],"license":"MPL-2.0"},"src/modules/library/RuleInterfaceId.sol":{"keccak256":"0x3c57987589d6205e2546d4ce332e944d1667dddfe897087028a95ed804c50882","urls":["bzz-raw://0e1718e500d4cb5cf4441131c57d23da788f2835e9a014e7d1f62dfb6161647a","dweb:/ipfs/QmXY5cjc9Dzrp7ML7DfvDB9zg7t4cene3g4K9AAuDmLLfC"],"license":"MPL-2.0"},"src/modules/library/RulesManagementModuleInvariantStorage.sol":{"keccak256":"0xa6f9109698f169be74c309a1efadd48edffcb0e9585523258477bf07942c8ae6","urls":["bzz-raw://4c28513636b660111b60a7028c9600b30dcfda291a831343d9e27e253b80856a","dweb:/ipfs/QmQVSZ9N6vjPxNnJDTqEuGSWqNdoxHKhzTzP2cvgZpBSzj"],"license":"MPL-2.0"}},"version":1},"id":164} \ No newline at end of file diff --git a/doc/compilation/v3.0.0-rc2/foundry/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.json b/doc/compilation/v3.0.0-rc2/foundry/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.json new file mode 100644 index 0000000..3041cec --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/foundry/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"owner_","type":"address","internalType":"address"},{"name":"forwarderIrrevocable","type":"address","internalType":"address"},{"name":"tokenContract","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"COMPLIANCE_MANAGER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RULES_MANAGEMENT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"acceptOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bindToken","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canTransfer","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"canTransferFrom","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"clearRules","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"containsRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"created","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"destroyed","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"detectTransferRestriction","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"detectTransferRestrictionFrom","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getTokenBound","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getTokenBounds","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"isTokenBound","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isTrustedForwarder","inputs":[{"name":"forwarder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageForTransferRestriction","inputs":[{"name":"restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pendingOwner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"removeRule","inputs":[{"name":"rule_","type":"address","internalType":"contract IRule"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"rule","inputs":[{"name":"ruleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"rules","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"rulesCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"setRules","inputs":[{"name":"rules_","type":"address[]","internalType":"contract IRule[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferred","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferred","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"trustedForwarder","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"unbindToken","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"version_","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"AddRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"contract IRule"}],"anonymous":false},{"type":"event","name":"ClearRules","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferStarted","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RemoveRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"contract IRule"}],"anonymous":false},{"type":"event","name":"TokenBound","inputs":[{"name":"token","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TokenUnbound","inputs":[{"name":"token","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_InvalidTokenAddress","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_OperationNotSuccessful","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_TokenAlreadyBound","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_TokenNotBound","inputs":[]},{"type":"error","name":"RuleEngine_ERC3643Compliance_UnauthorizedCaller","inputs":[]},{"type":"error","name":"RuleEngine_RuleInvalidInterface","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_ArrayIsEmpty","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_OperationNotSuccessful","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleAlreadyExists","inputs":[]},{"type":"error","name":"RuleEngine_RulesManagementModule_RuleDoNotMatch","inputs":[]}],"bytecode":{"object":"0x60a060405234801561000f575f5ffd5b50604051611bd1380380611bd183398101604081905261002e91610258565b6001600160a01b038083166080528390839083908116156100525761005281610093565b50506001600160a01b03811661008157604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61008a8161014a565b50505050610298565b6001600160a01b0381166100ba576040516301b8831760e71b815260040160405180910390fd5b6100c5600282610166565b156100e35760405163f423354760e01b815260040160405180910390fd5b6100ee60028261018c565b61010b57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b9060200160405180910390a150565b600580546001600160a01b0319169055610163816101a0565b50565b6001600160a01b0381165f90815260018301602052604081205415155b90505b92915050565b5f610183836001600160a01b0384166101f1565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260018301602052604081205461023657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610186565b505f610186565b80516001600160a01b0381168114610253575f5ffd5b919050565b5f5f5f6060848603121561026a575f5ffd5b6102738461023d565b92506102816020850161023d565b915061028f6040850161023d565b90509250925092565b6080516119136102be5f395f81816102f00152818161037801526113ab01526119135ff3fe608060405234801561000f575f5ffd5b50600436106101f2575f3560e01c80638baf29b411610114578063d32c7bb5116100a9578063e30c397811610079578063e30c3978146104a1578063e3c4602c146104b2578063e46638e6146104c5578063e54621d2146104d8578063f2fde38b146104e0575f5ffd5b8063d32c7bb514610443578063d4ce141514610468578063db18af6c1461047b578063df21950f1461048e575f5ffd5b80639b11c115116100e45780639b11c115146103f9578063b043572e14610420578063b27aef3a14610428578063bc13eacc1461043b575f5ffd5b80638baf29b4146103af5780638d2ea772146103c25780638da5cb5b146103d5578063993e8b95146103e6575f5ffd5b8063572b6c051161018a5780637157797f1161015a5780637157797f1461035b57806379ba50971461036e5780637da0a877146103765780637f4ab1dd1461039c575f5ffd5b8063572b6c05146102e05780635f8dead3146103205780636a3edf2814610333578063715018a614610353575f5ffd5b806340db3b50116101c557806340db3b501461027b57806352f6747a1461028e57806354e4b945146102a357806354fd4d50146102b6575f5ffd5b806301ffc9a7146101f657806303c26bcd1461021e5780633e5af4ca146102535780633ff5aa0214610268575b5f5ffd5b6102096102043660046114f1565b6104f3565b60405190151581526020015b60405180910390f35b6102457fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610215565b61026661026136600461152c565b610539565b005b61026661027636600461157a565b610553565b61026661028936600461157a565b610567565b610296610578565b6040516102159190611595565b6102096102b136600461157a565b610588565b6040805180820190915260058152640332e302e360dc1b60208201525b60405161021591906115e0565b6102096102ee36600461157a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b61026661032e366004611615565b610593565b61033b6105aa565b6040516001600160a01b039091168152602001610215565b6102666105cc565b61020961036936600461152c565b6105df565b6102666105fc565b7f000000000000000000000000000000000000000000000000000000000000000061033b565b6102d36103aa36600461164d565b610663565b6102666103bd366004611668565b61066e565b6102666103d0366004611615565b610686565b6004546001600160a01b031661033b565b6102096103f436600461157a565b610699565b6102457fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102666106a5565b6102666104363660046116a6565b6106b5565b6102456107e1565b61045661045136600461152c565b6107eb565b60405160ff9091168152602001610215565b610456610476366004611668565b610801565b61033b610489366004611717565b610817565b61026661049c36600461157a565b610839565b6005546001600160a01b031661033b565b6102666104c036600461157a565b610871565b6102096104d3366004611668565b6108df565b6102966108f8565b6102666104ee36600461157a565b610904565b5f6104fd82610975565b8061051857506001600160e01b031982166307f5828d60e41b145b8061053357506001600160e01b031982166301ffc9a760e01b145b92915050565b6105416109e0565b61054d84848484610a10565b50505050565b61055b610ab2565b61056481610aba565b50565b61056f610ab2565b61056481610b72565b60606105835f610bfb565b905090565b5f6105338183610c07565b61059b6109e0565b6105a65f8383610c27565b5050565b5f5f6105b66002610cc0565b11156105c75761058360025f610cc9565b505f90565b6105d4610cd4565b6105dd5f610d32565b565b5f806105ed868686866107eb565b60ff161490505b949350505050565b5f610605610d4b565b9050806001600160a01b03166106236005546001600160a01b031690565b6001600160a01b03161461065a5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61056481610d32565b606061053382610d54565b6106766109e0565b610681838383610c27565b505050565b61068e6109e0565b6105a6825f83610c27565b5f610533600283610c07565b6106ad610ab2565b6105dd610e9e565b6106bd610ab2565b5f8190036106de576040516359203cb960e01b815260040160405180910390fd5b5f6106e85f610cc0565b11156106f6576106f6610e9e565b5f5b818110156106815761072f8383838181106107155761071561172e565b905060200201602081019061072a919061157a565b610ecf565b6107608383838181106107445761074461172e565b9050602002016020810190610759919061157a565b5f90610f06565b61077d5760405163f280d16160e01b815260040160405180910390fd5b82828281811061078f5761078f61172e565b90506020020160208101906107a4919061157a565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016106f8565b5f6105835f610cc0565b5f6107f885858585610f1a565b95945050505050565b5f61080d848484610fe5565b90505b9392505050565b5f6108215f610cc0565b821015610832576105335f83610cc9565b505f919050565b610841610ab2565b61084b5f82610c07565b61086857604051632cdc3a4160e21b815260040160405180910390fd5b610564816110a7565b610879610ab2565b61088281610ecf565b61088c5f82610f06565b6108a95760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f806108ec858585610801565b60ff1614949350505050565b60606105836002610bfb565b61090c610cd4565b600580546001600160a01b0383166001600160a01b0319909116811790915561093d6004546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b031982166320c49ce760e01b14806109a557506001600160e01b031982166378a8de7d60e01b145b806109c057506001600160e01b03198216630c51264760e21b145b8061053357506001600160e01b03198216637157797f60e01b1492915050565b6109f36109eb610d4b565b600290610c07565b6105dd5760405163e39b3c8f60e01b815260040160405180910390fd5b5f610a1a5f610cc0565b90505f5b81811015610aaa57610a305f82610cc9565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610a89575f5ffd5b505af1158015610a9b573d5f5f3e3d5ffd5b50505050806001019050610a1e565b505050505050565b6105dd610cd4565b6001600160a01b038116610ae1576040516301b8831760e71b815260040160405180910390fd5b610aec600282610c07565b15610b0a5760405163f423354760e01b815260040160405180910390fd5b610b15600282610f06565b610b3257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610b7d600282610c07565b610b9a57604051636a2b488360e11b815260040160405180910390fd5b610ba5600282611104565b610bc257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610b67565b60605f61081083611118565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610c315f610cc0565b90505f5b81811015610cb957610c475f82610cc9565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610c98575f5ffd5b505af1158015610caa573d5f5f3e3d5ffd5b50505050806001019050610c35565b5050505050565b5f610533825490565b5f6108108383611171565b610cdc610d4b565b6001600160a01b0316610cf76004546001600160a01b031690565b6001600160a01b0316146105dd57610d0d610d4b565b60405163118cdaa760e01b81526001600160a01b039091166004820152602401610651565b600580546001600160a01b031916905561056481611197565b5f6105836111e8565b60605f610d5f6107e1565b90505f5b81811015610e6257610d7481610817565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610dbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611742565b15610e5a57610ded81610817565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610e33573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105f49190810190611775565b600101610d63565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105dd5f6111f1565b610ed8816111fa565b610ee981632497d6cb60e01b611249565b61056457604051639952e34360e01b815260040160405180910390fd5b5f610810836001600160a01b038416611264565b5f5f610f246107e1565b90505f5b81811015610fd9575f610f3a82610817565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610f97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbb9190611828565b905060ff811615610fd05792506105f4915050565b50600101610f28565b505f9695505050505050565b5f5f610fef6107e1565b90505f5b8181101561109c575f61100582610817565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa15801561105a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107e9190611828565b905060ff811615611093579250610810915050565b50600101610ff3565b505f95945050505050565b6110b15f82611104565b6110ce5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f610810836001600160a01b0384166112b0565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561116557602002820191905f5260205f20905b815481526020019060010190808311611151575b50505050509050919050565b5f825f0182815481106111865761118661172e565b905f5260205f200154905092915050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f61058361139a565b61056481611404565b6001600160a01b0381166112215760405163f9d152fb60e01b815260040160405180910390fd5b61122b5f82610c07565b156105645760405163cc790a4b60e01b815260040160405180910390fd5b5f6112538361145d565b80156108105750610810838361149c565b5f8181526001830160205260408120546112a957508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610533565b505f610533565b5f818152600183016020526040812054801561138a575f6112d2600183611843565b85549091505f906112e590600190611843565b9050808214611344575f865f0182815481106113035761130361172e565b905f5260205f200154905080875f0184815481106113235761132361172e565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061135557611355611862565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610533565b5f915050610533565b5092915050565b5f3660148082108015906113d657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113fc576113e936828403815f611876565b6113f29161189d565b60601c9250505090565b339250505090565b5f61140d825490565b90505f5b8181101561145657826001015f845f0183815481106114325761143261172e565b905f5260205f20015481526020019081526020015f205f9055806001019050611411565b50505f9055565b5f61146f826301ffc9a760e01b61149c565b15610832575f80611488846001600160e01b03196114bd565b915091508180156105f45750159392505050565b5f5f5f6114a985856114bd565b915091508180156107f85750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611501575f5ffd5b81356001600160e01b031981168114610810575f5ffd5b6001600160a01b0381168114610564575f5ffd5b5f5f5f5f6080858703121561153f575f5ffd5b843561154a81611518565b9350602085013561155a81611518565b9250604085013561156a81611518565b9396929550929360600135925050565b5f6020828403121561158a575f5ffd5b813561081081611518565b602080825282518282018190525f918401906040840190835b818110156115d55783516001600160a01b03168352602093840193909201916001016115ae565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611626575f5ffd5b823561163181611518565b946020939093013593505050565b60ff81168114610564575f5ffd5b5f6020828403121561165d575f5ffd5b81356108108161163f565b5f5f5f6060848603121561167a575f5ffd5b833561168581611518565b9250602084013561169581611518565b929592945050506040919091013590565b5f5f602083850312156116b7575f5ffd5b823567ffffffffffffffff8111156116cd575f5ffd5b8301601f810185136116dd575f5ffd5b803567ffffffffffffffff8111156116f3575f5ffd5b8560208260051b8401011115611707575f5ffd5b6020919091019590945092505050565b5f60208284031215611727575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611752575f5ffd5b81518015158114610810575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611785575f5ffd5b815167ffffffffffffffff81111561179b575f5ffd5b8201601f810184136117ab575f5ffd5b805167ffffffffffffffff8111156117c5576117c5611761565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156117f4576117f4611761565b60405281815282820160200186101561180b575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611838575f5ffd5b81516108108161163f565b8181038181111561053357634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f85851115611884575f5ffd5b83861115611890575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611393576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea2646970667358221220112af4469313f66a43c96817f27e5105f6d280d5212be301d8cd5f7becaaa13464736f6c63430008220033","sourceMap":"467:1692:165:-:0;;;805:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1542:37:135;;;;;971:6:165;;918:20;;940:13;;956:27:162;::::1;::::0;952:83:::1;;999:25;1010:13:::0;999:10:::1;:25::i;:::-;-1:-1:-1::0;;;;;;;1273:26:128;;1269:95;;1322:31;;-1:-1:-1;;;1322:31:128;;1350:1;1322:31;;;725:51:231;698:18;;1322:31:128;;;;;;;1269:95;1373:32;1392:12;1373:18;:32::i;:::-;1225:187;805:180:165;;;467:1692;;3688:459:186;-1:-1:-1;;;;;3750:19:186;;3742:80;;;;-1:-1:-1;;;3742:80:186;;;;;;;;;;;;3841:28;:12;3863:5;3841:21;:28::i;:::-;3840:29;3832:88;;;;-1:-1:-1;;;3832:88:186;;;;;;;;;;;;4029:23;:12;4046:5;4029:16;:23::i;:::-;4021:87;;;;-1:-1:-1;;;4021:87:186;;;;;;;;;;;;4123:17;;-1:-1:-1;;;;;743:32:231;;725:51;;4123:17:186;;713:2:231;698:18;4123:17:186;;;;;;;3688:459;:::o;2011:153:129:-;2100:13;2093:20;;-1:-1:-1;;;;;;2093:20:129;;;2123:34;2148:8;2123:24;:34::i;:::-;2011:153;:::o;16041:165:158:-;-1:-1:-1;;;;;16174:23:158;;16121:4;5238:21;;;:14;;;:21;;;;;;:26;;16144:55;16137:62;;16041:165;;;;;:::o;15089:150::-;15159:4;15182:50;15187:3;-1:-1:-1;;;;;15207:23:158;;15182:4;:50::i;2912:187:128:-;3004:6;;;-1:-1:-1;;;;;3020:17:128;;;-1:-1:-1;;;;;;3020:17:128;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;2538:406:158:-;2601:4;5238:21;;;:14;;;:21;;;;;;2617:321;;-1:-1:-1;2659:23:158;;;;;;;;:11;:23;;;;;;;;;;;;;2841:18;;2817:21;;;:14;;;:21;;;;;;:42;;;;2873:11;;2617:321;-1:-1:-1;2922:5:158;2915:12;;14:177:231;93:13;;-1:-1:-1;;;;;135:31:231;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:378::-;284:6;292;300;353:2;341:9;332:7;328:23;324:32;321:52;;;369:1;366;359:12;321:52;392:40;422:9;392:40;:::i;:::-;382:50;;451:49;496:2;485:9;481:18;451:49;:::i;:::-;441:59;;519:49;564:2;553:9;549:18;519:49;:::i;:::-;509:59;;196:378;;;;;:::o;579:203::-;467:1692:165;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b50600436106101f2575f3560e01c80638baf29b411610114578063d32c7bb5116100a9578063e30c397811610079578063e30c3978146104a1578063e3c4602c146104b2578063e46638e6146104c5578063e54621d2146104d8578063f2fde38b146104e0575f5ffd5b8063d32c7bb514610443578063d4ce141514610468578063db18af6c1461047b578063df21950f1461048e575f5ffd5b80639b11c115116100e45780639b11c115146103f9578063b043572e14610420578063b27aef3a14610428578063bc13eacc1461043b575f5ffd5b80638baf29b4146103af5780638d2ea772146103c25780638da5cb5b146103d5578063993e8b95146103e6575f5ffd5b8063572b6c051161018a5780637157797f1161015a5780637157797f1461035b57806379ba50971461036e5780637da0a877146103765780637f4ab1dd1461039c575f5ffd5b8063572b6c05146102e05780635f8dead3146103205780636a3edf2814610333578063715018a614610353575f5ffd5b806340db3b50116101c557806340db3b501461027b57806352f6747a1461028e57806354e4b945146102a357806354fd4d50146102b6575f5ffd5b806301ffc9a7146101f657806303c26bcd1461021e5780633e5af4ca146102535780633ff5aa0214610268575b5f5ffd5b6102096102043660046114f1565b6104f3565b60405190151581526020015b60405180910390f35b6102457fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610215565b61026661026136600461152c565b610539565b005b61026661027636600461157a565b610553565b61026661028936600461157a565b610567565b610296610578565b6040516102159190611595565b6102096102b136600461157a565b610588565b6040805180820190915260058152640332e302e360dc1b60208201525b60405161021591906115e0565b6102096102ee36600461157a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b61026661032e366004611615565b610593565b61033b6105aa565b6040516001600160a01b039091168152602001610215565b6102666105cc565b61020961036936600461152c565b6105df565b6102666105fc565b7f000000000000000000000000000000000000000000000000000000000000000061033b565b6102d36103aa36600461164d565b610663565b6102666103bd366004611668565b61066e565b6102666103d0366004611615565b610686565b6004546001600160a01b031661033b565b6102096103f436600461157a565b610699565b6102457fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102666106a5565b6102666104363660046116a6565b6106b5565b6102456107e1565b61045661045136600461152c565b6107eb565b60405160ff9091168152602001610215565b610456610476366004611668565b610801565b61033b610489366004611717565b610817565b61026661049c36600461157a565b610839565b6005546001600160a01b031661033b565b6102666104c036600461157a565b610871565b6102096104d3366004611668565b6108df565b6102966108f8565b6102666104ee36600461157a565b610904565b5f6104fd82610975565b8061051857506001600160e01b031982166307f5828d60e41b145b8061053357506001600160e01b031982166301ffc9a760e01b145b92915050565b6105416109e0565b61054d84848484610a10565b50505050565b61055b610ab2565b61056481610aba565b50565b61056f610ab2565b61056481610b72565b60606105835f610bfb565b905090565b5f6105338183610c07565b61059b6109e0565b6105a65f8383610c27565b5050565b5f5f6105b66002610cc0565b11156105c75761058360025f610cc9565b505f90565b6105d4610cd4565b6105dd5f610d32565b565b5f806105ed868686866107eb565b60ff161490505b949350505050565b5f610605610d4b565b9050806001600160a01b03166106236005546001600160a01b031690565b6001600160a01b03161461065a5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61056481610d32565b606061053382610d54565b6106766109e0565b610681838383610c27565b505050565b61068e6109e0565b6105a6825f83610c27565b5f610533600283610c07565b6106ad610ab2565b6105dd610e9e565b6106bd610ab2565b5f8190036106de576040516359203cb960e01b815260040160405180910390fd5b5f6106e85f610cc0565b11156106f6576106f6610e9e565b5f5b818110156106815761072f8383838181106107155761071561172e565b905060200201602081019061072a919061157a565b610ecf565b6107608383838181106107445761074461172e565b9050602002016020810190610759919061157a565b5f90610f06565b61077d5760405163f280d16160e01b815260040160405180910390fd5b82828281811061078f5761078f61172e565b90506020020160208101906107a4919061157a565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016106f8565b5f6105835f610cc0565b5f6107f885858585610f1a565b95945050505050565b5f61080d848484610fe5565b90505b9392505050565b5f6108215f610cc0565b821015610832576105335f83610cc9565b505f919050565b610841610ab2565b61084b5f82610c07565b61086857604051632cdc3a4160e21b815260040160405180910390fd5b610564816110a7565b610879610ab2565b61088281610ecf565b61088c5f82610f06565b6108a95760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f806108ec858585610801565b60ff1614949350505050565b60606105836002610bfb565b61090c610cd4565b600580546001600160a01b0383166001600160a01b0319909116811790915561093d6004546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b031982166320c49ce760e01b14806109a557506001600160e01b031982166378a8de7d60e01b145b806109c057506001600160e01b03198216630c51264760e21b145b8061053357506001600160e01b03198216637157797f60e01b1492915050565b6109f36109eb610d4b565b600290610c07565b6105dd5760405163e39b3c8f60e01b815260040160405180910390fd5b5f610a1a5f610cc0565b90505f5b81811015610aaa57610a305f82610cc9565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610a89575f5ffd5b505af1158015610a9b573d5f5f3e3d5ffd5b50505050806001019050610a1e565b505050505050565b6105dd610cd4565b6001600160a01b038116610ae1576040516301b8831760e71b815260040160405180910390fd5b610aec600282610c07565b15610b0a5760405163f423354760e01b815260040160405180910390fd5b610b15600282610f06565b610b3257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610b7d600282610c07565b610b9a57604051636a2b488360e11b815260040160405180910390fd5b610ba5600282611104565b610bc257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610b67565b60605f61081083611118565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610c315f610cc0565b90505f5b81811015610cb957610c475f82610cc9565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610c98575f5ffd5b505af1158015610caa573d5f5f3e3d5ffd5b50505050806001019050610c35565b5050505050565b5f610533825490565b5f6108108383611171565b610cdc610d4b565b6001600160a01b0316610cf76004546001600160a01b031690565b6001600160a01b0316146105dd57610d0d610d4b565b60405163118cdaa760e01b81526001600160a01b039091166004820152602401610651565b600580546001600160a01b031916905561056481611197565b5f6105836111e8565b60605f610d5f6107e1565b90505f5b81811015610e6257610d7481610817565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610dbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611742565b15610e5a57610ded81610817565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610e33573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105f49190810190611775565b600101610d63565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105dd5f6111f1565b610ed8816111fa565b610ee981632497d6cb60e01b611249565b61056457604051639952e34360e01b815260040160405180910390fd5b5f610810836001600160a01b038416611264565b5f5f610f246107e1565b90505f5b81811015610fd9575f610f3a82610817565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610f97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbb9190611828565b905060ff811615610fd05792506105f4915050565b50600101610f28565b505f9695505050505050565b5f5f610fef6107e1565b90505f5b8181101561109c575f61100582610817565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa15801561105a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107e9190611828565b905060ff811615611093579250610810915050565b50600101610ff3565b505f95945050505050565b6110b15f82611104565b6110ce5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f610810836001600160a01b0384166112b0565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561116557602002820191905f5260205f20905b815481526020019060010190808311611151575b50505050509050919050565b5f825f0182815481106111865761118661172e565b905f5260205f200154905092915050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f61058361139a565b61056481611404565b6001600160a01b0381166112215760405163f9d152fb60e01b815260040160405180910390fd5b61122b5f82610c07565b156105645760405163cc790a4b60e01b815260040160405180910390fd5b5f6112538361145d565b80156108105750610810838361149c565b5f8181526001830160205260408120546112a957508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610533565b505f610533565b5f818152600183016020526040812054801561138a575f6112d2600183611843565b85549091505f906112e590600190611843565b9050808214611344575f865f0182815481106113035761130361172e565b905f5260205f200154905080875f0184815481106113235761132361172e565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061135557611355611862565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610533565b5f915050610533565b5092915050565b5f3660148082108015906113d657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113fc576113e936828403815f611876565b6113f29161189d565b60601c9250505090565b339250505090565b5f61140d825490565b90505f5b8181101561145657826001015f845f0183815481106114325761143261172e565b905f5260205f20015481526020019081526020015f205f9055806001019050611411565b50505f9055565b5f61146f826301ffc9a760e01b61149c565b15610832575f80611488846001600160e01b03196114bd565b915091508180156105f45750159392505050565b5f5f5f6114a985856114bd565b915091508180156107f85750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611501575f5ffd5b81356001600160e01b031981168114610810575f5ffd5b6001600160a01b0381168114610564575f5ffd5b5f5f5f5f6080858703121561153f575f5ffd5b843561154a81611518565b9350602085013561155a81611518565b9250604085013561156a81611518565b9396929550929360600135925050565b5f6020828403121561158a575f5ffd5b813561081081611518565b602080825282518282018190525f918401906040840190835b818110156115d55783516001600160a01b03168352602093840193909201916001016115ae565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611626575f5ffd5b823561163181611518565b946020939093013593505050565b60ff81168114610564575f5ffd5b5f6020828403121561165d575f5ffd5b81356108108161163f565b5f5f5f6060848603121561167a575f5ffd5b833561168581611518565b9250602084013561169581611518565b929592945050506040919091013590565b5f5f602083850312156116b7575f5ffd5b823567ffffffffffffffff8111156116cd575f5ffd5b8301601f810185136116dd575f5ffd5b803567ffffffffffffffff8111156116f3575f5ffd5b8560208260051b8401011115611707575f5ffd5b6020919091019590945092505050565b5f60208284031215611727575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611752575f5ffd5b81518015158114610810575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611785575f5ffd5b815167ffffffffffffffff81111561179b575f5ffd5b8201601f810184136117ab575f5ffd5b805167ffffffffffffffff8111156117c5576117c5611761565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156117f4576117f4611761565b60405281815282820160200186101561180b575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611838575f5ffd5b81516108108161163f565b8181038181111561053357634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f85851115611884575f5ffd5b83861115611890575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611393576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea2646970667358221220112af4469313f66a43c96817f27e5105f6d280d5212be301d8cd5f7becaaa13464736f6c63430008220033","sourceMap":"467:1692:165:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1091:257:162;;;;;;:::i;:::-;;:::i;:::-;;;470:14:231;;463:22;445:41;;433:2;418:18;1091:257:162;;;;;;;;729:86:186;;779:36;729:86;;;;;643:25:231;;;631:2;616:18;729:86:186;497:177:231;1726:276:161;;;;;;:::i;:::-;;:::i;:::-;;1846:114:186;;;;;;:::i;:::-;;:::i;2223:118::-;;;;;;:::i;:::-;;:::i;4499:136:187:-;;;:::i;:::-;;;;;;;:::i;3804:158::-;;;;;;:::i;:::-;;:::i;692:129:188:-;807:7;;;;;;;;;;;;-1:-1:-1;;;807:7:188;;;;692:129;;;;;;;:::i;1874:137:135:-;;;;;;:::i;:::-;1749:17;-1:-1:-1;;;;;1973:31:135;;;;;;;1874:137;2328:155:161;;;;;;:::i;:::-;;:::i;2564:382:186:-;;;:::i;:::-;;;-1:-1:-1;;;;;3590:32:231;;;3572:51;;3560:2;3545:18;2564:382:186;3426:203:231;2293:101:128;;;:::i;4340:311:161:-;;;;;;:::i;:::-;;:::i;2244:229:129:-;;;:::i;1666:107:135:-;1749:17;1666:107;;3695:240:161;;;;;;:::i;:::-;;:::i;2071:212::-;;;;;;:::i;:::-;;:::i;2528:161::-;;;;;;:::i;:::-;;:::i;1638:85:128:-;1710:6;;-1:-1:-1;;;;;1710:6:128;1638:85;;2386:133:186;;;;;;:::i;:::-;;:::i;1199:82:192:-;;1247:34;1199:82;;2485:117:187;;;:::i;1781:640::-;;;;;;:::i;:::-;;:::i;3608:132::-;;;:::i;3363:282:161:-;;;;;;:::i;:::-;;:::i;:::-;;;5498:4:231;5486:17;;;5468:36;;5456:2;5441:18;3363:282:161;5326:184:231;3065:242:161;;;;;;:::i;:::-;;:::i;4026:409:187:-;;;;;;:::i;:::-;;:::i;3258:234::-;;;;;;:::i;:::-;;:::i;1232:99:129:-;1311:13;;-1:-1:-1;;;;;1311:13:129;1232:99;;2923:271:187;;;;;;:::i;:::-;;:::i;3999:281:161:-;;;;;;:::i;:::-;;:::i;2991:119:186:-;;;:::i;1649:178:129:-;;;;;;:::i;:::-;;:::i;1091:257:162:-;1167:4;1190:45;1223:11;1190:32;:45::i;:::-;:95;;;-1:-1:-1;;;;;;;1251:34:162;;-1:-1:-1;;;1251:34:162;1190:95;:151;;;-1:-1:-1;;;;;;;1301:40:162;;-1:-1:-1;;;1301:40:162;1190:151;1183:158;1091:257;-1:-1:-1;;1091:257:162:o;1726:276:161:-;1217:18:186;:16;:18::i;:::-;1935:60:161::1;1970:7;1979:4;1985:2;1989:5;1935:34;:60::i;:::-;1726:276:::0;;;;:::o;1846:114:186:-;1302:24;:22;:24::i;:::-;1936:17:::1;1947:5;1936:10;:17::i;:::-;1846:114:::0;:::o;2223:118::-;1302:24;:22;:24::i;:::-;2315:19:::1;2328:5;2315:12;:19::i;4499:136:187:-:0;4578:16;4613:15;:6;:13;:15::i;:::-;4606:22;;4499:136;:::o;3804:158::-;3901:4;3924:31;3901:4;3948:5;3924:15;:31::i;2328:155:161:-;1217:18:186;:16;:18::i;:::-;2441:35:161::1;2462:1;2466:2;2470:5;2441:12;:35::i;:::-;2328:155:::0;;:::o;2564:382:186:-;2627:7;2674:1;2650:21;:12;:19;:21::i;:::-;:25;2646:294;;;2863:18;:12;2879:1;2863:15;:18::i;2646:294::-;-1:-1:-1;2927:1:186;;2564:382::o;2293:101:128:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;4340:311:161:-;4521:4;;4548:55;4578:7;4587:4;4593:2;4597:5;4548:29;:55::i;:::-;:96;;;4541:103;;4340:311;;;;;;;:::o;2244:229:129:-;2296:14;2313:12;:10;:12::i;:::-;2296:29;;2357:6;-1:-1:-1;;;;;2339:24:129;:14;1311:13;;-1:-1:-1;;;;;1311:13:129;;1232:99;2339:14;-1:-1:-1;;;;;2339:24:129;;2335:96;;2386:34;;-1:-1:-1;;;2386:34:129;;-1:-1:-1;;;;;3590:32:231;;2386:34:129;;;3572:51:231;3545:18;;2386:34:129;;;;;;;;2335:96;2440:26;2459:6;2440:18;:26::i;3695:240:161:-;3845:13;3881:47;3912:15;3881:30;:47::i;2071:212::-;1217:18:186;:16;:18::i;:::-;2247:29:161::1;2260:4;2266:2;2270:5;2247:12;:29::i;:::-;2071:212:::0;;;:::o;2528:161::-;1217:18:186;:16;:18::i;:::-;2645:37:161::1;2658:4;2672:1;2676:5;2645:12;:37::i;2386:133:186:-:0;2461:4;2484:28;:12;2506:5;2484:21;:28::i;2485:117:187:-;643:19;:17;:19::i;:::-;2582:13:::1;:11;:13::i;1781:640::-:0;643:19;:17;:19::i;:::-;1920:1:::1;1903:18:::0;;;1899:103:::1;;1944:47;;-1:-1:-1::0;;;1944:47:187::1;;;;;;;;;;;1899:103;2033:1;2015:15;:6;:13;:15::i;:::-;:19;2011:63;;;2050:13;:11;:13::i;:::-;2088:9;2083:332;2103:17:::0;;::::1;2083:332;;;2141:30;2160:6;;2167:1;2160:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2141:10;:30::i;:::-;2277;2296:6;;2303:1;2296:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2277:6;::::0;:10:::1;:30::i;:::-;2269:98;;;;-1:-1:-1::0;;;2269:98:187::1;;;;;;;;;;;;2394:6;;2401:1;2394:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2386:18:187::1;;;;;;;;;;;2122:3;;2083:332;;3608:132:::0;3692:7;3718:15;:6;:13;:15::i;3363:282:161:-;3554:5;3582:56;3613:7;3622:4;3628:2;3632:5;3582:30;:56::i;:::-;3575:63;3363:282;-1:-1:-1;;;;;3363:282:161:o;3065:242::-;3229:5;3257:43;3284:4;3290:2;3294:5;3257:26;:43::i;:::-;3250:50;;3065:242;;;;;;:::o;4026:409:187:-;4118:7;4150:15;:6;:13;:15::i;:::-;4141:6;:24;4137:292;;;4353:17;:6;4363;4353:9;:17::i;4137:292::-;-1:-1:-1;4416:1:187;;4026:409;-1:-1:-1;4026:409:187:o;3258:234::-;643:19;:17;:19::i;:::-;3374:31:::1;:6;3398:5:::0;3374:15:::1;:31::i;:::-;3366:91;;;;-1:-1:-1::0;;;3366:91:187::1;;;;;;;;;;;;3467:18;3479:5;3467:11;:18::i;2923:271::-:0;643:19;:17;:19::i;:::-;3028:26:::1;3047:5;3028:10;:26::i;:::-;3072;:6;3091:5:::0;3072:10:::1;:26::i;:::-;3064:94;;;;-1:-1:-1::0;;;3064:94:187::1;;;;;;;;;;;;3173:14;::::0;-1:-1:-1;;;;;3173:14:187;::::1;::::0;::::1;::::0;;;::::1;2923:271:::0;:::o;3999:281:161:-;4163:4;;4190:42;4216:4;4222:2;4226:5;4190:25;:42::i;:::-;:83;;;;3999:281;-1:-1:-1;;;;3999:281:161:o;2991:119:186:-;3047:16;3082:21;:12;:19;:21::i;1649:178:129:-;1531:13:128;:11;:13::i;:::-;1738::129::1;:24:::0;;-1:-1:-1;;;;;1738:24:129;::::1;-1:-1:-1::0;;;;;;1738:24:129;;::::1;::::0;::::1;::::0;;;1802:7:::1;1710:6:128::0;;-1:-1:-1;;;;;1710:6:128;;1638:85;1802:7:129::1;-1:-1:-1::0;;;;;1777:43:129::1;;;;;;;;;;;1649:178:::0;:::o;7167:427:161:-;7252:4;-1:-1:-1;;;;;;7275:61:161;;-1:-1:-1;;;7275:61:161;;:143;;-1:-1:-1;;;;;;;7352:66:161;;-1:-1:-1;;;7352:66:161;7275:143;:227;;;-1:-1:-1;;;;;;;7434:68:161;;-1:-1:-1;;;7434:68:161;7275:227;:312;;;-1:-1:-1;;;;;;;7518:69:161;;-1:-1:-1;;;7518:69:161;7268:319;7167:427;-1:-1:-1;;7167:427:161:o;4153:188:186:-;4217:35;4239:12;:10;:12::i;:::-;4217;;:21;:35::i;:::-;4212:123;;4275:49;;-1:-1:-1;;;4275:49:186;;;;;;;;;;;7278:284:187;7385:19;7407:15;:6;:13;:15::i;:::-;7385:37;-1:-1:-1;7437:9:187;7432:124;7456:11;7452:1;:15;7432:124;;;7494:12;:6;7504:1;7494:9;:12::i;:::-;7488:57;;-1:-1:-1;;;7488:57:187;;-1:-1:-1;;;;;6259:32:231;;;7488:57:187;;;6241:51:231;6328:32;;;6308:18;;;6301:60;6397:32;;;6377:18;;;6370:60;6446:18;;;6439:34;;;7488:31:187;;;;;;;6213:19:231;;7488:57:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7469:3;;;;;7432:124;;;;7375:187;7278:284;;;;:::o;1257:72:165:-;1531:13:128;:11;:13::i;3688:459:186:-;-1:-1:-1;;;;;3750:19:186;;3742:80;;;;-1:-1:-1;;;3742:80:186;;;;;;;;;;;;3841:28;:12;3863:5;3841:21;:28::i;:::-;3840:29;3832:88;;;;-1:-1:-1;;;3832:88:186;;;;;;;;;;;;4029:23;:12;4046:5;4029:16;:23::i;:::-;4021:87;;;;-1:-1:-1;;;4021:87:186;;;;;;;;;;;;4123:17;;-1:-1:-1;;;;;3590:32:231;;3572:51;;4123:17:186;;3560:2:231;3545:18;4123:17:186;;;;;;;;3688:459;:::o;3310:372::-;3374:28;:12;3396:5;3374:21;:28::i;:::-;3366:83;;;;-1:-1:-1;;;3366:83:186;;;;;;;;;;;;3558:26;:12;3578:5;3558:19;:26::i;:::-;3550:90;;;;-1:-1:-1;;;3550:90:186;;;;;;;;;;;;3656:19;;-1:-1:-1;;;;;3590:32:231;;3572:51;;3656:19:186;;3560:2:231;3545:18;3656:19:186;3426:203:231;17440:273:158;17503:16;17531:22;17556:19;17564:3;17556:7;:19::i;16041:165::-;-1:-1:-1;;;;;16174:23:158;16121:4;5238:21;;;:14;;;;;:21;;;;;;:26;;;16041:165::o;6464:258:187:-;6554:19;6576:15;:6;:13;:15::i;:::-;6554:37;-1:-1:-1;6606:9:187;6601:115;6625:11;6621:1;:15;6601:115;;;6663:12;:6;6673:1;6663:9;:12::i;:::-;6657:48;;-1:-1:-1;;;6657:48:187;;-1:-1:-1;;;;;6704:32:231;;;6657:48:187;;;6686:51:231;6773:32;;;6753:18;;;6746:60;6822:18;;;6815:34;;;6657:31:187;;;;;;;6659:18:231;;6657:48:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6638:3;;;;;6601:115;;;;6544:178;6464:258;;;:::o;16287:115:158:-;16350:7;16376:19;16384:3;5434:18;;5352:107;16744:156;16818:7;16868:22;16872:3;16884:5;16868:3;:22::i;1796:162:128:-;1866:12;:10;:12::i;:::-;-1:-1:-1;;;;;1855:23:128;:7;1710:6;;-1:-1:-1;;;;;1710:6:128;;1638:85;1855:7;-1:-1:-1;;;;;1855:23:128;;1851:101;;1928:12;:10;:12::i;:::-;1901:40;;-1:-1:-1;;;1901:40:128;;-1:-1:-1;;;;;3590:32:231;;;1901:40:128;;;3572:51:231;3545:18;;1901:40:128;3426:203:231;2011:153:129;2100:13;2093:20;;-1:-1:-1;;;;;;2093:20:129;;;2123:34;2148:8;2123:24;:34::i;1430:172:165:-;1526:14;1559:36;:34;:36::i;6166:449:161:-;6260:13;6285:19;6307:12;:10;:12::i;:::-;6285:34;-1:-1:-1;6334:9:161;6329:237;6353:11;6349:1;:15;6329:237;;;6395:7;6400:1;6395:4;:7::i;:::-;6389:64;;-1:-1:-1;;;6389:64:161;;5498:4:231;5486:17;;6389:64:161;;;5468:36:231;-1:-1:-1;;;;;6389:47:161;;;;;;;5441:18:231;;6389:64:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6385:171;;;6486:7;6491:1;6486:4;:7::i;:::-;6480:61;;-1:-1:-1;;;6480:61:161;;5498:4:231;5486:17;;6480:61:161;;;5468:36:231;-1:-1:-1;;;;;6480:44:161;;;;;;;5441:18:231;;6480:61:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6480:61:161;;;;;;;;;;;;:::i;6385:171::-;6366:3;;6329:237;;;-1:-1:-1;;6575:33:161;;;;;;;;;;;;;;;;;;6166:449;-1:-1:-1;;6166:449:161:o;4914:98:187:-;4969:12;;;;;;;4991:14;:6;:12;:14::i;6719:261:161:-;6795:23;6812:5;6795:16;:23::i;:::-;6833:74;6865:5;-1:-1:-1;;;6833:31:161;:74::i;:::-;6828:146;;6930:33;;-1:-1:-1;;;6930:33:161;;;;;;;;;;;15089:150:158;15159:4;15182:50;15187:3;-1:-1:-1;;;;;15207:23:158;;15182:4;:50::i;5314:528:161:-;5475:5;5496:19;5518:12;:10;:12::i;:::-;5496:34;-1:-1:-1;5545:9:161;5540:242;5564:11;5560:1;:15;5540:242;;;5596:17;5622:7;5627:1;5622:4;:7::i;:::-;5616:70;;-1:-1:-1;;;5616:70:161;;-1:-1:-1;;;;;6259:32:231;;;5616:70:161;;;6241:51:231;6328:32;;;6308:18;;;6301:60;6397:32;;;6377:18;;;6370:60;6446:18;;;6439:34;;;5616:44:161;;;;;;;6213:19:231;;5616:70:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5596:90;-1:-1:-1;5704:15:161;;;;5700:72;;5746:11;-1:-1:-1;5739:18:161;;-1:-1:-1;;5739:18:161;5700:72;-1:-1:-1;5577:3:161;;5540:242;;;-1:-1:-1;5804:30:161;5791:44;5314:528;-1:-1:-1;;;;;;5314:528:161:o;4850:458::-;4958:5;4975:19;4997:12;:10;:12::i;:::-;4975:34;-1:-1:-1;5024:9:161;5019:229;5043:11;5039:1;:15;5019:229;;;5075:17;5101:7;5106:1;5101:4;:7::i;:::-;5095:57;;-1:-1:-1;;;5095:57:161;;-1:-1:-1;;;;;6704:32:231;;;5095:57:161;;;6686:51:231;6773:32;;;6753:18;;;6746:60;6822:18;;;6815:34;;;5095:40:161;;;;;;;6659:18:231;;5095:57:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5075:77;-1:-1:-1;5170:15:161;;;;5166:72;;5212:11;-1:-1:-1;5205:18:161;;-1:-1:-1;;5205:18:161;5166:72;-1:-1:-1;5056:3:161;;5019:229;;;-1:-1:-1;5270:30:161;5257:44;4850:458;-1:-1:-1;;;;;4850:458:161:o;5239:277:187:-;5388:29;:6;5410:5;5388:13;:29::i;:::-;5380:97;;;;-1:-1:-1;;;5380:97:187;;;;;;;;;;;;5492:17;;-1:-1:-1;;;;;5492:17:187;;;;;;;;5239:277;:::o;15407:156:158:-;15480:4;15503:53;15511:3;-1:-1:-1;;;;;15531:23:158;;15503:7;:53::i;6459:109::-;6515:16;6550:3;:11;;6543:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6459:109;;;:::o;5801:118::-;5868:7;5894:3;:11;;5906:5;5894:18;;;;;;;;:::i;:::-;;;;;;;;;5887:25;;5801:118;;;;:::o;2912:187:128:-;3004:6;;;-1:-1:-1;;;;;3020:17:128;;;-1:-1:-1;;;;;;3020:17:128;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;1624:154:162:-;1711:14;1744:27;:25;:27::i;15877:83:158:-;15935:18;15942:3;15935:6;:18::i;5593:313:187:-;-1:-1:-1;;;;;5664:21:187;;5660:119;;5708:60;;-1:-1:-1;;;5708:60:187;;;;;;;;;;;5660:119;5792:22;:6;5808:5;5792:15;:22::i;:::-;5788:112;;;5837:52;;-1:-1:-1;;;5837:52:187;;;;;;;;;;;1465:283:153;1552:4;1660:23;1675:7;1660:14;:23::i;:::-;:81;;;;;1687:54;1720:7;1729:11;1687:32;:54::i;2538:406:158:-;2601:4;5238:21;;;:14;;;:21;;;;;;2617:321;;-1:-1:-1;2659:23:158;;;;;;;;:11;:23;;;;;;;;;;;;;2841:18;;2817:21;;;:14;;;:21;;;;;;:42;;;;2873:11;;2617:321;-1:-1:-1;2922:5:158;2915:12;;3112:1368;3178:4;3307:21;;;:14;;;:21;;;;;;3343:13;;3339:1135;;3710:18;3731:12;3742:1;3731:8;:12;:::i;:::-;3777:18;;3710:33;;-1:-1:-1;3757:17:158;;3777:22;;3798:1;;3777:22;:::i;:::-;3757:42;;3832:9;3818:10;:23;3814:378;;3861:17;3881:3;:11;;3893:9;3881:22;;;;;;;;:::i;:::-;;;;;;;;;3861:42;;4028:9;4002:3;:11;;4014:10;4002:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;4141:25;;;:14;;;:25;;;;;:36;;;3814:378;4270:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4373:3;:14;;:21;4388:5;4373:21;;;;;;;;;;;4366:28;;;4416:4;4409:11;;;;;;;3339:1135;4458:5;4451:12;;;;;3339:1135;3184:1296;3112:1368;;;;:::o;2248:471:135:-;2310:7;2354:8;3609:2;2445:37;;;;;;:71;;-1:-1:-1;1749:17:135;-1:-1:-1;;;;;1973:31:135;2505:10;1973:31;2486:30;2441:272;;;2583:47;:8;2592:36;;;2583:8;;:47;:::i;:::-;2575:56;;;:::i;:::-;2567:65;;2560:72;;;;2248:471;:::o;2441:272::-;735:10:143;2677:25:135;;;;2248:471;:::o;4824:237:158:-;4875:11;4889:12;4897:3;5434:18;;5352:107;4889:12;4875:26;-1:-1:-1;4916:9:158;4911:96;4935:3;4931:1;:7;4911:96;;;4966:3;:14;;:30;4981:3;:11;;4993:1;4981:14;;;;;;;;:::i;:::-;;;;;;;;;4966:30;;;;;;;;;;;4959:37;;;4940:3;;;;;4911:96;;;-1:-1:-1;;5039:11:158;33920:23:140;;2328:155:161:o;719:528:153:-;783:4;976:68;1009:7;-1:-1:-1;;;976:32:153;:68::i;:::-;972:269;;;1061:12;;1093:52;1115:7;-1:-1:-1;;;;;;1093:21:153;:52::i;:::-;1060:85;;;;1166:7;:21;;;;-1:-1:-1;1177:10:153;;1159:28;-1:-1:-1;;;719:528:153:o;4504:238::-;4606:4;4623:12;4637:14;4655:43;4677:7;4686:11;4655:21;:43::i;:::-;4622:76;;;;4715:7;:20;;;;-1:-1:-1;4726:9:153;4708:27;-1:-1:-1;;;;4504:238:153:o;5198:628::-;-1:-1:-1;;;5310:12:153;5452:22;;;5494:4;5487:25;;;5310:12;;;5581:4;5310:12;5569:4;5310:12;5554:7;5547:5;5536:50;5525:61;;5740:4;5734:11;5727:19;5720:27;5654:4;5636:16;5633:26;5612:198;5599:211;;5438:382;5198:628;;;;;:::o;14:286:231:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:231;;209:43;;199:71;;266:1;263;256:12;679:131;-1:-1:-1;;;;;754:31:231;;744:42;;734:70;;800:1;797;790:12;815:650;901:6;909;917;925;978:3;966:9;957:7;953:23;949:33;946:53;;;995:1;992;985:12;946:53;1034:9;1021:23;1053:31;1078:5;1053:31;:::i;:::-;1103:5;-1:-1:-1;1160:2:231;1145:18;;1132:32;1173:33;1132:32;1173:33;:::i;:::-;1225:7;-1:-1:-1;1284:2:231;1269:18;;1256:32;1297:33;1256:32;1297:33;:::i;:::-;815:650;;;;-1:-1:-1;1349:7:231;;1429:2;1414:18;1401:32;;-1:-1:-1;;815:650:231:o;1470:247::-;1529:6;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;1637:9;1624:23;1656:31;1681:5;1656:31;:::i;1722:637::-;1912:2;1924:21;;;1994:13;;1897:18;;;2016:22;;;1864:4;;2095:15;;;2069:2;2054:18;;;1864:4;2138:195;2152:6;2149:1;2146:13;2138:195;;;2217:13;;-1:-1:-1;;;;;2213:39:231;2201:52;;2282:2;2308:15;;;;2273:12;;;;2249:1;2167:9;2138:195;;;-1:-1:-1;2350:3:231;;1722:637;-1:-1:-1;;;;;1722:637:231:o;2631:418::-;2780:2;2769:9;2762:21;2743:4;2812:6;2806:13;2855:6;2850:2;2839:9;2835:18;2828:34;2914:6;2909:2;2901:6;2897:15;2892:2;2881:9;2877:18;2871:50;2970:1;2965:2;2956:6;2945:9;2941:22;2937:31;2930:42;3040:2;3033;3029:7;3024:2;3016:6;3012:15;3008:29;2997:9;2993:45;2989:54;2981:62;;;2631:418;;;;:::o;3054:367::-;3122:6;3130;3183:2;3171:9;3162:7;3158:23;3154:32;3151:52;;;3199:1;3196;3189:12;3151:52;3238:9;3225:23;3257:31;3282:5;3257:31;:::i;:::-;3307:5;3385:2;3370:18;;;;3357:32;;-1:-1:-1;;;3054:367:231:o;3634:114::-;3718:4;3711:5;3707:16;3700:5;3697:27;3687:55;;3738:1;3735;3728:12;3753:243;3810:6;3863:2;3851:9;3842:7;3838:23;3834:32;3831:52;;;3879:1;3876;3869:12;3831:52;3918:9;3905:23;3937:29;3960:5;3937:29;:::i;4001:508::-;4078:6;4086;4094;4147:2;4135:9;4126:7;4122:23;4118:32;4115:52;;;4163:1;4160;4153:12;4115:52;4202:9;4189:23;4221:31;4246:5;4221:31;:::i;:::-;4271:5;-1:-1:-1;4328:2:231;4313:18;;4300:32;4341:33;4300:32;4341:33;:::i;:::-;4001:508;;4393:7;;-1:-1:-1;;;4473:2:231;4458:18;;;;4445:32;;4001:508::o;4514:625::-;4615:6;4623;4676:2;4664:9;4655:7;4651:23;4647:32;4644:52;;;4692:1;4689;4682:12;4644:52;4732:9;4719:23;4765:18;4757:6;4754:30;4751:50;;;4797:1;4794;4787:12;4751:50;4820:22;;4873:4;4865:13;;4861:27;-1:-1:-1;4851:55:231;;4902:1;4899;4892:12;4851:55;4942:2;4929:16;4968:18;4960:6;4957:30;4954:50;;;5000:1;4997;4990:12;4954:50;5053:7;5048:2;5038:6;5035:1;5031:14;5027:2;5023:23;5019:32;5016:45;5013:65;;;5074:1;5071;5064:12;5013:65;5105:2;5097:11;;;;;5127:6;;-1:-1:-1;4514:625:231;-1:-1:-1;;;4514:625:231:o;5515:226::-;5574:6;5627:2;5615:9;5606:7;5602:23;5598:32;5595:52;;;5643:1;5640;5633:12;5595:52;-1:-1:-1;5688:23:231;;5515:226;-1:-1:-1;5515:226:231:o;5878:127::-;5939:10;5934:3;5930:20;5927:1;5920:31;5970:4;5967:1;5960:15;5994:4;5991:1;5984:15;6860:277;6927:6;6980:2;6968:9;6959:7;6955:23;6951:32;6948:52;;;6996:1;6993;6986:12;6948:52;7028:9;7022:16;7081:5;7074:13;7067:21;7060:5;7057:32;7047:60;;7103:1;7100;7093:12;7142:127;7203:10;7198:3;7194:20;7191:1;7184:31;7234:4;7231:1;7224:15;7258:4;7255:1;7248:15;7274:935;7354:6;7407:2;7395:9;7386:7;7382:23;7378:32;7375:52;;;7423:1;7420;7413:12;7375:52;7456:9;7450:16;7489:18;7481:6;7478:30;7475:50;;;7521:1;7518;7511:12;7475:50;7544:22;;7597:4;7589:13;;7585:27;-1:-1:-1;7575:55:231;;7626:1;7623;7616:12;7575:55;7659:2;7653:9;7685:18;7677:6;7674:30;7671:56;;;7707:18;;:::i;:::-;7756:2;7750:9;7848:2;7810:17;;-1:-1:-1;;7806:31:231;;;7839:2;7802:40;7798:54;7786:67;;7883:18;7868:34;;7904:22;;;7865:62;7862:88;;;7930:18;;:::i;:::-;7966:2;7959:22;7990;;;8031:15;;;8048:2;8027:24;8024:37;-1:-1:-1;8021:57:231;;;8074:1;8071;8064:12;8021:57;8123:6;8118:2;8114;8110:11;8105:2;8097:6;8093:15;8087:43;8176:1;8150:19;;;8171:2;8146:28;8139:39;;;;8154:6;7274:935;-1:-1:-1;;;;7274:935:231:o;8214:247::-;8282:6;8335:2;8323:9;8314:7;8310:23;8306:32;8303:52;;;8351:1;8348;8341:12;8303:52;8383:9;8377:16;8402:29;8425:5;8402:29;:::i;8466:225::-;8533:9;;;8554:11;;;8551:134;;;8607:10;8602:3;8598:20;8595:1;8588:31;8642:4;8639:1;8632:15;8670:4;8667:1;8660:15;8696:127;8757:10;8752:3;8748:20;8745:1;8738:31;8788:4;8785:1;8778:15;8812:4;8809:1;8802:15;8828:331;8933:9;8944;8986:8;8974:10;8971:24;8968:44;;;9008:1;9005;8998:12;8968:44;9037:6;9027:8;9024:20;9021:40;;;9057:1;9054;9047:12;9021:40;-1:-1:-1;;9083:23:231;;;9128:25;;;;;-1:-1:-1;8828:331:231:o;9164:374::-;9285:19;;-1:-1:-1;;9322:40:231;;;9382:2;9374:11;;9371:161;;;-1:-1:-1;;9444:2:231;9440:12;;;;9437:1;9433:20;9429:58;;;9421:67;9417:105;;;;9164:374;-1:-1:-1;;9164:374:231:o","linkReferences":{},"immutableReferences":{"55852":[{"start":752,"length":32},{"start":888,"length":32},{"start":5035,"length":32}]}},"methodIdentifiers":{"COMPLIANCE_MANAGER_ROLE()":"03c26bcd","RULES_MANAGEMENT_ROLE()":"9b11c115","acceptOwnership()":"79ba5097","addRule(address)":"e3c4602c","bindToken(address)":"3ff5aa02","canTransfer(address,address,uint256)":"e46638e6","canTransferFrom(address,address,address,uint256)":"7157797f","clearRules()":"b043572e","containsRule(address)":"54e4b945","created(address,uint256)":"5f8dead3","destroyed(address,uint256)":"8d2ea772","detectTransferRestriction(address,address,uint256)":"d4ce1415","detectTransferRestrictionFrom(address,address,address,uint256)":"d32c7bb5","getTokenBound()":"6a3edf28","getTokenBounds()":"e54621d2","isTokenBound(address)":"993e8b95","isTrustedForwarder(address)":"572b6c05","messageForTransferRestriction(uint8)":"7f4ab1dd","owner()":"8da5cb5b","pendingOwner()":"e30c3978","removeRule(address)":"df21950f","renounceOwnership()":"715018a6","rule(uint256)":"db18af6c","rules()":"52f6747a","rulesCount()":"bc13eacc","setRules(address[])":"b27aef3a","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","transferred(address,address,address,uint256)":"3e5af4ca","transferred(address,address,uint256)":"8baf29b4","trustedForwarder()":"7da0a877","unbindToken(address)":"40db3b50","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.34+commit.80d5c536\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_OperationNotSuccessful\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_TokenAlreadyBound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_TokenNotBound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ERC3643Compliance_UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleInvalidInterface\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_OperationNotSuccessful\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RulesManagementModule_RuleDoNotMatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IRule\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IRule\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"RemoveRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenBound\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenUnbound\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COMPLIANCE_MANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RULES_MANAGEMENT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"bindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"canTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"canTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRules\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"containsRule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"created\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"destroyed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestrictionFrom\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenBound\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenBounds\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isTokenBound\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"removeRule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"rule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rules\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRule[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRules\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"unbindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"version_\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"AddRule(address)\":{\"params\":{\"rule\":\"The address of the rule contract that was added.\"}},\"RemoveRule(address)\":{\"params\":{\"rule\":\"The address of the rule contract that was removed.\"}},\"TokenBound(address)\":{\"params\":{\"token\":\"The address of the token that was bound.\"}},\"TokenUnbound(address)\":{\"params\":{\"token\":\"The address of the token that was unbound.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"addRule(address)\":{\"details\":\"No on-chain maximum number of rules is enforced. Adding too many rules can increase transfer-time gas usage because rule checks are linear in rule count. Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts.\",\"params\":{\"rule_\":\"The IRule contract to add.\"}},\"bindToken(address)\":{\"details\":\"Operator warning: \\\"multi-tenant\\\" means one RuleEngine is shared by multiple token contracts. In that setup, bind only tokens that are equally trusted and governed together.\",\"params\":{\"token\":\"The address of the token to bind.\"}},\"canTransfer(address,address,uint256)\":{\"details\":\"Don't check the balance and the user's right (access control)\"},\"canTransferFrom(address,address,address,uint256)\":{\"details\":\"Does not check balances or access rights (Access Control).\",\"params\":{\"from\":\"The source address.\",\"spender\":\"The address performing the transfer.\",\"to\":\"The destination address.\",\"value\":\"The number of tokens to transfer.\"},\"returns\":{\"_0\":\"isCompliant True if the transfer complies with policy.\"}},\"clearRules()\":{\"details\":\"After calling this function, no rules will remain set. Developers should keep in mind that this function has an unbounded cost and using it may render the function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.\"},\"constructor\":{\"params\":{\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\",\"owner_\":\"Address of the contract owner (ERC-173)\",\"tokenContract\":\"Address of the token contract to bind (can be zero address)\"}},\"containsRule(address)\":{\"details\":\"Complexity: O(1).\",\"params\":{\"rule_\":\"The IRule contract to check for membership.\"},\"returns\":{\"_0\":\"True if the rule is present, false otherwise.\"}},\"created(address,uint256)\":{\"details\":\"Called by the token contract when new tokens are issued to an account. Reverts if the minting does not comply with the rules.\",\"params\":{\"to\":\"The address receiving the minted tokens.\",\"value\":\"The number of tokens created.\"}},\"destroyed(address,uint256)\":{\"details\":\"Called by the token contract when tokens are redeemed or burned. Reverts if the burning does not comply with the rules.\",\"params\":{\"from\":\"The address whose tokens are being destroyed.\",\"value\":\"The number of tokens destroyed.\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"from\":\"the origin address\",\"to\":\"the destination address\",\"value\":\"to transfer\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK (0) if the transfer is valid\"}},\"detectTransferRestrictionFrom(address,address,address,uint256)\":{\"details\":\" See {ERC-1404} Add an additionnal argument `spender` This function is where an issuer enforces the restriction logic of their token transfers. Some examples of this might include: - checking if the token recipient is whitelisted, - checking if a sender's tokens are frozen in a lock-up period, etc.\",\"returns\":{\"_0\":\"uint8 restricted code, 0 means the transfer is authorized\"}},\"getTokenBound()\":{\"details\":\"If multiple tokens are supported, consider using getTokenBounds().\",\"returns\":{\"_0\":\"The address of the currently bound token.\"}},\"getTokenBounds()\":{\"details\":\"This is a view-only function and does not modify state. This function is not part of the original ERC-3643 specification This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.\",\"returns\":{\"_0\":\"An array of addresses of bound token contracts.\"}},\"isTokenBound(address)\":{\"details\":\"Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.\",\"params\":{\"token\":\"The token address to verify.\"},\"returns\":{\"_0\":\"True if the token is bound, false otherwise.\"}},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"details\":\"See {ERC-1404} This function is effectively an accessor for the \\\"message\\\", a human-readable explanation as to why a transaction is restricted. \"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"removeRule(address)\":{\"details\":\"Reverts if the provided rule is not found or does not match the stored rule at its index. Complexity: O(1).\",\"params\":{\"rule_\":\"The IRule contract to remove.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"rule(uint256)\":{\"details\":\"Reverts if `ruleId` is out of bounds. Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.\",\"params\":{\"ruleId\":\"The index of the desired rule in the array.\"},\"returns\":{\"_0\":\"The address of the corresponding IRule contract, return the `zero address` is out of bounds.\"}},\"rules()\":{\"details\":\"This is a view-only function that does not modify state. This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.\",\"returns\":{\"_0\":\"An array of all active rule contract addresses.\"}},\"rulesCount()\":{\"details\":\"Equivalent to the length of the internal rules array. Complexity: O(1)\",\"returns\":{\"_0\":\"The number of active rules.\"}},\"setRules(address[])\":{\"details\":\"Replaces the entire rule set atomically. Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. To transition from one non-empty set to another without an enforcement gap, call this function directly with the new set. No on-chain maximum number of rules is enforced. Operators are responsible for keeping the rule set size compatible with the target chain gas limits. Security convention: rule contracts should be treated as trusted business logic, but should not also be granted {RULES_MANAGEMENT_ROLE}.\",\"params\":{\"rules_\":\"The array of addresses representing the new rules to be set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner. Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.\"},\"transferred(address,address,address,uint256)\":{\"details\":\" Must revert if the transfer is invalid Same name as ERC-3643 but with one supplementary argument `spender` This function can be used to update state variables of the RuleEngine contract This function can be called ONLY by the token contract bound to the RuleEngine\",\"params\":{\"from\":\"token holder address\",\"spender\":\"spender address (sender)\",\"to\":\"receiver address\",\"value\":\"value of tokens involved in the transfer\"}},\"transferred(address,address,uint256)\":{\"details\":\" This function can be used to update state variables of the compliance contract This function can be called ONLY by the token contract bound to the compliance\",\"params\":{\"from\":\"The address of the sender\",\"to\":\"The address of the receiver\",\"value\":\"value of tokens involved in the transfer\"}},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"unbindToken(address)\":{\"details\":\"Operator warning: unbinding is an administrative operation and does not erase any state already stored by external rule contracts in a previously shared (\\\"multi-tenant\\\") setup.\",\"params\":{\"token\":\"The address of the token to unbind.\"}},\"version()\":{\"details\":\"This value is useful to know which smart contract version has been used\",\"returns\":{\"version_\":\"A string representing the version of the token implementation (e.g., \\\"1.0.0\\\").\"}}},\"title\":\"Implementation of a ruleEngine with ERC-173 Ownable2Step access control\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Emitted when a new rule is added to the rule set.\"},\"ClearRules()\":{\"notice\":\"Emitted when all rules are cleared from the rule set.\"},\"RemoveRule(address)\":{\"notice\":\"Emitted when a rule is removed from the rule set.\"},\"TokenBound(address)\":{\"notice\":\"Emitted when a token is successfully bound to the compliance contract.\"},\"TokenUnbound(address)\":{\"notice\":\"Emitted when a token is successfully unbound from the compliance contract.\"}},\"kind\":\"user\",\"methods\":{\"RULES_MANAGEMENT_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"addRule(address)\":{\"notice\":\"Adds a new rule to the current rule set.\"},\"bindToken(address)\":{\"notice\":\"Associates a token contract with this compliance contract.\"},\"canTransfer(address,address,uint256)\":{\"notice\":\"Returns true if the transfer is valid, and false otherwise.\"},\"canTransferFrom(address,address,address,uint256)\":{\"notice\":\"Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules.\"},\"clearRules()\":{\"notice\":\"Removes all configured rules.\"},\"containsRule(address)\":{\"notice\":\"Checks whether a specific rule is currently configured.\"},\"created(address,uint256)\":{\"notice\":\"Updates the compliance contract state when tokens are created (minted).\"},\"destroyed(address,uint256)\":{\"notice\":\"Updates the compliance contract state when tokens are destroyed (burned).\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"detectTransferRestrictionFrom(address,address,address,uint256)\":{\"notice\":\"Returns a uint8 code to indicate if a transfer is restricted or not\"},\"getTokenBound()\":{\"notice\":\"Returns the single token currently bound to this compliance contract.\"},\"getTokenBounds()\":{\"notice\":\"Returns all tokens currently bound to this compliance contract.\"},\"isTokenBound(address)\":{\"notice\":\"Checks whether a token is currently bound to this compliance contract.\"},\"removeRule(address)\":{\"notice\":\"Removes a specific rule from the current rule set.\"},\"rule(uint256)\":{\"notice\":\"Retrieves the rule address at a specific index.\"},\"rules()\":{\"notice\":\"Returns the full list of currently configured rules.\"},\"rulesCount()\":{\"notice\":\"Returns the total number of currently configured rules.\"},\"setRules(address[])\":{\"notice\":\"Defines the rules for the rule engine.\"},\"transferred(address,address,address,uint256)\":{\"notice\":\"Function called whenever tokens are transferred from one wallet to another\"},\"transferred(address,address,uint256)\":{\"notice\":\"Function called whenever tokens are transferred from one wallet to another\"},\"unbindToken(address)\":{\"notice\":\"Removes the association of a token contract from this compliance contract.\"},\"version()\":{\"notice\":\"Returns the current version of the token contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/deployment/RuleEngineOwnable2Step.sol\":\"RuleEngineOwnable2Step\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":CMTATv3.0.0/=lib/CMTATv3.0.0/contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol\":{\"keccak256\":\"0x524a2cf2214a82fb96e97a18a94956fee68a419ecd6b2dc841aa1105f336c3f1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://9c4728d80b6678101586515c0308c63bcba2a78b0a3c12d37b522d59f3175a01\",\"dweb:/ipfs/QmYP9SPbe2hB69jKkSg43qkz1HVxBayKrG14i9f6hx7hh8\"]},\"lib/CMTAT/contracts/interfaces/technical/IERC5679.sol\":{\"keccak256\":\"0xcc6f2e79d1d9eabcf4c7ffcbd85c0de31bb2b3cdf17eb847dffb7c2d2a8c4695\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://d618bc2be7c6bc167037fe57ca648523c671c61791f3f0c65965ab7139d6dc33\",\"dweb:/ipfs/QmSrCKWFjpg1SQ7v2k3vRyWpcU9dB6Pbk167R4oAzUc2Te\"]},\"lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol\":{\"keccak256\":\"0x1707381177447b1a398c443c7e753942df0c5d4633e80d2864db472e89e43dc0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c4281d98847629b67222332bea67f336623937758be908ee9ca1aa40b3abe19d\",\"dweb:/ipfs/QmZQBruKJH3sStjBmCb28rxRkUkZ4EFsDCi8WZ7Y85spxS\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol\":{\"keccak256\":\"0x17fb1f64b546fd882331dffbd8c7f4e53c51738b9e2621a0dcfcf30e64d8b66e\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c35fe277d5d99a0943293b5da5622947095e6b719af35fda9ef2c714a7879a4b\",\"dweb:/ipfs/QmRV5q3XvjJE8sxJJBpEkwk1qyz3r4McH2BdX1v2ZxZGZh\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7551.sol\":{\"keccak256\":\"0x709074d96bd5d7aa07d2ba3a1c9a99ae0fd4361f7322b528b42f3b83c5dcb984\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ca67a06011b746b55bf2465988dc10a4e6371e40b5108c54531f03e938bda865\",\"dweb:/ipfs/QmbjFyDAJsUXywqzU2s96pFqFpC5DLKdfa8WjMBtQPhKGE\"]},\"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7943.sol\":{\"keccak256\":\"0x1a341fc7ee7d9b8b00b6168b35a6a844d90431749d8ca694174c52c41e11763f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4fb6b13953539b99262cb299961fb8ff8a020de79b12f76c63decf33ff9d5103\",\"dweb:/ipfs/QmQ3bnkQJgD2s6xpapThCPTSMbDREokVEiM7extwQgfrv7\"]},\"lib/CMTAT/contracts/library/ERC1404ExtendInterfaceId.sol\":{\"keccak256\":\"0xe5f6f08d319d27f20989936460d3947eed5fdcb470f80e920f4fb09ccc7e1e87\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://cb654fe37c2bc6c765c67c5f94a769580312d1d4109c50262677ac406362f91e\",\"dweb:/ipfs/Qmc8ZFVANCmULNozM2wFUSGKXBgUHR5bpDC3ZVjV4XoEv7\"]},\"lib/CMTAT/contracts/library/RuleEngineInterfaceId.sol\":{\"keccak256\":\"0x759990208069b5a0862a255eff790d52d1d64bbb6c334705fc12414936825692\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0bce1c17cbbddac4bf123f602dc980246e5bec724f5ed3107e148548b930e124\",\"dweb:/ipfs/QmRZUxmRN9ji9UYueD6knhnz2nSsDRZgRTX74uenGczVjA\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\":{\"keccak256\":\"0xdcad8898fda432696597752e8ec361b87d85c82cb258115427af006dacf7128c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e2c9d517f0c136d54bd00cd57959d25681d4d6273f5bbbc263afe228303772f0\",\"dweb:/ipfs/QmReNFjXBiufByiAAzfSQ2SM5r3qeUErn46BmN3yVRvrek\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x9695d220b99dcf62910533bdf5d40d4cf6a4e04d5b106b6803a80586486dc7f7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://83b7aecd65882d8953643dce144efe91367082cc01830c9c4ed3c8a4837fb558\",\"dweb:/ipfs/QmQ5HxGavcCKjuhd8buv177qjG6A4kvxx4pZviceKdspdM\"]},\"lib/openzeppelin-contracts/contracts/utils/Arrays.sol\":{\"keccak256\":\"0xb3b81029526a4c3acf39e57cc446407141ebce338cc99585942af1340e1a69e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3857ce97e8f7a51ad78ea5419b3386e18fcc8af73b65803eedd8193ab7abc9df\",\"dweb:/ipfs/QmSQi6x2cYsUy76mfMNwuq151bVmh4kAND141kjume51Aq\"]},\"lib/openzeppelin-contracts/contracts/utils/Comparators.sol\":{\"keccak256\":\"0x302eecd8cf323b4690e3494a7d960b3cbce077032ab8ef655b323cdd136cec58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://49ba706f1bc476d68fe6c1fad75517acea4e9e275be0989b548e292eb3a3eacd\",\"dweb:/ipfs/QmeBpvcdGWzWMKTQESUCEhHgnEQYYATVwPxLMxa6vMT7jC\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol\":{\"keccak256\":\"0x94045fd4f268edf2b2d01ef119268548c320366d6f5294ad30c1b8f9d4f5225f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://edfda81f426f8948b3834115c21e83c48180e6db0d2a8cd2debb2185ed349337\",\"dweb:/ipfs/QmdYZneFyDAux1BuWQxLAdqtABrGS2k9WYCa7C9dvpKkWv\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0x7c7ad70641a7f8cd44def0857ec97b0e40bfd073b2d6037a5f57ce9527ee9bc5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e05c6572dfe769f7aea6f3a8002951cc12d143d980dad29f6c5feedf9408bc14\",\"dweb:/ipfs/QmXM7C8YEptxisZiEefXUrwdXt3zMaCobmkCchxTtDg1oK\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5\",\"dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9\",\"dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif\"]},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x5c298e834696707e274a71a224969d36faecd928a8076603210d67d091adb4ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a93fe967b4d55b31157164cbb7e3e1ebaf3535fc1d3f8d0156da7abb9b565d90\",\"dweb:/ipfs/QmXH7nyxwEUeMPFDDmkdUwqxLEcezaSmVyunyMAuck1WqR\"]},\"src/RuleEngineBase.sol\":{\"keccak256\":\"0x9edae8ce7df18638cf56b571be18251d4ac4c435844c8cd77d1f7f651623c568\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://9758c7256a994b371c00d9e0098be5d76d9896f2a556208dfb83768d4d4e916b\",\"dweb:/ipfs/QmdZwwiB29tzheoaoRWiJdbbGMH2nM46ojLp7WFjm9D19h\"]},\"src/RuleEngineOwnableShared.sol\":{\"keccak256\":\"0xbe119365533074f6f59227e4b74432e03407f553f13c8361c21166f1fbb67f19\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://22b0689c774191b4065d1eda22d040fc79211f83e41f018dfe4bfcae7a328a57\",\"dweb:/ipfs/QmS9EgzvD45x72bNpMW3hyMQHfPyyBJN24iJmAuR1cEjpc\"]},\"src/deployment/RuleEngineOwnable2Step.sol\":{\"keccak256\":\"0xb38e07dc3fca6e25f18ce11dbef8af3692ac8f5c115c45adf01f854d9b68efb5\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://1cee543cfeab07d772c245ced21140273fc5c2b9bd106f72bc971cc70ae0c726\",\"dweb:/ipfs/QmSDgmt41PpCDU6XRWkipgJtcMoh2VSr7ttBDfsQ7oJ9rT\"]},\"src/interfaces/IERC3643Compliance.sol\":{\"keccak256\":\"0xf86e78e8f737795c3762b402b121b0f1822d6b27414aeca08ea6f036cccea07b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c795d1b89a1393b2225f6e58c0310d345d78ff534ab028353413c4a5aaf9ecf7\",\"dweb:/ipfs/QmNcJsJzLWzSAV77whMzu7je2Mj2pWoTYYn1z76kqB5mKH\"]},\"src/interfaces/IRule.sol\":{\"keccak256\":\"0x315fd1d0147d40d3cc1ee35f6ddb8c9e25e6e4f96034a285e6f342c59c3cc222\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5b0ecca410bf89169e5c6393bc4d8fce97a5b3dcf8a2bba02317da85c98f4d0c\",\"dweb:/ipfs/QmeGS5vbFwkmEvJh7s27Q9xW4xGXuUohh2zGPVbgxgjfnu\"]},\"src/interfaces/IRulesManagementModule.sol\":{\"keccak256\":\"0x1be8087ef526f664cf8ba5dd35d4d12fc1880f905e3ba2e553ee02cb7d6506c1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://545cafd73f2fe9b2b89b37e905057637f58ae2c1da7f3dc33493b515c87a720f\",\"dweb:/ipfs/QmXiTEhLSpN6sj1fiwFT9V6bGD1VCXTqQJiNnXcLrYmW7N\"]},\"src/modules/ERC2771ModuleStandalone.sol\":{\"keccak256\":\"0xecc9aec20ff41c46404f6fcb9bfb0fd5588781fbb4f2fbec351f603a31c178b0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://48674e77afe59b6c6e6aa8b0d5e370ca58c9a354b5dc294bb3c9f10fbd12a3f3\",\"dweb:/ipfs/QmY3HhbBDqsBvrGBXoRwgVpfSNtiK2XmhaxVpS1F3dSPx9\"]},\"src/modules/ERC3643ComplianceModule.sol\":{\"keccak256\":\"0xdb472471270ea23d4694ca2d2eb107ce668affc9dbe18b5a6eda312ab4800a33\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://6200e990afca50a32fb0a0ad76ffe955447a67cab6e93f64281fc9f14208aab1\",\"dweb:/ipfs/QmXXhRsBq3eGDgBqQwWL5w4Sn6pdTeeXRvpC4jZBDVb6nQ\"]},\"src/modules/RulesManagementModule.sol\":{\"keccak256\":\"0xc9c58e027874658577285de9c9bf9069cd773573a615df7c9644c6c96c69dbc3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a6c9ca74cc247b42b9852b35cb4eeadc919d383d7bbd4f4df0739ee6a8bce2c3\",\"dweb:/ipfs/QmfJCvSQjqQrQXYt9JEHiJRZATy1s7q53DKxZC1QsSYMHZ\"]},\"src/modules/VersionModule.sol\":{\"keccak256\":\"0x077070dca24da125a764111d336c0a8fb3445b82d93692ff76b22384b0f4f39f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://be8df88e667fb2de39d095f0c396d23ed263fdc51a4095fedc89a326540a03ee\",\"dweb:/ipfs/QmYfhhEvNee1XYwCYZCVAKpUUWBd5FP5qvTMYGr6ogC8kA\"]},\"src/modules/library/ComplianceInterfaceId.sol\":{\"keccak256\":\"0xa0f15ca7f9e0fa8ccb854ea2bd812f220c68c280682b56e8d1a437ddba4b6d1f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://1e01a79b4a2110a401c3d2fbead97844f7428d6dc6603dccf795d42dbc142786\",\"dweb:/ipfs/QmV88ZcDHTU33oXNLFTshUBZ7otgcZRN1HXwywda7Fgz9a\"]},\"src/modules/library/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x15005e56f8fbf8f9b8a41c4bfed6c842e37be49fa52b0dbb2edc6b08b9e50c2f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://06c90dd748d060cb1b05de978cb42fd79d9b49a2beb3a479b4e49f8edaba1195\",\"dweb:/ipfs/QmYXEQWrwJkuzWBdi5hjSaM6pWhrNUf2kH2pHX8jRu9dZS\"]},\"src/modules/library/RuleInterfaceId.sol\":{\"keccak256\":\"0x3c57987589d6205e2546d4ce332e944d1667dddfe897087028a95ed804c50882\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0e1718e500d4cb5cf4441131c57d23da788f2835e9a014e7d1f62dfb6161647a\",\"dweb:/ipfs/QmXY5cjc9Dzrp7ML7DfvDB9zg7t4cene3g4K9AAuDmLLfC\"]},\"src/modules/library/RulesManagementModuleInvariantStorage.sol\":{\"keccak256\":\"0xa6f9109698f169be74c309a1efadd48edffcb0e9585523258477bf07942c8ae6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4c28513636b660111b60a7028c9600b30dcfda291a831343d9e27e253b80856a\",\"dweb:/ipfs/QmQVSZ9N6vjPxNnJDTqEuGSWqNdoxHKhzTzP2cvgZpBSzj\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.34+commit.80d5c536"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"forwarderIrrevocable","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_InvalidTokenAddress"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_OperationNotSuccessful"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_TokenAlreadyBound"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_TokenNotBound"},{"inputs":[],"type":"error","name":"RuleEngine_ERC3643Compliance_UnauthorizedCaller"},{"inputs":[],"type":"error","name":"RuleEngine_RuleInvalidInterface"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_ArrayIsEmpty"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_OperationNotSuccessful"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleAlreadyExists"},{"inputs":[],"type":"error","name":"RuleEngine_RulesManagementModule_RuleDoNotMatch"},{"inputs":[{"internalType":"contract IRule","name":"rule","type":"address","indexed":true}],"type":"event","name":"AddRule","anonymous":false},{"inputs":[],"type":"event","name":"ClearRules","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferStarted","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"contract IRule","name":"rule","type":"address","indexed":true}],"type":"event","name":"RemoveRule","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":false}],"type":"event","name":"TokenBound","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":false}],"type":"event","name":"TokenUnbound","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"COMPLIANCE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RULES_MANAGEMENT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"acceptOwnership"},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRule"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"bindToken"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"canTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"canTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"clearRules"},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"view","type":"function","name":"containsRule","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"created"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"destroyed"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestrictionFrom","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getTokenBound","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getTokenBounds","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"view","type":"function","name":"isTokenBound","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"stateMutability":"view","type":"function","name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"stateMutability":"view","type":"function","name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"contract IRule","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeRule"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"uint256","name":"ruleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"rule","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rules","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract IRule[]","name":"rules_","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setRules"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferred"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferred"},{"inputs":[],"stateMutability":"view","type":"function","name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"unbindToken"},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"version_","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"acceptOwnership()":{"details":"The new owner accepts the ownership transfer."},"addRule(address)":{"details":"No on-chain maximum number of rules is enforced. Adding too many rules can increase transfer-time gas usage because rule checks are linear in rule count. Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts.","params":{"rule_":"The IRule contract to add."}},"bindToken(address)":{"details":"Operator warning: \"multi-tenant\" means one RuleEngine is shared by multiple token contracts. In that setup, bind only tokens that are equally trusted and governed together.","params":{"token":"The address of the token to bind."}},"canTransfer(address,address,uint256)":{"details":"Don't check the balance and the user's right (access control)"},"canTransferFrom(address,address,address,uint256)":{"details":"Does not check balances or access rights (Access Control).","params":{"from":"The source address.","spender":"The address performing the transfer.","to":"The destination address.","value":"The number of tokens to transfer."},"returns":{"_0":"isCompliant True if the transfer complies with policy."}},"clearRules()":{"details":"After calling this function, no rules will remain set. Developers should keep in mind that this function has an unbounded cost and using it may render the function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block."},"constructor":{"params":{"forwarderIrrevocable":"Address of the forwarder, required for the gasless support","owner_":"Address of the contract owner (ERC-173)","tokenContract":"Address of the token contract to bind (can be zero address)"}},"containsRule(address)":{"details":"Complexity: O(1).","params":{"rule_":"The IRule contract to check for membership."},"returns":{"_0":"True if the rule is present, false otherwise."}},"created(address,uint256)":{"details":"Called by the token contract when new tokens are issued to an account. Reverts if the minting does not comply with the rules.","params":{"to":"The address receiving the minted tokens.","value":"The number of tokens created."}},"destroyed(address,uint256)":{"details":"Called by the token contract when tokens are redeemed or burned. Reverts if the burning does not comply with the rules.","params":{"from":"The address whose tokens are being destroyed.","value":"The number of tokens destroyed."}},"detectTransferRestriction(address,address,uint256)":{"params":{"from":"the origin address","to":"the destination address","value":"to transfer"},"returns":{"_0":"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK (0) if the transfer is valid"}},"detectTransferRestrictionFrom(address,address,address,uint256)":{"details":" See {ERC-1404} Add an additionnal argument `spender` This function is where an issuer enforces the restriction logic of their token transfers. Some examples of this might include: - checking if the token recipient is whitelisted, - checking if a sender's tokens are frozen in a lock-up period, etc.","returns":{"_0":"uint8 restricted code, 0 means the transfer is authorized"}},"getTokenBound()":{"details":"If multiple tokens are supported, consider using getTokenBounds().","returns":{"_0":"The address of the currently bound token."}},"getTokenBounds()":{"details":"This is a view-only function and does not modify state. This function is not part of the original ERC-3643 specification This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.","returns":{"_0":"An array of addresses of bound token contracts."}},"isTokenBound(address)":{"details":"Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.","params":{"token":"The token address to verify."},"returns":{"_0":"True if the token is bound, false otherwise."}},"isTrustedForwarder(address)":{"details":"Indicates whether any particular address is the trusted forwarder."},"messageForTransferRestriction(uint8)":{"details":"See {ERC-1404} This function is effectively an accessor for the \"message\", a human-readable explanation as to why a transaction is restricted. "},"owner()":{"details":"Returns the address of the current owner."},"pendingOwner()":{"details":"Returns the address of the pending owner."},"removeRule(address)":{"details":"Reverts if the provided rule is not found or does not match the stored rule at its index. Complexity: O(1).","params":{"rule_":"The IRule contract to remove."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"rule(uint256)":{"details":"Reverts if `ruleId` is out of bounds. Complexity: O(1). Note that there are no guarantees on the ordering of values inside the array, and it may change when more values are added or removed.","params":{"ruleId":"The index of the desired rule in the array."},"returns":{"_0":"The address of the corresponding IRule contract, return the `zero address` is out of bounds."}},"rules()":{"details":"This is a view-only function that does not modify state. This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees.","returns":{"_0":"An array of all active rule contract addresses."}},"rulesCount()":{"details":"Equivalent to the length of the internal rules array. Complexity: O(1)","returns":{"_0":"The number of active rules."}},"setRules(address[])":{"details":"Replaces the entire rule set atomically. Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. To transition from one non-empty set to another without an enforcement gap, call this function directly with the new set. No on-chain maximum number of rules is enforced. Operators are responsible for keeping the rule set size compatible with the target chain gas limits. Security convention: rule contracts should be treated as trusted business logic, but should not also be granted {RULES_MANAGEMENT_ROLE}.","params":{"rules_":"The array of addresses representing the new rules to be set."}},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"transferOwnership(address)":{"details":"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner. Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer."},"transferred(address,address,address,uint256)":{"details":" Must revert if the transfer is invalid Same name as ERC-3643 but with one supplementary argument `spender` This function can be used to update state variables of the RuleEngine contract This function can be called ONLY by the token contract bound to the RuleEngine","params":{"from":"token holder address","spender":"spender address (sender)","to":"receiver address","value":"value of tokens involved in the transfer"}},"transferred(address,address,uint256)":{"details":" This function can be used to update state variables of the compliance contract This function can be called ONLY by the token contract bound to the compliance","params":{"from":"The address of the sender","to":"The address of the receiver","value":"value of tokens involved in the transfer"}},"trustedForwarder()":{"details":"Returns the address of the trusted forwarder."},"unbindToken(address)":{"details":"Operator warning: unbinding is an administrative operation and does not erase any state already stored by external rule contracts in a previously shared (\"multi-tenant\") setup.","params":{"token":"The address of the token to unbind."}},"version()":{"details":"This value is useful to know which smart contract version has been used","returns":{"version_":"A string representing the version of the token implementation (e.g., \"1.0.0\")."}}},"version":1},"userdoc":{"kind":"user","methods":{"RULES_MANAGEMENT_ROLE()":{"notice":"Role to manage the ruleEngine"},"addRule(address)":{"notice":"Adds a new rule to the current rule set."},"bindToken(address)":{"notice":"Associates a token contract with this compliance contract."},"canTransfer(address,address,uint256)":{"notice":"Returns true if the transfer is valid, and false otherwise."},"canTransferFrom(address,address,address,uint256)":{"notice":"Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules."},"clearRules()":{"notice":"Removes all configured rules."},"containsRule(address)":{"notice":"Checks whether a specific rule is currently configured."},"created(address,uint256)":{"notice":"Updates the compliance contract state when tokens are created (minted)."},"destroyed(address,uint256)":{"notice":"Updates the compliance contract state when tokens are destroyed (burned)."},"detectTransferRestriction(address,address,uint256)":{"notice":"Go through all the rule to know if a restriction exists on the transfer"},"detectTransferRestrictionFrom(address,address,address,uint256)":{"notice":"Returns a uint8 code to indicate if a transfer is restricted or not"},"getTokenBound()":{"notice":"Returns the single token currently bound to this compliance contract."},"getTokenBounds()":{"notice":"Returns all tokens currently bound to this compliance contract."},"isTokenBound(address)":{"notice":"Checks whether a token is currently bound to this compliance contract."},"removeRule(address)":{"notice":"Removes a specific rule from the current rule set."},"rule(uint256)":{"notice":"Retrieves the rule address at a specific index."},"rules()":{"notice":"Returns the full list of currently configured rules."},"rulesCount()":{"notice":"Returns the total number of currently configured rules."},"setRules(address[])":{"notice":"Defines the rules for the rule engine."},"transferred(address,address,address,uint256)":{"notice":"Function called whenever tokens are transferred from one wallet to another"},"transferred(address,address,uint256)":{"notice":"Function called whenever tokens are transferred from one wallet to another"},"unbindToken(address)":{"notice":"Removes the association of a token contract from this compliance contract."},"version()":{"notice":"Returns the current version of the token contract."}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","CMTAT/=lib/CMTAT/contracts/","CMTATv3.0.0/=lib/CMTATv3.0.0/contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/deployment/RuleEngineOwnable2Step.sol":"RuleEngineOwnable2Step"},"evmVersion":"prague","libraries":{}},"sources":{"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol":{"keccak256":"0x524a2cf2214a82fb96e97a18a94956fee68a419ecd6b2dc841aa1105f336c3f1","urls":["bzz-raw://9c4728d80b6678101586515c0308c63bcba2a78b0a3c12d37b522d59f3175a01","dweb:/ipfs/QmYP9SPbe2hB69jKkSg43qkz1HVxBayKrG14i9f6hx7hh8"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/technical/IERC5679.sol":{"keccak256":"0xcc6f2e79d1d9eabcf4c7ffcbd85c0de31bb2b3cdf17eb847dffb7c2d2a8c4695","urls":["bzz-raw://d618bc2be7c6bc167037fe57ca648523c671c61791f3f0c65965ab7139d6dc33","dweb:/ipfs/QmSrCKWFjpg1SQ7v2k3vRyWpcU9dB6Pbk167R4oAzUc2Te"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol":{"keccak256":"0x1707381177447b1a398c443c7e753942df0c5d4633e80d2864db472e89e43dc0","urls":["bzz-raw://c4281d98847629b67222332bea67f336623937758be908ee9ca1aa40b3abe19d","dweb:/ipfs/QmZQBruKJH3sStjBmCb28rxRkUkZ4EFsDCi8WZ7Y85spxS"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol":{"keccak256":"0x17fb1f64b546fd882331dffbd8c7f4e53c51738b9e2621a0dcfcf30e64d8b66e","urls":["bzz-raw://c35fe277d5d99a0943293b5da5622947095e6b719af35fda9ef2c714a7879a4b","dweb:/ipfs/QmRV5q3XvjJE8sxJJBpEkwk1qyz3r4McH2BdX1v2ZxZGZh"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7551.sol":{"keccak256":"0x709074d96bd5d7aa07d2ba3a1c9a99ae0fd4361f7322b528b42f3b83c5dcb984","urls":["bzz-raw://ca67a06011b746b55bf2465988dc10a4e6371e40b5108c54531f03e938bda865","dweb:/ipfs/QmbjFyDAJsUXywqzU2s96pFqFpC5DLKdfa8WjMBtQPhKGE"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/tokenization/draft-IERC7943.sol":{"keccak256":"0x1a341fc7ee7d9b8b00b6168b35a6a844d90431749d8ca694174c52c41e11763f","urls":["bzz-raw://4fb6b13953539b99262cb299961fb8ff8a020de79b12f76c63decf33ff9d5103","dweb:/ipfs/QmQ3bnkQJgD2s6xpapThCPTSMbDREokVEiM7extwQgfrv7"],"license":"MPL-2.0"},"lib/CMTAT/contracts/library/ERC1404ExtendInterfaceId.sol":{"keccak256":"0xe5f6f08d319d27f20989936460d3947eed5fdcb470f80e920f4fb09ccc7e1e87","urls":["bzz-raw://cb654fe37c2bc6c765c67c5f94a769580312d1d4109c50262677ac406362f91e","dweb:/ipfs/Qmc8ZFVANCmULNozM2wFUSGKXBgUHR5bpDC3ZVjV4XoEv7"],"license":"MPL-2.0"},"lib/CMTAT/contracts/library/RuleEngineInterfaceId.sol":{"keccak256":"0x759990208069b5a0862a255eff790d52d1d64bbb6c334705fc12414936825692","urls":["bzz-raw://0bce1c17cbbddac4bf123f602dc980246e5bec724f5ed3107e148548b930e124","dweb:/ipfs/QmRZUxmRN9ji9UYueD6knhnz2nSsDRZgRTX74uenGczVjA"],"license":"MPL-2.0"},"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol":{"keccak256":"0xdcad8898fda432696597752e8ec361b87d85c82cb258115427af006dacf7128c","urls":["bzz-raw://e2c9d517f0c136d54bd00cd57959d25681d4d6273f5bbbc263afe228303772f0","dweb:/ipfs/QmReNFjXBiufByiAAzfSQ2SM5r3qeUErn46BmN3yVRvrek"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol":{"keccak256":"0x9695d220b99dcf62910533bdf5d40d4cf6a4e04d5b106b6803a80586486dc7f7","urls":["bzz-raw://83b7aecd65882d8953643dce144efe91367082cc01830c9c4ed3c8a4837fb558","dweb:/ipfs/QmQ5HxGavcCKjuhd8buv177qjG6A4kvxx4pZviceKdspdM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Arrays.sol":{"keccak256":"0xb3b81029526a4c3acf39e57cc446407141ebce338cc99585942af1340e1a69e0","urls":["bzz-raw://3857ce97e8f7a51ad78ea5419b3386e18fcc8af73b65803eedd8193ab7abc9df","dweb:/ipfs/QmSQi6x2cYsUy76mfMNwuq151bVmh4kAND141kjume51Aq"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Comparators.sol":{"keccak256":"0x302eecd8cf323b4690e3494a7d960b3cbce077032ab8ef655b323cdd136cec58","urls":["bzz-raw://49ba706f1bc476d68fe6c1fad75517acea4e9e275be0989b548e292eb3a3eacd","dweb:/ipfs/QmeBpvcdGWzWMKTQESUCEhHgnEQYYATVwPxLMxa6vMT7jC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol":{"keccak256":"0x94045fd4f268edf2b2d01ef119268548c320366d6f5294ad30c1b8f9d4f5225f","urls":["bzz-raw://edfda81f426f8948b3834115c21e83c48180e6db0d2a8cd2debb2185ed349337","dweb:/ipfs/QmdYZneFyDAux1BuWQxLAdqtABrGS2k9WYCa7C9dvpKkWv"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"keccak256":"0x7c7ad70641a7f8cd44def0857ec97b0e40bfd073b2d6037a5f57ce9527ee9bc5","urls":["bzz-raw://e05c6572dfe769f7aea6f3a8002951cc12d143d980dad29f6c5feedf9408bc14","dweb:/ipfs/QmXM7C8YEptxisZiEefXUrwdXt3zMaCobmkCchxTtDg1oK"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857","urls":["bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5","dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083","urls":["bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9","dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x5c298e834696707e274a71a224969d36faecd928a8076603210d67d091adb4ae","urls":["bzz-raw://a93fe967b4d55b31157164cbb7e3e1ebaf3535fc1d3f8d0156da7abb9b565d90","dweb:/ipfs/QmXH7nyxwEUeMPFDDmkdUwqxLEcezaSmVyunyMAuck1WqR"],"license":"MIT"},"src/RuleEngineBase.sol":{"keccak256":"0x9edae8ce7df18638cf56b571be18251d4ac4c435844c8cd77d1f7f651623c568","urls":["bzz-raw://9758c7256a994b371c00d9e0098be5d76d9896f2a556208dfb83768d4d4e916b","dweb:/ipfs/QmdZwwiB29tzheoaoRWiJdbbGMH2nM46ojLp7WFjm9D19h"],"license":"MPL-2.0"},"src/RuleEngineOwnableShared.sol":{"keccak256":"0xbe119365533074f6f59227e4b74432e03407f553f13c8361c21166f1fbb67f19","urls":["bzz-raw://22b0689c774191b4065d1eda22d040fc79211f83e41f018dfe4bfcae7a328a57","dweb:/ipfs/QmS9EgzvD45x72bNpMW3hyMQHfPyyBJN24iJmAuR1cEjpc"],"license":"MPL-2.0"},"src/deployment/RuleEngineOwnable2Step.sol":{"keccak256":"0xb38e07dc3fca6e25f18ce11dbef8af3692ac8f5c115c45adf01f854d9b68efb5","urls":["bzz-raw://1cee543cfeab07d772c245ced21140273fc5c2b9bd106f72bc971cc70ae0c726","dweb:/ipfs/QmSDgmt41PpCDU6XRWkipgJtcMoh2VSr7ttBDfsQ7oJ9rT"],"license":"MPL-2.0"},"src/interfaces/IERC3643Compliance.sol":{"keccak256":"0xf86e78e8f737795c3762b402b121b0f1822d6b27414aeca08ea6f036cccea07b","urls":["bzz-raw://c795d1b89a1393b2225f6e58c0310d345d78ff534ab028353413c4a5aaf9ecf7","dweb:/ipfs/QmNcJsJzLWzSAV77whMzu7je2Mj2pWoTYYn1z76kqB5mKH"],"license":"MPL-2.0"},"src/interfaces/IRule.sol":{"keccak256":"0x315fd1d0147d40d3cc1ee35f6ddb8c9e25e6e4f96034a285e6f342c59c3cc222","urls":["bzz-raw://5b0ecca410bf89169e5c6393bc4d8fce97a5b3dcf8a2bba02317da85c98f4d0c","dweb:/ipfs/QmeGS5vbFwkmEvJh7s27Q9xW4xGXuUohh2zGPVbgxgjfnu"],"license":"MPL-2.0"},"src/interfaces/IRulesManagementModule.sol":{"keccak256":"0x1be8087ef526f664cf8ba5dd35d4d12fc1880f905e3ba2e553ee02cb7d6506c1","urls":["bzz-raw://545cafd73f2fe9b2b89b37e905057637f58ae2c1da7f3dc33493b515c87a720f","dweb:/ipfs/QmXiTEhLSpN6sj1fiwFT9V6bGD1VCXTqQJiNnXcLrYmW7N"],"license":"MPL-2.0"},"src/modules/ERC2771ModuleStandalone.sol":{"keccak256":"0xecc9aec20ff41c46404f6fcb9bfb0fd5588781fbb4f2fbec351f603a31c178b0","urls":["bzz-raw://48674e77afe59b6c6e6aa8b0d5e370ca58c9a354b5dc294bb3c9f10fbd12a3f3","dweb:/ipfs/QmY3HhbBDqsBvrGBXoRwgVpfSNtiK2XmhaxVpS1F3dSPx9"],"license":"MPL-2.0"},"src/modules/ERC3643ComplianceModule.sol":{"keccak256":"0xdb472471270ea23d4694ca2d2eb107ce668affc9dbe18b5a6eda312ab4800a33","urls":["bzz-raw://6200e990afca50a32fb0a0ad76ffe955447a67cab6e93f64281fc9f14208aab1","dweb:/ipfs/QmXXhRsBq3eGDgBqQwWL5w4Sn6pdTeeXRvpC4jZBDVb6nQ"],"license":"MPL-2.0"},"src/modules/RulesManagementModule.sol":{"keccak256":"0xc9c58e027874658577285de9c9bf9069cd773573a615df7c9644c6c96c69dbc3","urls":["bzz-raw://a6c9ca74cc247b42b9852b35cb4eeadc919d383d7bbd4f4df0739ee6a8bce2c3","dweb:/ipfs/QmfJCvSQjqQrQXYt9JEHiJRZATy1s7q53DKxZC1QsSYMHZ"],"license":"MPL-2.0"},"src/modules/VersionModule.sol":{"keccak256":"0x077070dca24da125a764111d336c0a8fb3445b82d93692ff76b22384b0f4f39f","urls":["bzz-raw://be8df88e667fb2de39d095f0c396d23ed263fdc51a4095fedc89a326540a03ee","dweb:/ipfs/QmYfhhEvNee1XYwCYZCVAKpUUWBd5FP5qvTMYGr6ogC8kA"],"license":"MPL-2.0"},"src/modules/library/ComplianceInterfaceId.sol":{"keccak256":"0xa0f15ca7f9e0fa8ccb854ea2bd812f220c68c280682b56e8d1a437ddba4b6d1f","urls":["bzz-raw://1e01a79b4a2110a401c3d2fbead97844f7428d6dc6603dccf795d42dbc142786","dweb:/ipfs/QmV88ZcDHTU33oXNLFTshUBZ7otgcZRN1HXwywda7Fgz9a"],"license":"MPL-2.0"},"src/modules/library/RuleEngineInvariantStorage.sol":{"keccak256":"0x15005e56f8fbf8f9b8a41c4bfed6c842e37be49fa52b0dbb2edc6b08b9e50c2f","urls":["bzz-raw://06c90dd748d060cb1b05de978cb42fd79d9b49a2beb3a479b4e49f8edaba1195","dweb:/ipfs/QmYXEQWrwJkuzWBdi5hjSaM6pWhrNUf2kH2pHX8jRu9dZS"],"license":"MPL-2.0"},"src/modules/library/RuleInterfaceId.sol":{"keccak256":"0x3c57987589d6205e2546d4ce332e944d1667dddfe897087028a95ed804c50882","urls":["bzz-raw://0e1718e500d4cb5cf4441131c57d23da788f2835e9a014e7d1f62dfb6161647a","dweb:/ipfs/QmXY5cjc9Dzrp7ML7DfvDB9zg7t4cene3g4K9AAuDmLLfC"],"license":"MPL-2.0"},"src/modules/library/RulesManagementModuleInvariantStorage.sol":{"keccak256":"0xa6f9109698f169be74c309a1efadd48edffcb0e9585523258477bf07942c8ae6","urls":["bzz-raw://4c28513636b660111b60a7028c9600b30dcfda291a831343d9e27e253b80856a","dweb:/ipfs/QmQVSZ9N6vjPxNnJDTqEuGSWqNdoxHKhzTzP2cvgZpBSzj"],"license":"MPL-2.0"}},"version":1},"id":165} \ No newline at end of file diff --git a/doc/compilation/v3.0.0-rc2/hardhat/RuleEngine.sol/RuleEngine.dbg.json b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngine.sol/RuleEngine.dbg.json new file mode 100644 index 0000000..35abe72 --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngine.sol/RuleEngine.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../../build-info/6f3c11638d96ee863225bd1b2732b06d.json" +} diff --git a/doc/compilation/v3.0.0-rc2/hardhat/RuleEngine.sol/RuleEngine.json b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngine.sol/RuleEngine.json new file mode 100644 index 0000000..acccfe5 --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngine.sol/RuleEngine.json @@ -0,0 +1,921 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "RuleEngine", + "sourceName": "src/deployment/RuleEngine.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarderIrrevocable", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_AdminWithAddressZeroNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_InvalidTokenAddress", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_OperationNotSuccessful", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_TokenAlreadyBound", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_TokenNotBound", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_UnauthorizedCaller", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RuleInvalidInterface", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_ArrayIsEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_OperationNotSuccessful", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleDoNotMatch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IRule", + "name": "rule", + "type": "address" + } + ], + "name": "AddRule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ClearRules", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IRule", + "name": "rule", + "type": "address" + } + ], + "name": "RemoveRule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "TokenBound", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "TokenUnbound", + "type": "event" + }, + { + "inputs": [], + "name": "COMPLIANCE_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RULES_MANAGEMENT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "addRule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "bindToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "canTransfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "canTransferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "clearRules", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "containsRule", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "created", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "destroyed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "detectTransferRestriction", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "detectTransferRestrictionFrom", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMembers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenBound", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenBounds", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "isTokenBound", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "isTrustedForwarder", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "restrictionCode", + "type": "uint8" + } + ], + "name": "messageForTransferRestriction", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "removeRule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ruleId", + "type": "uint256" + } + ], + "name": "rule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rules", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rulesCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule[]", + "name": "rules_", + "type": "address[]" + } + ], + "name": "setRules", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferred", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferred", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "unbindToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "version_", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561000f575f5ffd5b5060405161200438038061200483398101604081905261002e91610385565b6001600160a01b03808316608052831661005b57604051630872273360e21b815260040160405180910390fd5b6001600160a01b038116156100735761007381610086565b61007d5f8461013d565b50505050610424565b6001600160a01b0381166100ad576040516301b8831760e71b815260040160405180910390fd5b6100b8600282610173565b156100d65760405163f423354760e01b815260040160405180910390fd5b6100e1600282610194565b6100fe57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b9060200160405180910390a150565b5f8061014984846101a8565b9050801561016a575f8481526005602052604090206101689084610194565b505b90505b92915050565b6001600160a01b0381165f908152600183016020526040812054151561016a565b5f61016a836001600160a01b03841661023a565b5f6101b3838361027f565b610233575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101eb6102f1565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161016d565b505f61016d565b5f81815260018301602052604081205461023357508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561016d565b6001600160a01b0381165f9081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec602052604081205460ff16156102c65750600161016d565b505f8281526004602090815260408083206001600160a01b038516845290915290205460ff1661016d565b5f6102fa6102ff565b905090565b5f366014808210801590610317575061031733610345565b1561033d5761032a36828403815f6103c5565b610333916103ec565b60601c9250505090565b339250505090565b5f61034f60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b0381168114610380575f5ffd5b919050565b5f5f5f60608486031215610397575f5ffd5b6103a08461036a565b92506103ae6020850161036a565b91506103bc6040850161036a565b90509250925092565b5f5f858511156103d3575f5ffd5b838611156103df575f5ffd5b5050820193919092039150565b80356001600160601b0319811690601484101561041d576001600160601b0319601485900360031b81901b82161691505b5092915050565b608051611bba61044a5f395f8181610364015281816103dc01526113460152611bba5ff3fe608060405234801561000f575f5ffd5b506004361061021e575f3560e01c80638d2ea7721161012a578063bc13eacc116100b4578063db18af6c11610079578063db18af6c14610534578063df21950f14610547578063e3c4602c1461055a578063e46638e61461056d578063e54621d214610580575f5ffd5b8063bc13eacc146104ce578063ca15c873146104d6578063d32c7bb5146104e9578063d4ce14151461050e578063d547741f14610521575f5ffd5b80639b11c115116100fa5780639b11c11514610472578063a217fddf14610499578063a3246ad3146104a0578063b043572e146104b3578063b27aef3a146104bb575f5ffd5b80638d2ea772146104265780639010d07c1461043957806391d148541461044c578063993e8b951461045f575f5ffd5b806354e4b945116101ab5780636a3edf281161017b5780636a3edf28146103a75780637157797f146103c75780637da0a877146103da5780637f4ab1dd146104005780638baf29b414610413575f5ffd5b806354e4b9451461031757806354fd4d501461032a578063572b6c05146103545780635f8dead314610394575f5ffd5b806336568abe116101f157806336568abe146102b65780633e5af4ca146102c95780633ff5aa02146102dc57806340db3b50146102ef57806352f6747a14610302575f5ffd5b806301ffc9a71461022257806303c26bcd1461024a578063248a9ca31461027f5780632f2ff15d146102a1575b5f5ffd5b61023561023036600461174a565b610588565b60405190151581526020015b60405180910390f35b6102717fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610241565b61027161028d366004611771565b5f9081526004602052604090206001015490565b6102b46102af36600461179c565b6105a7565b005b6102b46102c436600461179c565b6105d1565b6102b46102d73660046117ca565b610619565b6102b46102ea366004611818565b61062d565b6102b46102fd366004611818565b610641565b61030a610652565b6040516102419190611833565b610235610325366004611818565b610662565b6040805180820190915260058152640332e302e360dc1b60208201525b604051610241919061187e565b610235610362366004611818565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b46103a23660046118b3565b61066d565b6103af610684565b6040516001600160a01b039091168152602001610241565b6102356103d53660046117ca565b6106a6565b7f00000000000000000000000000000000000000000000000000000000000000006103af565b61034761040e3660046118eb565b6106c3565b6102b4610421366004611906565b6106ce565b6102b46104343660046118b3565b6106e1565b6103af610447366004611944565b6106f4565b61023561045a36600461179c565b610712565b61023561046d366004611818565b610784565b6102717fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102715f81565b61030a6104ae366004611771565b610790565b6102b46107a9565b6102b46104c9366004611964565b6107bb565b6102716108e7565b6102716104e4366004611771565b6108f1565b6104fc6104f73660046117ca565b610907565b60405160ff9091168152602001610241565b6104fc61051c366004611906565b61091d565b6102b461052f36600461179c565b610929565b6103af610542366004611771565b61094d565b6102b4610555366004611818565b61096f565b6102b4610568366004611818565b6109a7565b61023561057b366004611906565b610a15565b61030a610a2e565b5f61059282610a3a565b806105a157506105a182610aa5565b92915050565b5f828152600460205260409020600101546105c181610ac9565b6105cb8383610ada565b50505050565b6105d9610b0d565b6001600160a01b0316816001600160a01b03161461060a5760405163334bd91960e11b815260040160405180910390fd5b6106148282610b16565b505050565b610621610b41565b6105cb84848484610b71565b610635610c13565b61063e81610c3d565b50565b610649610c13565b61063e81610cf5565b606061065d5f610d7e565b905090565b5f6105a18183610d8a565b610675610b41565b6106805f8383610dab565b5050565b5f5f6106906002610e44565b11156106a15761065d60025f610e4d565b505f90565b5f806106b486868686610907565b60ff161490505b949350505050565b60606105a182610e58565b6106d6610b41565b610614838383610dab565b6106e9610b41565b610680825f83610dab565b5f82815260056020526040812061070b9083610e4d565b9392505050565b6001600160a01b0381165f9081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec602052604081205460ff1615610759575060016105a1565b505f8281526004602090815260408083206001600160a01b038516845290915290205460ff166105a1565b5f6105a1600283610d8a565b5f8181526005602052604090206060906105a190610d7e565b6107b1610fa2565b6107b9610fcc565b565b6107c3610fa2565b5f8190036107e4576040516359203cb960e01b815260040160405180910390fd5b5f6107ee5f610e44565b11156107fc576107fc610fcc565b5f5b818110156106145761083583838381811061081b5761081b6119d5565b90506020020160208101906108309190611818565b610ffd565b61086683838381811061084a5761084a6119d5565b905060200201602081019061085f9190611818565b5f90611034565b6108835760405163f280d16160e01b815260040160405180910390fd5b828282818110610895576108956119d5565b90506020020160208101906108aa9190611818565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016107fe565b5f61065d5f610e44565b5f8181526005602052604081206105a190610e44565b5f61091485858585611048565b95945050505050565b5f6106bb848484611113565b5f8281526004602052604090206001015461094381610ac9565b6105cb8383610b16565b5f6109575f610e44565b821015610968576105a15f83610e4d565b505f919050565b610977610fa2565b6109815f82610d8a565b61099e57604051632cdc3a4160e21b815260040160405180910390fd5b61063e816111d5565b6109af610fa2565b6109b881610ffd565b6109c25f82611034565b6109df5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f80610a2285858561091d565b60ff1614949350505050565b606061065d6002610d7e565b5f6001600160e01b031982166320c49ce760e01b1480610a6a57506001600160e01b031982166378a8de7d60e01b145b80610a8557506001600160e01b03198216630c51264760e21b145b806105a157506001600160e01b03198216637157797f60e01b1492915050565b5f6001600160e01b03198216635a05180f60e01b14806105a157506105a182611232565b61063e81610ad5610b0d565b611266565b5f5f610ae684846112a3565b9050801561070b575f848152600560205260409020610b059084611034565b509392505050565b5f61065d611335565b5f5f610b22848461139f565b9050801561070b575f848152600560205260409020610b059084611428565b610b54610b4c610b0d565b600290610d8a565b6107b95760405163e39b3c8f60e01b815260040160405180910390fd5b5f610b7b5f610e44565b90505f5b81811015610c0b57610b915f82610e4d565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610bea575f5ffd5b505af1158015610bfc573d5f5f3e3d5ffd5b50505050806001019050610b7f565b505050505050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856861063e81610ac9565b6001600160a01b038116610c64576040516301b8831760e71b815260040160405180910390fd5b610c6f600282610d8a565b15610c8d5760405163f423354760e01b815260040160405180910390fd5b610c98600282611034565b610cb557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610d00600282610d8a565b610d1d57604051636a2b488360e11b815260040160405180910390fd5b610d28600282611428565b610d4557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610cea565b60605f61070b8361143c565b6001600160a01b0381165f908152600183016020526040812054151561070b565b5f610db55f610e44565b90505f5b81811015610e3d57610dcb5f82610e4d565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610e1c575f5ffd5b505af1158015610e2e573d5f5f3e3d5ffd5b50505050806001019050610db9565b5050505050565b5f6105a1825490565b5f61070b8383611495565b60605f610e636108e7565b90505f5b81811015610f6657610e788161094d565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610ebf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee391906119e9565b15610f5e57610ef18161094d565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610f37573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106bb9190810190611a1c565b600101610e67565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e61063e81610ac9565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16107b95f6114bb565b611006816114c4565b61101781632497d6cb60e01b611513565b61063e57604051639952e34360e01b815260040160405180910390fd5b5f61070b836001600160a01b03841661152e565b5f5f6110526108e7565b90505f5b81811015611107575f6110688261094d565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa1580156110c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e99190611acf565b905060ff8116156110fe5792506106bb915050565b50600101611056565b505f9695505050505050565b5f5f61111d6108e7565b90505f5b818110156111ca575f6111338261094d565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015611188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ac9190611acf565b905060ff8116156111c157925061070b915050565b50600101611121565b505f95945050505050565b6111df5f82611428565b6111fc5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6001600160e01b03198216637965db0b60e01b14806105a157506301ffc9a760e01b6001600160e01b03198316146105a1565b6112708282610712565b6106805760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5f6112ae8383610712565b61132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191660011790556112e6610b0d565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016105a1565b505f6105a1565b5f36601480821080159061137157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113975761138436828403815f611aea565b61138d91611b11565b60601c9250505090565b339250505090565b5f6113aa8383610712565b1561132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191690556113e0610b0d565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45060016105a1565b5f61070b836001600160a01b038416611573565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561148957602002820191905f5260205f20905b815481526020019060010190808311611475575b50505050509050919050565b5f825f0182815481106114aa576114aa6119d5565b905f5260205f200154905092915050565b61063e8161165d565b6001600160a01b0381166114eb5760405163f9d152fb60e01b815260040160405180910390fd5b6114f55f82610d8a565b1561063e5760405163cc790a4b60e01b815260040160405180910390fd5b5f61151d836116b6565b801561070b575061070b83836116f5565b5f81815260018301602052604081205461132e57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556105a1565b5f818152600183016020526040812054801561164d575f611595600183611b51565b85549091505f906115a890600190611b51565b9050808214611607575f865f0182815481106115c6576115c66119d5565b905f5260205f200154905080875f0184815481106115e6576115e66119d5565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061161857611618611b70565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506105a1565b5f9150506105a1565b5092915050565b5f611666825490565b90505f5b818110156116af57826001015f845f01838154811061168b5761168b6119d5565b905f5260205f20015481526020019081526020015f205f905580600101905061166a565b50505f9055565b5f6116c8826301ffc9a760e01b6116f5565b15610968575f806116e1846001600160e01b0319611716565b915091508180156106bb5750159392505050565b5f5f5f6117028585611716565b915091508180156109145750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f6020828403121561175a575f5ffd5b81356001600160e01b03198116811461070b575f5ffd5b5f60208284031215611781575f5ffd5b5035919050565b6001600160a01b038116811461063e575f5ffd5b5f5f604083850312156117ad575f5ffd5b8235915060208301356117bf81611788565b809150509250929050565b5f5f5f5f608085870312156117dd575f5ffd5b84356117e881611788565b935060208501356117f881611788565b9250604085013561180881611788565b9396929550929360600135925050565b5f60208284031215611828575f5ffd5b813561070b81611788565b602080825282518282018190525f918401906040840190835b818110156118735783516001600160a01b031683526020938401939092019160010161184c565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156118c4575f5ffd5b82356118cf81611788565b946020939093013593505050565b60ff8116811461063e575f5ffd5b5f602082840312156118fb575f5ffd5b813561070b816118dd565b5f5f5f60608486031215611918575f5ffd5b833561192381611788565b9250602084013561193381611788565b929592945050506040919091013590565b5f5f60408385031215611955575f5ffd5b50508035926020909101359150565b5f5f60208385031215611975575f5ffd5b823567ffffffffffffffff81111561198b575f5ffd5b8301601f8101851361199b575f5ffd5b803567ffffffffffffffff8111156119b1575f5ffd5b8560208260051b84010111156119c5575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156119f9575f5ffd5b8151801515811461070b575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611a2c575f5ffd5b815167ffffffffffffffff811115611a42575f5ffd5b8201601f81018413611a52575f5ffd5b805167ffffffffffffffff811115611a6c57611a6c611a08565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611a9b57611a9b611a08565b604052818152828201602001861015611ab2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611adf575f5ffd5b815161070b816118dd565b5f5f85851115611af8575f5ffd5b83861115611b04575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611656576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b818103818111156105a157634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220a009c07502662c5792e389f7aebf6f174ebd68a89148a2c900772663b8436d7664736f6c63430008220033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061021e575f3560e01c80638d2ea7721161012a578063bc13eacc116100b4578063db18af6c11610079578063db18af6c14610534578063df21950f14610547578063e3c4602c1461055a578063e46638e61461056d578063e54621d214610580575f5ffd5b8063bc13eacc146104ce578063ca15c873146104d6578063d32c7bb5146104e9578063d4ce14151461050e578063d547741f14610521575f5ffd5b80639b11c115116100fa5780639b11c11514610472578063a217fddf14610499578063a3246ad3146104a0578063b043572e146104b3578063b27aef3a146104bb575f5ffd5b80638d2ea772146104265780639010d07c1461043957806391d148541461044c578063993e8b951461045f575f5ffd5b806354e4b945116101ab5780636a3edf281161017b5780636a3edf28146103a75780637157797f146103c75780637da0a877146103da5780637f4ab1dd146104005780638baf29b414610413575f5ffd5b806354e4b9451461031757806354fd4d501461032a578063572b6c05146103545780635f8dead314610394575f5ffd5b806336568abe116101f157806336568abe146102b65780633e5af4ca146102c95780633ff5aa02146102dc57806340db3b50146102ef57806352f6747a14610302575f5ffd5b806301ffc9a71461022257806303c26bcd1461024a578063248a9ca31461027f5780632f2ff15d146102a1575b5f5ffd5b61023561023036600461174a565b610588565b60405190151581526020015b60405180910390f35b6102717fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610241565b61027161028d366004611771565b5f9081526004602052604090206001015490565b6102b46102af36600461179c565b6105a7565b005b6102b46102c436600461179c565b6105d1565b6102b46102d73660046117ca565b610619565b6102b46102ea366004611818565b61062d565b6102b46102fd366004611818565b610641565b61030a610652565b6040516102419190611833565b610235610325366004611818565b610662565b6040805180820190915260058152640332e302e360dc1b60208201525b604051610241919061187e565b610235610362366004611818565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b46103a23660046118b3565b61066d565b6103af610684565b6040516001600160a01b039091168152602001610241565b6102356103d53660046117ca565b6106a6565b7f00000000000000000000000000000000000000000000000000000000000000006103af565b61034761040e3660046118eb565b6106c3565b6102b4610421366004611906565b6106ce565b6102b46104343660046118b3565b6106e1565b6103af610447366004611944565b6106f4565b61023561045a36600461179c565b610712565b61023561046d366004611818565b610784565b6102717fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102715f81565b61030a6104ae366004611771565b610790565b6102b46107a9565b6102b46104c9366004611964565b6107bb565b6102716108e7565b6102716104e4366004611771565b6108f1565b6104fc6104f73660046117ca565b610907565b60405160ff9091168152602001610241565b6104fc61051c366004611906565b61091d565b6102b461052f36600461179c565b610929565b6103af610542366004611771565b61094d565b6102b4610555366004611818565b61096f565b6102b4610568366004611818565b6109a7565b61023561057b366004611906565b610a15565b61030a610a2e565b5f61059282610a3a565b806105a157506105a182610aa5565b92915050565b5f828152600460205260409020600101546105c181610ac9565b6105cb8383610ada565b50505050565b6105d9610b0d565b6001600160a01b0316816001600160a01b03161461060a5760405163334bd91960e11b815260040160405180910390fd5b6106148282610b16565b505050565b610621610b41565b6105cb84848484610b71565b610635610c13565b61063e81610c3d565b50565b610649610c13565b61063e81610cf5565b606061065d5f610d7e565b905090565b5f6105a18183610d8a565b610675610b41565b6106805f8383610dab565b5050565b5f5f6106906002610e44565b11156106a15761065d60025f610e4d565b505f90565b5f806106b486868686610907565b60ff161490505b949350505050565b60606105a182610e58565b6106d6610b41565b610614838383610dab565b6106e9610b41565b610680825f83610dab565b5f82815260056020526040812061070b9083610e4d565b9392505050565b6001600160a01b0381165f9081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec602052604081205460ff1615610759575060016105a1565b505f8281526004602090815260408083206001600160a01b038516845290915290205460ff166105a1565b5f6105a1600283610d8a565b5f8181526005602052604090206060906105a190610d7e565b6107b1610fa2565b6107b9610fcc565b565b6107c3610fa2565b5f8190036107e4576040516359203cb960e01b815260040160405180910390fd5b5f6107ee5f610e44565b11156107fc576107fc610fcc565b5f5b818110156106145761083583838381811061081b5761081b6119d5565b90506020020160208101906108309190611818565b610ffd565b61086683838381811061084a5761084a6119d5565b905060200201602081019061085f9190611818565b5f90611034565b6108835760405163f280d16160e01b815260040160405180910390fd5b828282818110610895576108956119d5565b90506020020160208101906108aa9190611818565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016107fe565b5f61065d5f610e44565b5f8181526005602052604081206105a190610e44565b5f61091485858585611048565b95945050505050565b5f6106bb848484611113565b5f8281526004602052604090206001015461094381610ac9565b6105cb8383610b16565b5f6109575f610e44565b821015610968576105a15f83610e4d565b505f919050565b610977610fa2565b6109815f82610d8a565b61099e57604051632cdc3a4160e21b815260040160405180910390fd5b61063e816111d5565b6109af610fa2565b6109b881610ffd565b6109c25f82611034565b6109df5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f80610a2285858561091d565b60ff1614949350505050565b606061065d6002610d7e565b5f6001600160e01b031982166320c49ce760e01b1480610a6a57506001600160e01b031982166378a8de7d60e01b145b80610a8557506001600160e01b03198216630c51264760e21b145b806105a157506001600160e01b03198216637157797f60e01b1492915050565b5f6001600160e01b03198216635a05180f60e01b14806105a157506105a182611232565b61063e81610ad5610b0d565b611266565b5f5f610ae684846112a3565b9050801561070b575f848152600560205260409020610b059084611034565b509392505050565b5f61065d611335565b5f5f610b22848461139f565b9050801561070b575f848152600560205260409020610b059084611428565b610b54610b4c610b0d565b600290610d8a565b6107b95760405163e39b3c8f60e01b815260040160405180910390fd5b5f610b7b5f610e44565b90505f5b81811015610c0b57610b915f82610e4d565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610bea575f5ffd5b505af1158015610bfc573d5f5f3e3d5ffd5b50505050806001019050610b7f565b505050505050565b7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856861063e81610ac9565b6001600160a01b038116610c64576040516301b8831760e71b815260040160405180910390fd5b610c6f600282610d8a565b15610c8d5760405163f423354760e01b815260040160405180910390fd5b610c98600282611034565b610cb557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610d00600282610d8a565b610d1d57604051636a2b488360e11b815260040160405180910390fd5b610d28600282611428565b610d4557604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610cea565b60605f61070b8361143c565b6001600160a01b0381165f908152600183016020526040812054151561070b565b5f610db55f610e44565b90505f5b81811015610e3d57610dcb5f82610e4d565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610e1c575f5ffd5b505af1158015610e2e573d5f5f3e3d5ffd5b50505050806001019050610db9565b5050505050565b5f6105a1825490565b5f61070b8383611495565b60605f610e636108e7565b90505f5b81811015610f6657610e788161094d565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610ebf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee391906119e9565b15610f5e57610ef18161094d565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610f37573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106bb9190810190611a1c565b600101610e67565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e61063e81610ac9565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16107b95f6114bb565b611006816114c4565b61101781632497d6cb60e01b611513565b61063e57604051639952e34360e01b815260040160405180910390fd5b5f61070b836001600160a01b03841661152e565b5f5f6110526108e7565b90505f5b81811015611107575f6110688261094d565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa1580156110c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e99190611acf565b905060ff8116156110fe5792506106bb915050565b50600101611056565b505f9695505050505050565b5f5f61111d6108e7565b90505f5b818110156111ca575f6111338261094d565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015611188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ac9190611acf565b905060ff8116156111c157925061070b915050565b50600101611121565b505f95945050505050565b6111df5f82611428565b6111fc5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6001600160e01b03198216637965db0b60e01b14806105a157506301ffc9a760e01b6001600160e01b03198316146105a1565b6112708282610712565b6106805760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5f6112ae8383610712565b61132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191660011790556112e6610b0d565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016105a1565b505f6105a1565b5f36601480821080159061137157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113975761138436828403815f611aea565b61138d91611b11565b60601c9250505090565b339250505090565b5f6113aa8383610712565b1561132e575f8381526004602090815260408083206001600160a01b03861684529091529020805460ff191690556113e0610b0d565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45060016105a1565b5f61070b836001600160a01b038416611573565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561148957602002820191905f5260205f20905b815481526020019060010190808311611475575b50505050509050919050565b5f825f0182815481106114aa576114aa6119d5565b905f5260205f200154905092915050565b61063e8161165d565b6001600160a01b0381166114eb5760405163f9d152fb60e01b815260040160405180910390fd5b6114f55f82610d8a565b1561063e5760405163cc790a4b60e01b815260040160405180910390fd5b5f61151d836116b6565b801561070b575061070b83836116f5565b5f81815260018301602052604081205461132e57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556105a1565b5f818152600183016020526040812054801561164d575f611595600183611b51565b85549091505f906115a890600190611b51565b9050808214611607575f865f0182815481106115c6576115c66119d5565b905f5260205f200154905080875f0184815481106115e6576115e66119d5565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061161857611618611b70565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506105a1565b5f9150506105a1565b5092915050565b5f611666825490565b90505f5b818110156116af57826001015f845f01838154811061168b5761168b6119d5565b905f5260205f20015481526020019081526020015f205f905580600101905061166a565b50505f9055565b5f6116c8826301ffc9a760e01b6116f5565b15610968575f806116e1846001600160e01b0319611716565b915091508180156106bb5750159392505050565b5f5f5f6117028585611716565b915091508180156109145750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f6020828403121561175a575f5ffd5b81356001600160e01b03198116811461070b575f5ffd5b5f60208284031215611781575f5ffd5b5035919050565b6001600160a01b038116811461063e575f5ffd5b5f5f604083850312156117ad575f5ffd5b8235915060208301356117bf81611788565b809150509250929050565b5f5f5f5f608085870312156117dd575f5ffd5b84356117e881611788565b935060208501356117f881611788565b9250604085013561180881611788565b9396929550929360600135925050565b5f60208284031215611828575f5ffd5b813561070b81611788565b602080825282518282018190525f918401906040840190835b818110156118735783516001600160a01b031683526020938401939092019160010161184c565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156118c4575f5ffd5b82356118cf81611788565b946020939093013593505050565b60ff8116811461063e575f5ffd5b5f602082840312156118fb575f5ffd5b813561070b816118dd565b5f5f5f60608486031215611918575f5ffd5b833561192381611788565b9250602084013561193381611788565b929592945050506040919091013590565b5f5f60408385031215611955575f5ffd5b50508035926020909101359150565b5f5f60208385031215611975575f5ffd5b823567ffffffffffffffff81111561198b575f5ffd5b8301601f8101851361199b575f5ffd5b803567ffffffffffffffff8111156119b1575f5ffd5b8560208260051b84010111156119c5575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156119f9575f5ffd5b8151801515811461070b575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611a2c575f5ffd5b815167ffffffffffffffff811115611a42575f5ffd5b8201601f81018413611a52575f5ffd5b805167ffffffffffffffff811115611a6c57611a6c611a08565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611a9b57611a9b611a08565b604052818152828201602001861015611ab2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611adf575f5ffd5b815161070b816118dd565b5f5f85851115611af8575f5ffd5b83861115611b04575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611656576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b818103818111156105a157634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220a009c07502662c5792e389f7aebf6f174ebd68a89148a2c900772663b8436d7664736f6c63430008220033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable.sol/RuleEngineOwnable.dbg.json b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable.sol/RuleEngineOwnable.dbg.json new file mode 100644 index 0000000..35abe72 --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable.sol/RuleEngineOwnable.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../../build-info/6f3c11638d96ee863225bd1b2732b06d.json" +} diff --git a/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable.sol/RuleEngineOwnable.json b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable.sol/RuleEngineOwnable.json new file mode 100644 index 0000000..af208b0 --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable.sol/RuleEngineOwnable.json @@ -0,0 +1,727 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "RuleEngineOwnable", + "sourceName": "src/deployment/RuleEngineOwnable.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "owner_", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarderIrrevocable", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_AdminWithAddressZeroNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_InvalidTokenAddress", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_OperationNotSuccessful", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_TokenAlreadyBound", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_TokenNotBound", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_UnauthorizedCaller", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RuleInvalidInterface", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_ArrayIsEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_OperationNotSuccessful", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleDoNotMatch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IRule", + "name": "rule", + "type": "address" + } + ], + "name": "AddRule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ClearRules", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IRule", + "name": "rule", + "type": "address" + } + ], + "name": "RemoveRule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "TokenBound", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "TokenUnbound", + "type": "event" + }, + { + "inputs": [], + "name": "COMPLIANCE_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RULES_MANAGEMENT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "addRule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "bindToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "canTransfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "canTransferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "clearRules", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "containsRule", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "created", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "destroyed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "detectTransferRestriction", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "detectTransferRestrictionFrom", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenBound", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenBounds", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "isTokenBound", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "isTrustedForwarder", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "restrictionCode", + "type": "uint8" + } + ], + "name": "messageForTransferRestriction", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "removeRule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ruleId", + "type": "uint256" + } + ], + "name": "rule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rules", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rulesCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule[]", + "name": "rules_", + "type": "address[]" + } + ], + "name": "setRules", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferred", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferred", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "unbindToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "version_", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561000f575f5ffd5b50604051611ad2380380611ad283398101604081905261002e91610237565b6001600160a01b038083166080528390839083908116156100525761005281610093565b50506001600160a01b03811661008157604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61008a8161014a565b50505050610277565b6001600160a01b0381166100ba576040516301b8831760e71b815260040160405180910390fd5b6100c560028261019b565b156100e35760405163f423354760e01b815260040160405180910390fd5b6100ee6002826101c1565b61010b57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b9060200160405180910390a150565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f90815260018301602052604081205415155b90505b92915050565b5f6101b8836001600160a01b0384165f81815260018301602052604081205461021557508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556101bb565b505f6101bb565b80516001600160a01b0381168114610232575f5ffd5b919050565b5f5f5f60608486031215610249575f5ffd5b6102528461021c565b92506102606020850161021c565b915061026e6040850161021c565b90509250925092565b60805161183561029d5f395f81816102da0152818161035a015261138601526118355ff3fe608060405234801561000f575f5ffd5b50600436106101dc575f3560e01c80638baf29b411610109578063d32c7bb51161009e578063e3c4602c1161006e578063e3c4602c14610483578063e46638e614610496578063e54621d2146104a9578063f2fde38b146104b1575f5ffd5b8063d32c7bb514610425578063d4ce14151461044a578063db18af6c1461045d578063df21950f14610470575f5ffd5b80639b11c115116100d95780639b11c115146103db578063b043572e14610402578063b27aef3a1461040a578063bc13eacc1461041d575f5ffd5b80638baf29b4146103915780638d2ea772146103a45780638da5cb5b146103b7578063993e8b95146103c8575f5ffd5b806354fd4d501161017f578063715018a61161014f578063715018a61461033d5780637157797f146103455780637da0a877146103585780637f4ab1dd1461037e575f5ffd5b806354fd4d50146102a0578063572b6c05146102ca5780635f8dead31461030a5780636a3edf281461031d575f5ffd5b80633ff5aa02116101ba5780633ff5aa021461025257806340db3b501461026557806352f6747a1461027857806354e4b9451461028d575f5ffd5b806301ffc9a7146101e057806303c26bcd146102085780633e5af4ca1461023d575b5f5ffd5b6101f36101ee366004611413565b6104c4565b60405190151581526020015b60405180910390f35b61022f7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b6040519081526020016101ff565b61025061024b36600461144e565b61050a565b005b61025061026036600461149c565b610524565b61025061027336600461149c565b610538565b610280610549565b6040516101ff91906114b7565b6101f361029b36600461149c565b610559565b6040805180820190915260058152640332e302e360dc1b60208201525b6040516101ff9190611502565b6101f36102d836600461149c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610250610318366004611537565b610564565b61032561057b565b6040516001600160a01b0390911681526020016101ff565b61025061059d565b6101f361035336600461144e565b6105b0565b7f0000000000000000000000000000000000000000000000000000000000000000610325565b6102bd61038c36600461156f565b6105cd565b61025061039f36600461158a565b6105d8565b6102506103b2366004611537565b6105f0565b6004546001600160a01b0316610325565b6101f36103d636600461149c565b610603565b61022f7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b61025061060f565b6102506104183660046115c8565b61061f565b61022f61074b565b61043861043336600461144e565b610755565b60405160ff90911681526020016101ff565b61043861045836600461158a565b61076b565b61032561046b366004611639565b610781565b61025061047e36600461149c565b6107a3565b61025061049136600461149c565b6107db565b6101f36104a436600461158a565b610849565b610280610862565b6102506104bf36600461149c565b61086e565b5f6104ce826108ad565b806104e957506001600160e01b031982166307f5828d60e41b145b8061050457506001600160e01b031982166301ffc9a760e01b145b92915050565b610512610918565b61051e84848484610948565b50505050565b61052c6109ea565b610535816109f2565b50565b6105406109ea565b61053581610aaa565b60606105545f610b33565b905090565b5f6105048183610b3f565b61056c610918565b6105775f8383610b5f565b5050565b5f5f6105876002610bf8565b11156105985761055460025f610c01565b505f90565b6105a5610c0c565b6105ae5f610c6a565b565b5f806105be86868686610755565b60ff161490505b949350505050565b606061050482610cbb565b6105e0610918565b6105eb838383610b5f565b505050565b6105f8610918565b610577825f83610b5f565b5f610504600283610b3f565b6106176109ea565b6105ae610e05565b6106276109ea565b5f819003610648576040516359203cb960e01b815260040160405180910390fd5b5f6106525f610bf8565b111561066057610660610e05565b5f5b818110156105eb5761069983838381811061067f5761067f611650565b9050602002016020810190610694919061149c565b610e36565b6106ca8383838181106106ae576106ae611650565b90506020020160208101906106c3919061149c565b5f90610e6d565b6106e75760405163f280d16160e01b815260040160405180910390fd5b8282828181106106f9576106f9611650565b905060200201602081019061070e919061149c565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610662565b5f6105545f610bf8565b5f61076285858585610e81565b95945050505050565b5f610777848484610f4c565b90505b9392505050565b5f61078b5f610bf8565b82101561079c576105045f83610c01565b505f919050565b6107ab6109ea565b6107b55f82610b3f565b6107d257604051632cdc3a4160e21b815260040160405180910390fd5b6105358161100e565b6107e36109ea565b6107ec81610e36565b6107f65f82610e6d565b6108135760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f8061085685858561076b565b60ff1614949350505050565b60606105546002610b33565b610876610c0c565b6001600160a01b0381166108a457604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61053581610c6a565b5f6001600160e01b031982166320c49ce760e01b14806108dd57506001600160e01b031982166378a8de7d60e01b145b806108f857506001600160e01b03198216630c51264760e21b145b8061050457506001600160e01b03198216637157797f60e01b1492915050565b61092b61092361106b565b600290610b3f565b6105ae5760405163e39b3c8f60e01b815260040160405180910390fd5b5f6109525f610bf8565b90505f5b818110156109e2576109685f82610c01565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b1580156109c1575f5ffd5b505af11580156109d3573d5f5f3e3d5ffd5b50505050806001019050610956565b505050505050565b6105ae610c0c565b6001600160a01b038116610a19576040516301b8831760e71b815260040160405180910390fd5b610a24600282610b3f565b15610a425760405163f423354760e01b815260040160405180910390fd5b610a4d600282610e6d565b610a6a57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610ab5600282610b3f565b610ad257604051636a2b488360e11b815260040160405180910390fd5b610add600282611074565b610afa57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610a9f565b60605f61077a83611088565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610b695f610bf8565b90505f5b81811015610bf157610b7f5f82610c01565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610bd0575f5ffd5b505af1158015610be2573d5f5f3e3d5ffd5b50505050806001019050610b6d565b5050505050565b5f610504825490565b5f61077a83836110e1565b610c1461106b565b6001600160a01b0316610c2f6004546001600160a01b031690565b6001600160a01b0316146105ae57610c4561106b565b60405163118cdaa760e01b81526001600160a01b03909116600482015260240161089b565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60605f610cc661074b565b90505f5b81811015610dc957610cdb81610781565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610d22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d469190611664565b15610dc157610d5481610781565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610d9a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105c59190810190611697565b600101610cca565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105ae5f611107565b610e3f81611110565b610e5081632497d6cb60e01b61115f565b61053557604051639952e34360e01b815260040160405180910390fd5b5f61077a836001600160a01b03841661117a565b5f5f610e8b61074b565b90505f5b81811015610f40575f610ea182610781565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610efe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f22919061174a565b905060ff811615610f375792506105c5915050565b50600101610e8f565b505f9695505050505050565b5f5f610f5661074b565b90505f5b81811015611003575f610f6c82610781565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015610fc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe5919061174a565b905060ff811615610ffa57925061077a915050565b50600101610f5a565b505f95945050505050565b6110185f82611074565b6110355760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6105546111c6565b5f61077a836001600160a01b0384166111d4565b6060815f018054806020026020016040519081016040528092919081815260200182805480156110d557602002820191905f5260205f20905b8154815260200190600101908083116110c1575b50505050509050919050565b5f825f0182815481106110f6576110f6611650565b905f5260205f200154905092915050565b610535816112be565b6001600160a01b0381166111375760405163f9d152fb60e01b815260040160405180910390fd5b6111415f82610b3f565b156105355760405163cc790a4b60e01b815260040160405180910390fd5b5f61116983611317565b801561077a575061077a8383611356565b5f8181526001830160205260408120546111bf57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610504565b505f610504565b5f6105545f36816014611377565b5f81815260018301602052604081205480156112ae575f6111f6600183611765565b85549091505f9061120990600190611765565b9050808214611268575f865f01828154811061122757611227611650565b905f5260205f200154905080875f01848154811061124757611247611650565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061127957611279611784565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610504565b5f915050610504565b5092915050565b5f6112c7825490565b90505f5b8181101561131057826001015f845f0183815481106112ec576112ec611650565b905f5260205f20015481526020019081526020015f205f90558060010190506112cb565b50505f9055565b5f611329826301ffc9a760e01b611356565b1561079c575f80611342846001600160e01b03196113df565b915091508180156105c55750159392505050565b5f5f5f61136385856113df565b915091508180156107625750949350505050565b90508082101580156113b157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113d7576113c436828403815f611798565b6113cd916117bf565b60601c9250505090565b339250505090565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611423575f5ffd5b81356001600160e01b03198116811461077a575f5ffd5b6001600160a01b0381168114610535575f5ffd5b5f5f5f5f60808587031215611461575f5ffd5b843561146c8161143a565b9350602085013561147c8161143a565b9250604085013561148c8161143a565b9396929550929360600135925050565b5f602082840312156114ac575f5ffd5b813561077a8161143a565b602080825282518282018190525f918401906040840190835b818110156114f75783516001600160a01b03168352602093840193909201916001016114d0565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611548575f5ffd5b82356115538161143a565b946020939093013593505050565b60ff81168114610535575f5ffd5b5f6020828403121561157f575f5ffd5b813561077a81611561565b5f5f5f6060848603121561159c575f5ffd5b83356115a78161143a565b925060208401356115b78161143a565b929592945050506040919091013590565b5f5f602083850312156115d9575f5ffd5b823567ffffffffffffffff8111156115ef575f5ffd5b8301601f810185136115ff575f5ffd5b803567ffffffffffffffff811115611615575f5ffd5b8560208260051b8401011115611629575f5ffd5b6020919091019590945092505050565b5f60208284031215611649575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611674575f5ffd5b8151801515811461077a575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156116a7575f5ffd5b815167ffffffffffffffff8111156116bd575f5ffd5b8201601f810184136116cd575f5ffd5b805167ffffffffffffffff8111156116e7576116e7611683565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561171657611716611683565b60405281815282820160200186101561172d575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f6020828403121561175a575f5ffd5b815161077a81611561565b8181038181111561050457634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f858511156117a6575f5ffd5b838611156117b2575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156112b7576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea26469706673582212201e9fb211c255bec6228b5933ad98df6d4ed24f7c9a53f9bea90aa6130d1d316b64736f6c63430008220033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106101dc575f3560e01c80638baf29b411610109578063d32c7bb51161009e578063e3c4602c1161006e578063e3c4602c14610483578063e46638e614610496578063e54621d2146104a9578063f2fde38b146104b1575f5ffd5b8063d32c7bb514610425578063d4ce14151461044a578063db18af6c1461045d578063df21950f14610470575f5ffd5b80639b11c115116100d95780639b11c115146103db578063b043572e14610402578063b27aef3a1461040a578063bc13eacc1461041d575f5ffd5b80638baf29b4146103915780638d2ea772146103a45780638da5cb5b146103b7578063993e8b95146103c8575f5ffd5b806354fd4d501161017f578063715018a61161014f578063715018a61461033d5780637157797f146103455780637da0a877146103585780637f4ab1dd1461037e575f5ffd5b806354fd4d50146102a0578063572b6c05146102ca5780635f8dead31461030a5780636a3edf281461031d575f5ffd5b80633ff5aa02116101ba5780633ff5aa021461025257806340db3b501461026557806352f6747a1461027857806354e4b9451461028d575f5ffd5b806301ffc9a7146101e057806303c26bcd146102085780633e5af4ca1461023d575b5f5ffd5b6101f36101ee366004611413565b6104c4565b60405190151581526020015b60405180910390f35b61022f7fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b6040519081526020016101ff565b61025061024b36600461144e565b61050a565b005b61025061026036600461149c565b610524565b61025061027336600461149c565b610538565b610280610549565b6040516101ff91906114b7565b6101f361029b36600461149c565b610559565b6040805180820190915260058152640332e302e360dc1b60208201525b6040516101ff9190611502565b6101f36102d836600461149c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610250610318366004611537565b610564565b61032561057b565b6040516001600160a01b0390911681526020016101ff565b61025061059d565b6101f361035336600461144e565b6105b0565b7f0000000000000000000000000000000000000000000000000000000000000000610325565b6102bd61038c36600461156f565b6105cd565b61025061039f36600461158a565b6105d8565b6102506103b2366004611537565b6105f0565b6004546001600160a01b0316610325565b6101f36103d636600461149c565b610603565b61022f7fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b61025061060f565b6102506104183660046115c8565b61061f565b61022f61074b565b61043861043336600461144e565b610755565b60405160ff90911681526020016101ff565b61043861045836600461158a565b61076b565b61032561046b366004611639565b610781565b61025061047e36600461149c565b6107a3565b61025061049136600461149c565b6107db565b6101f36104a436600461158a565b610849565b610280610862565b6102506104bf36600461149c565b61086e565b5f6104ce826108ad565b806104e957506001600160e01b031982166307f5828d60e41b145b8061050457506001600160e01b031982166301ffc9a760e01b145b92915050565b610512610918565b61051e84848484610948565b50505050565b61052c6109ea565b610535816109f2565b50565b6105406109ea565b61053581610aaa565b60606105545f610b33565b905090565b5f6105048183610b3f565b61056c610918565b6105775f8383610b5f565b5050565b5f5f6105876002610bf8565b11156105985761055460025f610c01565b505f90565b6105a5610c0c565b6105ae5f610c6a565b565b5f806105be86868686610755565b60ff161490505b949350505050565b606061050482610cbb565b6105e0610918565b6105eb838383610b5f565b505050565b6105f8610918565b610577825f83610b5f565b5f610504600283610b3f565b6106176109ea565b6105ae610e05565b6106276109ea565b5f819003610648576040516359203cb960e01b815260040160405180910390fd5b5f6106525f610bf8565b111561066057610660610e05565b5f5b818110156105eb5761069983838381811061067f5761067f611650565b9050602002016020810190610694919061149c565b610e36565b6106ca8383838181106106ae576106ae611650565b90506020020160208101906106c3919061149c565b5f90610e6d565b6106e75760405163f280d16160e01b815260040160405180910390fd5b8282828181106106f9576106f9611650565b905060200201602081019061070e919061149c565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610662565b5f6105545f610bf8565b5f61076285858585610e81565b95945050505050565b5f610777848484610f4c565b90505b9392505050565b5f61078b5f610bf8565b82101561079c576105045f83610c01565b505f919050565b6107ab6109ea565b6107b55f82610b3f565b6107d257604051632cdc3a4160e21b815260040160405180910390fd5b6105358161100e565b6107e36109ea565b6107ec81610e36565b6107f65f82610e6d565b6108135760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f8061085685858561076b565b60ff1614949350505050565b60606105546002610b33565b610876610c0c565b6001600160a01b0381166108a457604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61053581610c6a565b5f6001600160e01b031982166320c49ce760e01b14806108dd57506001600160e01b031982166378a8de7d60e01b145b806108f857506001600160e01b03198216630c51264760e21b145b8061050457506001600160e01b03198216637157797f60e01b1492915050565b61092b61092361106b565b600290610b3f565b6105ae5760405163e39b3c8f60e01b815260040160405180910390fd5b5f6109525f610bf8565b90505f5b818110156109e2576109685f82610c01565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b1580156109c1575f5ffd5b505af11580156109d3573d5f5f3e3d5ffd5b50505050806001019050610956565b505050505050565b6105ae610c0c565b6001600160a01b038116610a19576040516301b8831760e71b815260040160405180910390fd5b610a24600282610b3f565b15610a425760405163f423354760e01b815260040160405180910390fd5b610a4d600282610e6d565b610a6a57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610ab5600282610b3f565b610ad257604051636a2b488360e11b815260040160405180910390fd5b610add600282611074565b610afa57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610a9f565b60605f61077a83611088565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610b695f610bf8565b90505f5b81811015610bf157610b7f5f82610c01565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610bd0575f5ffd5b505af1158015610be2573d5f5f3e3d5ffd5b50505050806001019050610b6d565b5050505050565b5f610504825490565b5f61077a83836110e1565b610c1461106b565b6001600160a01b0316610c2f6004546001600160a01b031690565b6001600160a01b0316146105ae57610c4561106b565b60405163118cdaa760e01b81526001600160a01b03909116600482015260240161089b565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60605f610cc661074b565b90505f5b81811015610dc957610cdb81610781565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610d22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d469190611664565b15610dc157610d5481610781565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610d9a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105c59190810190611697565b600101610cca565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105ae5f611107565b610e3f81611110565b610e5081632497d6cb60e01b61115f565b61053557604051639952e34360e01b815260040160405180910390fd5b5f61077a836001600160a01b03841661117a565b5f5f610e8b61074b565b90505f5b81811015610f40575f610ea182610781565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610efe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f22919061174a565b905060ff811615610f375792506105c5915050565b50600101610e8f565b505f9695505050505050565b5f5f610f5661074b565b90505f5b81811015611003575f610f6c82610781565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa158015610fc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe5919061174a565b905060ff811615610ffa57925061077a915050565b50600101610f5a565b505f95945050505050565b6110185f82611074565b6110355760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f6105546111c6565b5f61077a836001600160a01b0384166111d4565b6060815f018054806020026020016040519081016040528092919081815260200182805480156110d557602002820191905f5260205f20905b8154815260200190600101908083116110c1575b50505050509050919050565b5f825f0182815481106110f6576110f6611650565b905f5260205f200154905092915050565b610535816112be565b6001600160a01b0381166111375760405163f9d152fb60e01b815260040160405180910390fd5b6111415f82610b3f565b156105355760405163cc790a4b60e01b815260040160405180910390fd5b5f61116983611317565b801561077a575061077a8383611356565b5f8181526001830160205260408120546111bf57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610504565b505f610504565b5f6105545f36816014611377565b5f81815260018301602052604081205480156112ae575f6111f6600183611765565b85549091505f9061120990600190611765565b9050808214611268575f865f01828154811061122757611227611650565b905f5260205f200154905080875f01848154811061124757611247611650565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061127957611279611784565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610504565b5f915050610504565b5092915050565b5f6112c7825490565b90505f5b8181101561131057826001015f845f0183815481106112ec576112ec611650565b905f5260205f20015481526020019081526020015f205f90558060010190506112cb565b50505f9055565b5f611329826301ffc9a760e01b611356565b1561079c575f80611342846001600160e01b03196113df565b915091508180156105c55750159392505050565b5f5f5f61136385856113df565b915091508180156107625750949350505050565b90508082101580156113b157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113d7576113c436828403815f611798565b6113cd916117bf565b60601c9250505090565b339250505090565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611423575f5ffd5b81356001600160e01b03198116811461077a575f5ffd5b6001600160a01b0381168114610535575f5ffd5b5f5f5f5f60808587031215611461575f5ffd5b843561146c8161143a565b9350602085013561147c8161143a565b9250604085013561148c8161143a565b9396929550929360600135925050565b5f602082840312156114ac575f5ffd5b813561077a8161143a565b602080825282518282018190525f918401906040840190835b818110156114f75783516001600160a01b03168352602093840193909201916001016114d0565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611548575f5ffd5b82356115538161143a565b946020939093013593505050565b60ff81168114610535575f5ffd5b5f6020828403121561157f575f5ffd5b813561077a81611561565b5f5f5f6060848603121561159c575f5ffd5b83356115a78161143a565b925060208401356115b78161143a565b929592945050506040919091013590565b5f5f602083850312156115d9575f5ffd5b823567ffffffffffffffff8111156115ef575f5ffd5b8301601f810185136115ff575f5ffd5b803567ffffffffffffffff811115611615575f5ffd5b8560208260051b8401011115611629575f5ffd5b6020919091019590945092505050565b5f60208284031215611649575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611674575f5ffd5b8151801515811461077a575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156116a7575f5ffd5b815167ffffffffffffffff8111156116bd575f5ffd5b8201601f810184136116cd575f5ffd5b805167ffffffffffffffff8111156116e7576116e7611683565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561171657611716611683565b60405281815282820160200186101561172d575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f6020828403121561175a575f5ffd5b815161077a81611561565b8181038181111561050457634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f858511156117a6575f5ffd5b838611156117b2575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156112b7576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea26469706673582212201e9fb211c255bec6228b5933ad98df6d4ed24f7c9a53f9bea90aa6130d1d316b64736f6c63430008220033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.dbg.json b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.dbg.json new file mode 100644 index 0000000..35abe72 --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../../build-info/6f3c11638d96ee863225bd1b2732b06d.json" +} diff --git a/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.json b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.json new file mode 100644 index 0000000..2191aa7 --- /dev/null +++ b/doc/compilation/v3.0.0-rc2/hardhat/RuleEngineOwnable2Step.sol/RuleEngineOwnable2Step.json @@ -0,0 +1,766 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "RuleEngineOwnable2Step", + "sourceName": "src/deployment/RuleEngineOwnable2Step.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "owner_", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarderIrrevocable", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_AdminWithAddressZeroNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_InvalidTokenAddress", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_OperationNotSuccessful", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_TokenAlreadyBound", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_TokenNotBound", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_ERC3643Compliance_UnauthorizedCaller", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RuleInvalidInterface", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_ArrayIsEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_OperationNotSuccessful", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "RuleEngine_RulesManagementModule_RuleDoNotMatch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IRule", + "name": "rule", + "type": "address" + } + ], + "name": "AddRule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ClearRules", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IRule", + "name": "rule", + "type": "address" + } + ], + "name": "RemoveRule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "TokenBound", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "TokenUnbound", + "type": "event" + }, + { + "inputs": [], + "name": "COMPLIANCE_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RULES_MANAGEMENT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "addRule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "bindToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "canTransfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "canTransferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "clearRules", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "containsRule", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "created", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "destroyed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "detectTransferRestriction", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "detectTransferRestrictionFrom", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenBound", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenBounds", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "isTokenBound", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "isTrustedForwarder", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "restrictionCode", + "type": "uint8" + } + ], + "name": "messageForTransferRestriction", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule", + "name": "rule_", + "type": "address" + } + ], + "name": "removeRule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ruleId", + "type": "uint256" + } + ], + "name": "rule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rules", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rulesCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRule[]", + "name": "rules_", + "type": "address[]" + } + ], + "name": "setRules", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferred", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferred", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "unbindToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "version_", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561000f575f5ffd5b50604051611bd1380380611bd183398101604081905261002e91610258565b6001600160a01b038083166080528390839083908116156100525761005281610093565b50506001600160a01b03811661008157604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61008a8161014a565b50505050610298565b6001600160a01b0381166100ba576040516301b8831760e71b815260040160405180910390fd5b6100c5600282610166565b156100e35760405163f423354760e01b815260040160405180910390fd5b6100ee60028261018c565b61010b57604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b9060200160405180910390a150565b600580546001600160a01b0319169055610163816101a0565b50565b6001600160a01b0381165f90815260018301602052604081205415155b90505b92915050565b5f610183836001600160a01b0384166101f1565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260018301602052604081205461023657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610186565b505f610186565b80516001600160a01b0381168114610253575f5ffd5b919050565b5f5f5f6060848603121561026a575f5ffd5b6102738461023d565b92506102816020850161023d565b915061028f6040850161023d565b90509250925092565b6080516119136102be5f395f81816102f00152818161037801526113ab01526119135ff3fe608060405234801561000f575f5ffd5b50600436106101f2575f3560e01c80638baf29b411610114578063d32c7bb5116100a9578063e30c397811610079578063e30c3978146104a1578063e3c4602c146104b2578063e46638e6146104c5578063e54621d2146104d8578063f2fde38b146104e0575f5ffd5b8063d32c7bb514610443578063d4ce141514610468578063db18af6c1461047b578063df21950f1461048e575f5ffd5b80639b11c115116100e45780639b11c115146103f9578063b043572e14610420578063b27aef3a14610428578063bc13eacc1461043b575f5ffd5b80638baf29b4146103af5780638d2ea772146103c25780638da5cb5b146103d5578063993e8b95146103e6575f5ffd5b8063572b6c051161018a5780637157797f1161015a5780637157797f1461035b57806379ba50971461036e5780637da0a877146103765780637f4ab1dd1461039c575f5ffd5b8063572b6c05146102e05780635f8dead3146103205780636a3edf2814610333578063715018a614610353575f5ffd5b806340db3b50116101c557806340db3b501461027b57806352f6747a1461028e57806354e4b945146102a357806354fd4d50146102b6575f5ffd5b806301ffc9a7146101f657806303c26bcd1461021e5780633e5af4ca146102535780633ff5aa0214610268575b5f5ffd5b6102096102043660046114f1565b6104f3565b60405190151581526020015b60405180910390f35b6102457fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610215565b61026661026136600461152c565b610539565b005b61026661027636600461157a565b610553565b61026661028936600461157a565b610567565b610296610578565b6040516102159190611595565b6102096102b136600461157a565b610588565b6040805180820190915260058152640332e302e360dc1b60208201525b60405161021591906115e0565b6102096102ee36600461157a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b61026661032e366004611615565b610593565b61033b6105aa565b6040516001600160a01b039091168152602001610215565b6102666105cc565b61020961036936600461152c565b6105df565b6102666105fc565b7f000000000000000000000000000000000000000000000000000000000000000061033b565b6102d36103aa36600461164d565b610663565b6102666103bd366004611668565b61066e565b6102666103d0366004611615565b610686565b6004546001600160a01b031661033b565b6102096103f436600461157a565b610699565b6102457fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102666106a5565b6102666104363660046116a6565b6106b5565b6102456107e1565b61045661045136600461152c565b6107eb565b60405160ff9091168152602001610215565b610456610476366004611668565b610801565b61033b610489366004611717565b610817565b61026661049c36600461157a565b610839565b6005546001600160a01b031661033b565b6102666104c036600461157a565b610871565b6102096104d3366004611668565b6108df565b6102966108f8565b6102666104ee36600461157a565b610904565b5f6104fd82610975565b8061051857506001600160e01b031982166307f5828d60e41b145b8061053357506001600160e01b031982166301ffc9a760e01b145b92915050565b6105416109e0565b61054d84848484610a10565b50505050565b61055b610ab2565b61056481610aba565b50565b61056f610ab2565b61056481610b72565b60606105835f610bfb565b905090565b5f6105338183610c07565b61059b6109e0565b6105a65f8383610c27565b5050565b5f5f6105b66002610cc0565b11156105c75761058360025f610cc9565b505f90565b6105d4610cd4565b6105dd5f610d32565b565b5f806105ed868686866107eb565b60ff161490505b949350505050565b5f610605610d4b565b9050806001600160a01b03166106236005546001600160a01b031690565b6001600160a01b03161461065a5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61056481610d32565b606061053382610d54565b6106766109e0565b610681838383610c27565b505050565b61068e6109e0565b6105a6825f83610c27565b5f610533600283610c07565b6106ad610ab2565b6105dd610e9e565b6106bd610ab2565b5f8190036106de576040516359203cb960e01b815260040160405180910390fd5b5f6106e85f610cc0565b11156106f6576106f6610e9e565b5f5b818110156106815761072f8383838181106107155761071561172e565b905060200201602081019061072a919061157a565b610ecf565b6107608383838181106107445761074461172e565b9050602002016020810190610759919061157a565b5f90610f06565b61077d5760405163f280d16160e01b815260040160405180910390fd5b82828281811061078f5761078f61172e565b90506020020160208101906107a4919061157a565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016106f8565b5f6105835f610cc0565b5f6107f885858585610f1a565b95945050505050565b5f61080d848484610fe5565b90505b9392505050565b5f6108215f610cc0565b821015610832576105335f83610cc9565b505f919050565b610841610ab2565b61084b5f82610c07565b61086857604051632cdc3a4160e21b815260040160405180910390fd5b610564816110a7565b610879610ab2565b61088281610ecf565b61088c5f82610f06565b6108a95760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f806108ec858585610801565b60ff1614949350505050565b60606105836002610bfb565b61090c610cd4565b600580546001600160a01b0383166001600160a01b0319909116811790915561093d6004546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b031982166320c49ce760e01b14806109a557506001600160e01b031982166378a8de7d60e01b145b806109c057506001600160e01b03198216630c51264760e21b145b8061053357506001600160e01b03198216637157797f60e01b1492915050565b6109f36109eb610d4b565b600290610c07565b6105dd5760405163e39b3c8f60e01b815260040160405180910390fd5b5f610a1a5f610cc0565b90505f5b81811015610aaa57610a305f82610cc9565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610a89575f5ffd5b505af1158015610a9b573d5f5f3e3d5ffd5b50505050806001019050610a1e565b505050505050565b6105dd610cd4565b6001600160a01b038116610ae1576040516301b8831760e71b815260040160405180910390fd5b610aec600282610c07565b15610b0a5760405163f423354760e01b815260040160405180910390fd5b610b15600282610f06565b610b3257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610b7d600282610c07565b610b9a57604051636a2b488360e11b815260040160405180910390fd5b610ba5600282611104565b610bc257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610b67565b60605f61081083611118565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610c315f610cc0565b90505f5b81811015610cb957610c475f82610cc9565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610c98575f5ffd5b505af1158015610caa573d5f5f3e3d5ffd5b50505050806001019050610c35565b5050505050565b5f610533825490565b5f6108108383611171565b610cdc610d4b565b6001600160a01b0316610cf76004546001600160a01b031690565b6001600160a01b0316146105dd57610d0d610d4b565b60405163118cdaa760e01b81526001600160a01b039091166004820152602401610651565b600580546001600160a01b031916905561056481611197565b5f6105836111e8565b60605f610d5f6107e1565b90505f5b81811015610e6257610d7481610817565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610dbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611742565b15610e5a57610ded81610817565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610e33573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105f49190810190611775565b600101610d63565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105dd5f6111f1565b610ed8816111fa565b610ee981632497d6cb60e01b611249565b61056457604051639952e34360e01b815260040160405180910390fd5b5f610810836001600160a01b038416611264565b5f5f610f246107e1565b90505f5b81811015610fd9575f610f3a82610817565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610f97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbb9190611828565b905060ff811615610fd05792506105f4915050565b50600101610f28565b505f9695505050505050565b5f5f610fef6107e1565b90505f5b8181101561109c575f61100582610817565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa15801561105a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107e9190611828565b905060ff811615611093579250610810915050565b50600101610ff3565b505f95945050505050565b6110b15f82611104565b6110ce5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f610810836001600160a01b0384166112b0565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561116557602002820191905f5260205f20905b815481526020019060010190808311611151575b50505050509050919050565b5f825f0182815481106111865761118661172e565b905f5260205f200154905092915050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f61058361139a565b61056481611404565b6001600160a01b0381166112215760405163f9d152fb60e01b815260040160405180910390fd5b61122b5f82610c07565b156105645760405163cc790a4b60e01b815260040160405180910390fd5b5f6112538361145d565b80156108105750610810838361149c565b5f8181526001830160205260408120546112a957508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610533565b505f610533565b5f818152600183016020526040812054801561138a575f6112d2600183611843565b85549091505f906112e590600190611843565b9050808214611344575f865f0182815481106113035761130361172e565b905f5260205f200154905080875f0184815481106113235761132361172e565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061135557611355611862565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610533565b5f915050610533565b5092915050565b5f3660148082108015906113d657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113fc576113e936828403815f611876565b6113f29161189d565b60601c9250505090565b339250505090565b5f61140d825490565b90505f5b8181101561145657826001015f845f0183815481106114325761143261172e565b905f5260205f20015481526020019081526020015f205f9055806001019050611411565b50505f9055565b5f61146f826301ffc9a760e01b61149c565b15610832575f80611488846001600160e01b03196114bd565b915091508180156105f45750159392505050565b5f5f5f6114a985856114bd565b915091508180156107f85750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611501575f5ffd5b81356001600160e01b031981168114610810575f5ffd5b6001600160a01b0381168114610564575f5ffd5b5f5f5f5f6080858703121561153f575f5ffd5b843561154a81611518565b9350602085013561155a81611518565b9250604085013561156a81611518565b9396929550929360600135925050565b5f6020828403121561158a575f5ffd5b813561081081611518565b602080825282518282018190525f918401906040840190835b818110156115d55783516001600160a01b03168352602093840193909201916001016115ae565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611626575f5ffd5b823561163181611518565b946020939093013593505050565b60ff81168114610564575f5ffd5b5f6020828403121561165d575f5ffd5b81356108108161163f565b5f5f5f6060848603121561167a575f5ffd5b833561168581611518565b9250602084013561169581611518565b929592945050506040919091013590565b5f5f602083850312156116b7575f5ffd5b823567ffffffffffffffff8111156116cd575f5ffd5b8301601f810185136116dd575f5ffd5b803567ffffffffffffffff8111156116f3575f5ffd5b8560208260051b8401011115611707575f5ffd5b6020919091019590945092505050565b5f60208284031215611727575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611752575f5ffd5b81518015158114610810575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611785575f5ffd5b815167ffffffffffffffff81111561179b575f5ffd5b8201601f810184136117ab575f5ffd5b805167ffffffffffffffff8111156117c5576117c5611761565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156117f4576117f4611761565b60405281815282820160200186101561180b575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611838575f5ffd5b81516108108161163f565b8181038181111561053357634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f85851115611884575f5ffd5b83861115611890575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611393576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea26469706673582212203eeb560dee8ab479a1244c47104759fd3416c361073c50829fba85457e2504a264736f6c63430008220033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106101f2575f3560e01c80638baf29b411610114578063d32c7bb5116100a9578063e30c397811610079578063e30c3978146104a1578063e3c4602c146104b2578063e46638e6146104c5578063e54621d2146104d8578063f2fde38b146104e0575f5ffd5b8063d32c7bb514610443578063d4ce141514610468578063db18af6c1461047b578063df21950f1461048e575f5ffd5b80639b11c115116100e45780639b11c115146103f9578063b043572e14610420578063b27aef3a14610428578063bc13eacc1461043b575f5ffd5b80638baf29b4146103af5780638d2ea772146103c25780638da5cb5b146103d5578063993e8b95146103e6575f5ffd5b8063572b6c051161018a5780637157797f1161015a5780637157797f1461035b57806379ba50971461036e5780637da0a877146103765780637f4ab1dd1461039c575f5ffd5b8063572b6c05146102e05780635f8dead3146103205780636a3edf2814610333578063715018a614610353575f5ffd5b806340db3b50116101c557806340db3b501461027b57806352f6747a1461028e57806354e4b945146102a357806354fd4d50146102b6575f5ffd5b806301ffc9a7146101f657806303c26bcd1461021e5780633e5af4ca146102535780633ff5aa0214610268575b5f5ffd5b6102096102043660046114f1565b6104f3565b60405190151581526020015b60405180910390f35b6102457fe5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede60002856881565b604051908152602001610215565b61026661026136600461152c565b610539565b005b61026661027636600461157a565b610553565b61026661028936600461157a565b610567565b610296610578565b6040516102159190611595565b6102096102b136600461157a565b610588565b6040805180820190915260058152640332e302e360dc1b60208201525b60405161021591906115e0565b6102096102ee36600461157a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b61026661032e366004611615565b610593565b61033b6105aa565b6040516001600160a01b039091168152602001610215565b6102666105cc565b61020961036936600461152c565b6105df565b6102666105fc565b7f000000000000000000000000000000000000000000000000000000000000000061033b565b6102d36103aa36600461164d565b610663565b6102666103bd366004611668565b61066e565b6102666103d0366004611615565b610686565b6004546001600160a01b031661033b565b6102096103f436600461157a565b610699565b6102457fea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e81565b6102666106a5565b6102666104363660046116a6565b6106b5565b6102456107e1565b61045661045136600461152c565b6107eb565b60405160ff9091168152602001610215565b610456610476366004611668565b610801565b61033b610489366004611717565b610817565b61026661049c36600461157a565b610839565b6005546001600160a01b031661033b565b6102666104c036600461157a565b610871565b6102096104d3366004611668565b6108df565b6102966108f8565b6102666104ee36600461157a565b610904565b5f6104fd82610975565b8061051857506001600160e01b031982166307f5828d60e41b145b8061053357506001600160e01b031982166301ffc9a760e01b145b92915050565b6105416109e0565b61054d84848484610a10565b50505050565b61055b610ab2565b61056481610aba565b50565b61056f610ab2565b61056481610b72565b60606105835f610bfb565b905090565b5f6105338183610c07565b61059b6109e0565b6105a65f8383610c27565b5050565b5f5f6105b66002610cc0565b11156105c75761058360025f610cc9565b505f90565b6105d4610cd4565b6105dd5f610d32565b565b5f806105ed868686866107eb565b60ff161490505b949350505050565b5f610605610d4b565b9050806001600160a01b03166106236005546001600160a01b031690565b6001600160a01b03161461065a5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61056481610d32565b606061053382610d54565b6106766109e0565b610681838383610c27565b505050565b61068e6109e0565b6105a6825f83610c27565b5f610533600283610c07565b6106ad610ab2565b6105dd610e9e565b6106bd610ab2565b5f8190036106de576040516359203cb960e01b815260040160405180910390fd5b5f6106e85f610cc0565b11156106f6576106f6610e9e565b5f5b818110156106815761072f8383838181106107155761071561172e565b905060200201602081019061072a919061157a565b610ecf565b6107608383838181106107445761074461172e565b9050602002016020810190610759919061157a565b5f90610f06565b61077d5760405163f280d16160e01b815260040160405180910390fd5b82828281811061078f5761078f61172e565b90506020020160208101906107a4919061157a565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a26001016106f8565b5f6105835f610cc0565b5f6107f885858585610f1a565b95945050505050565b5f61080d848484610fe5565b90505b9392505050565b5f6108215f610cc0565b821015610832576105335f83610cc9565b505f919050565b610841610ab2565b61084b5f82610c07565b61086857604051632cdc3a4160e21b815260040160405180910390fd5b610564816110a7565b610879610ab2565b61088281610ecf565b61088c5f82610f06565b6108a95760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf46905f90a250565b5f806108ec858585610801565b60ff1614949350505050565b60606105836002610bfb565b61090c610cd4565b600580546001600160a01b0383166001600160a01b0319909116811790915561093d6004546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b031982166320c49ce760e01b14806109a557506001600160e01b031982166378a8de7d60e01b145b806109c057506001600160e01b03198216630c51264760e21b145b8061053357506001600160e01b03198216637157797f60e01b1492915050565b6109f36109eb610d4b565b600290610c07565b6105dd5760405163e39b3c8f60e01b815260040160405180910390fd5b5f610a1a5f610cc0565b90505f5b81811015610aaa57610a305f82610cc9565b604051631f2d7a6560e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529190911690633e5af4ca906084015f604051808303815f87803b158015610a89575f5ffd5b505af1158015610a9b573d5f5f3e3d5ffd5b50505050806001019050610a1e565b505050505050565b6105dd610cd4565b6001600160a01b038116610ae1576040516301b8831760e71b815260040160405180910390fd5b610aec600282610c07565b15610b0a5760405163f423354760e01b815260040160405180910390fd5b610b15600282610f06565b610b3257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906020015b60405180910390a150565b610b7d600282610c07565b610b9a57604051636a2b488360e11b815260040160405180910390fd5b610ba5600282611104565b610bc257604051631b4ddcf360e11b815260040160405180910390fd5b6040516001600160a01b03821681527f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a90602001610b67565b60605f61081083611118565b6001600160a01b03165f9081526001919091016020526040902054151590565b5f610c315f610cc0565b90505f5b81811015610cb957610c475f82610cc9565b6040516322ebca6d60e21b81526001600160a01b0387811660048301528681166024830152604482018690529190911690638baf29b4906064015f604051808303815f87803b158015610c98575f5ffd5b505af1158015610caa573d5f5f3e3d5ffd5b50505050806001019050610c35565b5050505050565b5f610533825490565b5f6108108383611171565b610cdc610d4b565b6001600160a01b0316610cf76004546001600160a01b031690565b6001600160a01b0316146105dd57610d0d610d4b565b60405163118cdaa760e01b81526001600160a01b039091166004820152602401610651565b600580546001600160a01b031916905561056481611197565b5f6105836111e8565b60605f610d5f6107e1565b90505f5b81811015610e6257610d7481610817565b604051633e822efb60e11b815260ff861660048201526001600160a01b039190911690637d045df690602401602060405180830381865afa158015610dbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611742565b15610e5a57610ded81610817565b604051637f4ab1dd60e01b815260ff861660048201526001600160a01b039190911690637f4ab1dd906024015f60405180830381865afa158015610e33573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105f49190810190611775565b600101610d63565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6040517fdbf61473843cd9be1c9791ce51ef66d0da6c9026d62ba80c1ca433b13fb729b2905f90a16105dd5f6111f1565b610ed8816111fa565b610ee981632497d6cb60e01b611249565b61056457604051639952e34360e01b815260040160405180910390fd5b5f610810836001600160a01b038416611264565b5f5f610f246107e1565b90505f5b81811015610fd9575f610f3a82610817565b60405163d32c7bb560e01b81526001600160a01b038a811660048301528981166024830152888116604483015260648201889052919091169063d32c7bb590608401602060405180830381865afa158015610f97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbb9190611828565b905060ff811615610fd05792506105f4915050565b50600101610f28565b505f9695505050505050565b5f5f610fef6107e1565b90505f5b8181101561109c575f61100582610817565b60405163d4ce141560e01b81526001600160a01b038981166004830152888116602483015260448201889052919091169063d4ce141590606401602060405180830381865afa15801561105a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107e9190611828565b905060ff811615611093579250610810915050565b50600101610ff3565b505f95945050505050565b6110b15f82611104565b6110ce5760405163f280d16160e01b815260040160405180910390fd5b6040516001600160a01b038216907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc4905f90a250565b5f610810836001600160a01b0384166112b0565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561116557602002820191905f5260205f20905b815481526020019060010190808311611151575b50505050509050919050565b5f825f0182815481106111865761118661172e565b905f5260205f200154905092915050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f61058361139a565b61056481611404565b6001600160a01b0381166112215760405163f9d152fb60e01b815260040160405180910390fd5b61122b5f82610c07565b156105645760405163cc790a4b60e01b815260040160405180910390fd5b5f6112538361145d565b80156108105750610810838361149c565b5f8181526001830160205260408120546112a957508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610533565b505f610533565b5f818152600183016020526040812054801561138a575f6112d2600183611843565b85549091505f906112e590600190611843565b9050808214611344575f865f0182815481106113035761130361172e565b905f5260205f200154905080875f0184815481106113235761132361172e565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061135557611355611862565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610533565b5f915050610533565b5092915050565b5f3660148082108015906113d657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156113fc576113e936828403815f611876565b6113f29161189d565b60601c9250505090565b339250505090565b5f61140d825490565b90505f5b8181101561145657826001015f845f0183815481106114325761143261172e565b905f5260205f20015481526020019081526020015f205f9055806001019050611411565b50505f9055565b5f61146f826301ffc9a760e01b61149c565b15610832575f80611488846001600160e01b03196114bd565b915091508180156105f45750159392505050565b5f5f5f6114a985856114bd565b915091508180156107f85750949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b5f60208284031215611501575f5ffd5b81356001600160e01b031981168114610810575f5ffd5b6001600160a01b0381168114610564575f5ffd5b5f5f5f5f6080858703121561153f575f5ffd5b843561154a81611518565b9350602085013561155a81611518565b9250604085013561156a81611518565b9396929550929360600135925050565b5f6020828403121561158a575f5ffd5b813561081081611518565b602080825282518282018190525f918401906040840190835b818110156115d55783516001600160a01b03168352602093840193909201916001016115ae565b509095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611626575f5ffd5b823561163181611518565b946020939093013593505050565b60ff81168114610564575f5ffd5b5f6020828403121561165d575f5ffd5b81356108108161163f565b5f5f5f6060848603121561167a575f5ffd5b833561168581611518565b9250602084013561169581611518565b929592945050506040919091013590565b5f5f602083850312156116b7575f5ffd5b823567ffffffffffffffff8111156116cd575f5ffd5b8301601f810185136116dd575f5ffd5b803567ffffffffffffffff8111156116f3575f5ffd5b8560208260051b8401011115611707575f5ffd5b6020919091019590945092505050565b5f60208284031215611727575f5ffd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611752575f5ffd5b81518015158114610810575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611785575f5ffd5b815167ffffffffffffffff81111561179b575f5ffd5b8201601f810184136117ab575f5ffd5b805167ffffffffffffffff8111156117c5576117c5611761565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156117f4576117f4611761565b60405281815282820160200186101561180b575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611838575f5ffd5b81516108108161163f565b8181038181111561053357634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f5f85851115611884575f5ffd5b83861115611890575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015611393576bffffffffffffffffffffffff1960149490940360031b84901b169092169291505056fea26469706673582212203eeb560dee8ab479a1244c47104759fd3416c361073c50829fba85457e2504a264736f6c63430008220033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/doc/coverage/code-coverage.png b/doc/coverage/code-coverage.png index 0c33ce6..0686ade 100644 Binary files a/doc/coverage/code-coverage.png and b/doc/coverage/code-coverage.png differ diff --git a/doc/coverage/coverage/index-sort-b.html b/doc/coverage/coverage/index-sort-b.html index b996809..37cda05 100644 --- a/doc/coverage/coverage/index-sort-b.html +++ b/doc/coverage/coverage/index-sort-b.html @@ -31,13 +31,13 @@ lcov.info Lines: - 158 - 158 + 163 + 163 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 53 @@ -99,11 +99,23 @@
100.0%
100.0 % - 79 / 79 + 42 / 42 + 100.0 % + 13 / 13 + 100.0 % + 4 / 4 + + + src/deployment + +
100.0%
+ + 100.0 % + 42 / 42 100.0 % - 28 / 28 + 15 / 15 100.0 % - 9 / 9 + 5 / 5 diff --git a/doc/coverage/coverage/index-sort-f.html b/doc/coverage/coverage/index-sort-f.html index bed08a3..4e0950c 100644 --- a/doc/coverage/coverage/index-sort-f.html +++ b/doc/coverage/coverage/index-sort-f.html @@ -31,13 +31,13 @@ lcov.info Lines: - 158 - 158 + 163 + 163 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 53 @@ -82,28 +82,40 @@ Branches Sort by branch coverage - src/modules + src
100.0%
100.0 % - 79 / 79 + 42 / 42 100.0 % - 25 / 25 - 81.5 % - 22 / 27 + 13 / 13 + 100.0 % + 4 / 4 - src + src/deployment
100.0%
100.0 % - 79 / 79 + 42 / 42 100.0 % - 28 / 28 + 15 / 15 100.0 % - 9 / 9 + 5 / 5 + + + src/modules + +
100.0%
+ + 100.0 % + 79 / 79 + 100.0 % + 25 / 25 + 81.5 % + 22 / 27 diff --git a/doc/coverage/coverage/index-sort-l.html b/doc/coverage/coverage/index-sort-l.html index a9cbdac..130e77b 100644 --- a/doc/coverage/coverage/index-sort-l.html +++ b/doc/coverage/coverage/index-sort-l.html @@ -31,13 +31,13 @@ lcov.info Lines: - 158 - 158 + 163 + 163 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 53 @@ -87,11 +87,23 @@
100.0%
100.0 % - 79 / 79 + 42 / 42 + 100.0 % + 13 / 13 + 100.0 % + 4 / 4 + + + src/deployment + +
100.0%
+ + 100.0 % + 42 / 42 100.0 % - 28 / 28 + 15 / 15 100.0 % - 9 / 9 + 5 / 5 src/modules diff --git a/doc/coverage/coverage/index.html b/doc/coverage/coverage/index.html index 723208f..9e873ee 100644 --- a/doc/coverage/coverage/index.html +++ b/doc/coverage/coverage/index.html @@ -31,13 +31,13 @@ lcov.info Lines: - 158 - 158 + 163 + 163 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 53 @@ -87,11 +87,23 @@
100.0%
100.0 % - 79 / 79 + 42 / 42 + 100.0 % + 13 / 13 + 100.0 % + 4 / 4 + + + src/deployment + +
100.0%
+ + 100.0 % + 42 / 42 100.0 % - 28 / 28 + 15 / 15 100.0 % - 9 / 9 + 5 / 5 src/modules diff --git a/doc/coverage/coverage/src/RuleEngineBase.sol.func-sort-c.html b/doc/coverage/coverage/src/RuleEngineBase.sol.func-sort-c.html index 47c8feb..3814568 100644 --- a/doc/coverage/coverage/src/RuleEngineBase.sol.func-sort-c.html +++ b/doc/coverage/coverage/src/RuleEngineBase.sol.func-sort-c.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 13 @@ -85,15 +85,15 @@ 18 - RuleEngineBase._messageForTransferRestriction - 19 + RuleEngineBase.transferred.1 + 18 - RuleEngineBase.messageForTransferRestriction + RuleEngineBase._messageForTransferRestriction 19 - RuleEngineBase.transferred.1 + RuleEngineBase.messageForTransferRestriction 19 @@ -117,8 +117,8 @@ 59 - RuleEngineBase._checkRule - 215 + RuleEngineBase._checkRule + 217
diff --git a/doc/coverage/coverage/src/RuleEngineBase.sol.func.html b/doc/coverage/coverage/src/RuleEngineBase.sol.func.html index 7790ab3..95e4dbb 100644 --- a/doc/coverage/coverage/src/RuleEngineBase.sol.func.html +++ b/doc/coverage/coverage/src/RuleEngineBase.sol.func.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 13 @@ -69,8 +69,8 @@ Hit count Sort by hit count - RuleEngineBase._checkRule - 215 + RuleEngineBase._checkRule + 217 RuleEngineBase._detectTransferRestriction @@ -81,7 +81,7 @@ 39 - RuleEngineBase._messageForTransferRestriction + RuleEngineBase._messageForTransferRestriction 19 @@ -118,7 +118,7 @@ RuleEngineBase.transferred.1 - 19 + 18
diff --git a/doc/coverage/coverage/src/RuleEngineBase.sol.gcov.html b/doc/coverage/coverage/src/RuleEngineBase.sol.gcov.html index e2afa7c..9a123d7 100644 --- a/doc/coverage/coverage/src/RuleEngineBase.sol.gcov.html +++ b/doc/coverage/coverage/src/RuleEngineBase.sol.gcov.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 13 @@ -118,13 +118,13 @@ 47 : : /** 48 : : * @inheritdoc IERC3643IComplianceContract 49 : : */ - 50 : 19 : function transferred(address from, address to, uint256 value) + 50 : 18 : function transferred(address from, address to, uint256 value) 51 : : public 52 : : virtual 53 : : override(IERC3643IComplianceContract) 54 : : onlyBoundToken 55 : : { - 56 : 17 : _transferred(from, to, value); + 56 : 16 : _transferred(from, to, value); 57 : : } 58 : : 59 : : /// @inheritdoc IERC3643Compliance @@ -238,27 +238,32 @@ 167 : 10 : return uint8(REJECTED_CODE_BASE.TRANSFER_OK); 168 : : } 169 : : - 170 : 19 : function _messageForTransferRestriction(uint8 restrictionCode) internal view virtual returns (string memory) { - 171 : : // - 172 : 19 : uint256 rulesLength = rulesCount(); - 173 : 19 : for (uint256 i = 0; i < rulesLength; ++i) { - 174 [ + ]: 16 : if (IRule(rule(i)).canReturnTransferRestrictionCode(restrictionCode)) { - 175 : 14 : return IRule(rule(i)).messageForTransferRestriction(restrictionCode); - 176 : : } - 177 : : } - 178 : 5 : return "Unknown restriction code"; - 179 : : } - 180 : : - 181 : : /** - 182 : : * @dev Override to add ERC-165 interface check for the full IRule hierarchy. - 183 : : */ - 184 : 215 : function _checkRule(address rule_) internal view virtual override { - 185 : 215 : super._checkRule(rule_); - 186 [ + ]: 206 : if (!ERC165Checker.supportsInterface(rule_, RuleInterfaceId.IRULE_INTERFACE_ID)) { - 187 : 6 : revert RuleEngine_RuleInvalidInterface(); - 188 : : } - 189 : : } - 190 : : } + 170 : : /** + 171 : : * @dev This function returns the message from the first rule claiming the code. + 172 : : * Rule designers should keep restriction codes unique across rules. + 173 : : * If a code is shared intentionally, all rules using that code should return + 174 : : * the same message to avoid ambiguous operator feedback. + 175 : : */ + 176 : 19 : function _messageForTransferRestriction(uint8 restrictionCode) internal view virtual returns (string memory) { + 177 : 19 : uint256 rulesLength = rulesCount(); + 178 : 19 : for (uint256 i = 0; i < rulesLength; ++i) { + 179 [ + ]: 16 : if (IRule(rule(i)).canReturnTransferRestrictionCode(restrictionCode)) { + 180 : 14 : return IRule(rule(i)).messageForTransferRestriction(restrictionCode); + 181 : : } + 182 : : } + 183 : 5 : return "Unknown restriction code"; + 184 : : } + 185 : : + 186 : : /** + 187 : : * @dev Override to add ERC-165 interface check for the full IRule hierarchy. + 188 : : */ + 189 : 217 : function _checkRule(address rule_) internal view virtual override { + 190 : 217 : super._checkRule(rule_); + 191 [ + ]: 208 : if (!ERC165Checker.supportsInterface(rule_, RuleInterfaceId.IRULE_INTERFACE_ID)) { + 192 : 6 : revert RuleEngine_RuleInvalidInterface(); + 193 : : } + 194 : : } + 195 : : } diff --git a/doc/coverage/coverage/src/RuleEngine.sol.func-sort-c.html b/doc/coverage/coverage/src/deployment/RuleEngine.sol.func-sort-c.html similarity index 63% rename from doc/coverage/coverage/src/RuleEngine.sol.func-sort-c.html rename to doc/coverage/coverage/src/deployment/RuleEngine.sol.func-sort-c.html index c156b2b..c376ad7 100644 --- a/doc/coverage/coverage/src/RuleEngine.sol.func-sort-c.html +++ b/doc/coverage/coverage/src/deployment/RuleEngine.sol.func-sort-c.html @@ -4,22 +4,22 @@ - LCOV - lcov.info - src/RuleEngine.sol - functions - + LCOV - lcov.info - src/deployment/RuleEngine.sol - functions + - + - +
LCOV - code coverage report
- + @@ -31,13 +31,13 @@ - - + + - + @@ -53,58 +53,58 @@ - +
Current view:top level - src - RuleEngine.sol (source / functions)top level - src/deployment - RuleEngine.sol (source / functions) Hitlcov.info Lines:22222424 100.0 %
Date:2026-02-16 13:49:212026-03-18 19:08:29 Functions: 84 100.0 %
- - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + +

Function Name Sort by function nameHit count Sort by hit countFunction Name Sort by function nameHit count Sort by hit count
RuleEngine._msgDataRuleEngine._msgData 1
RuleEngine.supportsInterface4RuleEngine.supportsInterface6
RuleEngine._onlyComplianceManagerRuleEngine._onlyComplianceManager 15
RuleEngine.constructor121RuleEngine.constructor127
RuleEngine.hasRole129RuleEngine.hasRole135
RuleEngine._onlyRulesManager168RuleEngine._onlyRulesManager170
RuleEngine._msgSender359RuleEngine._msgSender366
RuleEngine._contextSuffixLength360RuleEngine._contextSuffixLength367

- +
Generated by: LCOV version 1.16

diff --git a/doc/coverage/coverage/src/RuleEngine.sol.func.html b/doc/coverage/coverage/src/deployment/RuleEngine.sol.func.html similarity index 63% rename from doc/coverage/coverage/src/RuleEngine.sol.func.html rename to doc/coverage/coverage/src/deployment/RuleEngine.sol.func.html index c4cc7f4..ebb8602 100644 --- a/doc/coverage/coverage/src/RuleEngine.sol.func.html +++ b/doc/coverage/coverage/src/deployment/RuleEngine.sol.func.html @@ -4,22 +4,22 @@ - LCOV - lcov.info - src/RuleEngine.sol - functions - + LCOV - lcov.info - src/deployment/RuleEngine.sol - functions + - + - +
LCOV - code coverage report
- + @@ -31,13 +31,13 @@ - - + + - + @@ -53,58 +53,58 @@ - +
Current view:top level - src - RuleEngine.sol (source / functions)top level - src/deployment - RuleEngine.sol (source / functions) Hitlcov.info Lines:22222424 100.0 %
Date:2026-02-16 13:49:212026-03-18 19:08:29 Functions: 84 100.0 %
- - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + +

Function Name Sort by function nameHit count Sort by hit countFunction Name Sort by function nameHit count Sort by hit count
RuleEngine._contextSuffixLength360RuleEngine._contextSuffixLength367
RuleEngine._msgDataRuleEngine._msgData 1
RuleEngine._msgSender359RuleEngine._msgSender366
RuleEngine._onlyComplianceManagerRuleEngine._onlyComplianceManager 15
RuleEngine._onlyRulesManager168RuleEngine._onlyRulesManager170
RuleEngine.constructor121RuleEngine.constructor127
RuleEngine.hasRole129RuleEngine.hasRole135
RuleEngine.supportsInterface4RuleEngine.supportsInterface6

- +
Generated by: LCOV version 1.16

diff --git a/doc/coverage/coverage/src/RuleEngine.sol.gcov.html b/doc/coverage/coverage/src/deployment/RuleEngine.sol.gcov.html similarity index 78% rename from doc/coverage/coverage/src/RuleEngine.sol.gcov.html rename to doc/coverage/coverage/src/deployment/RuleEngine.sol.gcov.html index b19bca7..63031d1 100644 --- a/doc/coverage/coverage/src/RuleEngine.sol.gcov.html +++ b/doc/coverage/coverage/src/deployment/RuleEngine.sol.gcov.html @@ -4,22 +4,22 @@ - LCOV - lcov.info - src/RuleEngine.sol - + LCOV - lcov.info - src/deployment/RuleEngine.sol + - + - +
LCOV - code coverage report
- + @@ -31,13 +31,13 @@ - - + + - + @@ -53,12 +53,12 @@ - +
Current view:top level - src - RuleEngine.sol (source / functions)top level - src/deployment - RuleEngine.sol (source / functions) Hitlcov.info Lines:22222424 100.0 %
Date:2026-02-16 13:49:212026-03-18 19:08:29 Functions: 84 100.0 %
@@ -81,77 +81,80 @@ 10 : : import {AccessControl} from "OZ/access/AccessControl.sol"; 11 : : import {IERC165} from "OZ/utils/introspection/ERC165.sol"; 12 : : /* ==== Modules === */ - 13 : : import {ERC2771ModuleStandalone, ERC2771Context} from "./modules/ERC2771ModuleStandalone.sol"; + 13 : : import {ERC2771ModuleStandalone, ERC2771Context} from "../modules/ERC2771ModuleStandalone.sol"; 14 : : /* ==== Base contract === */ - 15 : : import {RuleEngineBase} from "./RuleEngineBase.sol"; - 16 : : - 17 : : /** - 18 : : * @title Implementation of a ruleEngine as defined by the CMTAT - 19 : : */ - 20 : : contract RuleEngine is ERC2771ModuleStandalone, RuleEngineBase { - 21 : : /** - 22 : : * @param admin Address of the contract (Access Control) - 23 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support - 24 : : */ - 25 : 121 : constructor(address admin, address forwarderIrrevocable, address tokenContract) - 26 : : ERC2771ModuleStandalone(forwarderIrrevocable) - 27 : : { - 28 [ + ]: 121 : if (admin == address(0)) { - 29 : 1 : revert RuleEngine_AdminWithAddressZeroNotAllowed(); - 30 : : } - 31 [ + ]: 120 : if (tokenContract != address(0)) { - 32 : 30 : _bindToken(tokenContract); - 33 : : } - 34 : 120 : _grantRole(DEFAULT_ADMIN_ROLE, admin); - 35 : : } - 36 : : - 37 : : /* ============ ACCESS CONTROL ============ */ - 38 : : /** - 39 : : * @notice Returns `true` if `account` has been granted `role`. - 40 : : * @dev The Default Admin has all roles - 41 : : */ - 42 : 129 : function hasRole(bytes32 role, address account) public view virtual override(AccessControl) returns (bool) { - 43 [ + + ]: 342 : if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) { - 44 : 183 : return true; - 45 : : } else { - 46 : 159 : return AccessControl.hasRole(role, account); - 47 : : } - 48 : : } - 49 : : - 50 : : /* ============ ERC-165 ============ */ - 51 : 4 : function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, IERC165) returns (bool) { - 52 : 4 : return interfaceId == RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID - 53 : 3 : || interfaceId == ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID - 54 : 2 : || AccessControl.supportsInterface(interfaceId); - 55 : : } - 56 : : - 57 : : /*////////////////////////////////////////////////////////////// - 58 : : ERC-2771 - 59 : : //////////////////////////////////////////////////////////////*/ - 60 : 15 : function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {} - 61 : 168 : function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {} - 62 : : - 63 : : /** - 64 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule - 65 : : */ - 66 : 359 : function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) { - 67 : 359 : return ERC2771Context._msgSender(); - 68 : : } - 69 : : - 70 : : /** - 71 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule - 72 : : */ - 73 : 1 : function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) { - 74 : 1 : return ERC2771Context._msgData(); - 75 : : } - 76 : : - 77 : : /** - 78 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule - 79 : : */ - 80 : 360 : function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) { - 81 : 360 : return ERC2771Context._contextSuffixLength(); - 82 : : } - 83 : : } + 15 : : import {RuleEngineBase} from "../RuleEngineBase.sol"; + 16 : : import {ComplianceInterfaceId} from "../modules/library/ComplianceInterfaceId.sol"; + 17 : : + 18 : : /** + 19 : : * @title Implementation of a ruleEngine as defined by the CMTAT + 20 : : */ + 21 : : contract RuleEngine is ERC2771ModuleStandalone, RuleEngineBase, AccessControl { + 22 : : /** + 23 : : * @param admin Address of the contract (Access Control) + 24 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support + 25 : : */ + 26 : 127 : constructor(address admin, address forwarderIrrevocable, address tokenContract) + 27 : : ERC2771ModuleStandalone(forwarderIrrevocable) + 28 : : { + 29 [ + ]: 127 : if (admin == address(0)) { + 30 : 1 : revert RuleEngine_AdminWithAddressZeroNotAllowed(); + 31 : : } + 32 [ + ]: 126 : if (tokenContract != address(0)) { + 33 : 31 : _bindToken(tokenContract); + 34 : : } + 35 : 126 : _grantRole(DEFAULT_ADMIN_ROLE, admin); + 36 : : } + 37 : : + 38 : : /* ============ ACCESS CONTROL ============ */ + 39 : : /** + 40 : : * @notice Returns `true` if `account` has been granted `role`. + 41 : : * @dev The Default Admin has all roles + 42 : : */ + 43 : 135 : function hasRole(bytes32 role, address account) public view virtual override(AccessControl) returns (bool) { + 44 [ + + ]: 350 : if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) { + 45 : 185 : return true; + 46 : : } else { + 47 : 165 : return AccessControl.hasRole(role, account); + 48 : : } + 49 : : } + 50 : : + 51 : : /* ============ ERC-165 ============ */ + 52 : 6 : function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, IERC165) returns (bool) { + 53 : 6 : return interfaceId == RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID + 54 : 5 : || interfaceId == ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID + 55 : 4 : || interfaceId == ComplianceInterfaceId.ERC3643_COMPLIANCE_INTERFACE_ID + 56 : 3 : || interfaceId == ComplianceInterfaceId.IERC7551_COMPLIANCE_INTERFACE_ID + 57 : 2 : || AccessControl.supportsInterface(interfaceId); + 58 : : } + 59 : : + 60 : : /*////////////////////////////////////////////////////////////// + 61 : : ERC-2771 + 62 : : //////////////////////////////////////////////////////////////*/ + 63 : 15 : function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {} + 64 : 170 : function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {} + 65 : : + 66 : : /** + 67 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule + 68 : : */ + 69 : 366 : function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) { + 70 : 366 : return ERC2771Context._msgSender(); + 71 : : } + 72 : : + 73 : : /** + 74 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule + 75 : : */ + 76 : 1 : function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) { + 77 : 1 : return ERC2771Context._msgData(); + 78 : : } + 79 : : + 80 : : /** + 81 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule + 82 : : */ + 83 : 367 : function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) { + 84 : 367 : return ERC2771Context._contextSuffixLength(); + 85 : : } + 86 : : } @@ -159,7 +162,7 @@
- +
Generated by: LCOV version 1.16

diff --git a/doc/coverage/coverage/src/RuleEngineOwnable.sol.func-sort-c.html b/doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.func-sort-c.html similarity index 70% rename from doc/coverage/coverage/src/RuleEngineOwnable.sol.func-sort-c.html rename to doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.func-sort-c.html index 8dc4707..cac79cd 100644 --- a/doc/coverage/coverage/src/RuleEngineOwnable.sol.func-sort-c.html +++ b/doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.func-sort-c.html @@ -4,22 +4,22 @@ - LCOV - lcov.info - src/RuleEngineOwnable.sol - functions - + LCOV - lcov.info - src/deployment/RuleEngineOwnable.sol - functions + - + - +
LCOV - code coverage report
- + @@ -31,13 +31,13 @@ - - + + - + @@ -53,28 +53,28 @@ - +
Current view:top level - src - RuleEngineOwnable.sol (source / functions)top level - src/deployment - RuleEngineOwnable.sol (source / functions) Hitlcov.info Lines:15151818 100.0 %
Date:2026-02-16 13:49:212026-03-18 19:08:29 Functions: 71 100.0 %
- - + + - + - + @@ -86,21 +86,21 @@ - + - + - +

Function Name Sort by function nameHit count Sort by hit countFunction Name Sort by function nameHit count Sort by hit count
RuleEngineOwnable._msgDataRuleEngineOwnable._msgData 1
RuleEngineOwnable.supportsInterface69
RuleEngineOwnable._onlyComplianceManager
RuleEngineOwnable.constructor7177
RuleEngineOwnable._msgSenderRuleEngineOwnable._msgSender 108
RuleEngineOwnable._contextSuffixLengthRuleEngineOwnable._contextSuffixLength 109

- +
Generated by: LCOV version 1.16

diff --git a/doc/coverage/coverage/src/RuleEngineOwnable.sol.func.html b/doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.func.html similarity index 69% rename from doc/coverage/coverage/src/RuleEngineOwnable.sol.func.html rename to doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.func.html index e01a844..2714e56 100644 --- a/doc/coverage/coverage/src/RuleEngineOwnable.sol.func.html +++ b/doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.func.html @@ -4,22 +4,22 @@ - LCOV - lcov.info - src/RuleEngineOwnable.sol - functions - + LCOV - lcov.info - src/deployment/RuleEngineOwnable.sol - functions + - + - +
LCOV - code coverage report
- + @@ -31,13 +31,13 @@ - - + + - + @@ -53,31 +53,31 @@ - +
Current view:top level - src - RuleEngineOwnable.sol (source / functions)top level - src/deployment - RuleEngineOwnable.sol (source / functions) Hitlcov.info Lines:15151818 100.0 %
Date:2026-02-16 13:49:212026-03-18 19:08:29 Functions: 71 100.0 %
- - + + - + - + - + @@ -90,17 +90,17 @@ - + - +

Function Name Sort by function nameHit count Sort by hit countFunction Name Sort by function nameHit count Sort by hit count
RuleEngineOwnable._contextSuffixLengthRuleEngineOwnable._contextSuffixLength 109
RuleEngineOwnable._msgDataRuleEngineOwnable._msgData 1
RuleEngineOwnable._msgSenderRuleEngineOwnable._msgSender 108
RuleEngineOwnable.constructor7177
RuleEngineOwnable.supportsInterface69

- +
Generated by: LCOV version 1.16

diff --git a/doc/coverage/coverage/src/RuleEngineOwnable.sol.gcov.html b/doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.gcov.html similarity index 84% rename from doc/coverage/coverage/src/RuleEngineOwnable.sol.gcov.html rename to doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.gcov.html index 6dac2ac..86ca861 100644 --- a/doc/coverage/coverage/src/RuleEngineOwnable.sol.gcov.html +++ b/doc/coverage/coverage/src/deployment/RuleEngineOwnable.sol.gcov.html @@ -4,22 +4,22 @@ - LCOV - lcov.info - src/RuleEngineOwnable.sol - + LCOV - lcov.info - src/deployment/RuleEngineOwnable.sol + - + - +
LCOV - code coverage report
- + @@ -31,13 +31,13 @@ - - + + - + @@ -53,12 +53,12 @@ - +
Current view:top level - src - RuleEngineOwnable.sol (source / functions)top level - src/deployment - RuleEngineOwnable.sol (source / functions) Hitlcov.info Lines:15151818 100.0 %
Date:2026-02-16 13:49:212026-03-18 19:08:29 Functions: 71 100.0 %
@@ -80,11 +80,11 @@ 9 : : import {Context} from "OZ/utils/Context.sol"; 10 : : import {Ownable} from "OZ/access/Ownable.sol"; 11 : : import {IERC165} from "OZ/utils/introspection/IERC165.sol"; - 12 : : import {AccessControl} from "OZ/access/AccessControl.sol"; - 13 : : /* ==== Modules === */ - 14 : : import {ERC2771ModuleStandalone, ERC2771Context} from "./modules/ERC2771ModuleStandalone.sol"; - 15 : : /* ==== Base contract === */ - 16 : : import {RuleEngineBase} from "./RuleEngineBase.sol"; + 12 : : /* ==== Modules === */ + 13 : : import {ERC2771ModuleStandalone, ERC2771Context} from "../modules/ERC2771ModuleStandalone.sol"; + 14 : : /* ==== Base contract === */ + 15 : : import {RuleEngineBase} from "../RuleEngineBase.sol"; + 16 : : import {ComplianceInterfaceId} from "../modules/library/ComplianceInterfaceId.sol"; 17 : : 18 : : /** 19 : : * @title Implementation of a ruleEngine with ERC-173 Ownable access control @@ -97,13 +97,13 @@ 26 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support 27 : : * @param tokenContract Address of the token contract to bind (can be zero address) 28 : : */ - 29 : 71 : constructor(address owner_, address forwarderIrrevocable, address tokenContract) + 29 : 77 : constructor(address owner_, address forwarderIrrevocable, address tokenContract) 30 : : ERC2771ModuleStandalone(forwarderIrrevocable) 31 : : Ownable(owner_) 32 : : { 33 : : // Note: zero-address check for owner_ is handled by Ownable(owner_), 34 : : // which reverts with OwnableInvalidOwner(address(0)) before reaching here. - 35 [ + ]: 70 : if (tokenContract != address(0)) { + 35 [ + ]: 76 : if (tokenContract != address(0)) { 36 : 1 : _bindToken(tokenContract); 37 : : } 38 : : } @@ -120,37 +120,40 @@ 49 : 21 : function _onlyComplianceManager() internal virtual override onlyOwner {} 50 : : 51 : : /* ============ ERC-165 ============ */ - 52 : 6 : function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, IERC165) returns (bool) { - 53 : 6 : return interfaceId == RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID - 54 : 5 : || interfaceId == ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID || interfaceId == ERC173_INTERFACE_ID - 55 : 2 : || AccessControl.supportsInterface(interfaceId); - 56 : : } - 57 : : - 58 : : /*////////////////////////////////////////////////////////////// - 59 : : ERC-2771 - 60 : : //////////////////////////////////////////////////////////////*/ - 61 : : - 62 : : /** - 63 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule - 64 : : */ - 65 : 108 : function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) { - 66 : 108 : return ERC2771Context._msgSender(); - 67 : : } - 68 : : - 69 : : /** - 70 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule - 71 : : */ - 72 : 1 : function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) { - 73 : 1 : return ERC2771Context._msgData(); - 74 : : } - 75 : : - 76 : : /** - 77 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule - 78 : : */ - 79 : 109 : function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) { - 80 : 109 : return ERC2771Context._contextSuffixLength(); - 81 : : } - 82 : : } + 52 : 9 : function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) { + 53 : 9 : return interfaceId == RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID + 54 : 8 : || interfaceId == ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID + 55 : 7 : || interfaceId == ERC173_INTERFACE_ID + 56 : 5 : || interfaceId == ComplianceInterfaceId.ERC3643_COMPLIANCE_INTERFACE_ID + 57 : 4 : || interfaceId == ComplianceInterfaceId.IERC7551_COMPLIANCE_INTERFACE_ID + 58 : 3 : || interfaceId == type(IERC165).interfaceId; + 59 : : } + 60 : : + 61 : : /*////////////////////////////////////////////////////////////// + 62 : : ERC-2771 + 63 : : //////////////////////////////////////////////////////////////*/ + 64 : : + 65 : : /** + 66 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule + 67 : : */ + 68 : 108 : function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) { + 69 : 108 : return ERC2771Context._msgSender(); + 70 : : } + 71 : : + 72 : : /** + 73 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule + 74 : : */ + 75 : 1 : function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) { + 76 : 1 : return ERC2771Context._msgData(); + 77 : : } + 78 : : + 79 : : /** + 80 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule + 81 : : */ + 82 : 109 : function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) { + 83 : 109 : return ERC2771Context._contextSuffixLength(); + 84 : : } + 85 : : } @@ -158,7 +161,7 @@
- +
Generated by: LCOV version 1.16

diff --git a/doc/coverage/coverage/src/deployment/index-sort-b.html b/doc/coverage/coverage/src/deployment/index-sort-b.html new file mode 100644 index 0000000..f15808a --- /dev/null +++ b/doc/coverage/coverage/src/deployment/index-sort-b.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - lcov.info - src/deployment + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/deploymentHitTotalCoverage
Test:lcov.infoLines:4242100.0 %
Date:2026-03-18 19:08:29Functions:1515100.0 %
Branches:55100.0 %
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage Sort by line coverageFunctions Sort by function coverageBranches Sort by branch coverage
RuleEngineOwnable.sol +
100.0%
+
100.0 %18 / 18100.0 %7 / 7100.0 %1 / 1
RuleEngine.sol +
100.0%
+
100.0 %24 / 24100.0 %8 / 8100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.16
+
+ + + diff --git a/doc/coverage/coverage/src/deployment/index-sort-f.html b/doc/coverage/coverage/src/deployment/index-sort-f.html new file mode 100644 index 0000000..c49a9ca --- /dev/null +++ b/doc/coverage/coverage/src/deployment/index-sort-f.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - lcov.info - src/deployment + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/deploymentHitTotalCoverage
Test:lcov.infoLines:4242100.0 %
Date:2026-03-18 19:08:29Functions:1515100.0 %
Branches:55100.0 %
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage Sort by line coverageFunctions Sort by function coverageBranches Sort by branch coverage
RuleEngineOwnable.sol +
100.0%
+
100.0 %18 / 18100.0 %7 / 7100.0 %1 / 1
RuleEngine.sol +
100.0%
+
100.0 %24 / 24100.0 %8 / 8100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.16
+
+ + + diff --git a/doc/coverage/coverage/src/deployment/index-sort-l.html b/doc/coverage/coverage/src/deployment/index-sort-l.html new file mode 100644 index 0000000..298c674 --- /dev/null +++ b/doc/coverage/coverage/src/deployment/index-sort-l.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - lcov.info - src/deployment + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/deploymentHitTotalCoverage
Test:lcov.infoLines:4242100.0 %
Date:2026-03-18 19:08:29Functions:1515100.0 %
Branches:55100.0 %
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage Sort by line coverageFunctions Sort by function coverageBranches Sort by branch coverage
RuleEngineOwnable.sol +
100.0%
+
100.0 %18 / 18100.0 %7 / 7100.0 %1 / 1
RuleEngine.sol +
100.0%
+
100.0 %24 / 24100.0 %8 / 8100.0 %4 / 4
+
+
+ + + + +
Generated by: LCOV version 1.16
+
+ + + diff --git a/doc/coverage/coverage/src/deployment/index.html b/doc/coverage/coverage/src/deployment/index.html new file mode 100644 index 0000000..c7383b6 --- /dev/null +++ b/doc/coverage/coverage/src/deployment/index.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - lcov.info - src/deployment + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/deploymentHitTotalCoverage
Test:lcov.infoLines:4242100.0 %
Date:2026-03-18 19:08:29Functions:1515100.0 %
Branches:55100.0 %
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by nameLine Coverage Sort by line coverageFunctions Sort by function coverageBranches Sort by branch coverage
RuleEngine.sol +
100.0%
+
100.0 %24 / 24100.0 %8 / 8100.0 %4 / 4
RuleEngineOwnable.sol +
100.0%
+
100.0 %18 / 18100.0 %7 / 7100.0 %1 / 1
+
+
+ + + + +
Generated by: LCOV version 1.16
+
+ + + diff --git a/doc/coverage/coverage/src/index-sort-b.html b/doc/coverage/coverage/src/index-sort-b.html index 35c348b..9424617 100644 --- a/doc/coverage/coverage/src/index-sort-b.html +++ b/doc/coverage/coverage/src/index-sort-b.html @@ -31,17 +31,17 @@ lcov.info Lines: - 79 - 79 + 42 + 42 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: - 28 - 28 + 13 + 13 100.0 % @@ -49,8 +49,8 @@ Branches: - 9 - 9 + 4 + 4 100.0 % @@ -81,30 +81,6 @@ Functions Sort by function coverage Branches Sort by branch coverage - - RuleEngineOwnable.sol - -
100.0%
- - 100.0 % - 15 / 15 - 100.0 % - 7 / 7 - 100.0 % - 1 / 1 - - - RuleEngine.sol - -
100.0%
- - 100.0 % - 22 / 22 - 100.0 % - 8 / 8 - 100.0 % - 4 / 4 - RuleEngineBase.sol diff --git a/doc/coverage/coverage/src/index-sort-f.html b/doc/coverage/coverage/src/index-sort-f.html index c8dc45e..b39eba9 100644 --- a/doc/coverage/coverage/src/index-sort-f.html +++ b/doc/coverage/coverage/src/index-sort-f.html @@ -31,17 +31,17 @@ lcov.info Lines: - 79 - 79 + 42 + 42 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: - 28 - 28 + 13 + 13 100.0 % @@ -49,8 +49,8 @@ Branches: - 9 - 9 + 4 + 4 100.0 % @@ -81,30 +81,6 @@ Functions Sort by function coverage Branches Sort by branch coverage - - RuleEngineOwnable.sol - -
100.0%
- - 100.0 % - 15 / 15 - 100.0 % - 7 / 7 - 100.0 % - 1 / 1 - - - RuleEngine.sol - -
100.0%
- - 100.0 % - 22 / 22 - 100.0 % - 8 / 8 - 100.0 % - 4 / 4 - RuleEngineBase.sol diff --git a/doc/coverage/coverage/src/index-sort-l.html b/doc/coverage/coverage/src/index-sort-l.html index 20e49f7..b0d14a3 100644 --- a/doc/coverage/coverage/src/index-sort-l.html +++ b/doc/coverage/coverage/src/index-sort-l.html @@ -31,17 +31,17 @@ lcov.info Lines: - 79 - 79 + 42 + 42 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: - 28 - 28 + 13 + 13 100.0 % @@ -49,8 +49,8 @@ Branches: - 9 - 9 + 4 + 4 100.0 % @@ -81,30 +81,6 @@ Functions Sort by function coverage Branches Sort by branch coverage - - RuleEngineOwnable.sol - -
100.0%
- - 100.0 % - 15 / 15 - 100.0 % - 7 / 7 - 100.0 % - 1 / 1 - - - RuleEngine.sol - -
100.0%
- - 100.0 % - 22 / 22 - 100.0 % - 8 / 8 - 100.0 % - 4 / 4 - RuleEngineBase.sol diff --git a/doc/coverage/coverage/src/index.html b/doc/coverage/coverage/src/index.html index fbba042..26bcfa8 100644 --- a/doc/coverage/coverage/src/index.html +++ b/doc/coverage/coverage/src/index.html @@ -31,17 +31,17 @@ lcov.info Lines: - 79 - 79 + 42 + 42 100.0 % Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: - 28 - 28 + 13 + 13 100.0 % @@ -49,8 +49,8 @@ Branches: - 9 - 9 + 4 + 4 100.0 % @@ -81,18 +81,6 @@ Functions Sort by function coverage Branches Sort by branch coverage - - RuleEngine.sol - -
100.0%
- - 100.0 % - 22 / 22 - 100.0 % - 8 / 8 - 100.0 % - 4 / 4 - RuleEngineBase.sol @@ -105,18 +93,6 @@ 100.0 % 4 / 4 - - RuleEngineOwnable.sol - -
100.0%
- - 100.0 % - 15 / 15 - 100.0 % - 7 / 7 - 100.0 % - 1 / 1 -
diff --git a/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func-sort-c.html b/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func-sort-c.html index db87ba1..1447d4e 100644 --- a/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func-sort-c.html +++ b/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func-sort-c.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 10 @@ -69,11 +69,11 @@ Hit count Sort by hit count - ERC3643ComplianceModule.getTokenBounds + ERC3643ComplianceModule.getTokenBounds 4 - ERC3643ComplianceModule.getTokenBound + ERC3643ComplianceModule.getTokenBound 5 @@ -81,19 +81,19 @@ 5 - ERC3643ComplianceModule._unbindToken + ERC3643ComplianceModule._unbindToken 9 - ERC3643ComplianceModule.unbindToken + ERC3643ComplianceModule.unbindToken 10 - ERC3643ComplianceModule.isTokenBound + ERC3643ComplianceModule.isTokenBound 15 - ERC3643ComplianceModule.bindToken + ERC3643ComplianceModule.bindToken 26 @@ -101,12 +101,12 @@ 26 - ERC3643ComplianceModule._checkBoundToken - 32 + ERC3643ComplianceModule._checkBoundToken + 31 - ERC3643ComplianceModule._bindToken - 56 + ERC3643ComplianceModule._bindToken + 57
diff --git a/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func.html b/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func.html index 290bfba..53bed1c 100644 --- a/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func.html +++ b/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.func.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 10 @@ -69,31 +69,31 @@ Hit count Sort by hit count - ERC3643ComplianceModule._bindToken - 56 + ERC3643ComplianceModule._bindToken + 57 - ERC3643ComplianceModule._checkBoundToken - 32 + ERC3643ComplianceModule._checkBoundToken + 31 - ERC3643ComplianceModule._unbindToken + ERC3643ComplianceModule._unbindToken 9 - ERC3643ComplianceModule.bindToken + ERC3643ComplianceModule.bindToken 26 - ERC3643ComplianceModule.getTokenBound + ERC3643ComplianceModule.getTokenBound 5 - ERC3643ComplianceModule.getTokenBounds + ERC3643ComplianceModule.getTokenBounds 4 - ERC3643ComplianceModule.isTokenBound + ERC3643ComplianceModule.isTokenBound 15 @@ -105,7 +105,7 @@ 26 - ERC3643ComplianceModule.unbindToken + ERC3643ComplianceModule.unbindToken 10 diff --git a/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.gcov.html b/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.gcov.html index f2bcda4..0dfe087 100644 --- a/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.gcov.html +++ b/doc/coverage/coverage/src/modules/ERC3643ComplianceModule.sol.gcov.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 10 @@ -112,65 +112,75 @@ 41 : : //////////////////////////////////////////////////////////////*/ 42 : : 43 : : /* ============ State functions ============ */ - 44 : : /// @inheritdoc IERC3643Compliance - 45 : 26 : function bindToken(address token) public virtual override onlyComplianceManager { - 46 : 25 : _bindToken(token); - 47 : : } - 48 : : - 49 : : /// @inheritdoc IERC3643Compliance - 50 : 10 : function unbindToken(address token) public virtual override onlyComplianceManager { - 51 : 9 : _unbindToken(token); + 44 : : /** + 45 : : * @inheritdoc IERC3643Compliance + 46 : : * @dev Operator warning: "multi-tenant" means one RuleEngine is shared by + 47 : : * multiple token contracts. In that setup, bind only tokens that are equally + 48 : : * trusted and governed together. + 49 : : */ + 50 : 26 : function bindToken(address token) public virtual override onlyComplianceManager { + 51 : 25 : _bindToken(token); 52 : : } 53 : : - 54 : : /// @inheritdoc IERC3643Compliance - 55 : 15 : function isTokenBound(address token) public view virtual override returns (bool) { - 56 : 15 : return _boundTokens.contains(token); - 57 : : } - 58 : : - 59 : : /// @inheritdoc IERC3643Compliance - 60 : 5 : function getTokenBound() public view virtual override returns (address) { - 61 [ + + ]: 5 : if (_boundTokens.length() > 0) { - 62 : : // Note that there are no guarantees on the ordering of values inside the array, - 63 : : // and it may change when more values are added or removed. - 64 : 3 : return _boundTokens.at(0); - 65 : : } else { - 66 : 2 : return address(0); - 67 : : } - 68 : : } - 69 : : - 70 : : /// @inheritdoc IERC3643Compliance - 71 : 4 : function getTokenBounds() public view override returns (address[] memory) { - 72 : 4 : return _boundTokens.values(); - 73 : : } - 74 : : - 75 : : /*////////////////////////////////////////////////////////////// - 76 : : INTERNAL/PRIVATE FUNCTIONS - 77 : : //////////////////////////////////////////////////////////////*/ - 78 : : - 79 : 9 : function _unbindToken(address token) internal { - 80 [ + + ]: 9 : require(_boundTokens.contains(token), RuleEngine_ERC3643Compliance_TokenNotBound()); - 81 : : // Should never revert because we check if the token address is already set before - 82 [ # + ]: 7 : require(_boundTokens.remove(token), RuleEngine_ERC3643Compliance_OperationNotSuccessful()); - 83 : : - 84 : 7 : emit TokenUnbound(token); - 85 : : } - 86 : : - 87 : 56 : function _bindToken(address token) internal { - 88 [ + + ]: 56 : require(token != address(0), RuleEngine_ERC3643Compliance_InvalidTokenAddress()); - 89 [ + + ]: 54 : require(!_boundTokens.contains(token), RuleEngine_ERC3643Compliance_TokenAlreadyBound()); - 90 : : // Should never revert because we check if the token address is already set before - 91 [ # + ]: 52 : require(_boundTokens.add(token), RuleEngine_ERC3643Compliance_OperationNotSuccessful()); - 92 : 52 : emit TokenBound(token); - 93 : : } - 94 : : - 95 : 32 : function _checkBoundToken() internal view virtual{ - 96 [ + ]: 32 : if (!_boundTokens.contains(_msgSender())) { - 97 : 7 : revert RuleEngine_ERC3643Compliance_UnauthorizedCaller(); - 98 : : } - 99 : : } - 100 : : - 101 : : function _onlyComplianceManager() internal virtual; - 102 : : } + 54 : : /** + 55 : : * @inheritdoc IERC3643Compliance + 56 : : * @dev Operator warning: unbinding is an administrative operation and does not + 57 : : * erase any state already stored by external rule contracts in a previously + 58 : : * shared ("multi-tenant") setup. + 59 : : */ + 60 : 10 : function unbindToken(address token) public virtual override onlyComplianceManager { + 61 : 9 : _unbindToken(token); + 62 : : } + 63 : : + 64 : : /// @inheritdoc IERC3643Compliance + 65 : 15 : function isTokenBound(address token) public view virtual override returns (bool) { + 66 : 15 : return _boundTokens.contains(token); + 67 : : } + 68 : : + 69 : : /// @inheritdoc IERC3643Compliance + 70 : 5 : function getTokenBound() public view virtual override returns (address) { + 71 [ + + ]: 5 : if (_boundTokens.length() > 0) { + 72 : : // Note that there are no guarantees on the ordering of values inside the array, + 73 : : // and it may change when more values are added or removed. + 74 : 3 : return _boundTokens.at(0); + 75 : : } else { + 76 : 2 : return address(0); + 77 : : } + 78 : : } + 79 : : + 80 : : /// @inheritdoc IERC3643Compliance + 81 : 4 : function getTokenBounds() public view override returns (address[] memory) { + 82 : 4 : return _boundTokens.values(); + 83 : : } + 84 : : + 85 : : /*////////////////////////////////////////////////////////////// + 86 : : INTERNAL/PRIVATE FUNCTIONS + 87 : : //////////////////////////////////////////////////////////////*/ + 88 : : + 89 : 9 : function _unbindToken(address token) internal { + 90 [ + + ]: 9 : require(_boundTokens.contains(token), RuleEngine_ERC3643Compliance_TokenNotBound()); + 91 : : // Should never revert because we check if the token address is already set before + 92 [ # + ]: 7 : require(_boundTokens.remove(token), RuleEngine_ERC3643Compliance_OperationNotSuccessful()); + 93 : : + 94 : 7 : emit TokenUnbound(token); + 95 : : } + 96 : : + 97 : 57 : function _bindToken(address token) internal { + 98 [ + + ]: 57 : require(token != address(0), RuleEngine_ERC3643Compliance_InvalidTokenAddress()); + 99 [ + + ]: 55 : require(!_boundTokens.contains(token), RuleEngine_ERC3643Compliance_TokenAlreadyBound()); + 100 : : // Should never revert because we check if the token address is already set before + 101 [ # + ]: 53 : require(_boundTokens.add(token), RuleEngine_ERC3643Compliance_OperationNotSuccessful()); + 102 : 53 : emit TokenBound(token); + 103 : : } + 104 : : + 105 : 31 : function _checkBoundToken() internal view virtual{ + 106 [ + ]: 31 : if (!_boundTokens.contains(_msgSender())) { + 107 : 7 : revert RuleEngine_ERC3643Compliance_UnauthorizedCaller(); + 108 : : } + 109 : : } + 110 : : + 111 : : function _onlyComplianceManager() internal virtual; + 112 : : } diff --git a/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func-sort-c.html b/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func-sort-c.html index c791411..9c2e3a2 100644 --- a/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func-sort-c.html +++ b/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func-sort-c.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 14 @@ -69,60 +69,60 @@ Hit count Sort by hit count - RulesManagementModule._transferred.1 + RulesManagementModule._transferred.1 4 - RulesManagementModule.rule + RulesManagementModule.rule 5 - RulesManagementModule._removeRule + RulesManagementModule._removeRule 13 - RulesManagementModule.clearRules + RulesManagementModule.clearRules 15 - RulesManagementModule.onlyRulesManager + RulesManagementModule.onlyRulesManager 15 - RulesManagementModule.rules + RulesManagementModule.rules 15 - RulesManagementModule.removeRule + RulesManagementModule.removeRule 18 - RulesManagementModule._transferred.0 - 21 + RulesManagementModule._transferred.0 + 20 - RulesManagementModule._clearRules + RulesManagementModule._clearRules 48 - RulesManagementModule.setRules + RulesManagementModule.setRules 49 - RulesManagementModule.containsRule + RulesManagementModule.containsRule 71 - RulesManagementModule.addRule - 150 + RulesManagementModule.addRule + 152 - RulesManagementModule.rulesCount + RulesManagementModule.rulesCount 161 - RulesManagementModule._checkRule - 215 + RulesManagementModule._checkRule + 217
diff --git a/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func.html b/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func.html index 62ea7f1..2a8a1b0 100644 --- a/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func.html +++ b/doc/coverage/coverage/src/modules/RulesManagementModule.sol.func.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 14 @@ -69,59 +69,59 @@ Hit count Sort by hit count - RulesManagementModule._checkRule - 215 + RulesManagementModule._checkRule + 217 - RulesManagementModule._clearRules + RulesManagementModule._clearRules 48 - RulesManagementModule._removeRule + RulesManagementModule._removeRule 13 - RulesManagementModule._transferred.0 - 21 + RulesManagementModule._transferred.0 + 20 - RulesManagementModule._transferred.1 + RulesManagementModule._transferred.1 4 - RulesManagementModule.addRule - 150 + RulesManagementModule.addRule + 152 - RulesManagementModule.clearRules + RulesManagementModule.clearRules 15 - RulesManagementModule.containsRule + RulesManagementModule.containsRule 71 - RulesManagementModule.onlyRulesManager + RulesManagementModule.onlyRulesManager 15 - RulesManagementModule.removeRule + RulesManagementModule.removeRule 18 - RulesManagementModule.rule + RulesManagementModule.rule 5 - RulesManagementModule.rules + RulesManagementModule.rules 15 - RulesManagementModule.rulesCount + RulesManagementModule.rulesCount 161 - RulesManagementModule.setRules + RulesManagementModule.setRules 49 diff --git a/doc/coverage/coverage/src/modules/RulesManagementModule.sol.gcov.html b/doc/coverage/coverage/src/modules/RulesManagementModule.sol.gcov.html index 399cd91..97c1d96 100644 --- a/doc/coverage/coverage/src/modules/RulesManagementModule.sol.gcov.html +++ b/doc/coverage/coverage/src/modules/RulesManagementModule.sol.gcov.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 14 @@ -75,186 +75,200 @@ 4 : : 5 : : /* ==== OpenZeppelin === */ 6 : : import {EnumerableSet} from "OZ/utils/structs/EnumerableSet.sol"; - 7 : : import {AccessControl} from "OZ/access/AccessControl.sol"; - 8 : : /* ==== Interface and other library === */ - 9 : : import {IRulesManagementModule} from "../interfaces/IRulesManagementModule.sol"; - 10 : : import {IRule} from "../interfaces/IRule.sol"; - 11 : : import {RulesManagementModuleInvariantStorage} from "./library/RulesManagementModuleInvariantStorage.sol"; - 12 : : - 13 : : /** - 14 : : * @title RuleEngine - part - 15 : : */ - 16 : : abstract contract RulesManagementModule is - 17 : : AccessControl, - 18 : : RulesManagementModuleInvariantStorage, - 19 : : IRulesManagementModule - 20 : : { - 21 : 15 : modifier onlyRulesManager() { - 22 : 15 : _onlyRulesManager(); - 23 : : _; - 24 : : } - 25 : : - 26 : : /* ==== Type declaration === */ - 27 : : using EnumerableSet for EnumerableSet.AddressSet; - 28 : : - 29 : : /* ==== State Variables === */ - 30 : : /// @dev Array of rules - 31 : : EnumerableSet.AddressSet internal _rules; - 32 : : - 33 : : /*////////////////////////////////////////////////////////////// - 34 : : PUBLIC/EXTERNAL FUNCTIONS - 35 : : //////////////////////////////////////////////////////////////*/ - 36 : : - 37 : : /* ============ State functions ============ */ - 38 : : - 39 : : /** - 40 : : * @inheritdoc IRulesManagementModule - 41 : : */ - 42 : 49 : function setRules(IRule[] calldata rules_) public virtual override(IRulesManagementModule) onlyRulesManager { - 43 [ + ]: 47 : if (rules_.length == 0) { - 44 : 6 : revert RuleEngine_RulesManagementModule_ArrayIsEmpty(); - 45 : : } - 46 [ + ]: 41 : if (_rules.length() > 0) { - 47 : 35 : _clearRules(); + 7 : : /* ==== Interface and other library === */ + 8 : : import {IRulesManagementModule} from "../interfaces/IRulesManagementModule.sol"; + 9 : : import {IRule} from "../interfaces/IRule.sol"; + 10 : : import {RulesManagementModuleInvariantStorage} from "./library/RulesManagementModuleInvariantStorage.sol"; + 11 : : + 12 : : /** + 13 : : * @title RuleEngine - part + 14 : : */ + 15 : : abstract contract RulesManagementModule is RulesManagementModuleInvariantStorage, IRulesManagementModule { + 16 : 15 : modifier onlyRulesManager() { + 17 : 15 : _onlyRulesManager(); + 18 : : _; + 19 : : } + 20 : : + 21 : : /* ==== Type declaration === */ + 22 : : using EnumerableSet for EnumerableSet.AddressSet; + 23 : : + 24 : : /* ==== State Variables === */ + 25 : : /// @dev Array of rules + 26 : : EnumerableSet.AddressSet internal _rules; + 27 : : + 28 : : /*////////////////////////////////////////////////////////////// + 29 : : PUBLIC/EXTERNAL FUNCTIONS + 30 : : //////////////////////////////////////////////////////////////*/ + 31 : : + 32 : : /* ============ State functions ============ */ + 33 : : + 34 : : /** + 35 : : * @inheritdoc IRulesManagementModule + 36 : : * @dev Replaces the entire rule set atomically. + 37 : : * Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. + 38 : : * To transition from one non-empty set to another without an enforcement gap, + 39 : : * call this function directly with the new set. + 40 : : * No on-chain maximum number of rules is enforced. Operators are responsible + 41 : : * for keeping the rule set size compatible with the target chain gas limits. + 42 : : * Security convention: rule contracts should be treated as trusted business logic, + 43 : : * but should not also be granted {RULES_MANAGEMENT_ROLE}. + 44 : : */ + 45 : 49 : function setRules(IRule[] calldata rules_) public virtual override(IRulesManagementModule) onlyRulesManager { + 46 [ + ]: 47 : if (rules_.length == 0) { + 47 : 6 : revert RuleEngine_RulesManagementModule_ArrayIsEmpty(); 48 : : } - 49 : 41 : for (uint256 i = 0; i < rules_.length; ++i) { - 50 : 69 : _checkRule(address(rules_[i])); - 51 : : // Should never revert because we check the presence of the rule before - 52 [ # + ]: 64 : require(_rules.add(address(rules_[i])), RuleEngine_RulesManagementModule_OperationNotSuccessful()); - 53 : 64 : emit AddRule(rules_[i]); - 54 : : } - 55 : : } - 56 : : - 57 : : /** - 58 : : * @inheritdoc IRulesManagementModule - 59 : : */ - 60 : 15 : function clearRules() public virtual override(IRulesManagementModule) onlyRulesManager { - 61 : 13 : _clearRules(); - 62 : : } - 63 : : - 64 : : /** - 65 : : * @inheritdoc IRulesManagementModule - 66 : : */ - 67 : 150 : function addRule(IRule rule_) public virtual override(IRulesManagementModule) onlyRulesManager { - 68 : 146 : _checkRule(address(rule_)); - 69 [ # + ]: 136 : require(_rules.add(address(rule_)), RuleEngine_RulesManagementModule_OperationNotSuccessful()); - 70 : 136 : emit AddRule(rule_); - 71 : : } - 72 : : - 73 : : /** - 74 : : * @inheritdoc IRulesManagementModule - 75 : : */ - 76 : 18 : function removeRule(IRule rule_) public virtual override(IRulesManagementModule) onlyRulesManager { - 77 [ + + ]: 16 : require(_rules.contains(address(rule_)), RuleEngine_RulesManagementModule_RuleDoNotMatch()); - 78 : 13 : _removeRule(rule_); - 79 : : } - 80 : : - 81 : : /* ============ View functions ============ */ - 82 : : - 83 : : /** - 84 : : * @inheritdoc IRulesManagementModule - 85 : : */ - 86 : 161 : function rulesCount() public view virtual override(IRulesManagementModule) returns (uint256) { - 87 : 278 : return _rules.length(); - 88 : : } - 89 : : - 90 : : /** - 91 : : * @inheritdoc IRulesManagementModule - 92 : : */ - 93 : 71 : function containsRule(IRule rule_) public view virtual override(IRulesManagementModule) returns (bool) { - 94 : 71 : return _rules.contains(address(rule_)); - 95 : : } - 96 : : - 97 : : /** - 98 : : * @inheritdoc IRulesManagementModule - 99 : : */ - 100 : 5 : function rule(uint256 ruleId) public view virtual override(IRulesManagementModule) returns (address) { - 101 [ + + ]: 133 : if (ruleId < _rules.length()) { - 102 : : // Note that there are no guarantees on the ordering of values inside the array, - 103 : : // and it may change when more values are added or removed. - 104 : 131 : return _rules.at(ruleId); - 105 : : } else { - 106 : 2 : return address(0); - 107 : : } - 108 : : } - 109 : : - 110 : : /** - 111 : : * @inheritdoc IRulesManagementModule - 112 : : */ - 113 : 15 : function rules() public view virtual override(IRulesManagementModule) returns (address[] memory) { - 114 : 15 : return _rules.values(); - 115 : : } - 116 : : - 117 : : /*////////////////////////////////////////////////////////////// - 118 : : INTERNAL/PRIVATE FUNCTIONS - 119 : : //////////////////////////////////////////////////////////////*/ - 120 : : /** - 121 : : * @notice Clear all the rules of the array of rules - 122 : : * - 123 : : */ - 124 : 48 : function _clearRules() internal virtual { - 125 : 48 : emit ClearRules(); - 126 : 48 : _rules.clear(); - 127 : : } - 128 : : - 129 : : /** - 130 : : * @notice Remove a rule from the array of rules - 131 : : * Revert if the rule found at the specified index does not match the rule in argument - 132 : : * @param rule_ address of the target rule - 133 : : * - 134 : : * - 135 : : */ - 136 : 13 : function _removeRule(IRule rule_) internal virtual { - 137 : : // Should never revert because we check the presence of the rule before - 138 [ # + ]: 13 : require(_rules.remove(address(rule_)), RuleEngine_RulesManagementModule_OperationNotSuccessful()); - 139 : 13 : emit RemoveRule(rule_); - 140 : : } - 141 : : - 142 : : /** - 143 : : * @dev check if a rule is valid, revert otherwise - 144 : : */ - 145 : 215 : function _checkRule(address rule_) internal view virtual { - 146 [ + ]: 215 : if (rule_ == address(0x0)) { - 147 : 3 : revert RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed(); - 148 : : } - 149 [ + ]: 212 : if (_rules.contains(rule_)) { - 150 : 6 : revert RuleEngine_RulesManagementModule_RuleAlreadyExists(); - 151 : : } - 152 : : } - 153 : : - 154 : : /* ============ Transferred functions ============ */ - 155 : : - 156 : : /** - 157 : : * @notice Go through all the rule to know if a restriction exists on the transfer - 158 : : * @param from the origin address - 159 : : * @param to the destination address - 160 : : * @param value to transfer - 161 : : * - 162 : : */ - 163 : 21 : function _transferred(address from, address to, uint256 value) internal virtual { - 164 : 21 : uint256 rulesLength = _rules.length(); - 165 : 21 : for (uint256 i = 0; i < rulesLength; ++i) { - 166 : 15 : IRule(_rules.at(i)).transferred(from, to, value); - 167 : : } - 168 : : } - 169 : : - 170 : : /** - 171 : : * @notice Go through all the rule to know if a restriction exists on the transfer - 172 : : * @param spender the spender address (transferFrom) - 173 : : * @param from the origin address - 174 : : * @param to the destination address - 175 : : * @param value to transfer - 176 : : * - 177 : : */ - 178 : 4 : function _transferred(address spender, address from, address to, uint256 value) internal virtual { - 179 : 4 : uint256 rulesLength = _rules.length(); - 180 : 4 : for (uint256 i = 0; i < rulesLength; ++i) { - 181 : 4 : IRule(_rules.at(i)).transferred(spender, from, to, value); - 182 : : } - 183 : : } - 184 : : - 185 : : function _onlyRulesManager() internal virtual; - 186 : : } + 49 [ + ]: 41 : if (_rules.length() > 0) { + 50 : 35 : _clearRules(); + 51 : : } + 52 : 41 : for (uint256 i = 0; i < rules_.length; ++i) { + 53 : 69 : _checkRule(address(rules_[i])); + 54 : : // Should never revert because we check the presence of the rule before + 55 [ # + ]: 64 : require(_rules.add(address(rules_[i])), RuleEngine_RulesManagementModule_OperationNotSuccessful()); + 56 : 64 : emit AddRule(rules_[i]); + 57 : : } + 58 : : } + 59 : : + 60 : : /** + 61 : : * @inheritdoc IRulesManagementModule + 62 : : */ + 63 : 15 : function clearRules() public virtual override(IRulesManagementModule) onlyRulesManager { + 64 : 13 : _clearRules(); + 65 : : } + 66 : : + 67 : : /** + 68 : : * @inheritdoc IRulesManagementModule + 69 : : * @dev No on-chain maximum number of rules is enforced. Adding too many rules + 70 : : * can increase transfer-time gas usage because rule checks are linear in rule count. + 71 : : * Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts. + 72 : : */ + 73 : 152 : function addRule(IRule rule_) public virtual override(IRulesManagementModule) onlyRulesManager { + 74 : 148 : _checkRule(address(rule_)); + 75 [ # + ]: 138 : require(_rules.add(address(rule_)), RuleEngine_RulesManagementModule_OperationNotSuccessful()); + 76 : 138 : emit AddRule(rule_); + 77 : : } + 78 : : + 79 : : /** + 80 : : * @inheritdoc IRulesManagementModule + 81 : : */ + 82 : 18 : function removeRule(IRule rule_) public virtual override(IRulesManagementModule) onlyRulesManager { + 83 [ + + ]: 16 : require(_rules.contains(address(rule_)), RuleEngine_RulesManagementModule_RuleDoNotMatch()); + 84 : 13 : _removeRule(rule_); + 85 : : } + 86 : : + 87 : : /* ============ View functions ============ */ + 88 : : + 89 : : /** + 90 : : * @inheritdoc IRulesManagementModule + 91 : : */ + 92 : 161 : function rulesCount() public view virtual override(IRulesManagementModule) returns (uint256) { + 93 : 278 : return _rules.length(); + 94 : : } + 95 : : + 96 : : /** + 97 : : * @inheritdoc IRulesManagementModule + 98 : : */ + 99 : 71 : function containsRule(IRule rule_) public view virtual override(IRulesManagementModule) returns (bool) { + 100 : 71 : return _rules.contains(address(rule_)); + 101 : : } + 102 : : + 103 : : /** + 104 : : * @inheritdoc IRulesManagementModule + 105 : : */ + 106 : 5 : function rule(uint256 ruleId) public view virtual override(IRulesManagementModule) returns (address) { + 107 [ + + ]: 133 : if (ruleId < _rules.length()) { + 108 : : // Note that there are no guarantees on the ordering of values inside the array, + 109 : : // and it may change when more values are added or removed. + 110 : 131 : return _rules.at(ruleId); + 111 : : } else { + 112 : 2 : return address(0); + 113 : : } + 114 : : } + 115 : : + 116 : : /** + 117 : : * @inheritdoc IRulesManagementModule + 118 : : */ + 119 : 15 : function rules() public view virtual override(IRulesManagementModule) returns (address[] memory) { + 120 : 15 : return _rules.values(); + 121 : : } + 122 : : + 123 : : /*////////////////////////////////////////////////////////////// + 124 : : INTERNAL/PRIVATE FUNCTIONS + 125 : : //////////////////////////////////////////////////////////////*/ + 126 : : /** + 127 : : * @notice Clear all the rules of the array of rules + 128 : : * + 129 : : */ + 130 : 48 : function _clearRules() internal virtual { + 131 : 48 : emit ClearRules(); + 132 : 48 : _rules.clear(); + 133 : : } + 134 : : + 135 : : /** + 136 : : * @notice Remove a rule from the array of rules + 137 : : * Revert if the rule found at the specified index does not match the rule in argument + 138 : : * @param rule_ address of the target rule + 139 : : * + 140 : : * + 141 : : */ + 142 : 13 : function _removeRule(IRule rule_) internal virtual { + 143 : : // Should never revert because we check the presence of the rule before + 144 [ # + ]: 13 : require(_rules.remove(address(rule_)), RuleEngine_RulesManagementModule_OperationNotSuccessful()); + 145 : 13 : emit RemoveRule(rule_); + 146 : : } + 147 : : + 148 : : /** + 149 : : * @dev check if a rule is valid, revert otherwise + 150 : : */ + 151 : 217 : function _checkRule(address rule_) internal view virtual { + 152 [ + ]: 217 : if (rule_ == address(0x0)) { + 153 : 3 : revert RuleEngine_RulesManagementModule_RuleAddressZeroNotAllowed(); + 154 : : } + 155 [ + ]: 214 : if (_rules.contains(rule_)) { + 156 : 6 : revert RuleEngine_RulesManagementModule_RuleAlreadyExists(); + 157 : : } + 158 : : } + 159 : : + 160 : : /* ============ Transferred functions ============ */ + 161 : : + 162 : : /** + 163 : : * @notice Go through all the rule to know if a restriction exists on the transfer + 164 : : * @dev Complexity is O(number of configured rules). Large rule sets can make + 165 : : * transfers too expensive on chains with lower block gas limits. + 166 : : * Security convention: rule contracts are expected to be trusted and must not + 167 : : * hold {RULES_MANAGEMENT_ROLE}. + 168 : : * @param from the origin address + 169 : : * @param to the destination address + 170 : : * @param value to transfer + 171 : : * + 172 : : */ + 173 : 20 : function _transferred(address from, address to, uint256 value) internal virtual { + 174 : 20 : uint256 rulesLength = _rules.length(); + 175 : 20 : for (uint256 i = 0; i < rulesLength; ++i) { + 176 : 14 : IRule(_rules.at(i)).transferred(from, to, value); + 177 : : } + 178 : : } + 179 : : + 180 : : /** + 181 : : * @notice Go through all the rule to know if a restriction exists on the transfer + 182 : : * @dev Complexity is O(number of configured rules). Large rule sets can make + 183 : : * transfers too expensive on chains with lower block gas limits. + 184 : : * Security convention: rule contracts are expected to be trusted and must not + 185 : : * hold {RULES_MANAGEMENT_ROLE}. + 186 : : * @param spender the spender address (transferFrom) + 187 : : * @param from the origin address + 188 : : * @param to the destination address + 189 : : * @param value to transfer + 190 : : * + 191 : : */ + 192 : 4 : function _transferred(address spender, address from, address to, uint256 value) internal virtual { + 193 : 4 : uint256 rulesLength = _rules.length(); + 194 : 4 : for (uint256 i = 0; i < rulesLength; ++i) { + 195 : 4 : IRule(_rules.at(i)).transferred(spender, from, to, value); + 196 : : } + 197 : : } + 198 : : + 199 : : function _onlyRulesManager() internal virtual; + 200 : : } diff --git a/doc/coverage/coverage/src/modules/VersionModule.sol.func-sort-c.html b/doc/coverage/coverage/src/modules/VersionModule.sol.func-sort-c.html index ef40376..b953c88 100644 --- a/doc/coverage/coverage/src/modules/VersionModule.sol.func-sort-c.html +++ b/doc/coverage/coverage/src/modules/VersionModule.sol.func-sort-c.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 1 diff --git a/doc/coverage/coverage/src/modules/VersionModule.sol.func.html b/doc/coverage/coverage/src/modules/VersionModule.sol.func.html index e09188d..f4517d4 100644 --- a/doc/coverage/coverage/src/modules/VersionModule.sol.func.html +++ b/doc/coverage/coverage/src/modules/VersionModule.sol.func.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 1 diff --git a/doc/coverage/coverage/src/modules/VersionModule.sol.gcov.html b/doc/coverage/coverage/src/modules/VersionModule.sol.gcov.html index cfba628..cf339dc 100644 --- a/doc/coverage/coverage/src/modules/VersionModule.sol.gcov.html +++ b/doc/coverage/coverage/src/modules/VersionModule.sol.gcov.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 1 diff --git a/doc/coverage/coverage/src/modules/index-sort-b.html b/doc/coverage/coverage/src/modules/index-sort-b.html index 4e2500b..b6a5a03 100644 --- a/doc/coverage/coverage/src/modules/index-sort-b.html +++ b/doc/coverage/coverage/src/modules/index-sort-b.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 25 diff --git a/doc/coverage/coverage/src/modules/index-sort-f.html b/doc/coverage/coverage/src/modules/index-sort-f.html index ea7db50..4252b69 100644 --- a/doc/coverage/coverage/src/modules/index-sort-f.html +++ b/doc/coverage/coverage/src/modules/index-sort-f.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 25 diff --git a/doc/coverage/coverage/src/modules/index-sort-l.html b/doc/coverage/coverage/src/modules/index-sort-l.html index d6d0b93..db2c56d 100644 --- a/doc/coverage/coverage/src/modules/index-sort-l.html +++ b/doc/coverage/coverage/src/modules/index-sort-l.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 25 diff --git a/doc/coverage/coverage/src/modules/index.html b/doc/coverage/coverage/src/modules/index.html index 3aadc68..f103df9 100644 --- a/doc/coverage/coverage/src/modules/index.html +++ b/doc/coverage/coverage/src/modules/index.html @@ -37,7 +37,7 @@ Date: - 2026-02-16 13:49:21 + 2026-03-18 19:08:29 Functions: 25 diff --git a/doc/coverage/lcov.info b/doc/coverage/lcov.info index 83ac545..b64b64b 100644 --- a/doc/coverage/lcov.info +++ b/doc/coverage/lcov.info @@ -1,64 +1,13 @@ TN: -SF:src/RuleEngine.sol -DA:25,121 -FN:25,RuleEngine.constructor -FNDA:121,RuleEngine.constructor -DA:28,121 -BRDA:28,0,0,1 -DA:29,1 -DA:31,120 -BRDA:31,1,0,30 -DA:32,30 -DA:34,120 -DA:42,129 -FN:42,RuleEngine.hasRole -FNDA:129,RuleEngine.hasRole -DA:43,342 -BRDA:43,2,0,183 -BRDA:43,2,1,159 -DA:44,183 -DA:46,159 -DA:51,4 -FN:51,RuleEngine.supportsInterface -FNDA:4,RuleEngine.supportsInterface -DA:52,4 -DA:53,3 -DA:54,2 -DA:60,15 -FN:60,RuleEngine._onlyComplianceManager -FNDA:15,RuleEngine._onlyComplianceManager -DA:61,168 -FN:61,RuleEngine._onlyRulesManager -FNDA:168,RuleEngine._onlyRulesManager -DA:66,359 -FN:66,RuleEngine._msgSender -FNDA:359,RuleEngine._msgSender -DA:67,359 -DA:73,1 -FN:73,RuleEngine._msgData -FNDA:1,RuleEngine._msgData -DA:74,1 -DA:80,360 -FN:80,RuleEngine._contextSuffixLength -FNDA:360,RuleEngine._contextSuffixLength -DA:81,360 -FNF:8 -FNH:8 -LF:22 -LH:22 -BRF:4 -BRH:4 -end_of_record -TN: SF:src/RuleEngineBase.sol DA:37,5 FN:37,RuleEngineBase.transferred.0 FNDA:5,RuleEngineBase.transferred.0 DA:44,4 -DA:50,19 +DA:50,18 FN:50,RuleEngineBase.transferred.1 -FNDA:19,RuleEngineBase.transferred.1 -DA:56,17 +FNDA:18,RuleEngineBase.transferred.1 +DA:56,16 DA:60,4 FN:60,RuleEngineBase.created FNDA:4,RuleEngineBase.created @@ -107,22 +56,22 @@ DA:163,39 BRDA:163,1,0,29 DA:164,29 DA:167,10 -DA:170,19 -FN:170,RuleEngineBase._messageForTransferRestriction +DA:176,19 +FN:176,RuleEngineBase._messageForTransferRestriction FNDA:19,RuleEngineBase._messageForTransferRestriction -DA:172,19 -DA:173,19 -DA:174,16 -BRDA:174,2,0,14 -DA:175,14 -DA:178,5 -DA:184,215 -FN:184,RuleEngineBase._checkRule -FNDA:215,RuleEngineBase._checkRule -DA:185,215 -DA:186,206 -BRDA:186,3,0,6 -DA:187,6 +DA:177,19 +DA:178,19 +DA:179,16 +BRDA:179,2,0,14 +DA:180,14 +DA:183,5 +DA:189,217 +FN:189,RuleEngineBase._checkRule +FNDA:217,RuleEngineBase._checkRule +DA:190,217 +DA:191,208 +BRDA:191,3,0,6 +DA:192,6 FNF:13 FNH:13 LF:42 @@ -131,11 +80,64 @@ BRF:4 BRH:4 end_of_record TN: -SF:src/RuleEngineOwnable.sol -DA:29,71 +SF:src/deployment/RuleEngine.sol +DA:26,127 +FN:26,RuleEngine.constructor +FNDA:127,RuleEngine.constructor +DA:29,127 +BRDA:29,0,0,1 +DA:30,1 +DA:32,126 +BRDA:32,1,0,31 +DA:33,31 +DA:35,126 +DA:43,135 +FN:43,RuleEngine.hasRole +FNDA:135,RuleEngine.hasRole +DA:44,350 +BRDA:44,2,0,185 +BRDA:44,2,1,165 +DA:45,185 +DA:47,165 +DA:52,6 +FN:52,RuleEngine.supportsInterface +FNDA:6,RuleEngine.supportsInterface +DA:53,6 +DA:54,5 +DA:55,4 +DA:56,3 +DA:57,2 +DA:63,15 +FN:63,RuleEngine._onlyComplianceManager +FNDA:15,RuleEngine._onlyComplianceManager +DA:64,170 +FN:64,RuleEngine._onlyRulesManager +FNDA:170,RuleEngine._onlyRulesManager +DA:69,366 +FN:69,RuleEngine._msgSender +FNDA:366,RuleEngine._msgSender +DA:70,366 +DA:76,1 +FN:76,RuleEngine._msgData +FNDA:1,RuleEngine._msgData +DA:77,1 +DA:83,367 +FN:83,RuleEngine._contextSuffixLength +FNDA:367,RuleEngine._contextSuffixLength +DA:84,367 +FNF:8 +FNH:8 +LF:24 +LH:24 +BRF:4 +BRH:4 +end_of_record +TN: +SF:src/deployment/RuleEngineOwnable.sol +DA:29,77 FN:29,RuleEngineOwnable.constructor -FNDA:71,RuleEngineOwnable.constructor -DA:35,70 +FNDA:77,RuleEngineOwnable.constructor +DA:35,76 BRDA:35,0,0,1 DA:36,1 DA:44,64 @@ -144,28 +146,31 @@ FNDA:64,RuleEngineOwnable._onlyRulesManager DA:49,21 FN:49,RuleEngineOwnable._onlyComplianceManager FNDA:21,RuleEngineOwnable._onlyComplianceManager -DA:52,6 +DA:52,9 FN:52,RuleEngineOwnable.supportsInterface -FNDA:6,RuleEngineOwnable.supportsInterface -DA:53,6 -DA:54,5 -DA:55,2 -DA:65,108 -FN:65,RuleEngineOwnable._msgSender +FNDA:9,RuleEngineOwnable.supportsInterface +DA:53,9 +DA:54,8 +DA:55,7 +DA:56,5 +DA:57,4 +DA:58,3 +DA:68,108 +FN:68,RuleEngineOwnable._msgSender FNDA:108,RuleEngineOwnable._msgSender -DA:66,108 -DA:72,1 -FN:72,RuleEngineOwnable._msgData +DA:69,108 +DA:75,1 +FN:75,RuleEngineOwnable._msgData FNDA:1,RuleEngineOwnable._msgData -DA:73,1 -DA:79,109 -FN:79,RuleEngineOwnable._contextSuffixLength +DA:76,1 +DA:82,109 +FN:82,RuleEngineOwnable._contextSuffixLength FNDA:109,RuleEngineOwnable._contextSuffixLength -DA:80,109 +DA:83,109 FNF:7 FNH:7 -LF:15 -LH:15 +LF:18 +LH:18 BRF:1 BRH:1 end_of_record @@ -179,59 +184,59 @@ DA:34,26 FN:34,ERC3643ComplianceModule.onlyComplianceManager FNDA:26,ERC3643ComplianceModule.onlyComplianceManager DA:35,26 -DA:45,26 -FN:45,ERC3643ComplianceModule.bindToken +DA:50,26 +FN:50,ERC3643ComplianceModule.bindToken FNDA:26,ERC3643ComplianceModule.bindToken -DA:46,25 -DA:50,10 -FN:50,ERC3643ComplianceModule.unbindToken +DA:51,25 +DA:60,10 +FN:60,ERC3643ComplianceModule.unbindToken FNDA:10,ERC3643ComplianceModule.unbindToken -DA:51,9 -DA:55,15 -FN:55,ERC3643ComplianceModule.isTokenBound +DA:61,9 +DA:65,15 +FN:65,ERC3643ComplianceModule.isTokenBound FNDA:15,ERC3643ComplianceModule.isTokenBound -DA:56,15 -DA:60,5 -FN:60,ERC3643ComplianceModule.getTokenBound +DA:66,15 +DA:70,5 +FN:70,ERC3643ComplianceModule.getTokenBound FNDA:5,ERC3643ComplianceModule.getTokenBound -DA:61,5 -BRDA:61,0,0,3 -BRDA:61,0,1,2 -DA:64,3 -DA:66,2 -DA:71,4 -FN:71,ERC3643ComplianceModule.getTokenBounds +DA:71,5 +BRDA:71,0,0,3 +BRDA:71,0,1,2 +DA:74,3 +DA:76,2 +DA:81,4 +FN:81,ERC3643ComplianceModule.getTokenBounds FNDA:4,ERC3643ComplianceModule.getTokenBounds -DA:72,4 -DA:79,9 -FN:79,ERC3643ComplianceModule._unbindToken +DA:82,4 +DA:89,9 +FN:89,ERC3643ComplianceModule._unbindToken FNDA:9,ERC3643ComplianceModule._unbindToken -DA:80,9 -BRDA:80,1,0,2 -BRDA:80,1,1,7 -DA:82,7 -BRDA:82,2,0,- -BRDA:82,2,1,7 -DA:84,7 -DA:87,56 -FN:87,ERC3643ComplianceModule._bindToken -FNDA:56,ERC3643ComplianceModule._bindToken -DA:88,56 -BRDA:88,3,0,2 -BRDA:88,3,1,54 -DA:89,54 -BRDA:89,4,0,2 -BRDA:89,4,1,52 -DA:91,52 -BRDA:91,5,0,- -BRDA:91,5,1,52 -DA:92,52 -DA:95,32 -FN:95,ERC3643ComplianceModule._checkBoundToken -FNDA:32,ERC3643ComplianceModule._checkBoundToken -DA:96,32 -BRDA:96,6,0,7 -DA:97,7 +DA:90,9 +BRDA:90,1,0,2 +BRDA:90,1,1,7 +DA:92,7 +BRDA:92,2,0,- +BRDA:92,2,1,7 +DA:94,7 +DA:97,57 +FN:97,ERC3643ComplianceModule._bindToken +FNDA:57,ERC3643ComplianceModule._bindToken +DA:98,57 +BRDA:98,3,0,2 +BRDA:98,3,1,55 +DA:99,55 +BRDA:99,4,0,2 +BRDA:99,4,1,53 +DA:101,53 +BRDA:101,5,0,- +BRDA:101,5,1,53 +DA:102,53 +DA:105,31 +FN:105,ERC3643ComplianceModule._checkBoundToken +FNDA:31,ERC3643ComplianceModule._checkBoundToken +DA:106,31 +BRDA:106,6,0,7 +DA:107,7 FNF:10 FNH:10 LF:28 @@ -241,97 +246,97 @@ BRH:11 end_of_record TN: SF:src/modules/RulesManagementModule.sol -DA:21,15 -FN:21,RulesManagementModule.onlyRulesManager +DA:16,15 +FN:16,RulesManagementModule.onlyRulesManager FNDA:15,RulesManagementModule.onlyRulesManager -DA:22,15 -DA:42,49 -FN:42,RulesManagementModule.setRules +DA:17,15 +DA:45,49 +FN:45,RulesManagementModule.setRules FNDA:49,RulesManagementModule.setRules -DA:43,47 -BRDA:43,0,0,6 -DA:44,6 -DA:46,41 -BRDA:46,1,0,35 -DA:47,35 +DA:46,47 +BRDA:46,0,0,6 +DA:47,6 DA:49,41 -DA:50,69 -DA:52,64 -BRDA:52,2,0,- -BRDA:52,2,1,64 -DA:53,64 -DA:60,15 -FN:60,RulesManagementModule.clearRules +BRDA:49,1,0,35 +DA:50,35 +DA:52,41 +DA:53,69 +DA:55,64 +BRDA:55,2,0,- +BRDA:55,2,1,64 +DA:56,64 +DA:63,15 +FN:63,RulesManagementModule.clearRules FNDA:15,RulesManagementModule.clearRules -DA:61,13 -DA:67,150 -FN:67,RulesManagementModule.addRule -FNDA:150,RulesManagementModule.addRule -DA:68,146 -DA:69,136 -BRDA:69,3,0,- -BRDA:69,3,1,136 -DA:70,136 -DA:76,18 -FN:76,RulesManagementModule.removeRule +DA:64,13 +DA:73,152 +FN:73,RulesManagementModule.addRule +FNDA:152,RulesManagementModule.addRule +DA:74,148 +DA:75,138 +BRDA:75,3,0,- +BRDA:75,3,1,138 +DA:76,138 +DA:82,18 +FN:82,RulesManagementModule.removeRule FNDA:18,RulesManagementModule.removeRule -DA:77,16 -BRDA:77,4,0,3 -BRDA:77,4,1,13 -DA:78,13 -DA:86,161 -FN:86,RulesManagementModule.rulesCount +DA:83,16 +BRDA:83,4,0,3 +BRDA:83,4,1,13 +DA:84,13 +DA:92,161 +FN:92,RulesManagementModule.rulesCount FNDA:161,RulesManagementModule.rulesCount -DA:87,278 -DA:93,71 -FN:93,RulesManagementModule.containsRule +DA:93,278 +DA:99,71 +FN:99,RulesManagementModule.containsRule FNDA:71,RulesManagementModule.containsRule -DA:94,71 -DA:100,5 -FN:100,RulesManagementModule.rule +DA:100,71 +DA:106,5 +FN:106,RulesManagementModule.rule FNDA:5,RulesManagementModule.rule -DA:101,133 -BRDA:101,5,0,131 -BRDA:101,5,1,2 -DA:104,131 -DA:106,2 -DA:113,15 -FN:113,RulesManagementModule.rules +DA:107,133 +BRDA:107,5,0,131 +BRDA:107,5,1,2 +DA:110,131 +DA:112,2 +DA:119,15 +FN:119,RulesManagementModule.rules FNDA:15,RulesManagementModule.rules -DA:114,15 -DA:124,48 -FN:124,RulesManagementModule._clearRules +DA:120,15 +DA:130,48 +FN:130,RulesManagementModule._clearRules FNDA:48,RulesManagementModule._clearRules -DA:125,48 -DA:126,48 -DA:136,13 -FN:136,RulesManagementModule._removeRule +DA:131,48 +DA:132,48 +DA:142,13 +FN:142,RulesManagementModule._removeRule FNDA:13,RulesManagementModule._removeRule -DA:138,13 -BRDA:138,6,0,- -BRDA:138,6,1,13 -DA:139,13 -DA:145,215 -FN:145,RulesManagementModule._checkRule -FNDA:215,RulesManagementModule._checkRule -DA:146,215 -BRDA:146,7,0,3 -DA:147,3 -DA:149,212 -BRDA:149,8,0,6 -DA:150,6 -DA:163,21 -FN:163,RulesManagementModule._transferred.0 -FNDA:21,RulesManagementModule._transferred.0 -DA:164,21 -DA:165,21 -DA:166,15 -DA:178,4 -FN:178,RulesManagementModule._transferred.1 +DA:144,13 +BRDA:144,6,0,- +BRDA:144,6,1,13 +DA:145,13 +DA:151,217 +FN:151,RulesManagementModule._checkRule +FNDA:217,RulesManagementModule._checkRule +DA:152,217 +BRDA:152,7,0,3 +DA:153,3 +DA:155,214 +BRDA:155,8,0,6 +DA:156,6 +DA:173,20 +FN:173,RulesManagementModule._transferred.0 +FNDA:20,RulesManagementModule._transferred.0 +DA:174,20 +DA:175,20 +DA:176,14 +DA:192,4 +FN:192,RulesManagementModule._transferred.1 FNDA:4,RulesManagementModule._transferred.1 -DA:179,4 -DA:180,4 -DA:181,4 +DA:193,4 +DA:194,4 +DA:195,4 FNF:14 FNH:14 LF:49 diff --git a/doc/schema/classDiagram.svg b/doc/schema/classDiagram.svg deleted file mode 100644 index d3a0e65..0000000 --- a/doc/schema/classDiagram.svg +++ /dev/null @@ -1,1542 +0,0 @@ - - - - - - -UmlClassDiagram - - - -0 - -<<Interface>> -IERC3643Pause -RuleEngineFlatten.sol - -External: -     paused(): bool -     pause() -     unpause() - - - -1 - -<<Interface>> -IERC3643ERC20Base -RuleEngineFlatten.sol - -External: -     setName(name: string) -     setSymbol(symbol: string) - - - -2 - -<<Interface>> -IERC3643BatchTransfer -RuleEngineFlatten.sol - -External: -     batchTransfer(tos: address[], values: uint256[]): (success_: bool) - - - -3 - -<<Interface>> -IERC3643Base -RuleEngineFlatten.sol - -External: -     version(): (version_: string) - - - -4 - -<<Interface>> -IERC3643EnforcementEvent -RuleEngineFlatten.sol - -Public: -    <<event>> AddressFrozen(account: address, isFrozen: bool, enforcer: address, data: bytes) - - - -5 - -<<Interface>> -IERC3643Enforcement -RuleEngineFlatten.sol - -External: -     isFrozen(account: address): (isFrozen_: bool) -     setAddressFrozen(account: address, freeze: bool) -     batchSetAddressFrozen(accounts: address[], freeze: bool[]) - - - -6 - -<<Interface>> -IERC3643ERC20Enforcement -RuleEngineFlatten.sol - -External: -     getFrozenTokens(account: address): (frozenBalance_: uint256) -     freezePartialTokens(account: address, value: uint256) -     unfreezePartialTokens(account: address, value: uint256) -     forcedTransfer(from: address, to: address, value: uint256): (success_: bool) - - - -7 - -<<Interface>> -IERC3643Mint -RuleEngineFlatten.sol - -External: -     mint(account: address, value: uint256) -     batchMint(accounts: address[], values: uint256[]) - - - -8 - -<<Interface>> -IERC3643Burn -RuleEngineFlatten.sol - -External: -     burn(account: address, value: uint256) -     batchBurn(accounts: address[], values: uint256[]) - - - -9 - -<<Interface>> -IERC3643ComplianceRead -RuleEngineFlatten.sol - -External: -     canTransfer(from: address, to: address, value: uint256): (isValid: bool) - - - -10 - -<<Interface>> -IERC3643IComplianceContract -RuleEngineFlatten.sol - -External: -     transferred(from: address, to: address, value: uint256) - - - -11 - -<<Interface>> -IERC1404 -RuleEngineFlatten.sol - -External: -     detectTransferRestriction(from: address, to: address, value: uint256): uint8 -     messageForTransferRestriction(restrictionCode: uint8): string - - - -12 - -<<Interface>> -IERC1404Extend -RuleEngineFlatten.sol - -External: -     detectTransferRestrictionFrom(spender: address, from: address, to: address, value: uint256): uint8 - - - -12->11 - - - - - -13 - -<<Enum>> -REJECTED_CODE_BASE -RuleEngineFlatten.sol - -TRANSFER_OK: 0 -TRANSFER_REJECTED_DEACTIVATED: 1 -TRANSFER_REJECTED_PAUSED: 2 -TRANSFER_REJECTED_FROM_FROZEN: 3 -TRANSFER_REJECTED_TO_FROZEN: 4 -TRANSFER_REJECTED_SPENDER_FROZEN: 5 -TRANSFER_REJECTED_FROM_INSUFFICIENT_ACTIVE_BALANCE: 6 - - - -13->12 - - - - - -14 - -<<Interface>> -IAccessControl -RuleEngineFlatten.sol - -External: -     hasRole(role: bytes32, account: address): bool -     getRoleAdmin(role: bytes32): bytes32 -     grantRole(role: bytes32, account: address) -     revokeRole(role: bytes32, account: address) -     renounceRole(role: bytes32, callerConfirmation: address) -Public: -    <<event>> RoleAdminChanged(role: bytes32, previousAdminRole: bytes32, newAdminRole: bytes32) -    <<event>> RoleGranted(role: bytes32, account: address, sender: address) -    <<event>> RoleRevoked(role: bytes32, account: address, sender: address) - - - -15 - -<<Library>> -Comparators -RuleEngineFlatten.sol - -Internal: -    lt(a: uint256, b: uint256): bool -    gt(a: uint256, b: uint256): bool - - - -16 - -<<Abstract>> -Context -RuleEngineFlatten.sol - -Internal: -    _msgSender(): address -    _msgData(): bytes -    _contextSuffixLength(): uint256 - - - -17 - -<<Library>> -Panic -RuleEngineFlatten.sol - -Internal: -   GENERIC: uint256 -   ASSERT: uint256 -   UNDER_OVERFLOW: uint256 -   DIVISION_BY_ZERO: uint256 -   ENUM_CONVERSION_ERROR: uint256 -   STORAGE_ENCODING_ERROR: uint256 -   EMPTY_ARRAY_POP: uint256 -   ARRAY_OUT_OF_BOUNDS: uint256 -   RESOURCE_ERROR: uint256 -   INVALID_INTERNAL_FUNCTION: uint256 - -Internal: -    panic(code: uint256) - - - -18 - -<<Library>> -SlotDerivation -RuleEngineFlatten.sol - -Internal: -    erc7201Slot(namespace: string): (slot: bytes32) -    offset(slot: bytes32, pos: uint256): (result: bytes32) -    deriveArray(slot: bytes32): (result: bytes32) -    deriveMapping(slot: bytes32, key: address): (result: bytes32) -    deriveMapping(slot: bytes32, key: bool): (result: bytes32) -    deriveMapping(slot: bytes32, key: bytes32): (result: bytes32) -    deriveMapping(slot: bytes32, key: uint256): (result: bytes32) -    deriveMapping(slot: bytes32, key: int256): (result: bytes32) -    deriveMapping(slot: bytes32, key: string): (result: bytes32) -    deriveMapping(slot: bytes32, key: bytes): (result: bytes32) - - - -19 - -<<Library>> -StorageSlot -RuleEngineFlatten.sol - -Internal: -    getAddressSlot(slot: bytes32): (r: AddressSlot) -    getBooleanSlot(slot: bytes32): (r: BooleanSlot) -    getBytes32Slot(slot: bytes32): (r: Bytes32Slot) -    getUint256Slot(slot: bytes32): (r: Uint256Slot) -    getInt256Slot(slot: bytes32): (r: Int256Slot) -    getStringSlot(slot: bytes32): (r: StringSlot) -    getStringSlot(store: string): (r: StringSlot) -    getBytesSlot(slot: bytes32): (r: BytesSlot) -    getBytesSlot(store: bytes): (r: BytesSlot) - - - -20 - -<<Struct>> -AddressSlot -RuleEngineFlatten.sol - -value: address - - - -19->20 - - - - - -21 - -<<Struct>> -BooleanSlot -RuleEngineFlatten.sol - -value: bool - - - -19->21 - - - - - -22 - -<<Struct>> -Bytes32Slot -RuleEngineFlatten.sol - -value: bytes32 - - - -19->22 - - - - - -23 - -<<Struct>> -Uint256Slot -RuleEngineFlatten.sol - -value: uint256 - - - -19->23 - - - - - -24 - -<<Struct>> -Int256Slot -RuleEngineFlatten.sol - -value: int256 - - - -19->24 - - - - - -25 - -<<Struct>> -StringSlot -RuleEngineFlatten.sol - -value: string - - - -19->25 - - - - - -26 - -<<Struct>> -BytesSlot -RuleEngineFlatten.sol - -value: bytes - - - -19->26 - - - - - -20->19 - - - - - -21->19 - - - - - -22->19 - - - - - -23->19 - - - - - -24->19 - - - - - -25->19 - - - - - -26->19 - - - - - -27 - -<<Interface>> -IERC165 -RuleEngineFlatten.sol - -External: -     supportsInterface(interfaceId: bytes4): bool - - - -28 - -<<Library>> -SafeCast -RuleEngineFlatten.sol - -Internal: -    toUint248(value: uint256): uint248 -    toUint240(value: uint256): uint240 -    toUint232(value: uint256): uint232 -    toUint224(value: uint256): uint224 -    toUint216(value: uint256): uint216 -    toUint208(value: uint256): uint208 -    toUint200(value: uint256): uint200 -    toUint192(value: uint256): uint192 -    toUint184(value: uint256): uint184 -    toUint176(value: uint256): uint176 -    toUint168(value: uint256): uint168 -    toUint160(value: uint256): uint160 -    toUint152(value: uint256): uint152 -    toUint144(value: uint256): uint144 -    toUint136(value: uint256): uint136 -    toUint128(value: uint256): uint128 -    toUint120(value: uint256): uint120 -    toUint112(value: uint256): uint112 -    toUint104(value: uint256): uint104 -    toUint96(value: uint256): uint96 -    toUint88(value: uint256): uint88 -    toUint80(value: uint256): uint80 -    toUint72(value: uint256): uint72 -    toUint64(value: uint256): uint64 -    toUint56(value: uint256): uint56 -    toUint48(value: uint256): uint48 -    toUint40(value: uint256): uint40 -    toUint32(value: uint256): uint32 -    toUint24(value: uint256): uint24 -    toUint16(value: uint256): uint16 -    toUint8(value: uint256): uint8 -    toUint256(value: int256): uint256 -    toInt248(value: int256): (downcasted: int248) -    toInt240(value: int256): (downcasted: int240) -    toInt232(value: int256): (downcasted: int232) -    toInt224(value: int256): (downcasted: int224) -    toInt216(value: int256): (downcasted: int216) -    toInt208(value: int256): (downcasted: int208) -    toInt200(value: int256): (downcasted: int200) -    toInt192(value: int256): (downcasted: int192) -    toInt184(value: int256): (downcasted: int184) -    toInt176(value: int256): (downcasted: int176) -    toInt168(value: int256): (downcasted: int168) -    toInt160(value: int256): (downcasted: int160) -    toInt152(value: int256): (downcasted: int152) -    toInt144(value: int256): (downcasted: int144) -    toInt136(value: int256): (downcasted: int136) -    toInt128(value: int256): (downcasted: int128) -    toInt120(value: int256): (downcasted: int120) -    toInt112(value: int256): (downcasted: int112) -    toInt104(value: int256): (downcasted: int104) -    toInt96(value: int256): (downcasted: int96) -    toInt88(value: int256): (downcasted: int88) -    toInt80(value: int256): (downcasted: int80) -    toInt72(value: int256): (downcasted: int72) -    toInt64(value: int256): (downcasted: int64) -    toInt56(value: int256): (downcasted: int56) -    toInt48(value: int256): (downcasted: int48) -    toInt40(value: int256): (downcasted: int40) -    toInt32(value: int256): (downcasted: int32) -    toInt24(value: int256): (downcasted: int24) -    toInt16(value: int256): (downcasted: int16) -    toInt8(value: int256): (downcasted: int8) -    toInt256(value: uint256): int256 -    toUint(b: bool): (u: uint256) - - - -29 - -<<Abstract>> -RuleEngineInvariantStorage -RuleEngineFlatten.sol - - - -30 - -<<Interface>> -IERC7551Mint -RuleEngineFlatten.sol - -External: -     mint(account: address, value: uint256, data: bytes) -Public: -    <<event>> Mint(minter: address, account: address, value: uint256, data: bytes) - - - -31 - -<<Interface>> -IERC7551Burn -RuleEngineFlatten.sol - -External: -     burn(account: address, amount: uint256, data: bytes) -Public: -    <<event>> Burn(burner: address, account: address, value: uint256, data: bytes) - - - -32 - -<<Interface>> -IERC7551Pause -RuleEngineFlatten.sol - -External: -     paused(): bool -     pause() -     unpause() - - - -33 - -<<Interface>> -IERC7551ERC20EnforcementEvent -RuleEngineFlatten.sol - -Public: -    <<event>> Enforcement(enforcer: address, account: address, amount: uint256, data: bytes) - - - -34 - -<<Interface>> -IERC7551ERC20EnforcementTokenFrozenEvent -RuleEngineFlatten.sol - -Public: -    <<event>> TokensFrozen(account: address, value: uint256, data: bytes) -    <<event>> TokensUnfrozen(account: address, value: uint256, data: bytes) - - - -35 - -<<Interface>> -IERC7551ERC20Enforcement -RuleEngineFlatten.sol - -External: -     getActiveBalanceOf(account: address): (activeBalance_: uint256) -     getFrozenTokens(account: address): (frozenBalance_: uint256) -     freezePartialTokens(account: address, amount: uint256, data: bytes) -     unfreezePartialTokens(account: address, amount: uint256, data: bytes) -     forcedTransfer(account: address, to: address, value: uint256, data: bytes): (success_: bool) - - - -36 - -<<Interface>> -IERC7551Compliance -RuleEngineFlatten.sol - -External: -     canTransferFrom(spender: address, from: address, to: address, value: uint256): bool - - - -36->9 - - - - - -37 - -<<Interface>> -IERC7551Document -RuleEngineFlatten.sol - -External: -     termsHash(): (hash_: bytes32) -     setTerms(_hash: bytes32, _uri: string) -     metaData(): (metadata_: string) -     setMetaData(metaData_: string) - - - -38 - -<<Abstract>> -ERC2771Context -RuleEngineFlatten.sol - -Private: -   _trustedForwarder: address - -Internal: -    _msgSender(): address -    _msgData(): bytes -    _contextSuffixLength(): uint256 -Public: -    constructor(trustedForwarder_: address) -    trustedForwarder(): address -    isTrustedForwarder(forwarder: address): bool - - - -38->16 - - - - - -39 - -<<Abstract>> -ERC165 -RuleEngineFlatten.sol - -Public: -    supportsInterface(interfaceId: bytes4): bool - - - -39->27 - - - - - -40 - -<<Interface>> -IERC3643Compliance -RuleEngineFlatten.sol - -External: -     bindToken(token: address) -     unbindToken(token: address) -     isTokenBound(token: address): (isBound: bool) -     getTokenBound(): (token: address) -     getTokenBounds(): (tokens: address[]) -     created(to: address, value: uint256) -     destroyed(from: address, value: uint256) -Public: -    <<event>> TokenBound(token: address) -    <<event>> TokenUnbound(token: address) - - - -40->9 - - - - - -40->10 - - - - - -41 - -<<Abstract>> -VersionModule -RuleEngineFlatten.sol - -Private: -   VERSION: string - -Public: -    version(): (version_: string) - - - -41->3 - - - - - -42 - -<<Library>> -Math -RuleEngineFlatten.sol - -Private: -    _zeroBytes(byteArray: bytes): bool -Internal: -    add512(a: uint256, b: uint256): (high: uint256, low: uint256) -    mul512(a: uint256, b: uint256): (high: uint256, low: uint256) -    tryAdd(a: uint256, b: uint256): (success: bool, result: uint256) -    trySub(a: uint256, b: uint256): (success: bool, result: uint256) -    tryMul(a: uint256, b: uint256): (success: bool, result: uint256) -    tryDiv(a: uint256, b: uint256): (success: bool, result: uint256) -    tryMod(a: uint256, b: uint256): (success: bool, result: uint256) -    saturatingAdd(a: uint256, b: uint256): uint256 -    saturatingSub(a: uint256, b: uint256): uint256 -    saturatingMul(a: uint256, b: uint256): uint256 -    ternary(condition: bool, a: uint256, b: uint256): uint256 -    max(a: uint256, b: uint256): uint256 -    min(a: uint256, b: uint256): uint256 -    average(a: uint256, b: uint256): uint256 -    ceilDiv(a: uint256, b: uint256): uint256 -    mulDiv(x: uint256, y: uint256, denominator: uint256): (result: uint256) -    mulDiv(x: uint256, y: uint256, denominator: uint256, rounding: Rounding): uint256 -    mulShr(x: uint256, y: uint256, n: uint8): (result: uint256) -    mulShr(x: uint256, y: uint256, n: uint8, rounding: Rounding): uint256 -    invMod(a: uint256, n: uint256): uint256 -    invModPrime(a: uint256, p: uint256): uint256 -    modExp(b: uint256, e: uint256, m: uint256): uint256 -    tryModExp(b: uint256, e: uint256, m: uint256): (success: bool, result: uint256) -    modExp(b: bytes, e: bytes, m: bytes): bytes -    tryModExp(b: bytes, e: bytes, m: bytes): (success: bool, result: bytes) -    sqrt(a: uint256): uint256 -    sqrt(a: uint256, rounding: Rounding): uint256 -    log2(x: uint256): (r: uint256) -    log2(value: uint256, rounding: Rounding): uint256 -    log10(value: uint256): uint256 -    log10(value: uint256, rounding: Rounding): uint256 -    log256(x: uint256): (r: uint256) -    log256(value: uint256, rounding: Rounding): uint256 -    unsignedRoundsUp(rounding: Rounding): bool - - - -42->17 - - - - - -42->28 - - - - - -43 - -<<Enum>> -Rounding -RuleEngineFlatten.sol - -Floor: 0 -Ceil: 1 -Trunc: 2 -Expand: 3 - - - -42->43 - - - - - -43->42 - - - - - -44 - -<<Abstract>> -ERC2771ModuleStandalone -RuleEngineFlatten.sol - -Public: -    constructor(trustedForwarder: address) - - - -44->38 - - - - - -45 - -<<Interface>> -IRuleEngine -RuleEngineFlatten.sol - -External: -     transferred(spender: address, from: address, to: address, value: uint256) - - - -45->10 - - - - - -45->12 - - - - - -45->36 - - - - - -46 - -<<Abstract>> -AccessControl -RuleEngineFlatten.sol - -Private: -   _roles: mapping(bytes32=>RoleData) -Public: -   DEFAULT_ADMIN_ROLE: bytes32 - -Internal: -    _checkRole(role: bytes32) -    _checkRole(role: bytes32, account: address) -    _setRoleAdmin(role: bytes32, adminRole: bytes32) -    _grantRole(role: bytes32, account: address): bool -    _revokeRole(role: bytes32, account: address): bool -Public: -    <<modifier>> onlyRole(role: bytes32) -    supportsInterface(interfaceId: bytes4): bool -    hasRole(role: bytes32, account: address): bool -    getRoleAdmin(role: bytes32): bytes32 -    grantRole(role: bytes32, account: address) <<onlyRole>> -    revokeRole(role: bytes32, account: address) <<onlyRole>> -    renounceRole(role: bytes32, callerConfirmation: address) - - - -46->14 - - - - - -46->16 - - - - - -46->39 - - - - - -47 - -<<Struct>> -RoleData -RuleEngineFlatten.sol - -hasRole: mapping(address=>bool) -adminRole: bytes32 - - - -46->47 - - - - - -47->46 - - - - - -48 - -<<Interface>> -IRule -RuleEngineFlatten.sol - -External: -     canReturnTransferRestrictionCode(restrictionCode: uint8): bool - - - -48->45 - - - - - -49 - -<<Interface>> -IRulesManagementModule -RuleEngineFlatten.sol - -External: -     setRules(rules_: IRule[]) -     rulesCount(): (numberOfrules: uint256) -     rule(ruleId: uint256): (ruleAddress: address) -     rules(): (ruleAddresses: address[]) -     clearRules() -     addRule(rule_: IRule) -     removeRule(rule_: IRule) -     containsRule(rule_: IRule): (exists: bool) - - - -49->48 - - - - - -50 - -<<Abstract>> -RulesManagementModuleInvariantStorage -RuleEngineFlatten.sol - -Public: -   RULES_MANAGEMENT_ROLE: bytes32 - -Public: -    <<event>> AddRule(rule: IRule) -    <<event>> RemoveRule(rule: IRule) -    <<event>> ClearRules() - - - -50->48 - - - - - -51 - -<<Library>> -Arrays -RuleEngineFlatten.sol - -Private: -    _quickSort(begin: uint256, end: uint256, comp: FunctionTypeName()) -    _begin(array: uint256[]): (ptr: uint256) -    _end(array: uint256[]): (ptr: uint256) -    _mload(ptr: uint256): (value: uint256) -    _swap(ptr1: uint256, ptr2: uint256) -    _castToUint256Array(input: address[]): (output: uint256[]) -    _castToUint256Array(input: bytes32[]): (output: uint256[]) -    _castToUint256Comp(input: FunctionTypeName()): (output: FunctionTypeName()) -    _castToUint256Comp(input: FunctionTypeName()): (output: FunctionTypeName()) -Internal: -    sort(array: uint256[], comp: FunctionTypeName()): uint256[] -    sort(array: uint256[]): uint256[] -    sort(array: address[], comp: FunctionTypeName()): address[] -    sort(array: address[]): address[] -    sort(array: bytes32[], comp: FunctionTypeName()): bytes32[] -    sort(array: bytes32[]): bytes32[] -    findUpperBound(array: uint256[], element: uint256): uint256 -    lowerBound(array: uint256[], element: uint256): uint256 -    upperBound(array: uint256[], element: uint256): uint256 -    lowerBoundMemory(array: uint256[], element: uint256): uint256 -    upperBoundMemory(array: uint256[], element: uint256): uint256 -    unsafeAccess(arr: address[], pos: uint256): StorageSlot.AddressSlot -    unsafeAccess(arr: bytes32[], pos: uint256): StorageSlot.Bytes32Slot -    unsafeAccess(arr: uint256[], pos: uint256): StorageSlot.Uint256Slot -    unsafeAccess(arr: bytes[], pos: uint256): StorageSlot.BytesSlot -    unsafeAccess(arr: string[], pos: uint256): StorageSlot.StringSlot -    unsafeMemoryAccess(arr: address[], pos: uint256): (res: address) -    unsafeMemoryAccess(arr: bytes32[], pos: uint256): (res: bytes32) -    unsafeMemoryAccess(arr: uint256[], pos: uint256): (res: uint256) -    unsafeMemoryAccess(arr: bytes[], pos: uint256): (res: bytes) -    unsafeMemoryAccess(arr: string[], pos: uint256): (res: string) -    unsafeSetLength(array: address[], len: uint256) -    unsafeSetLength(array: bytes32[], len: uint256) -    unsafeSetLength(array: uint256[], len: uint256) -    unsafeSetLength(array: bytes[], len: uint256) -    unsafeSetLength(array: string[], len: uint256) - - - -51->15 - - - - - -51->18 - - - - - -51->19 - - - - - -51->20 - - - - - -51->22 - - - - - -51->23 - - - - - -51->25 - - - - - -51->26 - - - - - -51->42 - - - - - -52 - -<<Library>> -EnumerableSet -RuleEngineFlatten.sol - -Private: -    _add(set: Set, value: bytes32): bool -    _remove(set: Set, value: bytes32): bool -    _clear(set: Set) -    _contains(set: Set, value: bytes32): bool -    _length(set: Set): uint256 -    _at(set: Set, index: uint256): bytes32 -    _values(set: Set): bytes32[] -    _values(set: Set, start: uint256, end: uint256): bytes32[] -Internal: -    add(set: Bytes32Set, value: bytes32): bool -    remove(set: Bytes32Set, value: bytes32): bool -    clear(set: Bytes32Set) -    contains(set: Bytes32Set, value: bytes32): bool -    length(set: Bytes32Set): uint256 -    at(set: Bytes32Set, index: uint256): bytes32 -    values(set: Bytes32Set): bytes32[] -    values(set: Bytes32Set, start: uint256, end: uint256): bytes32[] -    add(set: AddressSet, value: address): bool -    remove(set: AddressSet, value: address): bool -    clear(set: AddressSet) -    contains(set: AddressSet, value: address): bool -    length(set: AddressSet): uint256 -    at(set: AddressSet, index: uint256): address -    values(set: AddressSet): address[] -    values(set: AddressSet, start: uint256, end: uint256): address[] -    add(set: UintSet, value: uint256): bool -    remove(set: UintSet, value: uint256): bool -    clear(set: UintSet) -    contains(set: UintSet, value: uint256): bool -    length(set: UintSet): uint256 -    at(set: UintSet, index: uint256): uint256 -    values(set: UintSet): uint256[] -    values(set: UintSet, start: uint256, end: uint256): uint256[] -    add(set: StringSet, value: string): bool -    remove(set: StringSet, value: string): bool -    clear(set: StringSet) -    contains(set: StringSet, value: string): bool -    length(set: StringSet): uint256 -    at(set: StringSet, index: uint256): string -    values(set: StringSet): string[] -    values(set: StringSet, start: uint256, end: uint256): string[] -    add(set: BytesSet, value: bytes): bool -    remove(set: BytesSet, value: bytes): bool -    clear(set: BytesSet) -    contains(set: BytesSet, value: bytes): bool -    length(set: BytesSet): uint256 -    at(set: BytesSet, index: uint256): bytes -    values(set: BytesSet): bytes[] -    values(set: BytesSet, start: uint256, end: uint256): bytes[] - - - -52->51 - - - - - -53 - -<<Struct>> -Set -RuleEngineFlatten.sol - -_values: bytes32[] -_positions: mapping(bytes32=>uint256) - - - -52->53 - - - - - -54 - -<<Struct>> -Bytes32Set -RuleEngineFlatten.sol - -_inner: Set - - - -52->54 - - - - - -55 - -<<Struct>> -AddressSet -RuleEngineFlatten.sol - -_inner: Set - - - -52->55 - - - - - -56 - -<<Struct>> -UintSet -RuleEngineFlatten.sol - -_inner: Set - - - -52->56 - - - - - -57 - -<<Struct>> -StringSet -RuleEngineFlatten.sol - -_values: string[] -_positions: mapping(string=>uint256) - - - -52->57 - - - - - -58 - -<<Struct>> -BytesSet -RuleEngineFlatten.sol - -_values: bytes[] -_positions: mapping(bytes=>uint256) - - - -52->58 - - - - - -53->52 - - - - - -54->52 - - - - - -54->53 - - - - - -55->52 - - - - - -55->53 - - - - - -56->52 - - - - - -56->53 - - - - - -57->52 - - - - - -58->52 - - - - - -59 - -<<Abstract>> -ERC3643ComplianceModule -RuleEngineFlatten.sol - -Private: -   _boundTokens: EnumerableSet.AddressSet -Public: -   COMPLIANCE_MANAGER_ROLE: bytes32 - -Internal: -    _unbindToken(token: address) -    _bindToken(token: address) -Public: -    <<modifier>> onlyBoundToken() -    bindToken(token: address) <<onlyRole>> -    unbindToken(token: address) <<onlyRole>> -    isTokenBound(token: address): bool -    getTokenBound(): address -    getTokenBounds(): address[] - - - -59->40 - - - - - -59->46 - - - - - -59->52 - - - - - -59->55 - - - - - -60 - -<<Abstract>> -RulesManagementModule -RuleEngineFlatten.sol - -Internal: -   _rules: EnumerableSet.AddressSet - -Internal: -    _clearRules() -    _removeRule(rule_: IRule) -    _checkRule(rule_: address) -    _transferred(from: address, to: address, value: uint256) -    _transferred(spender: address, from: address, to: address, value: uint256) -Public: -    setRules(rules_: IRule[]) <<onlyRole>> -    clearRules() <<onlyRole>> -    addRule(rule_: IRule) <<onlyRole>> -    removeRule(rule_: IRule) <<onlyRole>> -    rulesCount(): uint256 -    containsRule(rule_: IRule): bool -    rule(ruleId: uint256): address -    rules(): address[] - - - -60->46 - - - - - -60->48 - - - - - -60->49 - - - - - -60->50 - - - - - -60->52 - - - - - -60->55 - - - - - -61 - -<<Abstract>> -RuleEngineBase -RuleEngineFlatten.sol - -Public: -    transferred(spender: address, from: address, to: address, value: uint256) <<onlyBoundToken>> -    transferred(from: address, to: address, value: uint256) <<onlyBoundToken>> -    created(to: address, value: uint256) <<onlyBoundToken>> -    destroyed(from: address, value: uint256) <<onlyBoundToken>> -    detectTransferRestriction(from: address, to: address, value: uint256): uint8 -    detectTransferRestrictionFrom(spender: address, from: address, to: address, value: uint256): uint8 -    messageForTransferRestriction(restrictionCode: uint8): string -    canTransfer(from: address, to: address, value: uint256): bool -    canTransferFrom(spender: address, from: address, to: address, value: uint256): bool -    hasRole(role: bytes32, account: address): bool - - - -61->13 - - - - - -61->29 - - - - - -61->41 - - - - - -61->45 - - - - - -61->46 - - - - - -61->48 - - - - - -61->59 - - - - - -61->60 - - - - - -62 - -RuleEngine -RuleEngineFlatten.sol - -Internal: -    _msgSender(): (sender: address) -    _msgData(): bytes -    _contextSuffixLength(): uint256 -Public: -    constructor(admin: address, forwarderIrrevocable: address, tokenContract: address) - - - -62->38 - - - - - -62->44 - - - - - -62->61 - - - - - diff --git a/doc/schema/surya/surya_graph/surya_graph_ComplianceInterfaceId.sol.png b/doc/schema/surya/surya_graph/surya_graph_ComplianceInterfaceId.sol.png new file mode 100644 index 0000000..5b4fa6b Binary files /dev/null and b/doc/schema/surya/surya_graph/surya_graph_ComplianceInterfaceId.sol.png differ diff --git a/doc/schema/surya/surya_graph/surya_graph_ICompliance.sol.png b/doc/schema/surya/surya_graph/surya_graph_ICompliance.sol.png new file mode 100644 index 0000000..f61d7c5 Binary files /dev/null and b/doc/schema/surya/surya_graph/surya_graph_ICompliance.sol.png differ diff --git a/doc/schema/surya/surya_graph/surya_graph_IERC7551ComplianceSubset.sol.png b/doc/schema/surya/surya_graph/surya_graph_IERC7551ComplianceSubset.sol.png new file mode 100644 index 0000000..3abc5c3 Binary files /dev/null and b/doc/schema/surya/surya_graph/surya_graph_IERC7551ComplianceSubset.sol.png differ diff --git a/doc/schema/surya/surya_graph/surya_graph_MetaTxModuleStandalone.sol.png b/doc/schema/surya/surya_graph/surya_graph_MetaTxModuleStandalone.sol.png deleted file mode 100644 index e066bfa..0000000 Binary files a/doc/schema/surya/surya_graph/surya_graph_MetaTxModuleStandalone.sol.png and /dev/null differ diff --git a/doc/schema/surya/surya_graph/surya_graph_RuleEngine.sol.png b/doc/schema/surya/surya_graph/surya_graph_RuleEngine.sol.png index b0bb876..1a90c23 100644 Binary files a/doc/schema/surya/surya_graph/surya_graph_RuleEngine.sol.png and b/doc/schema/surya/surya_graph/surya_graph_RuleEngine.sol.png differ diff --git a/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnable.sol.png b/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnable.sol.png index f05fc3b..40a1ff1 100644 Binary files a/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnable.sol.png and b/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnable.sol.png differ diff --git a/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnable2Step.sol.png b/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnable2Step.sol.png new file mode 100644 index 0000000..6a8ae98 Binary files /dev/null and b/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnable2Step.sol.png differ diff --git a/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnableShared.sol.png b/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnableShared.sol.png new file mode 100644 index 0000000..aa36e9f Binary files /dev/null and b/doc/schema/surya/surya_graph/surya_graph_RuleEngineOwnableShared.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_ComplianceInterfaceId.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_ComplianceInterfaceId.sol.png new file mode 100644 index 0000000..b5cc4fb Binary files /dev/null and b/doc/schema/surya/surya_inheritance/surya_inheritance_ComplianceInterfaceId.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_ICompliance.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_ICompliance.sol.png new file mode 100644 index 0000000..6ecad54 Binary files /dev/null and b/doc/schema/surya/surya_inheritance/surya_inheritance_ICompliance.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_IERC7551ComplianceSubset.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_IERC7551ComplianceSubset.sol.png new file mode 100644 index 0000000..960a3ad Binary files /dev/null and b/doc/schema/surya/surya_inheritance/surya_inheritance_IERC7551ComplianceSubset.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_MetaTxModuleStandalone.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_MetaTxModuleStandalone.sol.png deleted file mode 100644 index 6214001..0000000 Binary files a/doc/schema/surya/surya_inheritance/surya_inheritance_MetaTxModuleStandalone.sol.png and /dev/null differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngine.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngine.sol.png index b094bdf..6875d83 100644 Binary files a/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngine.sol.png and b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngine.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnable.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnable.sol.png index f703ccd..0b74357 100644 Binary files a/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnable.sol.png and b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnable.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnable2Step.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnable2Step.sol.png new file mode 100644 index 0000000..ff3fd8e Binary files /dev/null and b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnable2Step.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnableShared.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnableShared.sol.png new file mode 100644 index 0000000..79c3363 Binary files /dev/null and b/doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineOwnableShared.sol.png differ diff --git a/doc/schema/surya/surya_inheritance/surya_inheritance_RulesManagementModule.sol.png b/doc/schema/surya/surya_inheritance/surya_inheritance_RulesManagementModule.sol.png index fa292e5..617fdfb 100644 Binary files a/doc/schema/surya/surya_inheritance/surya_inheritance_RulesManagementModule.sol.png and b/doc/schema/surya/surya_inheritance/surya_inheritance_RulesManagementModule.sol.png differ diff --git a/doc/schema/surya/surya_report/surya_report_MetaTxModuleStandalone.sol.md b/doc/schema/surya/surya_report/surya_report_ComplianceInterfaceId.sol.md similarity index 73% rename from doc/schema/surya/surya_report/surya_report_MetaTxModuleStandalone.sol.md rename to doc/schema/surya/surya_report/surya_report_ComplianceInterfaceId.sol.md index 4079d57..33e301e 100644 --- a/doc/schema/surya/surya_report/surya_report_MetaTxModuleStandalone.sol.md +++ b/doc/schema/surya/surya_report/surya_report_ComplianceInterfaceId.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./modules/MetaTxModuleStandalone.sol | 7f61b75c585854e696ec011ef699a3016282bf9f | +| ./modules/library/ComplianceInterfaceId.sol | 866fb442493595cbaf8fd20bcd8c1767a5f98123 | ### Contracts Description Table @@ -15,8 +15,7 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **MetaTxModuleStandalone** | Implementation | ERC2771Context ||| -| └ | | Public ❗️ | 🛑 | ERC2771Context | +| **ComplianceInterfaceId** | Library | ||| ### Legend diff --git a/doc/schema/surya/surya_report/surya_report_ERC3643ComplianceModule.sol.md b/doc/schema/surya/surya_report/surya_report_ERC3643ComplianceModule.sol.md index 64c04b2..5fbd32b 100644 --- a/doc/schema/surya/surya_report/surya_report_ERC3643ComplianceModule.sol.md +++ b/doc/schema/surya/surya_report/surya_report_ERC3643ComplianceModule.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./modules/ERC3643ComplianceModule.sol | 182aff8d18ff3f6df8e27fd9a93df1788cdb9339 | +| ./modules/ERC3643ComplianceModule.sol | 450f861a6a5d7178fb1b038503e093e3a5491ac8 | ### Contracts Description Table diff --git a/doc/schema/surya/surya_report/surya_report_ICompliance.sol.md b/doc/schema/surya/surya_report/surya_report_ICompliance.sol.md new file mode 100644 index 0000000..d59013e --- /dev/null +++ b/doc/schema/surya/surya_report/surya_report_ICompliance.sol.md @@ -0,0 +1,34 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./mocks/ICompliance.sol | ad82538f6d414b1020a82240c7bc7df561b329a1 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **ICompliance** | Interface | ||| +| └ | bindToken | External ❗️ | 🛑 |NO❗️ | +| └ | unbindToken | External ❗️ | 🛑 |NO❗️ | +| └ | isTokenBound | External ❗️ | |NO❗️ | +| └ | getTokenBound | External ❗️ | |NO❗️ | +| └ | canTransfer | External ❗️ | |NO❗️ | +| └ | transferred | External ❗️ | 🛑 |NO❗️ | +| └ | created | External ❗️ | 🛑 |NO❗️ | +| └ | destroyed | External ❗️ | 🛑 |NO❗️ | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya/surya_report/surya_report_IERC3643Compliance.sol.md b/doc/schema/surya/surya_report/surya_report_IERC3643Compliance.sol.md index aa44bd2..b6eba44 100644 --- a/doc/schema/surya/surya_report/surya_report_IERC3643Compliance.sol.md +++ b/doc/schema/surya/surya_report/surya_report_IERC3643Compliance.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./interfaces/IERC3643Compliance.sol | 57f3433707ac6e17fb1d647d46ad44f5b5374f1d | +| ./interfaces/IERC3643Compliance.sol | fc7795352d154b3fe13fd9df3c8a85b19d667cc5 | ### Contracts Description Table diff --git a/doc/schema/surya/surya_report/surya_report_IERC7551ComplianceSubset.sol.md b/doc/schema/surya/surya_report/surya_report_IERC7551ComplianceSubset.sol.md new file mode 100644 index 0000000..aa4f744 --- /dev/null +++ b/doc/schema/surya/surya_report/surya_report_IERC7551ComplianceSubset.sol.md @@ -0,0 +1,27 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./mocks/IERC7551ComplianceSubset.sol | ac1d94775de7a76a4da688bd97a149df399f9a5b | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **IERC7551ComplianceSubset** | Interface | ||| +| └ | canTransferFrom | External ❗️ | |NO❗️ | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya/surya_report/surya_report_IRule.sol.md b/doc/schema/surya/surya_report/surya_report_IRule.sol.md index c130759..2172a67 100644 --- a/doc/schema/surya/surya_report/surya_report_IRule.sol.md +++ b/doc/schema/surya/surya_report/surya_report_IRule.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./interfaces/IRule.sol | fbb137a88e08184098f52f9f7999c417f60b1533 | +| ./interfaces/IRule.sol | 300bdcb28ddc2795202d0629bc4bec231d5b301c | ### Contracts Description Table diff --git a/doc/schema/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md b/doc/schema/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md index 4a02549..683987a 100644 --- a/doc/schema/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./mocks/rules/operation/RuleConditionalTransferLight.sol | 800f450efe2ffe3a0ad617b93ee7bfa00eca3c9b | +| ./mocks/rules/operation/RuleConditionalTransferLight.sol | 372b3d95b5492f195700fd2325a72ebb256629c9 | ### Contracts Description Table diff --git a/doc/schema/surya/surya_report/surya_report_RuleEngine.sol.md b/doc/schema/surya/surya_report/surya_report_RuleEngine.sol.md index 7b291ec..e680920 100644 --- a/doc/schema/surya/surya_report/surya_report_RuleEngine.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RuleEngine.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./RuleEngine.sol | 570421933a0eb92cb20a4d15df6e3105a7c7ffbc | +| ./deployment/RuleEngine.sol | cfe52f0d2abd4758606453a366c289dda9d91300 | ### Contracts Description Table @@ -15,7 +15,7 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **RuleEngine** | Implementation | ERC2771ModuleStandalone, RuleEngineBase ||| +| **RuleEngine** | Implementation | ERC2771ModuleStandalone, RuleEngineBase, AccessControlEnumerable ||| | └ | | Public ❗️ | 🛑 | ERC2771ModuleStandalone | | └ | hasRole | Public ❗️ | |NO❗️ | | └ | supportsInterface | Public ❗️ | |NO❗️ | diff --git a/doc/schema/surya/surya_report/surya_report_RuleEngineBase.sol.md b/doc/schema/surya/surya_report/surya_report_RuleEngineBase.sol.md index 0a4032a..22dace3 100644 --- a/doc/schema/surya/surya_report/surya_report_RuleEngineBase.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RuleEngineBase.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./RuleEngineBase.sol | 8d58f8c07e60ca21bf97210530ebfa477aaba3d2 | +| ./RuleEngineBase.sol | 5130f4dd846a01768400a053b1c3ff7a897a7e76 | ### Contracts Description Table @@ -29,6 +29,7 @@ | └ | _detectTransferRestrictionFrom | Internal 🔒 | | | | └ | _messageForTransferRestriction | Internal 🔒 | | | | └ | _checkRule | Internal 🔒 | | | +| └ | _supportsRuleEngineBaseInterface | Internal 🔒 | | | ### Legend diff --git a/doc/schema/surya/surya_report/surya_report_RuleEngineExposed.sol.md b/doc/schema/surya/surya_report/surya_report_RuleEngineExposed.sol.md index 4f5c54c..feb652d 100644 --- a/doc/schema/surya/surya_report/surya_report_RuleEngineExposed.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RuleEngineExposed.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./mocks/RuleEngineExposed.sol | 74134ecee35fced78e2e03658fc9d19ffad7c284 | +| ./mocks/RuleEngineExposed.sol | 32dc5064e590129ba225606fb229838bdce53545 | ### Contracts Description Table diff --git a/doc/schema/surya/surya_report/surya_report_RuleEngineOwnable.sol.md b/doc/schema/surya/surya_report/surya_report_RuleEngineOwnable.sol.md index da8cf6e..b407e38 100644 --- a/doc/schema/surya/surya_report/surya_report_RuleEngineOwnable.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RuleEngineOwnable.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./RuleEngineOwnable.sol | ee4b074118dd5b6e5081dee278d7dbcc22f633ca | +| ./deployment/RuleEngineOwnable.sol | 19b70cde4d1a7d7d4e5453ea53d5e69308043167 | ### Contracts Description Table @@ -15,11 +15,10 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **RuleEngineOwnable** | Implementation | ERC2771ModuleStandalone, RuleEngineBase, Ownable ||| -| └ | | Public ❗️ | 🛑 | ERC2771ModuleStandalone Ownable | +| **RuleEngineOwnable** | Implementation | RuleEngineOwnableShared, Ownable ||| +| └ | | Public ❗️ | 🛑 | RuleEngineOwnableShared Ownable | | └ | _onlyRulesManager | Internal 🔒 | 🛑 | onlyOwner | | └ | _onlyComplianceManager | Internal 🔒 | 🛑 | onlyOwner | -| └ | supportsInterface | Public ❗️ | |NO❗️ | | └ | _msgSender | Internal 🔒 | | | | └ | _msgData | Internal 🔒 | | | | └ | _contextSuffixLength | Internal 🔒 | | | diff --git a/doc/schema/surya/surya_report/surya_report_RuleEngineOwnable2Step.sol.md b/doc/schema/surya/surya_report/surya_report_RuleEngineOwnable2Step.sol.md new file mode 100644 index 0000000..98217df --- /dev/null +++ b/doc/schema/surya/surya_report/surya_report_RuleEngineOwnable2Step.sol.md @@ -0,0 +1,32 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./deployment/RuleEngineOwnable2Step.sol | 1e512067a7cba4738ec7f5243ebd6fd769bac157 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **RuleEngineOwnable2Step** | Implementation | RuleEngineOwnableShared, Ownable2Step ||| +| └ | | Public ❗️ | 🛑 | RuleEngineOwnableShared Ownable | +| └ | _onlyRulesManager | Internal 🔒 | 🛑 | onlyOwner | +| └ | _onlyComplianceManager | Internal 🔒 | 🛑 | onlyOwner | +| └ | _msgSender | Internal 🔒 | | | +| └ | _msgData | Internal 🔒 | | | +| └ | _contextSuffixLength | Internal 🔒 | | | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya/surya_report/surya_report_RuleEngineOwnableShared.sol.md b/doc/schema/surya/surya_report/surya_report_RuleEngineOwnableShared.sol.md new file mode 100644 index 0000000..b0a3586 --- /dev/null +++ b/doc/schema/surya/surya_report/surya_report_RuleEngineOwnableShared.sol.md @@ -0,0 +1,31 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./RuleEngineOwnableShared.sol | 3ebee76c60905011d0eb2d936d5839d4fbb17041 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **RuleEngineOwnableShared** | Implementation | ERC2771ModuleStandalone, RuleEngineBase ||| +| └ | | Public ❗️ | 🛑 | ERC2771ModuleStandalone | +| └ | supportsInterface | Public ❗️ | |NO❗️ | +| └ | _msgSender | Internal 🔒 | | | +| └ | _msgData | Internal 🔒 | | | +| └ | _contextSuffixLength | Internal 🔒 | | | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya/surya_report/surya_report_RuleOperationRevert.sol.md b/doc/schema/surya/surya_report/surya_report_RuleOperationRevert.sol.md index a0b565b..c482aa3 100644 --- a/doc/schema/surya/surya_report/surya_report_RuleOperationRevert.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RuleOperationRevert.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./mocks/rules/operation/RuleOperationRevert.sol | 9109b1159f610eab9e6c8228bf69d610cd33c2c1 | +| ./mocks/rules/operation/RuleOperationRevert.sol | d73e135daf5ae5f508edb4cd4b616513f3a99655 | ### Contracts Description Table diff --git a/doc/schema/surya/surya_report/surya_report_RuleWhitelist.sol.md b/doc/schema/surya/surya_report/surya_report_RuleWhitelist.sol.md index 712fd8c..53c9edb 100644 --- a/doc/schema/surya/surya_report/surya_report_RuleWhitelist.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RuleWhitelist.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./mocks/rules/validation/RuleWhitelist.sol | cca0b0e103f5c56fb1b33ffea21252c20e0fb78e | +| ./mocks/rules/validation/RuleWhitelist.sol | cf4b1568b96b381fa66ea41cf675e47455852055 | ### Contracts Description Table diff --git a/doc/schema/surya/surya_report/surya_report_RulesManagementModule.sol.md b/doc/schema/surya/surya_report/surya_report_RulesManagementModule.sol.md index 7ce8774..8e098d5 100644 --- a/doc/schema/surya/surya_report/surya_report_RulesManagementModule.sol.md +++ b/doc/schema/surya/surya_report/surya_report_RulesManagementModule.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./modules/RulesManagementModule.sol | eeb11b9ffc70fab119916187e532b859c6b45a37 | +| ./modules/RulesManagementModule.sol | 197635bda28fa8af5cba2be10740ab1a044dc95c | ### Contracts Description Table @@ -15,7 +15,7 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **RulesManagementModule** | Implementation | AccessControl, RulesManagementModuleInvariantStorage, IRulesManagementModule ||| +| **RulesManagementModule** | Implementation | RulesManagementModuleInvariantStorage, IRulesManagementModule ||| | └ | setRules | Public ❗️ | 🛑 | onlyRulesManager | | └ | clearRules | Public ❗️ | 🛑 | onlyRulesManager | | └ | addRule | Public ❗️ | 🛑 | onlyRulesManager | diff --git a/doc/schema/vscode-uml/ERC2771ModuleUML.png b/doc/schema/vscode-uml/ERC2771ModuleUML.png deleted file mode 100644 index 6b488ee..0000000 Binary files a/doc/schema/vscode-uml/ERC2771ModuleUML.png and /dev/null differ diff --git a/doc/schema/vscode-uml/ERC3643ComplianceModuleUML.png b/doc/schema/vscode-uml/ERC3643ComplianceModuleUML.png index 47061fe..97b1741 100644 Binary files a/doc/schema/vscode-uml/ERC3643ComplianceModuleUML.png and b/doc/schema/vscode-uml/ERC3643ComplianceModuleUML.png differ diff --git a/doc/schema/vscode-uml/RuleEngineBaseUML.png b/doc/schema/vscode-uml/RuleEngineBaseUML.png index b42a06a..cd577ee 100644 Binary files a/doc/schema/vscode-uml/RuleEngineBaseUML.png and b/doc/schema/vscode-uml/RuleEngineBaseUML.png differ diff --git a/doc/schema/vscode-uml/RuleEngineOwnable2StepUML.png b/doc/schema/vscode-uml/RuleEngineOwnable2StepUML.png new file mode 100644 index 0000000..8dd3a50 Binary files /dev/null and b/doc/schema/vscode-uml/RuleEngineOwnable2StepUML.png differ diff --git a/doc/schema/vscode-uml/RuleEngineOwnableUML.png b/doc/schema/vscode-uml/RuleEngineOwnableUML.png new file mode 100644 index 0000000..0b36f8e Binary files /dev/null and b/doc/schema/vscode-uml/RuleEngineOwnableUML.png differ diff --git a/doc/schema/vscode-uml/RuleEngineUML.png b/doc/schema/vscode-uml/RuleEngineUML.png index d1088bf..1595b1f 100644 Binary files a/doc/schema/vscode-uml/RuleEngineUML.png and b/doc/schema/vscode-uml/RuleEngineUML.png differ diff --git a/doc/schema/vscode-uml/RuleManagementModuleUML.png b/doc/schema/vscode-uml/RuleManagementModuleUML.png index 7a66b04..e010041 100644 Binary files a/doc/schema/vscode-uml/RuleManagementModuleUML.png and b/doc/schema/vscode-uml/RuleManagementModuleUML.png differ diff --git a/doc/security/audits/tools/aderyn-report-feedback.md b/doc/security/audits/tools/aderyn-report-feedback.md new file mode 100644 index 0000000..7211d8d --- /dev/null +++ b/doc/security/audits/tools/aderyn-report-feedback.md @@ -0,0 +1,160 @@ +# Aderyn Report — Assessment Feedback + +**Tool:** [Aderyn](https://github.com/Cyfrin/aderyn) +**Report file:** `aderyn-report.md` +**Codebase version:** v3.0.0-rc2 (14 files, 425 nSLOC) +**Assessment date:** 2026-03-18 + +> Aderyn was run with `aderyn -x mocks`. Findings cover production source only (`src/`). + +--- + +## Summary + +| ID | Finding | Severity | Assessment | +|----|---------|----------|------------| +| L-1 | Centralization Risk | Low | Accepted by design | +| L-2 | Unspecific Solidity Pragma | Low | Accepted by design | +| L-3 | PUSH0 Opcode | Low | Not applicable — EVM target is Prague | +| L-4 | Empty Block | Low | Accepted by design (access-control hook pattern) | +| L-5 | Loop Contains `require`/`revert` | Low | Accepted by design (atomic batch validation) | +| L-6 | Costly Operations Inside Loop | Low | Accepted — unavoidable `SSTORE` in `setRules` | +| L-7 | Unchecked Return | Low | Accepted — return value is irrelevant in constructor | + +No High findings. + +--- + +## L-1: Centralization Risk + +### What Aderyn reports + +6 instances: `AccessControl` + role-gated hooks in `RuleEngine`, and `Ownable` + owner-gated hooks in `RuleEngineOwnable`. + +### Assessment + +**Accepted by design. No action required.** + +The RuleEngine is an administrative compliance contract for tokenized securities. Privileged access control is an intentional and necessary feature: + +- `RuleEngine` uses RBAC (`AccessControl`) with distinct `RULES_MANAGEMENT_ROLE` and `COMPLIANCE_MANAGER_ROLE`, allowing fine-grained delegation to different operators. +- `RuleEngineOwnable` uses ERC-173 `Ownable` for simpler single-owner deployments, as recommended by the ERC-3643 specification. + +Both variants are provided precisely to give deployers a choice of trust model. Centralization at the operator level is expected and required for a compliance tool managing transfer restrictions on regulated assets. + +--- + +## L-2: Unspecific Solidity Pragma + +### What Aderyn reports + +12 instances of `pragma solidity ^0.8.20;` across all source files. + +### Assessment + +**Accepted by design. No action required.** + +The floating `^0.8.20` pragma is intentional. The RuleEngine is designed to be used as a library/dependency by integrators who may compile with different Solidity versions ≥ 0.8.20. Locking to a specific patch version would unnecessarily restrict integrators. + +The project itself always compiles with a pinned version: Solidity `0.8.34` as specified in `foundry.toml` and `hardhat.config.js`. The pragma floor of `0.8.20` captures the minimum required language features (custom errors, EnumerableSet improvements, etc.). + +--- + +## L-3: PUSH0 Opcode + +### What Aderyn reports + +14 instances: `pragma solidity ^0.8.20` may generate `PUSH0` opcodes (introduced in Shanghai), which are unsupported on some chains. + +### Assessment + +**Not applicable. No action required.** + +The project explicitly targets the **Prague EVM** (`evm_version = "prague"` in both `foundry.toml` and `hardhat.config.js`). `PUSH0` was introduced in the Shanghai upgrade (EIP-3855); it is supported by all EVM versions from Shanghai onwards, including Cancun and Prague. Any chain that supports Prague also supports `PUSH0`. + +If the project were ever deployed to a pre-Shanghai chain, this would require attention — but that is not a supported target. + +--- + +## L-4: Empty Block + +### What Aderyn reports + +4 instances: `_onlyComplianceManager()` and `_onlyRulesManager()` in both `RuleEngine` and `RuleEngineOwnable` have empty function bodies. + +### Assessment + +**Accepted by design. No action required.** + +These functions implement the **access-control hook pattern** used throughout the codebase (documented in `CLAUDE.md`). The access control check is enforced entirely by the modifier on the function declaration line — e.g.: + +```solidity +function _onlyRulesManager() internal virtual override onlyOwner {} +``` + +The modifier (`onlyOwner` / `onlyRole(...)`) executes before the empty body. The body is intentionally empty because the entire semantics are carried by the modifier. This pattern is necessary to allow abstract modules to define virtual hooks that concrete contracts override with different access control mechanisms. + +Removing or rewriting these functions would break the hook pattern. + +--- + +## L-5: Loop Contains `require`/`revert` + +### What Aderyn reports + +1 instance: `setRules` loop at `RulesManagementModule.sol` line 57 — `_checkRule` inside the loop can revert. + +### Assessment + +**Accepted by design. No action required.** + +`setRules` is an **atomic batch replacement** operation: it clears the existing rule set and registers a new one in a single transaction. If any rule in the input array is invalid (zero address, duplicate, or fails ERC-165 check), the entire operation must revert to prevent partial registration, which would leave the engine in an inconsistent compliance state. + +The "forgive on fail" pattern suggested by Aderyn (skip invalid entries and return them post-loop) is inappropriate here: silently skipping an invalid rule would give the operator a false impression that all rules were registered when in fact some were not, potentially creating a compliance gap. + +The revert-on-invalid behavior is intentional and correct. + +--- + +## L-6: Costly Operations Inside Loop + +### What Aderyn reports + +1 instance: `setRules` loop at `RulesManagementModule.sol` line 57 — `_rules.add()` performs an `SSTORE`. + +### Assessment + +**Accepted — unavoidable. No action required.** + +The purpose of `setRules` is to persist each rule to storage atomically. `EnumerableSet.add()` must write to storage by definition — there is no way to register rules without `SSTORE`. The suggestion to use a local variable to defer the storage write does not apply here because the goal of the loop body IS the storage write. + +The gas cost is bounded by the number of rules being registered, which is under operator control and bounded by practical constraints (see NatSpec and README warnings on rule-count limits). + +--- + +## L-7: Unchecked Return + +### What Aderyn reports + +1 instance: `_grantRole(DEFAULT_ADMIN_ROLE, admin)` in `RuleEngine` constructor (line 35) — the `bool` return value is ignored. + +### Assessment + +**Accepted — return value is irrelevant in this context. No action required.** + +`AccessControl._grantRole()` (OpenZeppelin v5) returns `true` if the role was newly granted, `false` if the account already held the role. In the constructor, `admin` cannot already hold `DEFAULT_ADMIN_ROLE` (the contract was just deployed; no roles have been assigned yet), so the call always returns `true`. + +Even if somehow `false` were returned, it would not represent an error — `_grantRole` does not revert on a no-op. Checking and branching on this value in a constructor would add meaningless code. + +This pattern (ignoring the return of `_grantRole` in a constructor) is standard across all OpenZeppelin-based contracts. + +--- + +## Overall conclusion + +All 7 Aderyn findings are **accepted**: + +- **L-1, L-2, L-3**: Reflect intentional design choices (privileged compliance model, library-friendly pragma, Prague EVM target). +- **L-4, L-5, L-6, L-7**: Are false-positive patterns generated by Aderyn that do not apply to this codebase's architecture. + +No code changes are required for v3.0.0-rc2 based on this report. diff --git a/doc/security/audits/tools/aderyn-report.md b/doc/security/audits/tools/aderyn-report.md index 4f824c7..d408f9d 100644 --- a/doc/security/audits/tools/aderyn-report.md +++ b/doc/security/audits/tools/aderyn-report.md @@ -11,7 +11,10 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati - [L-1: Centralization Risk](#l-1-centralization-risk) - [L-2: Unspecific Solidity Pragma](#l-2-unspecific-solidity-pragma) - [L-3: PUSH0 Opcode](#l-3-push0-opcode) - - [L-4: Loop Contains `require`/`revert`](#l-4-loop-contains-requirerevert) + - [L-4: Empty Block](#l-4-empty-block) + - [L-5: Loop Contains `require`/`revert`](#l-5-loop-contains-requirerevert) + - [L-6: Costly operations inside loop](#l-6-costly-operations-inside-loop) + - [L-7: Unchecked Return](#l-7-unchecked-return) # Summary @@ -20,26 +23,29 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati | Key | Value | | --- | --- | -| .sol Files | 11 | -| Total nSLOC | 466 | +| .sol Files | 14 | +| Total nSLOC | 425 | ## Files Details | Filepath | nSLOC | | --- | --- | -| src/RuleEngine.sol | 46 | -| src/RuleEngineBase.sol | 129 | -| src/interfaces/IERC3643Compliance.sol | 16 | -| src/interfaces/IRule.sol | 7 | +| src/RuleEngineBase.sol | 127 | +| src/deployment/RuleEngine.sol | 47 | +| src/deployment/RuleEngineOwnable.sol | 39 | +| src/interfaces/IERC3643Compliance.sol | 13 | +| src/interfaces/IRule.sol | 5 | | src/interfaces/IRulesManagementModule.sol | 12 | | src/modules/ERC2771ModuleStandalone.sol | 6 | -| src/modules/ERC3643ComplianceModule.sol | 72 | -| src/modules/RulesManagementModule.sol | 146 | -| src/modules/VersionModule.sol | 14 | -| src/modules/library/RuleEngineInvariantStorage.sol | 4 | -| src/modules/library/RulesManagementModuleInvariantStorage.sol | 14 | -| **Total** | **466** | +| src/modules/ERC3643ComplianceModule.sol | 58 | +| src/modules/RulesManagementModule.sol | 83 | +| src/modules/VersionModule.sol | 8 | +| src/modules/library/ComplianceInterfaceId.sol | 5 | +| src/modules/library/RuleEngineInvariantStorage.sol | 5 | +| src/modules/library/RuleInterfaceId.sol | 4 | +| src/modules/library/RulesManagementModuleInvariantStorage.sol | 13 | +| **Total** | **425** | ## Issue Summary @@ -47,67 +53,52 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati | Category | No. of Issues | | --- | --- | | High | 0 | -| Low | 4 | +| Low | 7 | # Low Issues ## L-1: Centralization Risk -> Acknowledge -> Admin and the different operators are considered as trusted. - Contracts have owners with privileged rights to perform admin tasks and need to be trusted to not perform malicious updates or drain funds. -
8 Found Instances - - -- Found in src/modules/ERC3643ComplianceModule.sol [Line: 11](src/modules/ERC3643ComplianceModule.sol#L11) +
6 Found Instances - ```solidity - abstract contract ERC3643ComplianceModule is IERC3643Compliance, AccessControl { - ``` -- Found in src/modules/ERC3643ComplianceModule.sol [Line: 44](src/modules/ERC3643ComplianceModule.sol#L44) +- Found in src/deployment/RuleEngine.sol [Line: 21](src/deployment/RuleEngine.sol#L21) ```solidity - ) public virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) { + contract RuleEngine is ERC2771ModuleStandalone, RuleEngineBase, AccessControl { ``` -- Found in src/modules/ERC3643ComplianceModule.sol [Line: 51](src/modules/ERC3643ComplianceModule.sol#L51) +- Found in src/deployment/RuleEngine.sol [Line: 63](src/deployment/RuleEngine.sol#L63) ```solidity - ) public virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) { + function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {} ``` -- Found in src/modules/RulesManagementModule.sol [Line: 17](src/modules/RulesManagementModule.sol#L17) +- Found in src/deployment/RuleEngine.sol [Line: 64](src/deployment/RuleEngine.sol#L64) ```solidity - AccessControl, + function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {} ``` -- Found in src/modules/RulesManagementModule.sol [Line: 43](src/modules/RulesManagementModule.sol#L43) +- Found in src/deployment/RuleEngineOwnable.sol [Line: 21](src/deployment/RuleEngineOwnable.sol#L21) ```solidity - onlyRole(RULES_MANAGEMENT_ROLE) + contract RuleEngineOwnable is ERC2771ModuleStandalone, RuleEngineBase, Ownable { ``` -- Found in src/modules/RulesManagementModule.sol [Line: 69](src/modules/RulesManagementModule.sol#L69) +- Found in src/deployment/RuleEngineOwnable.sol [Line: 44](src/deployment/RuleEngineOwnable.sol#L44) ```solidity - onlyRole(RULES_MANAGEMENT_ROLE) + function _onlyRulesManager() internal virtual override onlyOwner {} ``` -- Found in src/modules/RulesManagementModule.sol [Line: 83](src/modules/RulesManagementModule.sol#L83) +- Found in src/deployment/RuleEngineOwnable.sol [Line: 49](src/deployment/RuleEngineOwnable.sol#L49) ```solidity - onlyRole(RULES_MANAGEMENT_ROLE) - ``` - -- Found in src/modules/RulesManagementModule.sol [Line: 102](src/modules/RulesManagementModule.sol#L102) - - ```solidity - onlyRole(RULES_MANAGEMENT_ROLE) + function _onlyComplianceManager() internal virtual override onlyOwner {} ```
@@ -116,25 +107,24 @@ Contracts have owners with privileged rights to perform admin tasks and need to ## L-2: Unspecific Solidity Pragma -> One potential use of RuleEngine is to be used as a library, similar to OpenZeppelin library. -> -> In this sense, we use the same convention of OpenZeppelin which for the moment only imposes that the version is higher than 0.8.20: -> pragma solidity ^0.8.20; -> -> A fixed version is set in the config file (0.8.30). Users are free to use these or conduct their own research before switching to another. - 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;` -
11 Found Instances +
12 Found Instances + +- Found in src/RuleEngineBase.sol [Line: 3](src/RuleEngineBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` -- Found in src/RuleEngine.sol [Line: 3](src/RuleEngine.sol#L3) +- Found in src/deployment/RuleEngine.sol [Line: 3](src/deployment/RuleEngine.sol#L3) ```solidity pragma solidity ^0.8.20; ``` -- Found in src/RuleEngineBase.sol [Line: 3](src/RuleEngineBase.sol#L3) +- Found in src/deployment/RuleEngineOwnable.sol [Line: 3](src/deployment/RuleEngineOwnable.sol#L3) ```solidity pragma solidity ^0.8.20; @@ -200,20 +190,24 @@ Consider using a specific version of Solidity in your contracts instead of a wid ## L-3: PUSH0 Opcode -> Acknowledge - 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. -
11 Found Instances +
14 Found Instances -- Found in src/RuleEngine.sol [Line: 3](src/RuleEngine.sol#L3) +- Found in src/RuleEngineBase.sol [Line: 3](src/RuleEngineBase.sol#L3) ```solidity pragma solidity ^0.8.20; ``` -- Found in src/RuleEngineBase.sol [Line: 3](src/RuleEngineBase.sol#L3) +- Found in src/deployment/RuleEngine.sol [Line: 3](src/deployment/RuleEngine.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in src/deployment/RuleEngineOwnable.sol [Line: 3](src/deployment/RuleEngineOwnable.sol#L3) ```solidity pragma solidity ^0.8.20; @@ -261,12 +255,24 @@ Solc compiler version 0.8.20 switches the default target EVM version to Shanghai pragma solidity ^0.8.20; ``` +- Found in src/modules/library/ComplianceInterfaceId.sol [Line: 3](src/modules/library/ComplianceInterfaceId.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + - Found in src/modules/library/RuleEngineInvariantStorage.sol [Line: 3](src/modules/library/RuleEngineInvariantStorage.sol#L3) ```solidity pragma solidity ^0.8.20; ``` +- Found in src/modules/library/RuleInterfaceId.sol [Line: 3](src/modules/library/RuleInterfaceId.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + - Found in src/modules/library/RulesManagementModuleInvariantStorage.sol [Line: 3](src/modules/library/RulesManagementModuleInvariantStorage.sol#L3) ```solidity @@ -277,17 +283,66 @@ Solc compiler version 0.8.20 switches the default target EVM version to Shanghai -## L-4: Loop Contains `require`/`revert` +## L-4: Empty Block + +Consider removing empty blocks. + +
4 Found Instances + -> Acknowledge -> The number of configured rules will be probably low (between 1-10) +- Found in src/deployment/RuleEngine.sol [Line: 63](src/deployment/RuleEngine.sol#L63) + + ```solidity + function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {} + ``` + +- Found in src/deployment/RuleEngine.sol [Line: 64](src/deployment/RuleEngine.sol#L64) + + ```solidity + function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {} + ``` + +- Found in src/deployment/RuleEngineOwnable.sol [Line: 44](src/deployment/RuleEngineOwnable.sol#L44) + + ```solidity + function _onlyRulesManager() internal virtual override onlyOwner {} + ``` + +- Found in src/deployment/RuleEngineOwnable.sol [Line: 49](src/deployment/RuleEngineOwnable.sol#L49) + + ```solidity + function _onlyComplianceManager() internal virtual override onlyOwner {} + ``` + +
+ + + +## L-5: Loop Contains `require`/`revert` Avoid `require` / `revert` statements in a loop because a single bad item can cause the whole transaction to fail. It's better to forgive on fail and return failed elements post processing of the loop
1 Found Instances -- Found in src/modules/RulesManagementModule.sol [Line: 51](src/modules/RulesManagementModule.sol#L51) +- Found in src/modules/RulesManagementModule.sol [Line: 52](src/modules/RulesManagementModule.sol#L52) + + ```solidity + for (uint256 i = 0; i < rules_.length; ++i) { + ``` + +
+ + + +## L-6: Costly operations inside loop + +Invoking `SSTORE` operations in loops may waste gas. Use a local variable to hold the loop computation result. + +
1 Found Instances + + +- Found in src/modules/RulesManagementModule.sol [Line: 52](src/modules/RulesManagementModule.sol#L52) ```solidity for (uint256 i = 0; i < rules_.length; ++i) { @@ -297,3 +352,20 @@ Avoid `require` / `revert` statements in a loop because a single bad item can ca +## L-7: Unchecked Return + +Function returns a value but it is ignored. Consider checking the return value. + +
1 Found Instances + + +- Found in src/deployment/RuleEngine.sol [Line: 35](src/deployment/RuleEngine.sol#L35) + + ```solidity + _grantRole(DEFAULT_ADMIN_ROLE, admin); + ``` + +
+ + + diff --git a/doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1-feedback.md b/doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1-feedback.md new file mode 100644 index 0000000..0bec46a --- /dev/null +++ b/doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1-feedback.md @@ -0,0 +1,287 @@ +# Remediation Assessment — Nethermind AuditAgent Report #1 + +**Report:** `audit_agent_report_1_v3.0.0-rc1.pdf` +**Scan date:** February 20, 2026 +**Assessment date:** March 17, 2026 +**Scope commit range:** `f3e27c19…eb2d2b2c` (main branch, scanned) +**Remediation commits:** see per-finding details below +**Findings:** 7 total — 0 High · 1 Medium · 1 Low · 4 Info · 1 Best Practices + +> **Disclaimer:** This report was generated by an AI-powered automated tool, not a formal human-led audit. Findings are treated as a useful checklist; severity assessments may differ from a manual review. + +--- + +## Finding 1 — Medium: Cross-token rule state pollution + +**File(s):** `src/RuleEngineBase.sol`, `src/modules/ERC3643ComplianceModule.sol`, `src/modules/RulesManagementModule.sol` + +**Remediation commit:** `a4740b2` — `ID-1: docs(compliance) - Add trust warnings` + +### Finding summary + +`destroyed()`, `created()`, and `transferred()` are gated by `onlyBoundToken`, but the token address is never forwarded to rules. In a multi-tenant deployment (multiple bound tokens sharing one engine), a bound token can forge burn/mint/transfer callbacks that corrupt stateful rule state intended for another token. + +### Developer assessment + +**Disagree with severity framing.** The engine correctly enforces `onlyBoundToken`. The exploit requires a bound token to be either malicious or compromised — both are governance/operational failures, not smart contract bugs in the engine. The ERC-3643 standard itself omits the token address from compliance callbacks; this is a standard-level limitation, not a contract defect. Medium severity only applies in deliberately multi-tenant, mutually-untrusting deployments — which is not the primary deployment model. + +The long-term fix (adding a `token` parameter to `IRule` callbacks) is an interface-breaking change requiring CMTAT coordination and is out of scope for this repository alone. + +### Implementation + +Short-term documentation-only mitigation was applied: + +- **`src/interfaces/IERC3643Compliance.sol`** — `bindToken` NatSpec warns that all tokens sharing an engine must be equally trusted and governed together. `unbindToken` NatSpec warns that unbinding does not retroactively isolate previously shared rule state. +- **`src/modules/ERC3643ComplianceModule.sol`** — `bindToken` and `unbindToken` operator warnings repeated on the concrete implementations. +- **`README.md`** — "Contract Variants" section now includes a multi-tenant trust warning. + +No interface or runtime behavior was changed. + +### Verification + +Code check confirmed: +- `IERC3643Compliance.sol` lines 29–34: multi-tenant trust warning present on `bindToken`. ✓ +- `IERC3643Compliance.sol` lines 40–45: retroactive-state warning present on `unbindToken`. ✓ +- `ERC3643ComplianceModule.sol` lines 47–48 and 55–58: `@dev Operator warning` present on both functions. ✓ +- `README.md` line 29: explicit multi-tenant warning block present. ✓ + +**Status: Implemented (doc/NatSpec — short-term). Interface-breaking fix deferred pending CMTAT coordination.** + +--- + +## Finding 2 — Low: RuleEngineOwnable misreports AccessControl interface support + +**File(s):** `src/RuleEngineOwnable.sol` + +**Remediation commit:** `3e030a6` — `ID-2: remove IAccessControl ERC165 advertisement and document Finding 2 implementation` + +### Finding summary + +`RuleEngineOwnable.supportsInterface` previously fell back to `AccessControl.supportsInterface(interfaceId)`, causing it to return `true` for `IAccessControl`. The contract uses `onlyOwner` for all access control — `IAccessControl` methods exist in the ABI but have no effect on privilege, misleading off-chain tooling. + +### Developer assessment + +**Agree.** The `AccessControl` fallback was an oversight introduced by the inheritance chain. Removing it is a one-line fix with no side effects. The ERC-173 interface ID was already explicitly declared. + +### Implementation + +- **`src/RuleEngineOwnable.sol`** — `supportsInterface` rewritten as an explicit whitelist (no `AccessControl.supportsInterface` call): + - `RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID` + - `ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID` + - `ERC173_INTERFACE_ID` (`0x7f5828d0`) + - `ERC3643_COMPLIANCE_INTERFACE_ID` (`0x3144991c`) — added in conjunction with Finding 6 + - `IERC7551_COMPLIANCE_INTERFACE_ID` (`0x7157797f`) — added in conjunction with Finding 6 + - `type(IERC165).interfaceId` +- **`test/RuleEngineOwnable/RuleEngineOwnableCoverage.t.sol`** — added `testDoesNotSupportIAccessControlInterface()` asserting `supportsInterface(type(IAccessControl).interfaceId) == false`. + +### Verification + +Code check confirmed: +- `RuleEngineOwnable.sol` lines 54–61: `supportsInterface` is an explicit whitelist; `AccessControl.supportsInterface` call is absent. ✓ +- `RuleEngineOwnableCoverage.t.sol` line 60–62: negative test for `IAccessControl` interface ID present and correct. ✓ + +**Status: Implemented and verified.** + +--- + +## Finding 3 — Info: Unbounded rules loop can cause permanent DoS + +**File(s):** `src/modules/RulesManagementModule.sol`, `src/RuleEngineBase.sol` + +**Remediation commit:** `1caf4ea` — `Id-3: docs(rules-management): clarify operator-owned rule-count risk and blockchain-dependent gas limits` + +### Finding summary + +`addRule`/`setRules` have no cap on rule count. `_transferred` and `_detectTransferRestriction` loop over all rules per transfer. Adding too many rules can push gas cost above the block limit, permanently freezing token operations. + +### Developer assessment + +**Partially agree.** The risk is real as an operational concern. However, a fixed on-chain maximum would be deployment-dependent and potentially overly restrictive across different blockchains and rule complexities. Operator responsibility is retained; the mitigation is explicit documentation. + +### Implementation + +- **`src/modules/RulesManagementModule.sol`**: + - `setRules`: "No on-chain maximum number of rules is enforced. Operators are responsible for keeping the rule set size compatible with the target chain gas limits." + - `addRule`: "No on-chain maximum number of rules is enforced. Adding too many rules can increase transfer-time gas usage because rule checks are linear in rule count." + - `_transferred` (both overloads): "Complexity is O(number of configured rules). Large rule sets can make transfers too expensive on chains with lower block gas limits." +- **`README.md`** — explicit "How it works" warning paragraph added about gas scaling and absence of an on-chain rule count cap. + +No runtime logic was changed. + +### Verification + +Code check confirmed: +- `RulesManagementModule.sol` line 46: `setRules` NatSpec — gas/cap warning present. ✓ +- `RulesManagementModule.sol` line 75: `addRule` NatSpec — linear gas warning present. ✓ +- `RulesManagementModule.sol` lines 169–173 and 188–192: `_transferred` overloads — O(n) and block-gas warning present. ✓ +- `README.md` line 69: gas-limit warning block present. ✓ + +**Status: Implemented (warnings only — no hard cap by design).** + +--- + +## Finding 4 — Info: Restriction code and message can come from different rules + +**File(s):** `src/RuleEngineBase.sol` + +**Remediation commit:** `3fff502` — `ID-4: docs(restrictions): enforce unique-code convention or identical messages for shared ERC-1404 codes` + +### Finding summary + +`_detectTransferRestriction` returns the first non-zero code from rule N; `_messageForTransferRestriction` returns the message from the first rule claiming that code — potentially a different rule. `EnumerableSet` swap-and-pop ordering makes code/message pairs unstable when rules are added or removed. + +### Developer assessment + +**Partially agree.** This is a rule-design and integration convention issue, not a security vulnerability. The two-pass approach is intentional for gas efficiency. The practical risk is mitigated by requiring unique restriction codes across rules, or identical messages for shared codes. + +### Implementation + +- **`src/interfaces/IRule.sol`** — `canReturnTransferRestrictionCode` NatSpec: "Rule authors should use unique restriction codes across rules when possible. If a code is intentionally shared by multiple rules, all of them should return the same message for that code." +- **`src/RuleEngineBase.sol`** — `_messageForTransferRestriction` comment: documents first-match behavior and the shared-code message requirement. +- **`README.md`** — "restriction code conventions" warning block added. + +No behavior change was made to restriction code/message resolution. + +### Verification + +Code check confirmed: +- `IRule.sol` lines 13–16: unique-code convention documented on `canReturnTransferRestrictionCode`. ✓ +- `RuleEngineBase.sol` lines 172–175: `_messageForTransferRestriction` comment explains first-match behavior and shared-code requirement. ✓ +- `README.md` line 71: restriction code conventions warning present. ✓ + +**Status: Implemented (convention documentation only — no logic change by design).** + +--- + +## Finding 5 — Info: Re-entrant rule can modify rule set during `transferred()` + +**File(s):** `src/RuleEngineBase.sol`, `src/modules/RulesManagementModule.sol` + +**Remediation commit:** `33ff6fa` — `ID5: docs(access-control): warn that rule contracts must never hold RULES_MANAGEMENT_ROLE` + +### Finding summary + +`_transferred` iterates `_rules` while making external calls to each rule with no reentrancy guard. A rule that also holds `RULES_MANAGEMENT_ROLE` could re-enter the engine during iteration, mutating `_rules` mid-loop and potentially skipping rules or panicking. + +### Developer assessment + +**Disagree with exploit framing; agree on governance risk.** The scenario requires granting `RULES_MANAGEMENT_ROLE` to an external rule contract — a severe governance misconfiguration. Rules are trusted logic components; they should never be granted management privileges. The key mitigation is making this constraint explicit in code and documentation. + +### Implementation + +- **`src/modules/RulesManagementModule.sol`**: + - `setRules` and `addRule`: "Security convention: rule contracts should be treated as trusted business logic, but should not also be granted `{RULES_MANAGEMENT_ROLE}`." + - `_transferred` (both overloads): "Security convention: rule contracts are expected to be trusted and must not hold `{RULES_MANAGEMENT_ROLE}`." +- **`README.md`** — "role assignment" warning added: rule contracts must not be granted `RULES_MANAGEMENT_ROLE` or admin privileges. + +No reentrancy guard was added (would add gas overhead to every transfer; not warranted given the trust model). + +### Verification + +Code check confirmed: +- `RulesManagementModule.sol` line 48: `setRules` — role-grant warning present. ✓ +- `RulesManagementModule.sol` line 76: `addRule` — role-grant warning present. ✓ +- `RulesManagementModule.sol` lines 173 and 193: both `_transferred` overloads — must-not-hold-role warning present. ✓ +- `README.md` line 264: role assignment warning block present. ✓ + +**Status: Implemented (warnings only — no reentrancy guard by design).** + +--- + +## Finding 6 — Info: Missing ERC-3643 and IERC7551Compliance interface IDs in `supportsInterface` + +**File(s):** `src/RuleEngine.sol`, `src/RuleEngineOwnable.sol` + +**Remediation commit:** `4ef6cd5` — `ID-6: feat(erc165): advertise ERC-3643 and IERC7551 subset IDs with draft-status docs and coverage tests` + +### Finding summary + +Both contracts implement ERC-3643 compliance entrypoints and `canTransferFrom` (IERC7551Compliance subset), but did not advertise those interface IDs via ERC-165, causing capability-detection queries to incorrectly return `false`. + +### Developer assessment + +**Agree.** Both IDs should be explicitly advertised. ERC-7551 must be documented as draft-status and as a subset interface in this project. + +### Implementation + +- **`src/RuleEngine.sol`**: + - Constants added: `ERC3643_COMPLIANCE_INTERFACE_ID = 0x3144991c`, `IERC7551_COMPLIANCE_INTERFACE_ID = 0x7157797f`. + - `supportsInterface` updated to include both IDs. +- **`src/RuleEngineOwnable.sol`**: + - Same constants and `supportsInterface` update (as part of the Finding 2 rewrite of the explicit whitelist). +- **`test/mocks/ICompliance.sol`** — test-only interface for ERC-3643 `type(ICompliance).interfaceId` check. +- **`test/mocks/IERC7551ComplianceSubset.sol`** — test-only interface for `type(IERC7551ComplianceSubset).interfaceId` check. +- **`test/RuleEngine/RuleEngineCoverage.t.sol`** — added: + - `testSupportsERC3643ComplianceInterface()` + - `testSupportsIERC7551ComplianceSubsetInterface()` +- **`test/RuleEngineOwnable/RuleEngineOwnableCoverage.t.sol`** — added: + - `testSupportsERC3643ComplianceInterface()` + - `testSupportsIERC7551ComplianceSubsetInterface()` +- **`README.md`** — note clarifying ERC-7551 is draft (not final) and that `IERC7551Compliance` is a subset interface. + +### Verification + +Code check confirmed: +- `RuleEngine.sol` lines 21–22: both interface ID constants declared. ✓ +- `RuleEngine.sol` lines 57–58: both IDs included in `supportsInterface`. ✓ +- `RuleEngineOwnable.sol` lines 23–24: both constants declared. ✓ +- `RuleEngineOwnable.sol` lines 58–59: both IDs included in the explicit whitelist. ✓ +- `test/mocks/ICompliance.sol` and `test/mocks/IERC7551ComplianceSubset.sol`: both mock interfaces present. ✓ +- `RuleEngineCoverage.t.sol` lines 42–48: both positive ERC-165 tests present for RBAC variant. ✓ +- `RuleEngineOwnableCoverage.t.sol` lines 48–54: both positive ERC-165 tests present for Ownable variant. ✓ +- `README.md` line 506: draft-status and subset-interface note present. ✓ + +**Status: Implemented and verified.** + +--- + +## Finding 7 — Best Practices: `setRules` does not allow an empty array + +**File(s):** `src/modules/RulesManagementModule.sol` + +**Remediation commit:** `b709d1d` — `ID-7: docs(rules-management): clarify setRules non-empty design and document Finding 7 implementation` + +### Finding summary + +`setRules([])` reverts with `RuleEngine_RulesManagementModule_ArrayIsEmpty`. The report argues this creates an inconsistency — `clearRules()` achieves the same end state — and prevents atomic "replace with empty set" in a single transaction. + +### Developer assessment + +**Disagree with changing the behavior.** The empty-array rejection is intentional: `setRules` is an atomic replacement function for a non-empty rule set; `clearRules` is the explicit function to remove all rules. Allowing `setRules([])` would create semantic overlap and risk accidental mass-clearing. The design is correct; a NatSpec clarification is the appropriate response. + +### Implementation + +- **`src/modules/RulesManagementModule.sol`** — `setRules` NatSpec updated: + - "Replaces the entire rule set atomically." + - "Reverts if `rules_` is empty. Use `{clearRules}` to remove all rules explicitly." + - "To transition from one non-empty set to another without an enforcement gap, call this function directly with the new set." + +No runtime logic was changed; the empty-array check remains. + +### Verification + +Code check confirmed: +- `RulesManagementModule.sol` lines 41–49: `setRules` NatSpec documents the design rationale and refers to `clearRules`. ✓ +- Runtime check at line 51–53: empty-array revert still present. ✓ + +**Status: Implemented (NatSpec clarification only — behavior unchanged by design).** + +--- + +## Summary + +| # | Severity | Finding | Fix type | Commit | Status | +|---|----------|---------|----------|--------|--------| +| 1 | Medium | Cross-token rule state pollution | NatSpec + README warnings | `a4740b2` | Implemented (short-term). Interface fix deferred (CMTAT coordination required). | +| 2 | Low | RuleEngineOwnable misreports IAccessControl | Code fix: explicit ERC-165 whitelist + negative test | `3e030a6` | Implemented and verified. | +| 3 | Info | Unbounded rules loop can cause permanent DoS | NatSpec + README warnings | `1caf4ea` | Implemented (warnings only — no hard cap by design). | +| 4 | Info | Restriction code and message can come from different rules | NatSpec + README convention | `3fff502` | Implemented (convention doc only — no logic change by design). | +| 5 | Info | Re-entrant rule can modify rule set during `transferred()` | NatSpec + README warnings | `33ff6fa` | Implemented (warnings only — no reentrancy guard by design). | +| 6 | Info | Missing ERC-3643 and IERC7551Compliance interface IDs | Code fix: add interface IDs + tests (both variants) | `4ef6cd5` | Implemented and verified. | +| 7 | Best Practices | `setRules` does not allow an empty array | NatSpec clarification | `b709d1d` | Implemented (NatSpec only — behavior unchanged by design). | + +### Notes + +- Findings **2** and **6** are fully resolved in code with test coverage. +- Findings **1**, **3**, **4**, **5**, **7** are mitigated through documentation and NatSpec. No runtime logic was changed; the design decisions are intentional and documented. +- The long-term fix for Finding **1** (adding a `token` parameter to `IRule` callbacks) is tracked as a future coordination item with the CMTAT repository. diff --git a/doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1.pdf b/doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1.pdf new file mode 100644 index 0000000..f020a01 Binary files /dev/null and b/doc/security/audits/tools/nethermind-audit-agent/v3.0.0-rc1/audit_agent_report_1_v3.0.0-rc1.pdf differ diff --git a/doc/security/audits/tools/slither-report-feedback.md b/doc/security/audits/tools/slither-report-feedback.md new file mode 100644 index 0000000..6c2f217 --- /dev/null +++ b/doc/security/audits/tools/slither-report-feedback.md @@ -0,0 +1,80 @@ +# Slither Report — Assessment Feedback + +**Tool:** [Slither](https://github.com/crytic/slither) +**Report file:** `slither-report.md` +**Codebase version:** v3.0.0-rc2 +**Assessment date:** 2026-03-18 + +> Slither was run with `--show-ignored-findings` suppressed; this checklist reflects only non-ignored findings. + +--- + +## Summary + +| ID | Detector | Impact | Confidence | Assessment | +|----|----------|--------|------------|------------| +| 0–9 | `calls-loop` | Low | Medium | Accepted by design — see below | +| 10–11 | `unindexed-event-address` | Informational | High | Accepted — interface-breaking to fix | + +--- + +## calls-loop (ID-0 to ID-9) — Low / Medium confidence + +### What Slither reports + +Ten instances of external calls inside loops, covering every call path through the rule-dispatch layer: + +| ID | Function | Called from | +|----|----------|-------------| +| 0 | `_messageForTransferRestriction` — `canReturnTransferRestrictionCode` | `messageForTransferRestriction` | +| 1 | `_detectTransferRestrictionFrom` | `detectTransferRestrictionFrom` | +| 2 | `_messageForTransferRestriction` — `messageForTransferRestriction` | `messageForTransferRestriction` | +| 3 | `_transferred(spender, from, to, value)` | `transferred(address,address,address,uint256)` | +| 4 | `_detectTransferRestrictionFrom` | `canTransferFrom` → `detectTransferRestrictionFrom` | +| 5 | `_detectTransferRestriction` | `detectTransferRestriction` | +| 6 | `_transferred(from, to, value)` | `created` | +| 7 | `_detectTransferRestriction` | `canTransfer` → `detectTransferRestriction` | +| 8 | `_transferred(from, to, value)` | `transferred(address,address,uint256)` | +| 9 | `_transferred(from, to, value)` | `destroyed` | + +### Assessment + +**Accepted by design. No action required.** + +The 10 results are all expressions of the same fundamental architecture: the RuleEngine fans out each transfer event to every registered rule contract by iterating `_rules` and making an external call per rule. This is the entire purpose of the contract — there is no way to implement a pluggable rule engine without external calls in a loop. + +The typical concern behind this detector is reentrancy risk or gas griefing from a malicious external callee. Both are addressed: + +- **Reentrancy:** Rule contracts are trusted components added by a privileged operator. Granting management roles to rule contracts is explicitly warned against in NatSpec (see also Nethermind AuditAgent finding 5 remediation). A reentrancy guard on every transfer would add significant gas overhead for no benefit given the trust model. +- **Gas griefing / DoS:** Operators are responsible for keeping the rule set sized for the target chain gas limits. This is documented in NatSpec on `addRule`, `setRules`, and `_transferred`, and warned about in the README (see also Nethermind AuditAgent finding 3 remediation). + +These findings are expected and the pattern is inherent to the design. No code change is needed. + +--- + +## unindexed-event-address (ID-10 to ID-11) — Informational / High confidence + +### What Slither reports + +- `IERC3643Compliance.TokenBound(address token)` — `token` is not indexed. +- `IERC3643Compliance.TokenUnbound(address token)` — `token` is not indexed. + +### Assessment + +**Valid observation. Not fixed — interface-breaking change.** + +Adding `indexed` to the `token` parameter would allow off-chain tooling to filter `TokenBound` / `TokenUnbound` events by token address efficiently using a Bloom filter (topic-based filtering). Without `indexed`, a listener must fetch and decode all events of that type and filter client-side. + +However, adding `indexed` changes the event's ABI signature (the topic hash), which is a breaking change for any off-chain application already listening for these events. + +Given that: +- These events are emitted infrequently (only during administrative `bindToken` / `unbindToken` calls), so the filtering cost is negligible in practice. +- Changing the event signature breaks existing integrations. + +**Decision: accepted as-is.** If the interface is ever revised for another reason, the `indexed` keyword should be added at the same time. + +--- + +## Overall conclusion + +Both finding categories are **accepted by design** and require no code changes for v3.0.0-rc2. The `calls-loop` pattern is inherent to the RuleEngine architecture; the `unindexed-event-address` finding is noted and deferred to a future interface revision. diff --git a/doc/security/audits/tools/slither-report.md b/doc/security/audits/tools/slither-report.md index d5eab1b..75c678b 100644 --- a/doc/security/audits/tools/slither-report.md +++ b/doc/security/audits/tools/slither-report.md @@ -1,49 +1,104 @@ **THIS CHECKLIST IS NOT COMPLETE**. Use `--show-ignored-findings` to show all the results. Summary - - [calls-loop](#calls-loop) (4 results) (Low) - - [dead-code](#dead-code) (1 results) (Informational) + - [calls-loop](#calls-loop) (10 results) (Low) + - [unindexed-event-address](#unindexed-event-address) (2 results) (Informational) ## calls-loop - -> Acknowledge -> Rule contracts are considered as trusted - Impact: Low Confidence: Medium - [ ] ID-0 -[RuleEngineBase.detectTransferRestriction(address,address,uint256)](src/RuleEngineBase.sol#L76-L90) has external calls inside a loop: [restriction = IRule(rule(i)).detectTransferRestriction(from,to,value)](src/RuleEngineBase.sol#L83-L84) +[RuleEngineBase._messageForTransferRestriction(uint8)](src/RuleEngineBase.sol#L176-L184) has external calls inside a loop: [IRule(rule(i)).canReturnTransferRestrictionCode(restrictionCode)](src/RuleEngineBase.sol#L179) + Calls stack containing the loop: + RuleEngineBase.messageForTransferRestriction(uint8) -src/RuleEngineBase.sol#L76-L90 +src/RuleEngineBase.sol#L176-L184 - [ ] ID-1 -[RuleEngineBase.messageForTransferRestriction(uint8)](src/RuleEngineBase.sol#L116-L132) has external calls inside a loop: [IRule(rule(i)).canReturnTransferRestrictionCode(restrictionCode)](src/RuleEngineBase.sol#L123-L124) +[RuleEngineBase._detectTransferRestrictionFrom(address,address,address,uint256)](src/RuleEngineBase.sol#L154-L168) has external calls inside a loop: [restriction = IRule(rule(i)).detectTransferRestrictionFrom(spender,from,to,value)](src/RuleEngineBase.sol#L162) + Calls stack containing the loop: + RuleEngineBase.detectTransferRestrictionFrom(address,address,address,uint256) -src/RuleEngineBase.sol#L116-L132 +src/RuleEngineBase.sol#L154-L168 - [ ] ID-2 -[RuleEngineBase.messageForTransferRestriction(uint8)](src/RuleEngineBase.sol#L116-L132) has external calls inside a loop: [IRule(rule(i)).messageForTransferRestriction(restrictionCode)](src/RuleEngineBase.sol#L126-L128) +[RuleEngineBase._messageForTransferRestriction(uint8)](src/RuleEngineBase.sol#L176-L184) has external calls inside a loop: [IRule(rule(i)).messageForTransferRestriction(restrictionCode)](src/RuleEngineBase.sol#L180) + Calls stack containing the loop: + RuleEngineBase.messageForTransferRestriction(uint8) -src/RuleEngineBase.sol#L116-L132 +src/RuleEngineBase.sol#L176-L184 - [ ] ID-3 -[RuleEngineBase.detectTransferRestrictionFrom(address,address,address,uint256)](src/RuleEngineBase.sol#L95-L111) has external calls inside a loop: [restriction = IRule(rule(i)).detectTransferRestrictionFrom(spender,from,to,value)](src/RuleEngineBase.sol#L103-L104) +[RulesManagementModule._transferred(address,address,address,uint256)](src/modules/RulesManagementModule.sol#L192-L197) has external calls inside a loop: [IRule(_rules.at(i)).transferred(spender,from,to,value)](src/modules/RulesManagementModule.sol#L195) + Calls stack containing the loop: + RuleEngineBase.transferred(address,address,address,uint256) + +src/modules/RulesManagementModule.sol#L192-L197 + + + - [ ] ID-4 +[RuleEngineBase._detectTransferRestrictionFrom(address,address,address,uint256)](src/RuleEngineBase.sol#L154-L168) has external calls inside a loop: [restriction = IRule(rule(i)).detectTransferRestrictionFrom(spender,from,to,value)](src/RuleEngineBase.sol#L162) + Calls stack containing the loop: + RuleEngineBase.canTransferFrom(address,address,address,uint256) + RuleEngineBase.detectTransferRestrictionFrom(address,address,address,uint256) + +src/RuleEngineBase.sol#L154-L168 + + + - [ ] ID-5 +[RuleEngineBase._detectTransferRestriction(address,address,uint256)](src/RuleEngineBase.sol#L143-L152) has external calls inside a loop: [restriction = IRule(rule(i)).detectTransferRestriction(from,to,value)](src/RuleEngineBase.sol#L146) + Calls stack containing the loop: + RuleEngineBase.detectTransferRestriction(address,address,uint256) + +src/RuleEngineBase.sol#L143-L152 + + + - [ ] ID-6 +[RulesManagementModule._transferred(address,address,uint256)](src/modules/RulesManagementModule.sol#L173-L178) has external calls inside a loop: [IRule(_rules.at(i)).transferred(from,to,value)](src/modules/RulesManagementModule.sol#L176) + Calls stack containing the loop: + RuleEngineBase.created(address,uint256) + +src/modules/RulesManagementModule.sol#L173-L178 -src/RuleEngineBase.sol#L95-L111 -## dead-code + - [ ] ID-7 +[RuleEngineBase._detectTransferRestriction(address,address,uint256)](src/RuleEngineBase.sol#L143-L152) has external calls inside a loop: [restriction = IRule(rule(i)).detectTransferRestriction(from,to,value)](src/RuleEngineBase.sol#L146) + Calls stack containing the loop: + RuleEngineBase.canTransfer(address,address,uint256) + RuleEngineBase.detectTransferRestriction(address,address,uint256) -> - Implemented to be gasless compatible (see MetaTxModule) -> -> - If we remove this function, we will have the following error: -> -> "Derived contract must override function "_msgData". Two or more base classes define function with same name and parameter types." +src/RuleEngineBase.sol#L143-L152 + + - [ ] ID-8 +[RulesManagementModule._transferred(address,address,uint256)](src/modules/RulesManagementModule.sol#L173-L178) has external calls inside a loop: [IRule(_rules.at(i)).transferred(from,to,value)](src/modules/RulesManagementModule.sol#L176) + Calls stack containing the loop: + RuleEngineBase.transferred(address,address,uint256) + +src/modules/RulesManagementModule.sol#L173-L178 + + + - [ ] ID-9 +[RulesManagementModule._transferred(address,address,uint256)](src/modules/RulesManagementModule.sol#L173-L178) has external calls inside a loop: [IRule(_rules.at(i)).transferred(from,to,value)](src/modules/RulesManagementModule.sol#L176) + Calls stack containing the loop: + RuleEngineBase.destroyed(address,uint256) + +src/modules/RulesManagementModule.sol#L173-L178 + + +## unindexed-event-address Impact: Informational -Confidence: Medium - - [ ] ID-4 -[RuleEngine._msgData()](src/RuleEngine.sol#L56-L64) is never used and should be removed +Confidence: High + - [ ] ID-10 +Event [IERC3643Compliance.TokenBound(address)](src/interfaces/IERC3643Compliance.sol#L14) has address parameters but no indexed parameters + +src/interfaces/IERC3643Compliance.sol#L14 + + + - [ ] ID-11 +Event [IERC3643Compliance.TokenUnbound(address)](src/interfaces/IERC3643Compliance.sol#L20) has address parameters but no indexed parameters + +src/interfaces/IERC3643Compliance.sol#L20 -src/RuleEngine.sol#L56-L64 diff --git a/doc/specification/README.pdf b/doc/specification/README.pdf new file mode 100644 index 0000000..7ea2e38 Binary files /dev/null and b/doc/specification/README.pdf differ diff --git a/doc/specification/RuleEngine_specificationv3.0.0-rc0.odg b/doc/specification/RuleEngine_specificationv3.0.0-rc0.odg index 5d0e7d0..c164da2 100644 Binary files a/doc/specification/RuleEngine_specificationv3.0.0-rc0.odg and b/doc/specification/RuleEngine_specificationv3.0.0-rc0.odg differ diff --git a/doc/specification/cover_page.pdf b/doc/specification/cover_page.pdf new file mode 100644 index 0000000..45822f4 Binary files /dev/null and b/doc/specification/cover_page.pdf differ diff --git a/doc/specification/RuleEngine_specificationv3.0.0-rc0.pdf b/doc/specification/previous_specification/RuleEngine_specificationv3.0.0-rc0.pdf similarity index 100% rename from doc/specification/RuleEngine_specificationv3.0.0-rc0.pdf rename to doc/specification/previous_specification/RuleEngine_specificationv3.0.0-rc0.pdf diff --git a/doc/specification/previous_specification/RuleEngine_specificationv3.0.0-rc1.pdf b/doc/specification/previous_specification/RuleEngine_specificationv3.0.0-rc1.pdf new file mode 100644 index 0000000..66c8188 Binary files /dev/null and b/doc/specification/previous_specification/RuleEngine_specificationv3.0.0-rc1.pdf differ diff --git a/foundry.toml b/foundry.toml index 621aac1..6c528c9 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,5 +1,5 @@ [profile.default] -solc = "0.8.33" +solc = "0.8.34" src = 'src' out = 'out' libs = ['lib'] diff --git a/hardhat.config.js b/hardhat.config.js index 56c8008..38cd154 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -1,12 +1,15 @@ /** @type import('hardhat/config').HardhatUserConfig */ +require("@nomicfoundation/hardhat-toolbox"); require("@nomicfoundation/hardhat-foundry"); module.exports = { - solidity: "0.8.33", - settings: { - optimizer: { - enabled: true, - runs: 200 - }, - evmVersion:"prague" + solidity: { + version: "0.8.34", + settings: { + optimizer: { + enabled: true, + runs: 200 + }, + evmVersion: "prague" + } } }; diff --git a/lib/CMTAT b/lib/CMTAT index 78e6e48..49544f4 160000 --- a/lib/CMTAT +++ b/lib/CMTAT @@ -1 +1 @@ -Subproject commit 78e6e48e491e01e853e6490e061189875d4785ea +Subproject commit 49544f4de1993008acfc9e848d0bf03bd31d8579 diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts index fcbae53..5fd1781 160000 --- a/lib/openzeppelin-contracts +++ b/lib/openzeppelin-contracts @@ -1 +1 @@ -Subproject commit fcbae5394ae8ad52d8e580a3477db99814b9d565 +Subproject commit 5fd1781b1454fd1ef8e722282f86f9293cacf256 diff --git a/lib/openzeppelin-contracts-upgradeable b/lib/openzeppelin-contracts-upgradeable index aa677e9..7bf4727 160000 --- a/lib/openzeppelin-contracts-upgradeable +++ b/lib/openzeppelin-contracts-upgradeable @@ -1 +1 @@ -Subproject commit aa677e9d28ed78fc427ec47ba2baef2030c58e7c +Subproject commit 7bf4727aacdbfaa0f36cbd664654d0c9e1dc52bf diff --git a/package-lock.json b/package-lock.json index d6c0912..1ecc425 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,18 +4,52 @@ "requires": true, "packages": { "": { - "name": "RuleEngineNew", "devDependencies": { - "@nomicfoundation/hardhat-foundry": "^1.0.1", + "@nomicfoundation/hardhat-foundry": "^1.2.1", + "@nomicfoundation/hardhat-toolbox": "^6.1.2", + "hardhat": "^2.28.6", "surya": "^0.4.13" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@ethereumjs/rlp": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", "dev": true, - "peer": true, "bin": { "rlp": "bin/rlp.cjs" }, @@ -28,7 +62,6 @@ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", "dev": true, - "peer": true, "dependencies": { "@ethereumjs/rlp": "^5.0.2", "ethereum-cryptography": "^2.2.1" @@ -42,7 +75,6 @@ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, - "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -55,7 +87,6 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, - "peer": true, "engines": { "node": ">= 16" }, @@ -68,7 +99,6 @@ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, - "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -83,7 +113,6 @@ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, - "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -97,7 +126,6 @@ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, - "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -120,7 +148,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -148,7 +175,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -174,7 +200,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -198,7 +223,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -222,7 +246,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0" } @@ -242,7 +265,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -264,7 +286,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/logger": "^5.8.0" } @@ -284,7 +305,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0" } @@ -304,7 +324,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -332,7 +351,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" @@ -352,8 +370,7 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ], - "peer": true + ] }, "node_modules/@ethersproject/networks": { "version": "5.8.0", @@ -370,7 +387,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/logger": "^5.8.0" } @@ -390,7 +406,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/logger": "^5.8.0" } @@ -410,7 +425,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -431,7 +445,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -456,7 +469,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -478,7 +490,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -491,6 +502,29 @@ "@ethersproject/signing-key": "^5.8.0" } }, + "node_modules/@ethersproject/units": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, "node_modules/@ethersproject/web": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", @@ -506,7 +540,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -520,17 +553,170 @@ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "dev": true, - "peer": true, "engines": { "node": ">=14" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/curves": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", "dev": true, - "peer": true, "dependencies": { "@noble/hashes": "1.7.2" }, @@ -546,7 +732,6 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", "dev": true, - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -564,8 +749,7 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "peer": true + ] }, "node_modules/@noble/secp256k1": { "version": "1.7.1", @@ -577,15 +761,54 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "peer": true + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, "node_modules/@nomicfoundation/edr": { "version": "0.12.0-next.23", "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.23.tgz", "integrity": "sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw==", "dev": true, - "peer": true, "dependencies": { "@nomicfoundation/edr-darwin-arm64": "0.12.0-next.23", "@nomicfoundation/edr-darwin-x64": "0.12.0-next.23", @@ -604,7 +827,6 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.23.tgz", "integrity": "sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } @@ -614,7 +836,6 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.23.tgz", "integrity": "sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } @@ -624,7 +845,6 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.23.tgz", "integrity": "sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } @@ -634,7 +854,6 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.23.tgz", "integrity": "sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } @@ -644,7 +863,6 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.23.tgz", "integrity": "sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } @@ -654,7 +872,6 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.23.tgz", "integrity": "sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } @@ -664,16 +881,52 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.23.tgz", "integrity": "sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.1.2.tgz", + "integrity": "sha512-NlUlde/ycXw2bLzA2gWjjbxQaD9xIRbAF30nsoEprAWzH8dXEI1ILZUKZMyux9n9iygEXTzN0SDVjE6zWDZi9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.1.0", + "chai": "^4.2.0", + "ethers": "^6.14.0", + "hardhat": "^2.26.0" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.3.tgz", + "integrity": "sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.14.0", + "hardhat": "^2.28.0" + } + }, "node_modules/@nomicfoundation/hardhat-foundry": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.2.1.tgz", "integrity": "sha512-pH1KeyI0sysgi7I7uQKPLXWl895EkuS6V41rSi820Ipqp/FScIwDh27RbevgC9zJ4ufSsSz34njm9cvRMGMNVA==", "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^1.1.0" }, @@ -681,56 +934,307 @@ "hardhat": "^2.26.0" } }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", - "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "node_modules/@nomicfoundation/hardhat-ignition": { + "version": "0.15.16", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.16.tgz", + "integrity": "sha512-T0JTnuib7QcpsWkHCPLT7Z6F483EjTdcdjb1e00jqS9zTGCPqinPB66LLtR/duDLdvgoiCVS6K8WxTQkA/xR1Q==", "dev": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">= 12" + "dependencies": { + "@nomicfoundation/ignition-core": "^0.15.15", + "@nomicfoundation/ignition-ui": "^0.15.13", + "chalk": "^4.0.0", + "debug": "^4.3.2", + "fs-extra": "^10.0.0", + "json5": "^2.2.3", + "prompts": "^2.4.2" }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" + "peerDependencies": { + "@nomicfoundation/hardhat-verify": "^2.1.0", + "hardhat": "^2.26.0" } }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", - "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "node_modules/@nomicfoundation/hardhat-ignition-ethers": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.17.tgz", + "integrity": "sha512-io6Wrp1dUsJ94xEI3pw6qkPfhc9TFA+e6/+o16yQ8pvBTFMjgK5x8wIHKrrIHr9L3bkuTMtmDjyN4doqO2IqFQ==", "dev": true, - "optional": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">= 12" + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.1.0", + "@nomicfoundation/hardhat-ignition": "^0.15.16", + "@nomicfoundation/ignition-core": "^0.15.15", + "ethers": "^6.14.0", + "hardhat": "^2.26.0" } }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", - "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "node_modules/@nomicfoundation/hardhat-ignition/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "optional": true, + "license": "MIT", "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">= 12" + "node": ">=12" } }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", - "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "node_modules/@nomicfoundation/hardhat-ignition/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, - "optional": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">= 12" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nomicfoundation/hardhat-ignition/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.2.tgz", + "integrity": "sha512-p7HaUVDbLj7ikFivQVNhnfMHUBgiHYMwQWvGn9AriieuopGOELIrwj2KjyM2a6z70zai5YKO264Vwz+3UFJZPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.26.0" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-6.1.2.tgz", + "integrity": "sha512-xKL2r43GC/UIcQzmtFSmj3L4KqLSQ4fK+kyUw0vbIp94nV+9o2ZkI1s3znB8EKXqitt9ClXo0qcKj9RKOFjqPQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.1.0", + "@nomicfoundation/hardhat-ethers": "^3.1.3", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.14", + "@nomicfoundation/hardhat-network-helpers": "^1.1.0", + "@nomicfoundation/hardhat-verify": "^2.1.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=20.0.0", + "chai": "^4.2.0", + "ethers": "^6.14.0", + "hardhat": "^2.28.0", + "hardhat-gas-reporter": "^2.3.0", + "solidity-coverage": "^0.8.17", + "ts-node": ">=8.0.0", + "typechain": "^8.3.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.1.3.tgz", + "integrity": "sha512-danbGjPp2WBhLkJdQy9/ARM3WQIK+7vwzE0urNem1qZJjh9f54Kf5f1xuQv8DvqewUAkuPxVt/7q4Grz5WjqSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.1.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.26.0" + } + }, + "node_modules/@nomicfoundation/ignition-core": { + "version": "0.15.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.15.tgz", + "integrity": "sha512-JdKFxYknTfOYtFXMN6iFJ1vALJPednuB+9p9OwGIRdoI6HYSh4ZBzyRURgyXtHFyaJ/SF9lBpsYV9/1zEpcYwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/address": "5.6.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", + "cbor": "^9.0.0", + "debug": "^4.3.2", + "ethers": "^6.14.0", + "fs-extra": "^10.0.0", + "immer": "10.0.2", + "lodash": "4.17.21", + "ndjson": "2.0.0" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/@ethersproject/address": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.6.2", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/rlp": "^5.6.1" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/cbor": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@nomicfoundation/ignition-ui": { + "version": "0.15.13", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.13.tgz", + "integrity": "sha512-HbTszdN1iDHCkUS9hLeooqnLEW2U45FaqFwFEYT8nIno2prFZhG+n68JEERjmfFCB5u0WgbuJwk3CgLoqtSL7Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { @@ -739,7 +1243,6 @@ "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">= 12" } @@ -750,7 +1253,6 @@ "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">= 12" } @@ -761,7 +1263,6 @@ "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">= 12" } @@ -772,17 +1273,27 @@ "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">= 12" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@scure/base": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "dev": true, - "peer": true, "funding": { "url": "https://paulmillr.com/funding/" } @@ -798,7 +1309,6 @@ "url": "https://paulmillr.com/funding/" } ], - "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -816,7 +1326,6 @@ "url": "https://paulmillr.com/funding/" } ], - "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" @@ -827,7 +1336,6 @@ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", "dev": true, - "peer": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -844,7 +1352,6 @@ "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dev": true, - "peer": true, "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -859,7 +1366,6 @@ "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dev": true, - "peer": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -874,7 +1380,6 @@ "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dev": true, - "peer": true, "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -895,7 +1400,6 @@ "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dev": true, - "peer": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -912,7 +1416,6 @@ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -922,7 +1425,6 @@ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dev": true, - "peer": true, "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -940,527 +1442,619 @@ "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", "dev": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">=0.3.0" + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.2", + "typescript": ">=4.7.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@typechain/hardhat": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", + "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "debug": "4" + "fs-extra": "^9.1.0" }, - "engines": { - "node": ">= 6.0.0" + "peerDependencies": { + "@typechain/ethers-v6": "^0.5.1", + "ethers": "^6.1.0", + "hardhat": "^2.9.9", + "typechain": "^8.3.2" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "node_modules/@typechain/hardhat/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "string-width": "^4.1.0" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/@typechain/hardhat/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">=6" + "node": ">= 10.0.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@types/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@types/chai": { + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT", + "peer": true }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/chai": "*" } }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, - "peer": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT", + "peer": true }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.19.0" + } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dev": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@types/node": "*" } }, - "node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "node_modules/@types/secp256k1": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz", + "integrity": "sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/abitype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", "dev": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } } }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "fill-range": "^7.1.1" + "acorn": "^8.11.0" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "peer": true - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true, - "peer": true + "engines": { + "node": ">=0.3.0" + } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "peer": true, + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">= 0.8" + "node": ">= 6.0.0" } }, - "node_modules/c3-linearization": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/c3-linearization/-/c3-linearization-0.3.0.tgz", - "integrity": "sha512-eQNsZQhFSJAhrNrITy2FpKh7EHS98q/pniDtQhndWqqsvayiPeqZ9T6I9V9PsHcm0nc+ZYJHKUvI/hh37I33HQ==", - "dev": true - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "peer": true, - "engines": { - "node": ">=10" + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, + "license": "BSD-3-Clause OR MIT", + "optional": true, "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=0.4.2" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, - "peer": true + "dependencies": { + "string-width": "^4.1.0" + } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "peer": true, + "dependencies": { + "type-fest": "^0.21.3" + }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", "dev": true }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=0.1.90" + "node": ">= 8" } }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">= 12" + "node": ">=6" } }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "ms": "^2.1.3" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "*" } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "peer": true, "engines": { - "node": ">= 0.8" + "node": ">= 4.0.0" } }, - "node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "node_modules/axios": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "peer": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" + "safe-buffer": "^5.0.1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "peer": true, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -1468,1475 +2062,5650 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "balanced-match": "^1.0.0" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "peer": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "fill-range": "^7.1.1" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/brotli-wasm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-2.0.1.tgz", + "integrity": "sha512-+3USgYsC7bzb5yU0/p2HnnynZl0ak0E6uoIm4UW4Aby/8s8HFCq6NCfrrf1E9c3O8OCSzq3oYO1tUVqIi61Nww==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "base-x": "^3.0.2" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dev": true, + "license": "MIT", "peer": true, - "bin": { - "flat": "cli.js" + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "peer": true, "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">= 0.8" } }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true, - "peer": true + "node_modules/c3-linearization": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/c3-linearization/-/c3-linearization-0.3.0.tgz", + "integrity": "sha512-eQNsZQhFSJAhrNrITy2FpKh7EHS98q/pniDtQhndWqqsvayiPeqZ9T6I9V9PsHcm0nc+ZYJHKUvI/hh37I33HQ==", + "dev": true }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob": { + "node_modules/cbor": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "nofilter": "^3.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12.19" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "is-glob": "^4.0.1" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "peer": true - }, - "node_modules/graphviz": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.9.tgz", - "integrity": "sha512-SmoY2pOtcikmMCqCSy2NO1YsRfu9OO0wpTlOYW++giGjfX1a6gax/m1Fo8IdUd0/3H15cTOfR1SMKwohj4LKsg==", + "node_modules/chai-as-promised": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", "dev": true, + "license": "WTFPL", + "peer": true, "dependencies": { - "temp": "~0.4.0" + "check-error": "^1.0.2" }, - "engines": { - "node": ">=0.6.8" + "peerDependencies": { + "chai": ">= 2.1.2 < 6" } }, - "node_modules/hardhat": { - "version": "2.28.6", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.28.6.tgz", - "integrity": "sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "dependencies": { - "@ethereumjs/util": "^9.1.0", - "@ethersproject/abi": "^5.1.2", - "@nomicfoundation/edr": "0.12.0-next.23", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "boxen": "^5.1.2", - "chokidar": "^4.0.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "find-up": "^5.0.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "json-stream-stringify": "^3.1.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "micro-eth-signer": "^0.14.0", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "picocolors": "^1.1.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.8.26", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tinyglobby": "^0.2.6", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" } }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 14.16.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true, - "peer": true, - "bin": { - "he": "bin/he" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/http-errors": { + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true, + "peer": true + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "peer": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz", + "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethers": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", + "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD", + "peer": true + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/ghost-testrpc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphviz": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.9.tgz", + "integrity": "sha512-SmoY2pOtcikmMCqCSy2NO1YsRfu9OO0wpTlOYW++giGjfX1a6gax/m1Fo8IdUd0/3H15cTOfR1SMKwohj4LKsg==", + "dev": true, + "dependencies": { + "temp": "~0.4.0" + }, + "engines": { + "node": ">=0.6.8" + } + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hardhat": { + "version": "2.28.6", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.28.6.tgz", + "integrity": "sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethereumjs/util": "^9.1.0", + "@ethersproject/abi": "^5.1.2", + "@nomicfoundation/edr": "0.12.0-next.23", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", + "chokidar": "^4.0.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "find-up": "^5.0.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "json-stream-stringify": "^3.1.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "micro-eth-signer": "^0.14.0", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "picocolors": "^1.1.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.8.26", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.6", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-2.3.0.tgz", + "integrity": "sha512-ySdA+044xMQv1BlJu5CYXToHzMexKFfIWxlQTBNNoerx1x96+d15IMdN01iQZ/TJ7NH2V5sU73bz77LoS/PEVw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/units": "^5.7.0", + "@solidity-parser/parser": "^0.20.1", + "axios": "^1.6.7", + "brotli-wasm": "^2.0.1", + "chalk": "4.1.2", + "cli-table3": "^0.6.3", + "ethereum-cryptography": "^2.1.3", + "glob": "^10.3.10", + "jsonschema": "^1.4.1", + "lodash": "^4.17.21", + "markdown-table": "2.0.0", + "sha1": "^1.1.1", + "viem": "^2.27.0" + }, + "peerDependencies": { + "hardhat": "^2.16.0" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@solidity-parser/parser": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.20.2.tgz", + "integrity": "sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/hardhat-gas-reporter/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/hash-base/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz", + "integrity": "sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz", + "integrity": "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peer": true, + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-stream-stringify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", + "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "dev": true, + "engines": { + "node": ">=7.10.1" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micro-eth-signer": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz", + "integrity": "sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==", + "dev": true, + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "micro-packed": "~0.7.2" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "dev": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/micro-packed": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", + "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==", + "dev": true, + "dependencies": { + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-packed/node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "dev": true, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dev": true, + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/ndjson": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", + "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.5", + "readable-stream": "^3.6.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "ndjson": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ox": { + "version": "0.14.15", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.15.tgz", + "integrity": "sha512-3TubCmbKen/cuZQzX0qDbOS5lojjdSZ90lqKxWIDWd5siuJ0IJBaTXMYs8eMPLcraqnOwGZazz3apHPGiRCkGQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.2.3", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ox/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "peer": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "has-flag": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": ">=0.8.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/secp256k1": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", "peer": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18.0.0" } }, - "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "dev": true, + "license": "(MIT AND BSD-3-Clause)", "peer": true, "dependencies": { - "fp-ts": "^1.0.0" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { - "binary-extensions": "^2.0.0" + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/sha1-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sha1-file/-/sha1-file-2.0.1.tgz", + "integrity": "sha512-L4Kum9Lp8cWqcGKycZcXxR6spUoG4idDIUzAKjPiELnIZWxiFlZ5HFVzFxVxuWuGPsrraeL0JoGk0nFZ7AGFEQ==", + "dev": true, + "dependencies": { + "hasha": "^5.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-fullwidth-code-point": { + "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { - "is-extglob": "^2.1.1" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">=0.12.0" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "engines": { - "node": ">=8" + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "*" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "peer": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-stream-stringify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", - "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">=7.10.1" + "node": ">=8" } }, - "node_modules/jsonfile": { + "node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "node_modules/solc": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", + "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", "dev": true, - "hasInstallScript": true, - "peer": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solidity-coverage": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.17.tgz", + "integrity": "sha512-5P8vnB6qVX9tt1MfuONtCTEaEGO/O4WuEidPHIAJjx4sktHHKhO3rFvnE0q8L30nWJPTrcqGQMT7jpE29B2qow==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { - "p-locate": "^5.0.0" + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.20.1", + "chalk": "^2.4.2", + "death": "^1.1.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.21", + "mocha": "^10.2.0", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" }, - "engines": { - "node": ">=10" + "bin": { + "solidity-coverage": "plugins/bin.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "hardhat": "^2.11.0" } }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.20.2.tgz", + "integrity": "sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "node_modules/solidity-coverage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/solidity-coverage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">= 0.10.0" + "node": ">=0.8.0" } }, - "node_modules/micro-eth-signer": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz", - "integrity": "sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==", + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "micro-packed": "~0.7.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/micro-eth-signer/node_modules/@noble/hashes": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", - "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "node_modules/solidity-coverage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=10" } }, - "node_modules/micro-packed": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", - "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==", + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@scure/base": "~1.2.5" + "has-flag": "^3.0.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=4" } }, - "node_modules/micro-packed/node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "peer": true, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "peer": true + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/stacktrace-parser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, - "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "type-fest": "^0.7.1" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "peer": true, "dependencies": { - "obliterator": "^2.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/mocha": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", - "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "license": "WTFPL OR MIT", + "peer": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "peer": true, "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 14.0.0" + "node": ">=8" } }, - "node_modules/mocha/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/mocha/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "peer": true, - "engines": { - "node": ">=8.6" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=8" } }, - "node_modules/mocha/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "picomatch": "^2.2.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=8" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "is-hex-prefixed": "1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "peer": true + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "peer": true - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/surya": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/surya/-/surya-0.4.13.tgz", + "integrity": "sha512-ff2YmkYu9+u9A1tUv6cEuQDhLw1N+++iI+ZenXyhYR7YmaiQ19h32p2VchBn6zy3JPcfpvBZjf/aEmLbSMW1WA==", "dev": true, - "peer": true, + "dependencies": { + "@solidity-parser/parser": "^0.16.1", + "c3-linearization": "^0.3.0", + "colors": "^1.4.0", + "graphviz": "0.0.9", + "sha1-file": "^2.0.0", + "treeify": "^1.1.0", + "yargs": "^17.0.0" + }, "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "surya": "bin/surya" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/surya/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/obliterator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", - "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", - "dev": true, - "peer": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/surya/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "peer": true, "dependencies": { - "wrappy": "1" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/surya/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { - "yocto-queue": "^0.1.0" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.0.0" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0.0" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "node_modules/temp": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.4.0.tgz", + "integrity": "sha512-IsFisGgDKk7qzK9erMIkQe/XwiSUdac7z3wYOsjcLkhPBy3k1SlvLoIh2dAHIlEpgA971CgguMrx9z8fFg7tSA==", "dev": true, - "peer": true - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "engines": [ + "node >=0.4.0" + ] }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, "engines": { - "node": ">=12" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "peer": true, "dependencies": { - "safe-buffer": "^5.1.0" + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "peer": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-number": "^7.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8.0" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "peer": true, "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "node": ">=0.6" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" } }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { - "path-parse": "^1.0.6" + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "write-markdown": "dist/write-markdown.js" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true + "license": "MIT", + "peer": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=0.3.1" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "randombytes": "^2.1.0" + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } }, - "node_modules/sha1-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sha1-file/-/sha1-file-2.0.1.tgz", - "integrity": "sha512-L4Kum9Lp8cWqcGKycZcXxR6spUoG4idDIUzAKjPiELnIZWxiFlZ5HFVzFxVxuWuGPsrraeL0JoGk0nFZ7AGFEQ==", + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "dependencies": { - "hasha": "^5.2.0" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solc": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", - "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" }, "bin": { - "solcjs": "solc.js" + "typechain": "dist/cli/cli.js" }, - "engines": { - "node": ">=10.0.0" + "peerDependencies": { + "typescript": ">=4.3.0" } }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, + "license": "MIT", "peer": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/stacktrace-parser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "type-fest": "^0.7.1" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "dev": true, + "license": "Apache-2.0", "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">= 0.8" + "node": ">=14.17" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "@fastify/busboy": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/viem": { + "version": "2.47.16", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.47.16.tgz", + "integrity": "sha512-IHkMi65tXLFSz81V2wtOXfRmznSvU0ANOPMRMgBcTwTPWMC+TcUSFFLvcl0UKpj+omFe+54lIcyAwK0I5jcvSw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "1.9.1", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.2.3", + "isows": "1.0.7", + "ox": "0.14.15", + "ws": "8.18.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@noble/hashes": "1.8.0" }, "engines": { - "node": ">=8" + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/surya": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/surya/-/surya-0.4.13.tgz", - "integrity": "sha512-ff2YmkYu9+u9A1tUv6cEuQDhLw1N+++iI+ZenXyhYR7YmaiQ19h32p2VchBn6zy3JPcfpvBZjf/aEmLbSMW1WA==", + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.16.1", - "c3-linearization": "^0.3.0", - "colors": "^1.4.0", - "graphviz": "0.0.9", - "sha1-file": "^2.0.0", - "treeify": "^1.1.0", - "yargs": "^17.0.0" + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.21.3 || >=16" }, - "bin": { - "surya": "bin/surya" + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/surya/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/viem/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/surya/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/viem/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/surya/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/viem/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=12" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/temp": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.4.0.tgz", - "integrity": "sha512-IsFisGgDKk7qzK9erMIkQe/XwiSUdac7z3wYOsjcLkhPBy3k1SlvLoIh2dAHIlEpgA971CgguMrx9z8fFg7tSA==", - "dev": true, - "engines": [ - "node >=0.4.0" - ] - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "node_modules/web3-utils": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", "dev": true, + "license": "LGPL-3.0", "peer": true, "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "@ethereumjs/util": "^8.1.0", + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereum-cryptography": "^2.1.2", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils/node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "bin": { + "rlp": "bin/rlp" }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "engines": { + "node": ">=14" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/web3-utils/node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", "dev": true, + "license": "MPL-2.0", "peer": true, "dependencies": { - "os-tmpdir": "~1.0.2" + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" }, "engines": { - "node": ">=0.6.0" + "node": ">=14" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "is-number": "^7.0.0" + "@noble/hashes": "1.4.0" }, - "engines": { - "node": ">=8.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/web3-utils/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">=0.6" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "node_modules/web3-utils/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, - "engines": { - "node": ">=0.6" + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/web3-utils/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "peer": true, - "engines": { - "node": ">=10" + "dependencies": { + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "which": "bin/which" } }, - "node_modules/undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@fastify/busboy": "^2.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=14.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, - "peer": true, + "dependencies": { + "string-width": "^4.0.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=8" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, + "license": "MIT", "peer": true, - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "string-width": "^4.0.0" - }, "engines": { "node": ">=8" } @@ -2945,8 +7714,7 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -2965,19 +7733,37 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -3008,7 +7794,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "peer": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -3027,7 +7812,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -3037,7 +7821,6 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, - "peer": true, "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -3048,12 +7831,22 @@ "node": ">=10" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 967b238..ee734de 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,16 @@ { "scripts": { + "test:hardhat": "npx hardhat test test/hardhat/RuleEngine.smoke.js", "uml": "npx sol2uml class src", - "uml:ruleEngine": "npx sol2uml src contracts -b RuleEngine", + "uml:ruleEngine": "npx sol2uml class src/deployment/RuleEngine.sol", "uml:test": "npx sol2uml class test", - "surya:report": "npx surya mdreport surya_report_ruleEngine.md src/RuleEngine.sol", - "surya:graph": "npx surya graph src/RuleEngine.sol | dot -Tpng > surya_graph_RuleEngine.png" + "surya:report": "npx surya mdreport surya_report_ruleEngine.md src/deployment/RuleEngine.sol", + "surya:graph": "npx surya graph src/deployment/RuleEngine.sol | dot -Tpng > surya_graph_RuleEngine.png" }, "devDependencies": { - "@nomicfoundation/hardhat-foundry": "^1.0.1", + "@nomicfoundation/hardhat-foundry": "^1.2.1", + "@nomicfoundation/hardhat-toolbox": "^6.1.2", + "hardhat": "^2.28.6", "surya": "^0.4.13" } } diff --git a/remappings.txt b/remappings.txt index 3628d37..f213225 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,5 +1,4 @@ CMTAT=lib/CMTAT/contracts/ CMTATv3.0.0=lib/CMTATv3.0.0/contracts/ -OZ/=lib/openzeppelin-contracts/contracts @openzeppelin/contracts/=lib/openzeppelin-contracts/contracts @openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ diff --git a/script/CMTATWithRuleEngineScript.s.sol b/script/CMTATWithRuleEngineScript.s.sol index f1eb618..0ea6ee9 100644 --- a/script/CMTATWithRuleEngineScript.s.sol +++ b/script/CMTATWithRuleEngineScript.s.sol @@ -2,17 +2,19 @@ // Documentation : // https://book.getfoundry.sh/tutorials/solidity-scripting -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import {Script, console} from "forge-std/Script.sol"; import {ICMTATConstructor, CMTATStandalone} from "CMTAT/deployment/CMTATStandalone.sol"; import {IERC1643CMTAT} from "CMTAT/interfaces/tokenization/draft-IERC1643CMTAT.sol"; import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol"; -import {RuleEngine} from "src/RuleEngine.sol"; +import {RuleEngine} from "src/deployment/RuleEngine.sol"; import {RuleWhitelist} from "src/mocks/rules/validation/RuleWhitelist.sol"; /** - * @title Deploy a CMTAT, a RuleWhitelist and a RuleEngine + * @title Example deployment of a CMTAT, a mock RuleWhitelist and a RuleEngine + * @dev This script deploys a reference/mock rule from `src/mocks/` for demo and testing flows. + * It is not a production deployment recipe for rule contracts. */ contract CMTATWithRuleEngineScript is Script { function run() external { diff --git a/script/RuleEngineScript.s.sol b/script/RuleEngineScript.s.sol index b0e7d61..30ddb41 100644 --- a/script/RuleEngineScript.s.sol +++ b/script/RuleEngineScript.s.sol @@ -2,17 +2,19 @@ // Documentation : // https://book.getfoundry.sh/tutorials/solidity-scripting -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import {Script, console} from "forge-std/Script.sol"; -import {RuleEngine} from "src/RuleEngine.sol"; +import {RuleEngine} from "src/deployment/RuleEngine.sol"; import {RuleWhitelist} from "src/mocks/rules/validation/RuleWhitelist.sol"; import { ValidationModuleRuleEngine } from "CMTAT/modules/wrapper/extensions/ValidationModule/ValidationModuleRuleEngine.sol"; /** - * @title Deploy a RuleWhitelist and a RuleEngine. The CMTAT is considred already deployed + * @title Example deployment of a mock RuleWhitelist and a RuleEngine + * @dev This script deploys a reference/mock rule from `src/mocks/` for demo and testing flows. + * It is not a production deployment recipe for rule contracts. */ contract RuleEngineScript is Script { function run() external { diff --git a/src/RuleEngineBase.sol b/src/RuleEngineBase.sol index 1b10c58..5d99d1c 100644 --- a/src/RuleEngineBase.sol +++ b/src/RuleEngineBase.sol @@ -3,7 +3,10 @@ pragma solidity ^0.8.20; /* ==== OpenZeppelin === */ -import {ERC165Checker} from "OZ/utils/introspection/ERC165Checker.sol"; +import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +/* ==== CMTAT interface IDs === */ +import {ERC1404ExtendInterfaceId} from "CMTAT/library/ERC1404ExtendInterfaceId.sol"; +import {RuleEngineInterfaceId} from "CMTAT/library/RuleEngineInterfaceId.sol"; /* ==== CMTAT === */ import {IRuleEngine, IRuleEngineERC1404} from "CMTAT/interfaces/engine/IRuleEngine.sol"; import {IERC1404, IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol"; @@ -17,6 +20,7 @@ import {RulesManagementModule} from "./modules/RulesManagementModule.sol"; /* ==== Interface and other library === */ import {IRule} from "./interfaces/IRule.sol"; +import {ComplianceInterfaceId} from "./modules/library/ComplianceInterfaceId.sol"; import {RuleEngineInvariantStorage} from "./modules/library/RuleEngineInvariantStorage.sol"; import {RuleInterfaceId} from "./modules/library/RuleInterfaceId.sol"; @@ -167,8 +171,13 @@ abstract contract RuleEngineBase is return uint8(REJECTED_CODE_BASE.TRANSFER_OK); } + /** + * @dev This function returns the message from the first rule claiming the code. + * Rule designers should keep restriction codes unique across rules. + * If a code is shared intentionally, all rules using that code should return + * the same message to avoid ambiguous operator feedback. + */ function _messageForTransferRestriction(uint8 restrictionCode) internal view virtual returns (string memory) { - // uint256 rulesLength = rulesCount(); for (uint256 i = 0; i < rulesLength; ++i) { if (IRule(rule(i)).canReturnTransferRestrictionCode(restrictionCode)) { @@ -187,4 +196,15 @@ abstract contract RuleEngineBase is revert RuleEngine_RuleInvalidInterface(); } } + + /** + * @dev Shared ERC-165 checks common to all RuleEngine deployment variants. + * Concrete deployments can extend this with access-control-specific interfaces. + */ + function _supportsRuleEngineBaseInterface(bytes4 interfaceId) internal pure returns (bool) { + return interfaceId == RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID + || interfaceId == ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID + || interfaceId == ComplianceInterfaceId.ERC3643_COMPLIANCE_INTERFACE_ID + || interfaceId == ComplianceInterfaceId.IERC7551_COMPLIANCE_INTERFACE_ID; + } } diff --git a/src/RuleEngineOwnable.sol b/src/RuleEngineOwnable.sol deleted file mode 100644 index f926f0d..0000000 --- a/src/RuleEngineOwnable.sol +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: MPL-2.0 - -pragma solidity ^0.8.20; - -/* ==== CMTAT === */ -import {ERC1404ExtendInterfaceId} from "CMTAT/library/ERC1404ExtendInterfaceId.sol"; -import {RuleEngineInterfaceId} from "CMTAT/library/RuleEngineInterfaceId.sol"; -/* ==== OpenZeppelin === */ -import {Context} from "OZ/utils/Context.sol"; -import {Ownable} from "OZ/access/Ownable.sol"; -import {IERC165} from "OZ/utils/introspection/IERC165.sol"; -import {AccessControl} from "OZ/access/AccessControl.sol"; -/* ==== Modules === */ -import {ERC2771ModuleStandalone, ERC2771Context} from "./modules/ERC2771ModuleStandalone.sol"; -/* ==== Base contract === */ -import {RuleEngineBase} from "./RuleEngineBase.sol"; - -/** - * @title Implementation of a ruleEngine with ERC-173 Ownable access control - */ -contract RuleEngineOwnable is ERC2771ModuleStandalone, RuleEngineBase, Ownable { - bytes4 private constant ERC173_INTERFACE_ID = 0x7f5828d0; - - /** - * @param owner_ Address of the contract owner (ERC-173) - * @param forwarderIrrevocable Address of the forwarder, required for the gasless support - * @param tokenContract Address of the token contract to bind (can be zero address) - */ - constructor(address owner_, address forwarderIrrevocable, address tokenContract) - ERC2771ModuleStandalone(forwarderIrrevocable) - Ownable(owner_) - { - // Note: zero-address check for owner_ is handled by Ownable(owner_), - // which reverts with OwnableInvalidOwner(address(0)) before reaching here. - if (tokenContract != address(0)) { - _bindToken(tokenContract); - } - } - - /* ============ ACCESS CONTROL ============ */ - /** - * @dev Access control check using Ownable pattern - */ - function _onlyRulesManager() internal virtual override onlyOwner {} - - /** - * @dev Access control check using Ownable pattern - */ - function _onlyComplianceManager() internal virtual override onlyOwner {} - - /* ============ ERC-165 ============ */ - function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, IERC165) returns (bool) { - return interfaceId == RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID - || interfaceId == ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID || interfaceId == ERC173_INTERFACE_ID - || AccessControl.supportsInterface(interfaceId); - } - - /*////////////////////////////////////////////////////////////// - ERC-2771 - //////////////////////////////////////////////////////////////*/ - - /** - * @dev This surcharge is not necessary if you do not use the MetaTxModule - */ - function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) { - return ERC2771Context._msgSender(); - } - - /** - * @dev This surcharge is not necessary if you do not use the MetaTxModule - */ - function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) { - return ERC2771Context._msgData(); - } - - /** - * @dev This surcharge is not necessary if you do not use the MetaTxModule - */ - function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) { - return ERC2771Context._contextSuffixLength(); - } -} diff --git a/src/RuleEngineOwnableShared.sol b/src/RuleEngineOwnableShared.sol new file mode 100644 index 0000000..4193758 --- /dev/null +++ b/src/RuleEngineOwnableShared.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/* ==== OpenZeppelin === */ +import {Context} from "@openzeppelin/contracts/utils/Context.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +/* ==== Modules === */ +import {ERC2771ModuleStandalone, ERC2771Context} from "./modules/ERC2771ModuleStandalone.sol"; +/* ==== Base contract === */ +import {RuleEngineBase} from "./RuleEngineBase.sol"; + +/** + * @title Shared Ownable deployment logic for RuleEngine variants + * @dev Kept abstract to let child contracts choose the ownership mechanism + * (`Ownable` or `Ownable2Step`) while reusing constructor, ERC-165 and ERC-2771 code. + */ +abstract contract RuleEngineOwnableShared is ERC2771ModuleStandalone, RuleEngineBase { + bytes4 private constant ERC173_INTERFACE_ID = 0x7f5828d0; + + constructor(address forwarderIrrevocable, address tokenContract) ERC2771ModuleStandalone(forwarderIrrevocable) { + if (tokenContract != address(0)) { + _bindToken(tokenContract); + } + } + + /* ============ ERC-165 ============ */ + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return _supportsRuleEngineBaseInterface(interfaceId) + || interfaceId == ERC173_INTERFACE_ID + || interfaceId == type(IERC165).interfaceId; + } + + /*////////////////////////////////////////////////////////////// + ERC-2771 + //////////////////////////////////////////////////////////////*/ + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) { + return ERC2771Context._msgSender(); + } + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) { + return ERC2771Context._msgData(); + } + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) { + return ERC2771Context._contextSuffixLength(); + } +} diff --git a/src/RuleEngine.sol b/src/deployment/RuleEngine.sol similarity index 67% rename from src/RuleEngine.sol rename to src/deployment/RuleEngine.sol index bc54f18..e9a501b 100644 --- a/src/RuleEngine.sol +++ b/src/deployment/RuleEngine.sol @@ -2,22 +2,21 @@ pragma solidity ^0.8.20; -/* ==== CMTAT === */ -import {ERC1404ExtendInterfaceId} from "CMTAT/library/ERC1404ExtendInterfaceId.sol"; -import {RuleEngineInterfaceId} from "CMTAT/library/RuleEngineInterfaceId.sol"; /* ==== OpenZeppelin === */ -import {Context} from "OZ/utils/Context.sol"; -import {AccessControl} from "OZ/access/AccessControl.sol"; -import {IERC165} from "OZ/utils/introspection/ERC165.sol"; +import {Context} from "@openzeppelin/contracts/utils/Context.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {AccessControlEnumerable} from "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /* ==== Modules === */ -import {ERC2771ModuleStandalone, ERC2771Context} from "./modules/ERC2771ModuleStandalone.sol"; +import {ERC2771ModuleStandalone, ERC2771Context} from "../modules/ERC2771ModuleStandalone.sol"; /* ==== Base contract === */ -import {RuleEngineBase} from "./RuleEngineBase.sol"; +import {RuleEngineBase} from "../RuleEngineBase.sol"; /** * @title Implementation of a ruleEngine as defined by the CMTAT */ -contract RuleEngine is ERC2771ModuleStandalone, RuleEngineBase { +contract RuleEngine is ERC2771ModuleStandalone, RuleEngineBase, AccessControlEnumerable { /** * @param admin Address of the contract (Access Control) * @param forwarderIrrevocable Address of the forwarder, required for the gasless support @@ -39,7 +38,13 @@ contract RuleEngine is ERC2771ModuleStandalone, RuleEngineBase { * @notice Returns `true` if `account` has been granted `role`. * @dev The Default Admin has all roles */ - function hasRole(bytes32 role, address account) public view virtual override(AccessControl) returns (bool) { + function hasRole(bytes32 role, address account) + public + view + virtual + override(AccessControl, IAccessControl) + returns (bool) + { if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) { return true; } else { @@ -48,10 +53,14 @@ contract RuleEngine is ERC2771ModuleStandalone, RuleEngineBase { } /* ============ ERC-165 ============ */ - function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, IERC165) returns (bool) { - return interfaceId == RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID - || interfaceId == ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID - || AccessControl.supportsInterface(interfaceId); + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(AccessControlEnumerable, IERC165) + returns (bool) + { + return _supportsRuleEngineBaseInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId); } /*////////////////////////////////////////////////////////////// diff --git a/src/deployment/RuleEngineOwnable.sol b/src/deployment/RuleEngineOwnable.sol new file mode 100644 index 0000000..7753874 --- /dev/null +++ b/src/deployment/RuleEngineOwnable.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {Context} from "@openzeppelin/contracts/utils/Context.sol"; +import {RuleEngineOwnableShared} from "../RuleEngineOwnableShared.sol"; + +/** + * @title Implementation of a ruleEngine with ERC-173 Ownable access control + */ +contract RuleEngineOwnable is RuleEngineOwnableShared, Ownable { + /** + * @param owner_ Address of the contract owner (ERC-173) + * @param forwarderIrrevocable Address of the forwarder, required for the gasless support + * @param tokenContract Address of the token contract to bind (can be zero address) + */ + constructor(address owner_, address forwarderIrrevocable, address tokenContract) + RuleEngineOwnableShared(forwarderIrrevocable, tokenContract) + Ownable(owner_) + {} + + /* ============ ACCESS CONTROL ============ */ + /** + * @dev Access control check using Ownable pattern + */ + function _onlyRulesManager() internal virtual override onlyOwner {} + + /** + * @dev Access control check using Ownable pattern + */ + function _onlyComplianceManager() internal virtual override onlyOwner {} + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _msgSender() internal view virtual override(RuleEngineOwnableShared, Context) returns (address sender) { + return RuleEngineOwnableShared._msgSender(); + } + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _msgData() internal view virtual override(RuleEngineOwnableShared, Context) returns (bytes calldata) { + return RuleEngineOwnableShared._msgData(); + } + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _contextSuffixLength() internal view virtual override(RuleEngineOwnableShared, Context) returns (uint256) { + return RuleEngineOwnableShared._contextSuffixLength(); + } + +} diff --git a/src/deployment/RuleEngineOwnable2Step.sol b/src/deployment/RuleEngineOwnable2Step.sol new file mode 100644 index 0000000..2b7240a --- /dev/null +++ b/src/deployment/RuleEngineOwnable2Step.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/* ==== OpenZeppelin === */ +import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {Context} from "@openzeppelin/contracts/utils/Context.sol"; +import {RuleEngineOwnableShared} from "../RuleEngineOwnableShared.sol"; + +/** + * @title Implementation of a ruleEngine with ERC-173 Ownable2Step access control + */ +contract RuleEngineOwnable2Step is RuleEngineOwnableShared, Ownable2Step { + /** + * @param owner_ Address of the contract owner (ERC-173) + * @param forwarderIrrevocable Address of the forwarder, required for the gasless support + * @param tokenContract Address of the token contract to bind (can be zero address) + */ + constructor(address owner_, address forwarderIrrevocable, address tokenContract) + RuleEngineOwnableShared(forwarderIrrevocable, tokenContract) + Ownable(owner_) + {} + + /* ============ ACCESS CONTROL ============ */ + /** + * @dev Access control check using Ownable pattern + */ + function _onlyRulesManager() internal virtual override onlyOwner {} + + /** + * @dev Access control check using Ownable pattern + */ + function _onlyComplianceManager() internal virtual override onlyOwner {} + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _msgSender() internal view virtual override(RuleEngineOwnableShared, Context) returns (address sender) { + return RuleEngineOwnableShared._msgSender(); + } + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _msgData() internal view virtual override(RuleEngineOwnableShared, Context) returns (bytes calldata) { + return RuleEngineOwnableShared._msgData(); + } + + /** + * @dev This surcharge is not necessary if you do not use the MetaTxModule + */ + function _contextSuffixLength() internal view virtual override(RuleEngineOwnableShared, Context) returns (uint256) { + return RuleEngineOwnableShared._contextSuffixLength(); + } +} diff --git a/src/interfaces/IERC3643Compliance.sol b/src/interfaces/IERC3643Compliance.sol index 39189a4..eb965de 100644 --- a/src/interfaces/IERC3643Compliance.sol +++ b/src/interfaces/IERC3643Compliance.sol @@ -24,6 +24,11 @@ interface IERC3643Compliance is IERC3643ComplianceRead, IERC3643IComplianceContr * @notice Associates a token contract with this compliance contract. * @dev The compliance contract may restrict operations on the bound token * according to the compliance logic. + * Security note: a "multi-tenant" setup means multiple token contracts + * share one RuleEngine instance (all are bound via {bindToken}). + * In that setup, all bound tokens must be equally trusted and governed together. + * ERC-3643 callbacks do not carry the token address to rules, so stateful + * rules with per-address accounting are unsafe across mutually untrusted tokens. * Reverts if the token is already bound. * Complexity: O(1). * @param token The address of the token to bind. @@ -32,7 +37,11 @@ interface IERC3643Compliance is IERC3643ComplianceRead, IERC3643IComplianceContr /** * @notice Removes the association of a token contract from this compliance contract. - * @dev Reverts if the token is not currently bound. + * @dev Security note: unbinding does not retroactively isolate rule state from + * previously shared multi-token operation. "Multi-tenant" means one RuleEngine + * shared by multiple token contracts. Avoid multi-tenant binding unless + * all tokens are equally trusted and governed together. + * Reverts if the token is not currently bound. * Complexity: O(1). * @param token The address of the token to unbind. */ diff --git a/src/interfaces/IRule.sol b/src/interfaces/IRule.sol index bebf961..86554b9 100644 --- a/src/interfaces/IRule.sol +++ b/src/interfaces/IRule.sol @@ -10,6 +10,9 @@ import {IRuleEngineERC1404} from "CMTAT/interfaces/engine/IRuleEngine.sol"; interface IRule is IRuleEngineERC1404 { /** * @dev Returns true if the restriction code exists, and false otherwise. + * Rule authors should use unique restriction codes across rules when possible. + * If a code is intentionally shared by multiple rules, all of them should return + * the same message for that code in `messageForTransferRestriction`. */ function canReturnTransferRestrictionCode(uint8 restrictionCode) external view returns (bool); } diff --git a/src/mocks/ICompliance.sol b/src/mocks/ICompliance.sol new file mode 100644 index 0000000..d2b8902 --- /dev/null +++ b/src/mocks/ICompliance.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MPL-2.0 +pragma solidity ^0.8.20; + +interface ICompliance { + // events + event TokenBound(address _token); + event TokenUnbound(address _token); + + // functions + // initialization of the compliance contract + function bindToken(address _token) external; + function unbindToken(address _token) external; + + // check the parameters of the compliance contract + function isTokenBound(address _token) external view returns (bool); + function getTokenBound() external view returns (address); + + // compliance check and state update + function canTransfer(address _from, address _to, uint256 _amount) external view returns (bool); + function transferred(address _from, address _to, uint256 _amount) external; + function created(address _to, uint256 _amount) external; + function destroyed(address _from, uint256 _amount) external; +} diff --git a/src/mocks/IERC7551ComplianceSubset.sol b/src/mocks/IERC7551ComplianceSubset.sol new file mode 100644 index 0000000..8c5f46a --- /dev/null +++ b/src/mocks/IERC7551ComplianceSubset.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MPL-2.0 +pragma solidity ^0.8.20; + +/** + * @dev Test-only subset interface used to validate the advertised ERC-165 ID. + * ERC-7551 is draft and this interface contains only the compliance method + * currently implemented by RuleEngine. + */ +interface IERC7551ComplianceSubset { + function canTransferFrom(address spender, address from, address to, uint256 value) external view returns (bool); +} diff --git a/src/mocks/IRuleInterfaceIdHelper.sol b/src/mocks/IRuleInterfaceIdHelper.sol index 6e5f752..735caa5 100644 --- a/src/mocks/IRuleInterfaceIdHelper.sol +++ b/src/mocks/IRuleInterfaceIdHelper.sol @@ -6,7 +6,7 @@ import {IRuleEngineERC1404, IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngi import {IERC1404, IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol"; import {IERC3643ComplianceRead, IERC3643IComplianceContract} from "CMTAT/interfaces/tokenization/IERC3643Partial.sol"; import {IERC7551Compliance} from "CMTAT/interfaces/tokenization/draft-IERC7551.sol"; -import {IERC165} from "OZ/utils/introspection/IERC165.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import {RuleInterfaceId} from "../modules/library/RuleInterfaceId.sol"; /** diff --git a/src/mocks/RuleEngineExposed.sol b/src/mocks/RuleEngineExposed.sol index cb1a773..948dd0f 100644 --- a/src/mocks/RuleEngineExposed.sol +++ b/src/mocks/RuleEngineExposed.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MPL-2.0 pragma solidity ^0.8.20; -import {RuleEngine} from "../RuleEngine.sol"; -import {RuleEngineOwnable} from "../RuleEngineOwnable.sol"; +import {RuleEngine} from "../deployment/RuleEngine.sol"; +import {RuleEngineOwnable} from "../deployment/RuleEngineOwnable.sol"; /** * @title RuleEngineExposed diff --git a/src/mocks/RuleInvalidMock.sol b/src/mocks/RuleInvalidMock.sol index 5925b8f..e30ccec 100644 --- a/src/mocks/RuleInvalidMock.sol +++ b/src/mocks/RuleInvalidMock.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MPL-2.0 pragma solidity ^0.8.20; -import {ERC165} from "OZ/utils/introspection/ERC165.sol"; +import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @title RuleInvalidMock diff --git a/src/mocks/rules/operation/RuleConditionalTransferLight.sol b/src/mocks/rules/operation/RuleConditionalTransferLight.sol index ce5c846..dc864fa 100644 --- a/src/mocks/rules/operation/RuleConditionalTransferLight.sol +++ b/src/mocks/rules/operation/RuleConditionalTransferLight.sol @@ -7,7 +7,8 @@ import { } from "./abstract/RuleConditionalTransferLightInvariantStorage.sol"; import {IRule} from "../../../interfaces/IRule.sol"; import {RuleInterfaceId} from "../../../modules/library/RuleInterfaceId.sol"; -import {IERC165, AccessControl} from "OZ/access/AccessControl.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @title TransferApprovalRule diff --git a/src/mocks/rules/operation/RuleOperationRevert.sol b/src/mocks/rules/operation/RuleOperationRevert.sol index ed62f25..a8c3cbb 100644 --- a/src/mocks/rules/operation/RuleOperationRevert.sol +++ b/src/mocks/rules/operation/RuleOperationRevert.sol @@ -5,7 +5,8 @@ pragma solidity ^0.8.20; import "../validation/abstract/RuleCommonInvariantStorage.sol"; import {IRule} from "../../../interfaces/IRule.sol"; import {RuleInterfaceId} from "../../../modules/library/RuleInterfaceId.sol"; -import {IERC165, AccessControl} from "OZ/access/AccessControl.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @title TransferApprovalRule diff --git a/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol b/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol index ffc8119..fb3eb3a 100644 --- a/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol +++ b/src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; // forge-lint: disable-next-line(unaliased-plain-import) -import "OZ/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "../../validation/abstract/RuleCommonInvariantStorage.sol"; diff --git a/src/mocks/rules/validation/RuleWhitelist.sol b/src/mocks/rules/validation/RuleWhitelist.sol index 7f67cb2..f728072 100644 --- a/src/mocks/rules/validation/RuleWhitelist.sol +++ b/src/mocks/rules/validation/RuleWhitelist.sol @@ -6,7 +6,8 @@ pragma solidity ^0.8.20; import "./abstract/RuleAddressList/RuleAddressList.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "./abstract/RuleWhitelistCommon.sol"; -import {IERC165, AccessControl} from "OZ/access/AccessControl.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import {RuleInterfaceId} from "../../../modules/library/RuleInterfaceId.sol"; //import {ERC165, IERC165} from "@OZ/utils/introspection/ERC165.sol"; diff --git a/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol b/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol index 57c63b7..2bb727f 100644 --- a/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol +++ b/src/mocks/rules/validation/abstract/RuleAddressList/RuleAddressList.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; // forge-lint: disable-next-line(unaliased-plain-import) -import "OZ/access/AccessControl.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "../../../../../modules/ERC2771ModuleStandalone.sol"; // forge-lint: disable-next-line(unaliased-plain-import) diff --git a/src/modules/ERC2771ModuleStandalone.sol b/src/modules/ERC2771ModuleStandalone.sol index f256909..98f8af9 100644 --- a/src/modules/ERC2771ModuleStandalone.sol +++ b/src/modules/ERC2771ModuleStandalone.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; /* ==== OpenZeppelin === */ -import {ERC2771Context} from "OZ/metatx/ERC2771Context.sol"; +import {ERC2771Context} from "@openzeppelin/contracts/metatx/ERC2771Context.sol"; /** * @dev Meta transaction (gasless) module. diff --git a/src/modules/ERC3643ComplianceModule.sol b/src/modules/ERC3643ComplianceModule.sol index 43b429c..a7e2185 100644 --- a/src/modules/ERC3643ComplianceModule.sol +++ b/src/modules/ERC3643ComplianceModule.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.20; /* ==== OpenZeppelin === */ -import {EnumerableSet} from "OZ/utils/structs/EnumerableSet.sol"; -import {Context} from "OZ/utils/Context.sol"; +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import {Context} from "@openzeppelin/contracts/utils/Context.sol"; /* ==== Interface and other library === */ import {IERC3643Compliance} from "../interfaces/IERC3643Compliance.sol"; @@ -41,12 +41,22 @@ abstract contract ERC3643ComplianceModule is Context, IERC3643Compliance { //////////////////////////////////////////////////////////////*/ /* ============ State functions ============ */ - /// @inheritdoc IERC3643Compliance + /** + * @inheritdoc IERC3643Compliance + * @dev Operator warning: "multi-tenant" means one RuleEngine is shared by + * multiple token contracts. In that setup, bind only tokens that are equally + * trusted and governed together. + */ function bindToken(address token) public virtual override onlyComplianceManager { _bindToken(token); } - /// @inheritdoc IERC3643Compliance + /** + * @inheritdoc IERC3643Compliance + * @dev Operator warning: unbinding is an administrative operation and does not + * erase any state already stored by external rule contracts in a previously + * shared ("multi-tenant") setup. + */ function unbindToken(address token) public virtual override onlyComplianceManager { _unbindToken(token); } diff --git a/src/modules/RulesManagementModule.sol b/src/modules/RulesManagementModule.sol index e37960b..72ed6fa 100644 --- a/src/modules/RulesManagementModule.sol +++ b/src/modules/RulesManagementModule.sol @@ -3,8 +3,7 @@ pragma solidity ^0.8.20; /* ==== OpenZeppelin === */ -import {EnumerableSet} from "OZ/utils/structs/EnumerableSet.sol"; -import {AccessControl} from "OZ/access/AccessControl.sol"; +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; /* ==== Interface and other library === */ import {IRulesManagementModule} from "../interfaces/IRulesManagementModule.sol"; import {IRule} from "../interfaces/IRule.sol"; @@ -13,11 +12,7 @@ import {RulesManagementModuleInvariantStorage} from "./library/RulesManagementMo /** * @title RuleEngine - part */ -abstract contract RulesManagementModule is - AccessControl, - RulesManagementModuleInvariantStorage, - IRulesManagementModule -{ +abstract contract RulesManagementModule is RulesManagementModuleInvariantStorage, IRulesManagementModule { modifier onlyRulesManager() { _onlyRulesManager(); _; @@ -38,6 +33,14 @@ abstract contract RulesManagementModule is /** * @inheritdoc IRulesManagementModule + * @dev Replaces the entire rule set atomically. + * Reverts if `rules_` is empty. Use {clearRules} to remove all rules explicitly. + * To transition from one non-empty set to another without an enforcement gap, + * call this function directly with the new set. + * No on-chain maximum number of rules is enforced. Operators are responsible + * for keeping the rule set size compatible with the target chain gas limits. + * Security convention: rule contracts should be treated as trusted business logic, + * but should not also be granted {RULES_MANAGEMENT_ROLE}. */ function setRules(IRule[] calldata rules_) public virtual override(IRulesManagementModule) onlyRulesManager { if (rules_.length == 0) { @@ -63,6 +66,9 @@ abstract contract RulesManagementModule is /** * @inheritdoc IRulesManagementModule + * @dev No on-chain maximum number of rules is enforced. Adding too many rules + * can increase transfer-time gas usage because rule checks are linear in rule count. + * Security convention: do not grant {RULES_MANAGEMENT_ROLE} to rule contracts. */ function addRule(IRule rule_) public virtual override(IRulesManagementModule) onlyRulesManager { _checkRule(address(rule_)); @@ -155,6 +161,10 @@ abstract contract RulesManagementModule is /** * @notice Go through all the rule to know if a restriction exists on the transfer + * @dev Complexity is O(number of configured rules). Large rule sets can make + * transfers too expensive on chains with lower block gas limits. + * Security convention: rule contracts are expected to be trusted and must not + * hold {RULES_MANAGEMENT_ROLE}. * @param from the origin address * @param to the destination address * @param value to transfer @@ -169,6 +179,10 @@ abstract contract RulesManagementModule is /** * @notice Go through all the rule to know if a restriction exists on the transfer + * @dev Complexity is O(number of configured rules). Large rule sets can make + * transfers too expensive on chains with lower block gas limits. + * Security convention: rule contracts are expected to be trusted and must not + * hold {RULES_MANAGEMENT_ROLE}. * @param spender the spender address (transferFrom) * @param from the origin address * @param to the destination address diff --git a/src/modules/library/ComplianceInterfaceId.sol b/src/modules/library/ComplianceInterfaceId.sol new file mode 100644 index 0000000..1c604a8 --- /dev/null +++ b/src/modules/library/ComplianceInterfaceId.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/** + * @title ComplianceInterfaceId + * @dev ERC-165 interface IDs used by RuleEngine for compliance interfaces. + */ +library ComplianceInterfaceId { + bytes4 public constant ERC3643_COMPLIANCE_INTERFACE_ID = 0x3144991c; + bytes4 public constant IERC7551_COMPLIANCE_INTERFACE_ID = 0x7157797f; +} diff --git a/test/HelperContract.sol b/test/HelperContract.sol index 1805977..ef59d3d 100644 --- a/test/HelperContract.sol +++ b/test/HelperContract.sol @@ -8,7 +8,7 @@ import {CMTATStandalone} from "CMTAT/deployment/CMTATStandalone.sol"; import {RuleEngineInvariantStorage} from "src/modules/library/RuleEngineInvariantStorage.sol"; import {RulesManagementModuleInvariantStorage} from "src/modules/library/RulesManagementModuleInvariantStorage.sol"; // RuleEngine -import {RuleEngine} from "src/RuleEngine.sol"; +import {RuleEngine} from "src/deployment/RuleEngine.sol"; // forge-lint: disable-next-line(unused-import) import {RulesManagementModule} from "src/RuleEngineBase.sol"; // forge-lint: disable-next-line(unused-import) diff --git a/test/HelperContractOwnable.sol b/test/HelperContractOwnable.sol index 6a31a3e..08c9357 100644 --- a/test/HelperContractOwnable.sol +++ b/test/HelperContractOwnable.sol @@ -8,7 +8,7 @@ import {CMTATStandalone} from "CMTAT/deployment/CMTATStandalone.sol"; import {RuleEngineInvariantStorage} from "src/modules/library/RuleEngineInvariantStorage.sol"; import {RulesManagementModuleInvariantStorage} from "src/modules/library/RulesManagementModuleInvariantStorage.sol"; // RuleEngineOwnable -import {RuleEngineOwnable} from "src/RuleEngineOwnable.sol"; +import {RuleEngineOwnable} from "src/deployment/RuleEngineOwnable.sol"; // forge-lint: disable-next-line(unused-import) import {RulesManagementModule} from "src/RuleEngineBase.sol"; // forge-lint: disable-next-line(unused-import) diff --git a/test/HelperContractOwnable2Step.sol b/test/HelperContractOwnable2Step.sol new file mode 100644 index 0000000..0ed3205 --- /dev/null +++ b/test/HelperContractOwnable2Step.sol @@ -0,0 +1,21 @@ +//SPDX-License-Identifier: MPL-2.0 +pragma solidity ^0.8.20; + +import {RuleEngineOwnable2Step} from "src/deployment/RuleEngineOwnable2Step.sol"; +import {RuleConditionalTransferLight} from "src/mocks/rules/operation/RuleConditionalTransferLight.sol"; + +/** + * @title Constants used by tests for RuleEngineOwnable2Step + */ +abstract contract HelperContractOwnable2Step { + address internal constant ZERO_ADDRESS = address(0); + address internal constant OWNER_ADDRESS = address(1); + address internal constant NEW_OWNER_ADDRESS = address(8); + address internal constant ATTACKER = address(4); + address internal constant CONDITIONAL_TRANSFER_OPERATOR_ADDRESS = address(9); + + RuleEngineOwnable2Step public ruleEngineMock; + RuleConditionalTransferLight public ruleConditionalTransferLight; + + string internal constant ERC2771ForwarderDomain = "ERC2771ForwarderDomain"; +} diff --git a/test/RuleEngine/AccessControl/RuleEngineAccessControl.sol b/test/RuleEngine/AccessControl/RuleEngineAccessControl.sol index ceae2fe..22ec64a 100644 --- a/test/RuleEngine/AccessControl/RuleEngineAccessControl.sol +++ b/test/RuleEngine/AccessControl/RuleEngineAccessControl.sol @@ -9,7 +9,7 @@ import "../../HelperContract.sol"; /** * @title Tests on the Access Control */ -contract RuleEngineAccessControlTest is Test, HelperContract { +contract RuleEngineTest is Test, HelperContract { // Custom error openZeppelin error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); diff --git a/test/RuleEngine/AccessControl/RuleEngineAccessControlOZ.t.sol b/test/RuleEngine/AccessControl/RuleEngineAccessControlOZ.t.sol index 28c4623..7634d7f 100644 --- a/test/RuleEngine/AccessControl/RuleEngineAccessControlOZ.t.sol +++ b/test/RuleEngine/AccessControl/RuleEngineAccessControlOZ.t.sol @@ -2,14 +2,14 @@ pragma solidity ^0.8.20; import {Test} from "forge-std/Test.sol"; -import {AccessControl} from "OZ/access/AccessControl.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "../../HelperContract.sol"; /** * @title Tests on the provided functions by OpenZeppelin */ -contract RuleEngineAccessControlTest is Test, HelperContract, AccessControl { +contract RuleEngineTest is Test, HelperContract, AccessControl { // Arrange function setUp() public { ruleWhitelist = new RuleWhitelist(WHITELIST_OPERATOR_ADDRESS, ZERO_ADDRESS); diff --git a/test/RuleEngine/RuleEngineCoverage.t.sol b/test/RuleEngine/RuleEngineCoverage.t.sol index 619e51e..5f9e9e2 100644 --- a/test/RuleEngine/RuleEngineCoverage.t.sol +++ b/test/RuleEngine/RuleEngineCoverage.t.sol @@ -7,6 +7,8 @@ import "../HelperContract.sol"; import {RuleEngineExposed} from "src/mocks/RuleEngineExposed.sol"; import {RuleInvalidMock} from "src/mocks/RuleInvalidMock.sol"; +import {ICompliance} from "src/mocks/ICompliance.sol"; +import {IERC7551ComplianceSubset} from "src/mocks/IERC7551ComplianceSubset.sol"; /** * @title Coverage tests for RuleEngine (supportsInterface, _msgData, ERC-165 rule check) @@ -37,6 +39,14 @@ contract RuleEngineCoverageTest is Test, HelperContract { assertTrue(ruleEngineMock.supportsInterface(ERC1404_EXTEND_ID)); } + function testSupportsERC3643ComplianceInterface() public view { + assertTrue(ruleEngineMock.supportsInterface(type(ICompliance).interfaceId)); + } + + function testSupportsIERC7551ComplianceSubsetInterface() public view { + assertTrue(ruleEngineMock.supportsInterface(type(IERC7551ComplianceSubset).interfaceId)); + } + function testSupportsERC165Interface() public view { assertTrue(ruleEngineMock.supportsInterface(ERC165_ID)); } diff --git a/test/RuleEngine/RuleEngineDeployment.t.sol b/test/RuleEngine/RuleEngineDeployment.t.sol index bfe3965..841adc0 100644 --- a/test/RuleEngine/RuleEngineDeployment.t.sol +++ b/test/RuleEngine/RuleEngineDeployment.t.sol @@ -5,6 +5,13 @@ import {Test} from "forge-std/Test.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "../HelperContract.sol"; import {MinimalForwarderMock} from "CMTAT/mocks/MinimalForwarderMock.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {IAccessControlEnumerable} from "@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.sol"; +import {ERC1404ExtendInterfaceId} from "CMTAT/library/ERC1404ExtendInterfaceId.sol"; +import {RuleEngineInterfaceId} from "CMTAT/library/RuleEngineInterfaceId.sol"; +import {ICompliance} from "src/mocks/ICompliance.sol"; +import {IERC7551ComplianceSubset} from "src/mocks/IERC7551ComplianceSubset.sol"; /** * @title General functions of the RuleEngine @@ -46,6 +53,20 @@ contract RuleEngineTest is Test, HelperContract { assertEq(ruleEngineMock.version(), "3.0.0"); } + function testSupportsInterfaces() public { + // Arrange + ruleEngineMock = new RuleEngine(RULE_ENGINE_OPERATOR_ADDRESS, address(0x0), ZERO_ADDRESS); + + // Act & Assert + assertTrue(ruleEngineMock.supportsInterface(type(IERC165).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(type(IAccessControl).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(type(IAccessControlEnumerable).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID)); + assertTrue(ruleEngineMock.supportsInterface(ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID)); + assertTrue(ruleEngineMock.supportsInterface(type(ICompliance).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(type(IERC7551ComplianceSubset).interfaceId)); + } + function testCannotDeployContractifAdminAddressIsZero() public { // Arrange vm.prank(WHITELIST_OPERATOR_ADDRESS); diff --git a/test/RuleEngineOwnable/AccessControl/RuleEngineOwnableAccessControl.t.sol b/test/RuleEngineOwnable/AccessControl/RuleEngineOwnableAccessControl.t.sol index 78dad9d..5d0b96c 100644 --- a/test/RuleEngineOwnable/AccessControl/RuleEngineOwnableAccessControl.t.sol +++ b/test/RuleEngineOwnable/AccessControl/RuleEngineOwnableAccessControl.t.sol @@ -5,7 +5,7 @@ import {Test} from "forge-std/Test.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "../../HelperContractOwnable.sol"; -import {Ownable} from "OZ/access/Ownable.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; /** * @title Access Control tests for RuleEngineOwnable diff --git a/test/RuleEngineOwnable/RuleEngineOwnableCoverage.t.sol b/test/RuleEngineOwnable/RuleEngineOwnableCoverage.t.sol index c5ef9ba..52ef58d 100644 --- a/test/RuleEngineOwnable/RuleEngineOwnableCoverage.t.sol +++ b/test/RuleEngineOwnable/RuleEngineOwnableCoverage.t.sol @@ -7,9 +7,12 @@ import "../HelperContractOwnable.sol"; import {RuleEngineOwnableExposed} from "src/mocks/RuleEngineExposed.sol"; import {RuleInvalidMock} from "src/mocks/RuleInvalidMock.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {ICompliance} from "src/mocks/ICompliance.sol"; +import {IERC7551ComplianceSubset} from "src/mocks/IERC7551ComplianceSubset.sol"; /** - * @title Coverage tests for RuleEngineOwnable (supportsInterface fallback, _msgData, ERC-165 rule check) + * @title Coverage tests for RuleEngineOwnable (_msgData, ERC-165 rule check) */ contract RuleEngineOwnableCoverageTest is Test, HelperContractOwnable { RuleEngineOwnableExposed public ruleEngineOwnableExposed; @@ -42,13 +45,23 @@ contract RuleEngineOwnableCoverageTest is Test, HelperContractOwnable { assertTrue(ruleEngineMock.supportsInterface(ERC173_ID)); } - function testSupportsERC165ViaAccessControlFallback() public view { - // This hits line 61: AccessControl.supportsInterface(interfaceId) + function testSupportsERC3643ComplianceInterface() public view { + assertTrue(ruleEngineMock.supportsInterface(type(ICompliance).interfaceId)); + } + + function testSupportsIERC7551ComplianceSubsetInterface() public view { + assertTrue(ruleEngineMock.supportsInterface(type(IERC7551ComplianceSubset).interfaceId)); + } + + function testSupportsERC165() public view { assertTrue(ruleEngineMock.supportsInterface(ERC165_ID)); } + function testDoesNotSupportIAccessControlInterface() public view { + assertFalse(ruleEngineMock.supportsInterface(type(IAccessControl).interfaceId)); + } + function testDoesNotSupportInvalidInterface() public view { - // Falls through all checks including AccessControl.supportsInterface -> false assertFalse(ruleEngineMock.supportsInterface(INVALID_ID)); } diff --git a/test/RuleEngineOwnable/RuleEngineOwnableDeployment.t.sol b/test/RuleEngineOwnable/RuleEngineOwnableDeployment.t.sol index 9e3062e..939b19a 100644 --- a/test/RuleEngineOwnable/RuleEngineOwnableDeployment.t.sol +++ b/test/RuleEngineOwnable/RuleEngineOwnableDeployment.t.sol @@ -5,6 +5,11 @@ import {Test} from "forge-std/Test.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "../HelperContractOwnable.sol"; import {MinimalForwarderMock} from "CMTAT/mocks/MinimalForwarderMock.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import {ERC1404ExtendInterfaceId} from "CMTAT/library/ERC1404ExtendInterfaceId.sol"; +import {RuleEngineInterfaceId} from "CMTAT/library/RuleEngineInterfaceId.sol"; +import {ICompliance} from "src/mocks/ICompliance.sol"; +import {IERC7551ComplianceSubset} from "src/mocks/IERC7551ComplianceSubset.sol"; /** * @title Deployment tests for RuleEngineOwnable @@ -55,12 +60,17 @@ contract RuleEngineOwnableDeploymentTest is Test, HelperContractOwnable { ruleEngineMock = new RuleEngineOwnable(address(0x0), address(forwarder), ZERO_ADDRESS); } - function testSupportsERC173Interface() public { + function testSupportsInterfaces() public { // Arrange ruleEngineMock = new RuleEngineOwnable(OWNER_ADDRESS, address(0x0), ZERO_ADDRESS); - // Act & Assert - ERC-173 interface ID - assertTrue(ruleEngineMock.supportsInterface(0x7f5828d0)); + // Act & Assert + assertTrue(ruleEngineMock.supportsInterface(type(IERC165).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(0x7f5828d0)); // ERC-173 + assertTrue(ruleEngineMock.supportsInterface(RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID)); + assertTrue(ruleEngineMock.supportsInterface(ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID)); + assertTrue(ruleEngineMock.supportsInterface(type(ICompliance).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(type(IERC7551ComplianceSubset).interfaceId)); } function testDeploymentWithTokenBound() public { diff --git a/test/RuleEngineOwnable2Step/RuleEngineOwnable2Step.t.sol b/test/RuleEngineOwnable2Step/RuleEngineOwnable2Step.t.sol new file mode 100644 index 0000000..2e096c2 --- /dev/null +++ b/test/RuleEngineOwnable2Step/RuleEngineOwnable2Step.t.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MPL-2.0 +pragma solidity ^0.8.20; + +import {Test} from "forge-std/Test.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {MinimalForwarderMock} from "CMTAT/mocks/MinimalForwarderMock.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import {ERC1404ExtendInterfaceId} from "CMTAT/library/ERC1404ExtendInterfaceId.sol"; +import {RuleEngineInterfaceId} from "CMTAT/library/RuleEngineInterfaceId.sol"; +import {ICompliance} from "src/mocks/ICompliance.sol"; +import {IERC7551ComplianceSubset} from "src/mocks/IERC7551ComplianceSubset.sol"; +// forge-lint: disable-next-line(unaliased-plain-import) +import "../HelperContractOwnable2Step.sol"; + +/** + * @title Deployment and ownership tests for RuleEngineOwnable2Step + */ +contract RuleEngineOwnable2StepTest is Test, HelperContractOwnable2Step { + bytes4 constant ERC173_ID = 0x7f5828d0; + + function setUp() public { + ruleEngineMock = new RuleEngineOwnable2Step(OWNER_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS); + ruleConditionalTransferLight = + new RuleConditionalTransferLight(CONDITIONAL_TRANSFER_OPERATOR_ADDRESS, ruleEngineMock); + } + + function testDeploymentSetsOwner() public view { + assertEq(ruleEngineMock.owner(), OWNER_ADDRESS); + } + + function testCannotDeployContractIfOwnerAddressIsZero() public { + vm.expectRevert(abi.encodeWithSignature("OwnableInvalidOwner(address)", ZERO_ADDRESS)); + new RuleEngineOwnable2Step(ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS); + } + + function testTrustedForwarderSetAtDeployment() public { + MinimalForwarderMock forwarder = new MinimalForwarderMock(); + forwarder.initialize(ERC2771ForwarderDomain); + + RuleEngineOwnable2Step ruleEngineWithForwarder = + new RuleEngineOwnable2Step(OWNER_ADDRESS, address(forwarder), ZERO_ADDRESS); + assertTrue(ruleEngineWithForwarder.isTrustedForwarder(address(forwarder))); + } + + function testSupportsOwnableAndComplianceInterfaces() public view { + assertTrue(ruleEngineMock.supportsInterface(type(IERC165).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(ERC173_ID)); + assertTrue(ruleEngineMock.supportsInterface(RuleEngineInterfaceId.RULE_ENGINE_INTERFACE_ID)); + assertTrue(ruleEngineMock.supportsInterface(ERC1404ExtendInterfaceId.ERC1404EXTEND_INTERFACE_ID)); + assertTrue(ruleEngineMock.supportsInterface(type(ICompliance).interfaceId)); + assertTrue(ruleEngineMock.supportsInterface(type(IERC7551ComplianceSubset).interfaceId)); + } + + function testOwnerCanAddRule() public { + vm.prank(OWNER_ADDRESS); + ruleEngineMock.addRule(ruleConditionalTransferLight); + assertEq(ruleEngineMock.rulesCount(), 1); + } + + function testNonOwnerCannotAddRule() public { + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, ATTACKER)); + vm.prank(ATTACKER); + ruleEngineMock.addRule(ruleConditionalTransferLight); + } + + function testTransferOwnershipSetsPendingOwner() public { + vm.prank(OWNER_ADDRESS); + ruleEngineMock.transferOwnership(NEW_OWNER_ADDRESS); + + assertEq(ruleEngineMock.owner(), OWNER_ADDRESS); + assertEq(ruleEngineMock.pendingOwner(), NEW_OWNER_ADDRESS); + } + + function testPendingOwnerCanAcceptOwnership() public { + vm.prank(OWNER_ADDRESS); + ruleEngineMock.transferOwnership(NEW_OWNER_ADDRESS); + + vm.prank(NEW_OWNER_ADDRESS); + ruleEngineMock.acceptOwnership(); + + assertEq(ruleEngineMock.owner(), NEW_OWNER_ADDRESS); + assertEq(ruleEngineMock.pendingOwner(), ZERO_ADDRESS); + } + + function testNonPendingOwnerCannotAcceptOwnership() public { + vm.prank(OWNER_ADDRESS); + ruleEngineMock.transferOwnership(NEW_OWNER_ADDRESS); + + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, ATTACKER)); + vm.prank(ATTACKER); + ruleEngineMock.acceptOwnership(); + } + + function testOwnerKeepsRightsUntilAcceptOwnership() public { + vm.prank(OWNER_ADDRESS); + ruleEngineMock.transferOwnership(NEW_OWNER_ADDRESS); + + vm.prank(OWNER_ADDRESS); + ruleEngineMock.addRule(ruleConditionalTransferLight); + + assertEq(ruleEngineMock.rulesCount(), 1); + } + + function testOldOwnerLosesRightsAfterAcceptOwnership() public { + vm.prank(OWNER_ADDRESS); + ruleEngineMock.transferOwnership(NEW_OWNER_ADDRESS); + + vm.prank(NEW_OWNER_ADDRESS); + ruleEngineMock.acceptOwnership(); + + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, OWNER_ADDRESS)); + vm.prank(OWNER_ADDRESS); + ruleEngineMock.clearRules(); + } +} diff --git a/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlOZ.t.sol b/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlOZ.t.sol index 9352f8c..314e912 100644 --- a/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlOZ.t.sol +++ b/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlOZ.t.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.20; import {Test} from "forge-std/Test.sol"; // forge-lint: disable-next-line(unaliased-plain-import) import "../../HelperContract.sol"; -import {AccessControl} from "OZ/access/AccessControl.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; /** diff --git a/test/hardhat/RuleEngine.smoke.js b/test/hardhat/RuleEngine.smoke.js new file mode 100644 index 0000000..d0491f1 --- /dev/null +++ b/test/hardhat/RuleEngine.smoke.js @@ -0,0 +1,23 @@ +const {expect} = require("chai"); +const {ethers} = require("hardhat"); + +describe("RuleEngine Hardhat smoke test", function () { + it("compiles, deploys, and exposes the expected basic state", async function () { + const [admin] = await ethers.getSigners(); + + const RuleEngine = await ethers.getContractFactory("RuleEngine"); + const ruleEngine = await RuleEngine.deploy( + admin.address, + ethers.ZeroAddress, + ethers.ZeroAddress + ); + await ruleEngine.waitForDeployment(); + + expect(await ruleEngine.version()).to.equal("3.0.0"); + expect(await ruleEngine.rulesCount()).to.equal(0n); + expect(await ruleEngine.getTokenBound()).to.equal(ethers.ZeroAddress); + + const defaultAdminRole = await ruleEngine.DEFAULT_ADMIN_ROLE(); + expect(await ruleEngine.hasRole(defaultAdminRole, admin.address)).to.equal(true); + }); +});