From df6e94c3d38e20acdf4f09b43932df73345031d9 Mon Sep 17 00:00:00 2001 From: Ryan Sauge <ryan.sauge@protonmail.com> Date: Tue, 9 Jul 2024 17:57:27 +0200 Subject: [PATCH 1/2] update doc --- LICENSE.md | 373 +++++ RuleEngineV2.0.2.json | 1449 +++++++++++++++++ RuleWhitelistWrapper.json | 1 + RuleWhitelistv2.0.2.json | 1081 ++++++++++++ doc/schema/RuleEngine | 2 +- doc/schema/rule/ruleWhitelistWrapper.drawio | 2 +- .../rule/ruleWhitelistWrapperV2.drawio.png | Bin 0 -> 111165 bytes 7 files changed, 2906 insertions(+), 2 deletions(-) create mode 100644 LICENSE.md create mode 100644 RuleEngineV2.0.2.json create mode 100644 RuleWhitelistWrapper.json create mode 100644 RuleWhitelistv2.0.2.json create mode 100644 doc/schema/rule/ruleWhitelistWrapperV2.drawio.png diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/RuleEngineV2.0.2.json b/RuleEngineV2.0.2.json new file mode 100644 index 0000000..aaf230e --- /dev/null +++ b/RuleEngineV2.0.2.json @@ -0,0 +1,1449 @@ +{ + "contractName": "RuleEngine", + "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": "DEFAULT_ADMIN_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "RULE_ENGINE_OPERATOR_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOKEN_CONTRACT_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addRuleOperation", + "inputs": [ + { + "name": "rule_", + "type": "address", + "internalType": "contract IRuleOperation" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addRuleValidation", + "inputs": [ + { + "name": "rule_", + "type": "address", + "internalType": "contract IRuleValidation" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "clearRulesOperation", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "clearRulesValidation", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "detectTransferRestriction", + "inputs": [ + { "name": "_from", "type": "address", "internalType": "address" }, + { "name": "_to", "type": "address", "internalType": "address" }, + { "name": "_amount", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "detectTransferRestrictionValidation", + "inputs": [ + { "name": "_from", "type": "address", "internalType": "address" }, + { "name": "_to", "type": "address", "internalType": "address" }, + { "name": "_amount", "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": "getRuleIndexOperation", + "inputs": [ + { + "name": "rule_", + "type": "address", + "internalType": "contract IRuleOperation" + } + ], + "outputs": [ + { "name": "index", "type": "uint256", "internalType": "uint256" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleIndexValidation", + "inputs": [ + { + "name": "rule_", + "type": "address", + "internalType": "contract IRuleValidation" + } + ], + "outputs": [ + { "name": "index", "type": "uint256", "internalType": "uint256" } + ], + "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": "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": "operateOnTransfer", + "inputs": [ + { "name": "from", "type": "address", "internalType": "address" }, + { "name": "to", "type": "address", "internalType": "address" }, + { "name": "amount", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [ + { "name": "isValid", "type": "bool", "internalType": "bool" } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRuleOperation", + "inputs": [ + { + "name": "rule_", + "type": "address", + "internalType": "contract IRuleOperation" + }, + { "name": "index", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRuleValidation", + "inputs": [ + { + "name": "rule_", + "type": "address", + "internalType": "contract IRuleValidation" + }, + { "name": "index", "type": "uint256", "internalType": "uint256" } + ], + "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": "ruleOperation", + "inputs": [ + { "name": "ruleId", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ruleValidation", + "inputs": [ + { "name": "ruleId", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "rulesCountOperation", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "rulesCountValidation", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "rulesOperation", + "inputs": [], + "outputs": [ + { "name": "", "type": "address[]", "internalType": "address[]" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "rulesValidation", + "inputs": [], + "outputs": [ + { "name": "", "type": "address[]", "internalType": "address[]" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setRulesOperation", + "inputs": [ + { "name": "rules_", "type": "address[]", "internalType": "address[]" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setRulesValidation", + "inputs": [ + { "name": "rules_", "type": "address[]", "internalType": "address[]" } + ], + "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": "trustedForwarder", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "validateTransfer", + "inputs": [ + { "name": "_from", "type": "address", "internalType": "address" }, + { "name": "_to", "type": "address", "internalType": "address" }, + { "name": "_amount", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "validateTransferValidation", + "inputs": [ + { "name": "_from", "type": "address", "internalType": "address" }, + { "name": "_to", "type": "address", "internalType": "address" }, + { "name": "_amount", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "event", + "name": "AddRule", + "inputs": [ + { + "name": "rule", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ClearRules", + "inputs": [ + { + "name": "rulesRemoved", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RemoveRule", + "inputs": [ + { + "name": "rule", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "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": "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_ArrayIsEmpty", "inputs": [] }, + { + "type": "error", + "name": "RuleEngine_RuleAddressZeroNotAllowed", + "inputs": [] + }, + { "type": "error", "name": "RuleEngine_RuleAlreadyExists", "inputs": [] }, + { "type": "error", "name": "RuleEngine_RuleDoNotMatch", "inputs": [] }, + { "type": "error", "name": "RuleEngine_TransferInvalid", "inputs": [] } + ], + "bytecode":"0x60a06040523480156200001157600080fd5b5060405162001db338038062001db3833981016040819052620000349162000246565b6001600160a01b0380831660805283166200006257604051630872273360e21b815260040160405180910390fd5b6001600160a01b03811615620000a0576200009e7fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a382620000e4565b505b620000ad600084620000e4565b50620000da7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99984620000e4565b505050506200030f565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200018b576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200014262000195565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200018f565b5060005b92915050565b6000620001a1620001a6565b905090565b6000366014620001b63362000202565b8015620001c35750808210155b15620001fa57600036620001d8838562000290565b620001e5928290620002b2565b620001f091620002de565b60601c9250505090565b339250505090565b60006200020e60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200024157600080fd5b919050565b6000806000606084860312156200025c57600080fd5b620002678462000229565b9250620002776020850162000229565b9150620002876040850162000229565b90509250925092565b818103818111156200018f57634e487b7160e01b600052601160045260246000fd5b60008085851115620002c357600080fd5b83861115620002d157600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620003075780818660140360031b1b83161692505b505092915050565b608051611a7a620003396000396000818161033d01528181610384015261137d0152611a7a6000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033", + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033", + "sourceMap": "323:5144:84:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1001:113:91;;;:::i;:::-;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;860:555:92;;;;;;:::i;:::-;;:::i;:::-;;;1633:4:139;1621:17;;;1603:36;;1591:2;1576:18;860:555:92;1461:184:139;4226:136:62;;;;;;:::i;:::-;;:::i;3255:118:91:-;3344:15;:22;3255:118;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3121:32:139;;;3103:51;;3091:2;3076:18;4051:143:93;2957:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;1622:107:66;1705:17;1622:107;;2978:1092:84;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4097:151:91;;;:::i;:::-;;;;;;;:::i;4143:464:84:-;;;;;;:::i;:::-;;:::i;4282:153:93:-;;;:::i;1794:214:91:-;;;;;;:::i;:::-;;:::i;2502:272:84:-;;;;;;:::i;:::-;;:::i;648:267:91:-;;;;;;:::i;:::-;;:::i;3868:141::-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;2408:191:91:-;;;;;;:::i;:::-;;:::i;3526:187::-;;;;;;:::i;:::-;;:::i;1438:829:84:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;1650:292:92:-;;;;;;:::i;:::-;;:::i;1001:113:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1085:22:91::1;:20;:22::i;:::-;1001:113:::0;:::o;2565:202:62:-;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;860:555:92:-;1049:16;:23;1010:5;;;1082:272;1106:11;1102:1;:15;1082:272;;;1138:17;1174:16;1191:1;1174:19;;;;;;;;:::i;:::-;;;;;;;;;;;1158:100;;-1:-1:-1;;;1158:100:92;;-1:-1:-1;;;;;6735:15:139;;;1158:100:92;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;1174:19:92;;;;1158:79;;6652:18:139;;1158:100:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1138:120;-1:-1:-1;1276:15:92;;;;1272:72;;1318:11;-1:-1:-1;1311:18:92;;-1:-1:-1;;1311:18:92;1272:72;-1:-1:-1;1119:3:92;;1082:272;;;-1:-1:-1;1377:30:92;1371:37;1364:44;;;860:555;;;;;;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;2978:1092:84:-:0;3156:16;:23;3087:13;;3134:19;3189:379;3213:11;3209:1;:15;3189:379;;;3282:16;3299:1;3282:19;;;;;;;;:::i;:::-;;;;;;;;;;;3266:108;;-1:-1:-1;;;3266:108:84;;1633:4:139;1621:17;;3266:108:84;;;1603:36:139;-1:-1:-1;;;;;3282:19:84;;;;3266:90;;1576:18:139;;3266:108:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3245:313;;;3450:16;3467:1;3450:19;;;;;;;;:::i;:::-;;;;;;;;;;;3434:109;;-1:-1:-1;;;3434:109:84;;1633:4:139;1621:17;;3434:109:84;;;1603:36:139;-1:-1:-1;;;;;3450:19:84;;;;3434:91;;1576:18:139;;3434:109:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3434:109:84;;;;;;;;;;;;:::i;:::-;3407:136;2978:1092;-1:-1:-1;;;;2978:1092:84:o;3245:313::-;3226:3;;3189:379;;;-1:-1:-1;;3612:15:84;:22;3649:9;3644:377;3668:11;3664:1;:15;3644:377;;;3737:15;3753:1;3737:18;;;;;;;;:::i;:::-;;;;;;;;;;;3721:107;;-1:-1:-1;;;3721:107:84;;1633:4:139;1621:17;;3721:107:84;;;1603:36:139;-1:-1:-1;;;;;3737:18:84;;;;3721:89;;1576:18:139;;3721:107:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3700:311;;;3904:15;3920:1;3904:18;;;;;;;;:::i;3700:311::-;3681:3;;3644:377;;;-1:-1:-1;;4030:33:84;;;;;;;;;;;;;;;;;;2978:1092;-1:-1:-1;;2978:1092:84:o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;2854:136:62:-:0;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4097:151:91:-;4187:16;4226:15;4219:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4219:22:91;;;;;;;;;;;;;;;;;;;;;;;4097:151;:::o;4143:464:84:-;4299:12;856:32:90;2464:16:62;2475:4;2464:10;:16::i;:::-;4374:65:84::1;4422:4;4428:2;4432:6;4374:47;:65::i;:::-;4356:131;;4471:5;4464:12;;;;4356:131;4544:56;4583:4;4589:2;4593:6;4544:38;:56::i;2490:1:62:-;4143:464:84::0;;;;;;:::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;1794:214:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1909:54:91::1;1931:15;1956:5;1909:21;:54::i;:::-;1978:23;::::0;-1:-1:-1;;;;;1978:23:91;::::1;::::0;::::1;::::0;;;::::1;1794:214:::0;;:::o;2502:272:84:-;2633:4;;2668:46;2694:5;2701:3;2706:7;2668:25;:46::i;:::-;:99;;;;2502:272;-1:-1:-1;;;;2502:272:84:o;648:267:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;773:15:91::1;:22:::0;:26;769:79:::1;;815:22;:20;:22::i;:::-;857:17;867:6;;857:9;:17::i;:::-;884:24;:15;902:6:::0;;884:24:::1;:::i;3868:141::-:0;3953:7;3979:15;3995:6;3979:23;;;;;;;;:::i;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;2408:191:91:-:0;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2549:43:91::1;2578:5;2586;2549:20;:43::i;3526:187::-:0;3616:13;3648:58;3674:15;3699:5;3648:25;:58::i;1438:829:84:-;1578:5;1617:10;1630:123;1700:5;1719:3;1736:7;1630:56;:123::i;:::-;1617:136;-1:-1:-1;1767:45:84;;;;1763:87;;1835:4;-1:-1:-1;1828:11:84;;1763:87;1903:15;:22;1881:19;1935:271;1959:11;1955:1;:15;1935:271;;;1991:17;2027:15;2043:1;2027:18;;;;;;;;:::i;:::-;;;;;;;;;;;2011:99;;-1:-1:-1;;;2011:99:84;;-1:-1:-1;;;;;6735:15:139;;;2011:99:84;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;2027:18:84;;;;2011:78;;6652:18:139;;2011:99:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1991:119;-1:-1:-1;2128:15:84;;;;2124:72;;2170:11;-1:-1:-1;2163:18:84;;-1:-1:-1;;;2163:18:84;2124:72;-1:-1:-1;1972:3:84;;1935:271;;;-1:-1:-1;2229:30:84;2216:44;1438:829;-1:-1:-1;;;;;;1438:829:84:o;4642:138:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;1650:292:92:-:0;1791:4;;1826:56;1862:5;1869:3;1874:7;1826:35;:56::i;3199:103:62:-;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;1200:439:91:-;1363:15;:22;1251:13;;1346:245;1387:5;;1346:245;;1500:1;1496;:5;1488:13;;1529:51;1550:15;1566:5;1550:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1550:22:91;1574:5;1529:20;:51::i;:::-;1394:3;;;:::i;:::-;;;1346:245;;;;1605:27;1616:15;1605:27;;;;;;:::i;:::-;;;;;;;;1241:398;1200:439::o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;4708:182:84;4819:14;4856:27;:25;:27::i;:::-;4849:34;;4708:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;4473:513:91:-;4640:15;:22;4594:12;;;4672:287;4696:11;4692:1;:15;4672:287;;;4728:11;4757:15;4773:1;4757:18;;;;;;;;:::i;:::-;;;;;;;;;;;4742:135;;-1:-1:-1;;;4742:135:91;;-1:-1:-1;;;;;6735:15:139;;;4742:135:91;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;4757:18:91;;;;4742:52;;6652:18:139;;4742:135:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4728:149;;4896:6;4891:58;;4929:5;4922:12;;;;;;;4891:58;-1:-1:-1;4709:3:91;;4672:287;;;-1:-1:-1;4975:4:91;;4473:513;-1:-1:-1;;;;;4473:513:91:o;1351:354:94:-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;2999:182:91:-;3078:55;3103:15;3120:5;3127;3078:24;:55::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9708:32:139;;3565:47:62;;;9690:51:139;9757:18;;;9750:34;;;9663:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;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:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:456;1077:6;1085;1093;1146:2;1134:9;1125:7;1121:23;1117:32;1114:52;;;1162:1;1159;1152:12;1114:52;1201:9;1188:23;1220:31;1245:5;1220:31;:::i;:::-;1270:5;-1:-1:-1;1327:2:139;1312:18;;1299:32;1340:33;1299:32;1340:33;:::i;:::-;1000:456;;1392:7;;-1:-1:-1;;;1446:2:139;1431:18;;;;1418:32;;1000:456::o;1650:315::-;1718:6;1726;1779:2;1767:9;1758:7;1754:23;1750:32;1747:52;;;1795:1;1792;1785:12;1747:52;1831:9;1818:23;1808:33;;1891:2;1880:9;1876:18;1863:32;1904:31;1929:5;1904:31;:::i;:::-;1954:5;1944:15;;;1650:315;;;;;:::o;2152:615::-;2238:6;2246;2299:2;2287:9;2278:7;2274:23;2270:32;2267:52;;;2315:1;2312;2305:12;2267:52;2355:9;2342:23;2384:18;2425:2;2417:6;2414:14;2411:34;;;2441:1;2438;2431:12;2411:34;2479:6;2468:9;2464:22;2454:32;;2524:7;2517:4;2513:2;2509:13;2505:27;2495:55;;2546:1;2543;2536:12;2495:55;2586:2;2573:16;2612:2;2604:6;2601:14;2598:34;;;2628:1;2625;2618:12;2598:34;2681:7;2676:2;2666:6;2663:1;2659:14;2655:2;2651:23;2647:32;2644:45;2641:65;;;2702:1;2699;2692:12;2641:65;2733:2;2725:11;;;;;2755:6;;-1:-1:-1;2152:615:139;;-1:-1:-1;;;;2152:615:139:o;3165:340::-;3258:6;3266;3319:2;3307:9;3298:7;3294:23;3290:32;3287:52;;;3335:1;3332;3325:12;3287:52;3374:9;3361:23;3393:31;3418:5;3393:31;:::i;:::-;3443:5;3495:2;3480:18;;;;3467:32;;-1:-1:-1;;;3165:340:139:o;3510:247::-;3569:6;3622:2;3610:9;3601:7;3597:23;3593:32;3590:52;;;3638:1;3635;3628:12;3590:52;3677:9;3664:23;3696:31;3721:5;3696:31;:::i;3762:114::-;3846:4;3839:5;3835:16;3828:5;3825:27;3815:55;;3866:1;3863;3856:12;3881:243;3938:6;3991:2;3979:9;3970:7;3966:23;3962:32;3959:52;;;4007:1;4004;3997:12;3959:52;4046:9;4033:23;4065:29;4088:5;4065:29;:::i;4129:250::-;4214:1;4224:113;4238:6;4235:1;4232:13;4224:113;;;4314:11;;;4308:18;4295:11;;;4288:39;4260:2;4253:10;4224:113;;;-1:-1:-1;;4371:1:139;4353:16;;4346:27;4129:250::o;4384:396::-;4533:2;4522:9;4515:21;4496:4;4565:6;4559:13;4608:6;4603:2;4592:9;4588:18;4581:34;4624:79;4696:6;4691:2;4680:9;4676:18;4671:2;4663:6;4659:15;4624:79;:::i;:::-;4764:2;4743:15;-1:-1:-1;;4739:29:139;4724:45;;;;4771:2;4720:54;;4384:396;-1:-1:-1;;4384:396:139:o;5062:658::-;5233:2;5285:21;;;5355:13;;5258:18;;;5377:22;;;5204:4;;5233:2;5456:15;;;;5430:2;5415:18;;;5204:4;5499:195;5513:6;5510:1;5507:13;5499:195;;;5578:13;;-1:-1:-1;;;;;5574:39:139;5562:52;;5669:15;;;;5634:12;;;;5610:1;5528:9;5499:195;;;-1:-1:-1;5711:3:139;;5062:658;-1:-1:-1;;;;;;5062:658:139:o;6345:127::-;6406:10;6401:3;6397:20;6394:1;6387:31;6437:4;6434:1;6427:15;6461:4;6458:1;6451:15;6857:247;6925:6;6978:2;6966:9;6957:7;6953:23;6949:32;6946:52;;;6994:1;6991;6984:12;6946:52;7026:9;7020:16;7045:29;7068:5;7045:29;:::i;7241:277::-;7308:6;7361:2;7349:9;7340:7;7336:23;7332:32;7329:52;;;7377:1;7374;7367:12;7329:52;7409:9;7403:16;7462:5;7455:13;7448:21;7441:5;7438:32;7428:60;;7484:1;7481;7474:12;7523:127;7584:10;7579:3;7575:20;7572:1;7565:31;7615:4;7612:1;7605:15;7639:4;7636:1;7629:15;7655:897;7735:6;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7837:9;7831:16;7866:18;7907:2;7899:6;7896:14;7893:34;;;7923:1;7920;7913:12;7893:34;7961:6;7950:9;7946:22;7936:32;;8006:7;7999:4;7995:2;7991:13;7987:27;7977:55;;8028:1;8025;8018:12;7977:55;8057:2;8051:9;8079:2;8075;8072:10;8069:36;;;8085:18;;:::i;:::-;8160:2;8154:9;8128:2;8214:13;;-1:-1:-1;;8210:22:139;;;8234:2;8206:31;8202:40;8190:53;;;8258:18;;;8278:22;;;8255:46;8252:72;;;8304:18;;:::i;:::-;8344:10;8340:2;8333:22;8379:2;8371:6;8364:18;8419:7;8414:2;8409;8405;8401:11;8397:20;8394:33;8391:53;;;8440:1;8437;8430:12;8391:53;8453:68;8518:2;8513;8505:6;8501:15;8496:2;8492;8488:11;8453:68;:::i;:::-;8540:6;7655:897;-1:-1:-1;;;;;;;7655:897:139:o;8557:127::-;8618:10;8613:3;8609:20;8606:1;8599:31;8649:4;8646:1;8639:15;8673:4;8670:1;8663:15;8689:136;8728:3;8756:5;8746:39;;8765:18;;:::i;:::-;-1:-1:-1;;;8801:18:139;;8689:136::o;8830:681::-;8998:2;9050:21;;;9120:13;;9023:18;;;9142:22;;;8969:4;9207:17;;;9247:16;;;8969:4;;8998:2;9195;9180:18;;;8969:4;9291:194;9305:6;9302:1;9299:13;9291:194;;;9370:13;;-1:-1:-1;;;;;9366:39:139;9354:52;;9402:1;9461:14;;;;9426:12;;;;9320:9;9291:194;;9795:128;9862:9;;;9883:11;;;9880:37;;;9897:18;;:::i;9928:331::-;10033:9;10044;10086:8;10074:10;10071:24;10068:44;;;10108:1;10105;10098:12;10068:44;10137:6;10127:8;10124:20;10121:40;;;10157:1;10154;10147:12;10121:40;-1:-1:-1;;10183:23:139;;;10228:25;;;;;-1:-1:-1;9928:331:139:o;10264:337::-;-1:-1:-1;;10385:19:139;;10472:11;;;;10503:2;10495:11;;10492:103;;;10582:2;10576;10569:3;10565:2;10561:12;10558:1;10554:20;10550:29;10546:2;10542:38;10538:47;10529:56;;10492:103;;;10264:337;;;;:::o;10606:127::-;10667:10;10662:3;10658:20;10655:1;10648:31;10698:4;10695:1;10688:15;10722:4;10719:1;10712:15", + "linkReferences": {}, + "immutableReferences": { + "54247": [ + { "start": 829, "length": 32 }, + { "start": 900, "length": 32 }, + { "start": 4989, "length": 32 } + ] + } + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "RULE_ENGINE_OPERATOR_ROLE()": "6728f545", + "TOKEN_CONTRACT_ROLE()": "0fbbfb55", + "addRuleOperation(address)": "c68a651a", + "addRuleValidation(address)": "cd1d4dc7", + "clearRulesOperation()": "001582f7", + "clearRulesValidation()": "8a1b6c8e", + "detectTransferRestriction(address,address,uint256)": "d4ce1415", + "detectTransferRestrictionValidation(address,address,uint256)": "28aa67bc", + "getRoleAdmin(bytes32)": "248a9ca3", + "getRuleIndexOperation(address)": "d0e835f2", + "getRuleIndexValidation(address)": "83304df0", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "isTrustedForwarder(address)": "572b6c05", + "messageForTransferRestriction(uint8)": "7f4ab1dd", + "operateOnTransfer(address,address,uint256)": "c03888c2", + "removeRuleOperation(address,uint256)": "ce29ed35", + "removeRuleValidation(address,uint256)": "4d53374e", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "ruleOperation(uint256)": "ca3e16e7", + "ruleValidation(uint256)": "397a7d3c", + "rulesCountOperation()": "323a4616", + "rulesCountValidation()": "8a2021b1", + "rulesOperation()": "a39eda14", + "rulesValidation()": "c57086a1", + "setRulesOperation(address[])": "ca1f6c4d", + "setRulesValidation(address[])": "334a29cc", + "supportsInterface(bytes4)": "01ffc9a7", + "trustedForwarder()": "7da0a877", + "validateTransfer(address,address,uint256)": "c6946a12", + "validateTransferValidation(address,address,uint256)": "eb2647e3" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"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_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_TransferInvalid\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"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\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestrictionValidation\",\"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\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"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\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"operateOnTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"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\":\"ruleOperation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesOperation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"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\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransferValidation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":{\"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 signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"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`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexOperation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesOperation.length otherwise\"}},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"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\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"removeRuleOperation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"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.\"},\"ruleOperation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountOperation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesOperation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"validateTransferValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}}},\"title\":\"Implementation of a ruleEngine as defined by the CMTAT\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleOperation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"clearRulesOperation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"getRuleIndexOperation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the message corresponding to the code\"},\"removeRuleOperation(address,uint256)\":{\"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\"},\"removeRuleValidation(address,uint256)\":{\"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\"},\"ruleOperation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesOperation()\":{\"notice\":\"Get all the rules\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesOperation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"},\"validateTransferValidation(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/RuleEngine.sol\":\"RuleEngine\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol\":{\"keccak256\":\"0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607\",\"dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/RuleEngine.sol\":{\"keccak256\":\"0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b\",\"dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya\"]},\"src/interfaces/IRuleEngineOperation.sol\":{\"keccak256\":\"0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91\",\"dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleOperation.sol\":{\"keccak256\":\"0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce\",\"dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineOperation.sol\":{\"keccak256\":\"0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd\",\"dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs\"]},\"src/modules/RuleEngineValidation.sol\":{\"keccak256\":\"0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a\",\"dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]}},\"version\":1}", + "metadata": { + "compiler": { "version": "0.8.22+commit.4fc1097e" }, + "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_ArrayIsEmpty" }, + { + "inputs": [], + "type": "error", + "name": "RuleEngine_RuleAddressZeroNotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "RuleEngine_RuleAlreadyExists" + }, + { "inputs": [], "type": "error", "name": "RuleEngine_RuleDoNotMatch" }, + { "inputs": [], "type": "error", "name": "RuleEngine_TransferInvalid" }, + { + "inputs": [ + { + "internalType": "address", + "name": "rule", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "AddRule", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "rulesRemoved", + "type": "address[]", + "indexed": false + } + ], + "type": "event", + "name": "ClearRules", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "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": [], + "stateMutability": "view", + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "RULE_ENGINE_OPERATOR_ROLE", + "outputs": [ + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "TOKEN_CONTRACT_ROLE", + "outputs": [ + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ] + }, + { + "inputs": [ + { + "internalType": "contract IRuleOperation", + "name": "rule_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addRuleOperation" + }, + { + "inputs": [ + { + "internalType": "contract IRuleValidation", + "name": "rule_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addRuleValidation" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "clearRulesOperation" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "clearRulesValidation" + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_amount", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "detectTransferRestriction", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }] + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_amount", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "detectTransferRestrictionValidation", + "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": "contract IRuleOperation", + "name": "rule_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleIndexOperation", + "outputs": [ + { "internalType": "uint256", "name": "index", "type": "uint256" } + ] + }, + { + "inputs": [ + { + "internalType": "contract IRuleValidation", + "name": "rule_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleIndexValidation", + "outputs": [ + { "internalType": "uint256", "name": "index", "type": "uint256" } + ] + }, + { + "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": "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": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "operateOnTransfer", + "outputs": [ + { "internalType": "bool", "name": "isValid", "type": "bool" } + ] + }, + { + "inputs": [ + { + "internalType": "contract IRuleOperation", + "name": "rule_", + "type": "address" + }, + { "internalType": "uint256", "name": "index", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRuleOperation" + }, + { + "inputs": [ + { + "internalType": "contract IRuleValidation", + "name": "rule_", + "type": "address" + }, + { "internalType": "uint256", "name": "index", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRuleValidation" + }, + { + "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": "ruleOperation", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { "internalType": "uint256", "name": "ruleId", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "ruleValidation", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "rulesCountOperation", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "rulesCountValidation", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "rulesOperation", + "outputs": [ + { "internalType": "address[]", "name": "", "type": "address[]" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "rulesValidation", + "outputs": [ + { "internalType": "address[]", "name": "", "type": "address[]" } + ] + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "rules_", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setRulesOperation" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "rules_", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setRulesValidation" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "supportsInterface", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "trustedForwarder", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_amount", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "validateTransfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_amount", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "validateTransferValidation", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "admin": "Address of the contract (Access Control)", + "forwarderIrrevocable": "Address of the forwarder, required for the gasless support" + } + }, + "detectTransferRestriction(address,address,uint256)": { + "params": { + "_amount": "to transfer", + "_from": "the origin address", + "_to": "the destination address" + }, + "returns": { + "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*" + } + }, + "detectTransferRestrictionValidation(address,address,uint256)": { + "params": { + "_amount": "to transfer", + "_from": "the origin address", + "_to": "the destination address" + }, + "returns": { + "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*" + } + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getRuleIndexOperation(address)": { + "returns": { + "index": "if the rule is found, _rulesOperation.length otherwise" + } + }, + "getRuleIndexValidation(address)": { + "returns": { + "index": "if the rule is found, _rulesValidation.length otherwise" + } + }, + "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": "Returns `true` if `account` has been granted `role`." + }, + "isTrustedForwarder(address)": { + "details": "Indicates whether any particular address is the trusted forwarder." + }, + "messageForTransferRestriction(uint8)": { + "params": { "_restrictionCode": "The target restriction code" }, + "returns": { + "_0": "True if the transfer is valid, false otherwise*" + } + }, + "removeRuleOperation(address,uint256)": { + "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove", + "params": { + "index": "the position inside the array of rule", + "rule_": "address of the target rule" + } + }, + "removeRuleValidation(address,uint256)": { + "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove", + "params": { + "index": "the position inside the array of rule", + "rule_": "address of the target rule" + } + }, + "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." + }, + "ruleOperation(uint256)": { + "params": { "ruleId": "index of the rule" }, + "returns": { "_0": "a rule address" } + }, + "ruleValidation(uint256)": { + "params": { "ruleId": "index of the rule" }, + "returns": { "_0": "a rule address" } + }, + "rulesCountOperation()": { + "returns": { "_0": "The number of rules inside the array" } + }, + "rulesCountValidation()": { + "returns": { "_0": "The number of rules inside the array" } + }, + "rulesOperation()": { "returns": { "_0": "An array of rules" } }, + "rulesValidation()": { "returns": { "_0": "An array of rules" } }, + "setRulesValidation(address[])": { + "details": "take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]" + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "trustedForwarder()": { + "details": "Returns the address of the trusted forwarder." + }, + "validateTransfer(address,address,uint256)": { + "params": { + "_amount": "to transfer", + "_from": "the origin address", + "_to": "the destination address" + }, + "returns": { + "_0": "True if the transfer is valid, false otherwise*" + } + }, + "validateTransferValidation(address,address,uint256)": { + "params": { + "_amount": "to transfer", + "_from": "the origin address", + "_to": "the destination address" + }, + "returns": { + "_0": "True if the transfer is valid, false otherwise*" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "RULE_ENGINE_OPERATOR_ROLE()": { + "notice": "Role to manage the ruleEngine" + }, + "TOKEN_CONTRACT_ROLE()": { "notice": "token contract" }, + "addRuleOperation(address)": { + "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present" + }, + "addRuleValidation(address)": { + "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present" + }, + "clearRulesOperation()": { + "notice": "Clear all the rules of the array of rules" + }, + "clearRulesValidation()": { + "notice": "Clear all the rules of the array of rules" + }, + "detectTransferRestriction(address,address,uint256)": { + "notice": "Go through all the rule to know if a restriction exists on the transfer" + }, + "detectTransferRestrictionValidation(address,address,uint256)": { + "notice": "Go through all the rule to know if a restriction exists on the transfer" + }, + "getRuleIndexOperation(address)": { + "notice": "Get the index of a rule inside the list" + }, + "getRuleIndexValidation(address)": { + "notice": "Get the index of a rule inside the list" + }, + "messageForTransferRestriction(uint8)": { + "notice": "Return the message corresponding to the code" + }, + "removeRuleOperation(address,uint256)": { + "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" + }, + "removeRuleValidation(address,uint256)": { + "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" + }, + "ruleOperation(uint256)": { + "notice": "Get the rule at the position specified by ruleId" + }, + "ruleValidation(uint256)": { + "notice": "Get the rule at the position specified by ruleId" + }, + "rulesOperation()": { "notice": "Get all the rules" }, + "rulesValidation()": { "notice": "Get all the rules" }, + "setRulesOperation(address[])": { + "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present" + }, + "setRulesValidation(address[])": { + "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present" + }, + "validateTransfer(address,address,uint256)": { + "notice": "Validate a transfer" + }, + "validateTransferValidation(address,address,uint256)": { + "notice": "Validate a transfer" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", + "CMTAT/=lib/CMTAT/contracts/", + "OZ/=lib/openzeppelin-contracts/contracts/", + "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", + "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/" + ], + "optimizer": { "enabled": true, "runs": 200 }, + "metadata": { "bytecodeHash": "ipfs" }, + "compilationTarget": { "src/RuleEngine.sol": "RuleEngine" }, + "evmVersion": "london", + "libraries": {} + }, + "sources": { + "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": { + "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad", + "urls": [ + "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0", + "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg" + ], + "license": "MPL-2.0" + }, + "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": { + "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed", + "urls": [ + "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423", + "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx" + ], + "license": "MPL-2.0" + }, + "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": { + "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3", + "urls": [ + "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e", + "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF" + ], + "license": "MPL-2.0" + }, + "lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol": { + "keccak256": "0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f", + "urls": [ + "bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607", + "dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc" + ], + "license": "MPL-2.0" + }, + "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": { + "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308", + "urls": [ + "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80", + "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": { + "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41", + "urls": [ + "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26", + "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": { + "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6", + "urls": [ + "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f", + "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK" + ], + "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/introspection/ERC165.sol": { + "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", + "urls": [ + "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", + "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "src/RuleEngine.sol": { + "keccak256": "0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5", + "urls": [ + "bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b", + "dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya" + ], + "license": "MPL-2.0" + }, + "src/interfaces/IRuleEngineOperation.sol": { + "keccak256": "0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809", + "urls": [ + "bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91", + "dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76" + ], + "license": "MPL-2.0" + }, + "src/interfaces/IRuleEngineValidation.sol": { + "keccak256": "0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1", + "urls": [ + "bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20", + "dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT" + ], + "license": "MPL-2.0" + }, + "src/interfaces/IRuleOperation.sol": { + "keccak256": "0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6", + "urls": [ + "bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce", + "dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE" + ], + "license": "MPL-2.0" + }, + "src/interfaces/IRuleValidation.sol": { + "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1", + "urls": [ + "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9", + "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8" + ], + "license": "MPL-2.0" + }, + "src/modules/MetaTxModuleStandalone.sol": { + "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0", + "urls": [ + "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25", + "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj" + ], + "license": "MPL-2.0" + }, + "src/modules/RuleEngineInvariantStorage.sol": { + "keccak256": "0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0", + "urls": [ + "bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44", + "dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq" + ], + "license": "MPL-2.0" + }, + "src/modules/RuleEngineOperation.sol": { + "keccak256": "0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a", + "urls": [ + "bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd", + "dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs" + ], + "license": "MPL-2.0" + }, + "src/modules/RuleEngineValidation.sol": { + "keccak256": "0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367", + "urls": [ + "bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a", + "dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w" + ], + "license": "MPL-2.0" + }, + "src/modules/RuleEngineValidationCommon.sol": { + "keccak256": "0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb", + "urls": [ + "bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d", + "dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk" + ], + "license": "MPL-2.0" + }, + "src/modules/RuleInternal.sol": { + "keccak256": "0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c", + "urls": [ + "bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3", + "dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A" + ], + "license": "MPL-2.0" + } + }, + "version": 1 + }, + "id": 84 +} diff --git a/RuleWhitelistWrapper.json b/RuleWhitelistWrapper.json new file mode 100644 index 0000000..73281c9 --- /dev/null +++ b/RuleWhitelistWrapper.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"forwarderIrrevocable","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"TOKEN_CONTRACT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canReturnTransferRestrictionCode","inputs":[{"name":"_restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"clearRulesValidation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"detectTransferRestriction","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"","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":"getRuleIndexValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"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":"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":"pure"},{"type":"function","name":"removeRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"},{"name":"index","type":"uint256","internalType":"uint256"}],"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":"ruleValidation","inputs":[{"name":"ruleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"rulesCountValidation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"rulesValidation","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"setRulesValidation","inputs":[{"name":"rules_","type":"address[]","internalType":"address[]"}],"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":"trustedForwarder","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"validateTransfer","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"isValid","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"AddRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ClearRules","inputs":[{"name":"rulesRemoved","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"RemoveRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"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":"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_ArrayIsEmpty","inputs":[]},{"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_RuleAlreadyExists","inputs":[]},{"type":"error","name":"RuleEngine_RuleDoNotMatch","inputs":[]}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b506040516200197138038062001971833981016040819052620000349162000207565b6001600160a01b0380821660805282166200006257604051630872273360e21b815260040160405180910390fd5b6200006f600083620000a5565b506200009c7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99983620000a5565b505050620002be565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200014c576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200010362000156565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000150565b5060005b92915050565b60006200016262000167565b905090565b60003660146200017733620001c3565b8015620001845750808210155b15620001bb576000366200019983856200023f565b620001a692829062000261565b620001b1916200028d565b60601c9250505090565b339250505090565b6000620001cf60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200020257600080fd5b919050565b600080604083850312156200021b57600080fd5b6200022683620001ea565b91506200023660208401620001ea565b90509250929050565b818103818111156200015057634e487b7160e01b600052601160045260246000fd5b600080858511156200027257600080fd5b838611156200028057600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002b65780818660140360031b1b83161692505b505092915050565b608051611689620002e860003960008181610281015281816102f50152610f4701526116896000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;672:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1498:37:66;;;;;810:19:101;::::1;806:100;;852:43;;-1:-1:-1::0;;;852:43:101::1;;;;;;;;;;;806:100;915:37;2232:4:62;946:5:101::0;915:10:::1;:37::i;:::-;-1:-1:-1::0;962:44:101::1;726:38:90;1000:5:101::0;962:10:::1;:44::i;:::-;;672:341:::0;;378:3013;;6179:316:62;6256:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6272:217;6179:316;;;;:::o;2632:182:101:-;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2401:30;2420:10;2401:18;:30::i;:::-;:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;1830:137::-;1906:4;1942:18;1705:17;;;1622:107;1942:18;-1:-1:-1;;;;;1929:31:66;:9;-1:-1:-1;;;;;1929:31:66;;1922:38;;1830:137;;;:::o;14:177:139:-;93:13;;-1:-1:-1;;;;;135:31:139;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:293::-;275:6;283;336:2;324:9;315:7;311:23;307:32;304:52;;;352:1;349;342:12;304:52;375:40;405:9;375:40;:::i;:::-;365:50;;434:49;479:2;468:9;464:18;434:49;:::i;:::-;424:59;;196:293;;;;;:::o;494:225::-;561:9;;;582:11;;;579:134;;;635:10;630:3;626:20;623:1;616:31;670:4;667:1;660:15;698:4;695:1;688:15;724:331;829:9;840;882:8;870:10;867:24;864:44;;;904:1;901;894:12;864:44;933:6;923:8;920:20;917:40;;;953:1;950;943:12;917:40;-1:-1:-1;;979:23:139;;;1024:25;;;;;-1:-1:-1;724:331:139:o;1060:329::-;-1:-1:-1;;;;;;1181:19:139;;1260:11;;;;1291:2;1283:11;;1280:103;;;1370:2;1364;1357:3;1353:2;1349:12;1346:1;1342:20;1338:29;1334:2;1330:38;1326:47;1317:56;;1280:103;;;1060:329;;;;:::o;:::-;378:3013:101;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;:::-;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2289:32:139;;;2271:51;;2259:2;2244:18;4051:143:93;2125:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;3102:4:139;3090:17;;;3072:36;;3060:2;3045:18;490:60:106;2930:184:139;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;511:274:110;;;;;;:::i;:::-;;:::i;1622:107:66:-;1705:17;1622:107;;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4282:153:93;;;:::i;:::-;;;;;;;:::i;418:355:109:-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;1284:1247:101:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;4226:136::-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;511:274:110:-:0;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;:::-;1163:115:::0;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6144:15:139;;;662:51:109;;;6126:34:139;6196:15;;6176:18;;;6169:43;6228:18;;;6221:34;;;549:12:109;;;;662:4;;:30;;6061:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;:::-;2150:23;::::0;-1:-1:-1;;;;;2150:23:93;::::1;::::0;::::1;::::0;;;::::1;1963:217:::0;;:::o;1284:1247:101:-;1478:16;;;1492:1;1478:16;;;;;;;;1428:5;;;;1478:16;1492:1;1478:16;;;;;;;;-1:-1:-1;;1529:13:101;;;1540:1;1529:13;;;;;;;;1445:49;;-1:-1:-1;1504:22:101;;1529:13;;-1:-1:-1;1540:1:101;1529:13;;;;;;;;-1:-1:-1;;1575:13:101;;;1586:1;1575:13;;;;;;;;1504:38;;-1:-1:-1;1552:20:101;;1575:13;;-1:-1:-1;1586:1:101;1575:13;;;;;;;;;;-1:-1:-1;1575:13:101;1552:36;;1617:5;1598:13;1612:1;1598:16;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;1598:24:101;;;-1:-1:-1;;;;;1598:24:101;;;;;1651:3;1632:13;1646:1;1632:16;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1632:22:101;;;:16;;;;;;;;;;;:22;1686:16;:23;1664:19;1797:478;1821:11;1817:1;:15;1797:478;;;1909:16;1926:1;1909:19;;;;;;;;:::i;:::-;;;;;;;;;;;1893:89;;-1:-1:-1;;;1893:89:101;;-1:-1:-1;;;;;1909:19:101;;;;1893:74;;:89;;1968:13;;1893:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1893:89:101;;;;;;;;;;;;:::i;:::-;1882:100;;2000:8;2009:1;2000:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2016:6;2023:1;2016:9;;;;;;;;:::i;:::-;;;;;;;2015:10;2000:25;1996:129;;;2106:4;2094:6;2101:1;2094:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;1996:129;2142:8;2151:1;2142:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2158:6;2165:1;2158:9;;;;;;;;:::i;:::-;;;;;;;2157:10;2142:25;2138:127;;;2246:4;2234:6;2241:1;2234:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;2138:127;1834:3;;1797:478;;;;2289:6;2296:1;2289:9;;;;;;;;:::i;:::-;;;;;;;2284:241;;548:2:106;2314:40:101;;;;;;;;2284:241;2376:6;2383:1;2376:9;;;;;;;;:::i;:::-;;;;;;;2371:154;;612:2:106;2401:38:101;;;;;;;;2371:154;2483:30;2470:44;;;;;;;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;3199:103::-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;6179:316::-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;:::-;;;;;;;;1406:402;1364:444::o;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;2632:182:101;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;1351:354::-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9098:32:139;;3565:47:62;;;9080:51:139;9147:18;;;9140:34;;;9053:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;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:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:315;1068:6;1076;1129:2;1117:9;1108:7;1104:23;1100:32;1097:52;;;1145:1;1142;1135:12;1097:52;1181:9;1168:23;1158:33;;1241:2;1230:9;1226:18;1213:32;1254:31;1279:5;1254:31;:::i;:::-;1304:5;1294:15;;;1000:315;;;;;:::o;1320:615::-;1406:6;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1523:9;1510:23;1552:18;1593:2;1585:6;1582:14;1579:34;;;1609:1;1606;1599:12;1579:34;1647:6;1636:9;1632:22;1622:32;;1692:7;1685:4;1681:2;1677:13;1673:27;1663:55;;1714:1;1711;1704:12;1663:55;1754:2;1741:16;1780:2;1772:6;1769:14;1766:34;;;1796:1;1793;1786:12;1766:34;1849:7;1844:2;1834:6;1831:1;1827:14;1823:2;1819:23;1815:32;1812:45;1809:65;;;1870:1;1867;1860:12;1809:65;1901:2;1893:11;;;;;1923:6;;-1:-1:-1;1320:615:139;;-1:-1:-1;;;;1320:615:139:o;2333:340::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2542:9;2529:23;2561:31;2586:5;2561:31;:::i;:::-;2611:5;2663:2;2648:18;;;;2635:32;;-1:-1:-1;;;2333:340:139:o;2678:247::-;2737:6;2790:2;2778:9;2769:7;2765:23;2761:32;2758:52;;;2806:1;2803;2796:12;2758:52;2845:9;2832:23;2864:31;2889:5;2864:31;:::i;3119:114::-;3203:4;3196:5;3192:16;3185:5;3182:27;3172:55;;3223:1;3220;3213:12;3238:243;3295:6;3348:2;3336:9;3327:7;3323:23;3319:32;3316:52;;;3364:1;3361;3354:12;3316:52;3403:9;3390:23;3422:29;3445:5;3422:29;:::i;3486:548::-;3598:4;3627:2;3656;3645:9;3638:21;3688:6;3682:13;3731:6;3726:2;3715:9;3711:18;3704:34;3756:1;3766:140;3780:6;3777:1;3774:13;3766:140;;;3875:14;;;3871:23;;3865:30;3841:17;;;3860:2;3837:26;3830:66;3795:10;;3766:140;;;3770:3;3955:1;3950:2;3941:6;3930:9;3926:22;3922:31;3915:42;4025:2;4018;4014:7;4009:2;4001:6;3997:15;3993:29;3982:9;3978:45;3974:54;3966:62;;;;3486:548;;;;:::o;4498:658::-;4669:2;4721:21;;;4791:13;;4694:18;;;4813:22;;;4640:4;;4669:2;4892:15;;;;4866:2;4851:18;;;4640:4;4935:195;4949:6;4946:1;4943:13;4935:195;;;5014:13;;-1:-1:-1;;;;;5010:39:139;4998:52;;5105:15;;;;5070:12;;;;5046:1;4964:9;4935:195;;;-1:-1:-1;5147:3:139;;4498:658;-1:-1:-1;;;;;;4498:658:139:o;5161:456::-;5238:6;5246;5254;5307:2;5295:9;5286:7;5282:23;5278:32;5275:52;;;5323:1;5320;5313:12;5275:52;5362:9;5349:23;5381:31;5406:5;5381:31;:::i;:::-;5431:5;-1:-1:-1;5488:2:139;5473:18;;5460:32;5501:33;5460:32;5501:33;:::i;:::-;5161:456;;5553:7;;-1:-1:-1;;;5607:2:139;5592:18;;;;5579:32;;5161:456::o;5622:127::-;5683:10;5678:3;5674:20;5671:1;5664:31;5714:4;5711:1;5704:15;5738:4;5735:1;5728:15;6266:247;6334:6;6387:2;6375:9;6366:7;6362:23;6358:32;6355:52;;;6403:1;6400;6393:12;6355:52;6435:9;6429:16;6454:29;6477:5;6454:29;:::i;6518:127::-;6579:10;6574:3;6570:20;6567:1;6560:31;6610:4;6607:1;6600:15;6634:4;6631:1;6624:15;6650:164;6726:13;;6775;;6768:21;6758:32;;6748:60;;6804:1;6801;6794:12;6819:1123;6911:6;6942:2;6985;6973:9;6964:7;6960:23;6956:32;6953:52;;;7001:1;6998;6991:12;6953:52;7034:9;7028:16;7063:18;7104:2;7096:6;7093:14;7090:34;;;7120:1;7117;7110:12;7090:34;7158:6;7147:9;7143:22;7133:32;;7203:7;7196:4;7192:2;7188:13;7184:27;7174:55;;7225:1;7222;7215:12;7174:55;7254:2;7248:9;7276:2;7272;7269:10;7266:36;;;7282:18;;:::i;:::-;7328:2;7325:1;7321:10;7360:2;7354:9;7423:2;7419:7;7414:2;7410;7406:11;7402:25;7394:6;7390:38;7478:6;7466:10;7463:22;7458:2;7446:10;7443:18;7440:46;7437:72;;;7489:18;;:::i;:::-;7525:2;7518:22;7575:18;;;7609:15;;;;-1:-1:-1;7651:11:139;;;7647:20;;;7679:19;;;7676:39;;;7711:1;7708;7701:12;7676:39;7735:11;;;;7755:156;7771:6;7766:3;7763:15;7755:156;;;7837:31;7864:3;7837:31;:::i;:::-;7825:44;;7788:12;;;;7889;;;;7755:156;;;7930:6;6819:1123;-1:-1:-1;;;;;;;;6819:1123:139:o;7947:127::-;8008:10;8003:3;7999:20;7996:1;7989:31;8039:4;8036:1;8029:15;8063:4;8060:1;8053:15;8079:136;8118:3;8146:5;8136:39;;8155:18;;:::i;:::-;-1:-1:-1;;;8191:18:139;;8079:136::o;8220:681::-;8388:2;8440:21;;;8510:13;;8413:18;;;8532:22;;;8359:4;8597:17;;;8637:16;;;8359:4;;8388:2;8585;8570:18;;;8359:4;8681:194;8695:6;8692:1;8689:13;8681:194;;;8760:13;;-1:-1:-1;;;;;8756:39:139;8744:52;;8792:1;8851:14;;;;8816:12;;;;8710:9;8681:194;;9185:128;9252:9;;;9273:11;;;9270:37;;;9287:18;;:::i;9318:331::-;9423:9;9434;9476:8;9464:10;9461:24;9458:44;;;9498:1;9495;9488:12;9458:44;9527:6;9517:8;9514:20;9511:40;;;9547:1;9544;9537:12;9511:40;-1:-1:-1;;9573:23:139;;;9618:25;;;;;-1:-1:-1;9318:331:139:o;9654:337::-;-1:-1:-1;;9775:19:139;;9862:11;;;;9893:2;9885:11;;9882:103;;;9972:2;9966;9959:3;9955:2;9951:12;9948:1;9944:20;9940:29;9936:2;9932:38;9928:47;9919:56;;9882:103;;;9654:337;;;;:::o;9996:127::-;10057:10;10052:3;10048:20;10045:1;10038:31;10088:4;10085:1;10078:15;10112:4;10109:1;10102:15","linkReferences":{},"immutableReferences":{"54247":[{"start":641,"length":32},{"start":757,"length":32},{"start":3911,"length":32}]}},"methodIdentifiers":{"CODE_ADDRESS_FROM_NOT_WHITELISTED()":"5b119c0a","CODE_ADDRESS_TO_NOT_WHITELISTED()":"db136dad","DEFAULT_ADMIN_ROLE()":"a217fddf","RULE_ENGINE_OPERATOR_ROLE()":"6728f545","TOKEN_CONTRACT_ROLE()":"0fbbfb55","addRuleValidation(address)":"cd1d4dc7","canReturnTransferRestrictionCode(uint8)":"7d045df6","clearRulesValidation()":"8a1b6c8e","detectTransferRestriction(address,address,uint256)":"d4ce1415","getRoleAdmin(bytes32)":"248a9ca3","getRuleIndexValidation(address)":"83304df0","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","messageForTransferRestriction(uint8)":"7f4ab1dd","removeRuleValidation(address,uint256)":"4d53374e","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","ruleValidation(uint256)":"397a7d3c","rulesCountValidation()":"8a2021b1","rulesValidation()":"c57086a1","setRulesValidation(address[])":"334a29cc","supportsInterface(bytes4)":"01ffc9a7","trustedForwarder()":"7da0a877","validateTransfer(address,address,uint256)":"c6946a12"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"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\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"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\":\"CODE_ADDRESS_FROM_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\":[],\"name\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"canReturnTransferRestrictionCode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"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\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"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\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"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\":{\"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 signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"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`)\"}},\"kind\":\"dev\",\"methods\":{\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"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\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"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.\"},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"Wrapper to call several different whitelist rules\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the whitelist rules to know if a restriction exists on the transfer\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"removeRuleValidation(address,uint256)\":{\"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\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelistWrapper.sol\":\"RuleWhitelistWrapper\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]},\"src/rules/validation/RuleWhitelistWrapper.sol\":{\"keccak256\":\"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644\",\"dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"forwarderIrrevocable","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_ArrayIsEmpty"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAlreadyExists"},{"inputs":[],"type":"error","name":"RuleEngine_RuleDoNotMatch"},{"inputs":[{"internalType":"address","name":"rule","type":"address","indexed":true}],"type":"event","name":"AddRule","anonymous":false},{"inputs":[{"internalType":"address[]","name":"rulesRemoved","type":"address[]","indexed":false}],"type":"event","name":"ClearRules","anonymous":false},{"inputs":[{"internalType":"address","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":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"TOKEN_CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRuleValidation"},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"canReturnTransferRestrictionCode","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"clearRulesValidation"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestriction","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":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"view","type":"function","name":"getRuleIndexValidation","outputs":[{"internalType":"uint256","name":"index","type":"uint256"}]},{"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":"forwarder","type":"address"}],"stateMutability":"view","type":"function","name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRuleValidation"},{"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":"ruleValidation","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesCountValidation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesValidation","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address[]","name":"rules_","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setRulesValidation"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function","name":"validateTransfer","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"canReturnTransferRestrictionCode(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the restriction code is known, false otherwise*"}},"constructor":{"params":{"admin":"Address of the contract (Access Control)","forwarderIrrevocable":"Address of the forwarder, required for the gasless support"}},"detectTransferRestriction(address,address,uint256)":{"params":{"_from":"the origin address","_to":"the destination address"},"returns":{"_0":"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getRuleIndexValidation(address)":{"returns":{"index":"if the rule is found, _rulesValidation.length otherwise"}},"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":"Returns `true` if `account` has been granted `role`."},"isTrustedForwarder(address)":{"details":"Indicates whether any particular address is the trusted forwarder."},"messageForTransferRestriction(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the transfer is valid, false otherwise*"}},"removeRuleValidation(address,uint256)":{"details":"To reduce the array size, the last rule is moved to the location occupied by the rule to remove","params":{"index":"the position inside the array of rule","rule_":"address of the target rule"}},"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."},"ruleValidation(uint256)":{"params":{"ruleId":"index of the rule"},"returns":{"_0":"a rule address"}},"rulesCountValidation()":{"returns":{"_0":"The number of rules inside the array"}},"rulesValidation()":{"returns":{"_0":"An array of rules"}},"setRulesValidation(address[])":{"details":"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]"},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"trustedForwarder()":{"details":"Returns the address of the trusted forwarder."},"validateTransfer(address,address,uint256)":{"params":{"_amount":"to transfer","_from":"the origin address","_to":"the destination address"},"returns":{"isValid":"=> true if the transfer is valid, false otherwise*"}}},"version":1},"userdoc":{"kind":"user","methods":{"RULE_ENGINE_OPERATOR_ROLE()":{"notice":"Role to manage the ruleEngine"},"TOKEN_CONTRACT_ROLE()":{"notice":"token contract"},"addRuleValidation(address)":{"notice":"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"},"canReturnTransferRestrictionCode(uint8)":{"notice":"To know if the restriction code is valid for this rule or not"},"clearRulesValidation()":{"notice":"Clear all the rules of the array of rules"},"detectTransferRestriction(address,address,uint256)":{"notice":"Go through all the whitelist rules to know if a restriction exists on the transfer"},"getRuleIndexValidation(address)":{"notice":"Get the index of a rule inside the list"},"messageForTransferRestriction(uint8)":{"notice":"Return the corresponding message"},"removeRuleValidation(address,uint256)":{"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"},"ruleValidation(uint256)":{"notice":"Get the rule at the position specified by ruleId"},"rulesValidation()":{"notice":"Get all the rules"},"setRulesValidation(address[])":{"notice":"Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"},"validateTransfer(address,address,uint256)":{"notice":"Validate a transfer"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","CMTAT/=lib/CMTAT/contracts/","OZ/=lib/openzeppelin-contracts/contracts/","ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/rules/validation/RuleWhitelistWrapper.sol":"RuleWhitelistWrapper"},"evmVersion":"london","libraries":{}},"sources":{"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol":{"keccak256":"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad","urls":["bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0","dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol":{"keccak256":"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed","urls":["bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423","dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol":{"keccak256":"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3","urls":["bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e","dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"],"license":"MPL-2.0"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol":{"keccak256":"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6","urls":["bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f","dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"],"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/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"src/interfaces/IRuleEngineValidation.sol":{"keccak256":"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1","urls":["bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20","dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT"],"license":"MPL-2.0"},"src/interfaces/IRuleValidation.sol":{"keccak256":"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1","urls":["bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9","dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"],"license":"MPL-2.0"},"src/modules/MetaTxModuleStandalone.sol":{"keccak256":"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0","urls":["bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25","dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"],"license":"MPL-2.0"},"src/modules/RuleEngineInvariantStorage.sol":{"keccak256":"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0","urls":["bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44","dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq"],"license":"MPL-2.0"},"src/modules/RuleEngineValidationCommon.sol":{"keccak256":"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb","urls":["bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d","dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk"],"license":"MPL-2.0"},"src/modules/RuleInternal.sol":{"keccak256":"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c","urls":["bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3","dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A"],"license":"MPL-2.0"},"src/rules/validation/RuleWhitelistWrapper.sol":{"keccak256":"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785","urls":["bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644","dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol":{"keccak256":"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400","urls":["bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac","dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol":{"keccak256":"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6","urls":["bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531","dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol":{"keccak256":"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3","urls":["bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7","dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol":{"keccak256":"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2","urls":["bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e","dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleCommonInvariantStorage.sol":{"keccak256":"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678","urls":["bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749","dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleValidateTransfer.sol":{"keccak256":"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b","urls":["bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd","dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleWhitelistCommon.sol":{"keccak256":"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c","urls":["bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c","dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ"],"license":"MPL-2.0"}},"version":1},"id":101} \ No newline at end of file diff --git a/RuleWhitelistv2.0.2.json b/RuleWhitelistv2.0.2.json new file mode 100644 index 0000000..21cfa2a --- /dev/null +++ b/RuleWhitelistv2.0.2.json @@ -0,0 +1,1081 @@ +{ + "contractName": "RuleWhitelist", + "abi": [ + { + "type": "constructor", + "inputs": [ + { "name": "admin", "type": "address", "internalType": "address" }, + { + "name": "forwarderIrrevocable", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "ADDRESS_LIST_ADD_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ADDRESS_LIST_REMOVE_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED", + "inputs": [], + "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CODE_ADDRESS_TO_NOT_WHITELISTED", + "inputs": [], + "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addAddressToTheList", + "inputs": [ + { + "name": "_newWhitelistAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addAddressesToTheList", + "inputs": [ + { + "name": "listWhitelistedAddress", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addressIsListed", + "inputs": [ + { + "name": "_targetAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addressIsListedBatch", + "inputs": [ + { + "name": "_targetAddresses", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [{ "name": "", "type": "bool[]", "internalType": "bool[]" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "canReturnTransferRestrictionCode", + "inputs": [ + { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "detectTransferRestriction", + "inputs": [ + { "name": "_from", "type": "address", "internalType": "address" }, + { "name": "_to", "type": "address", "internalType": "address" }, + { "name": "", "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": "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": "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": "pure" + }, + { + "type": "function", + "name": "numberListedAddress", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeAddressFromTheList", + "inputs": [ + { + "name": "_removeWhitelistAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeAddressesFromTheList", + "inputs": [ + { + "name": "listWhitelistedAddress", + "type": "address[]", + "internalType": "address[]" + } + ], + "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": "supportsInterface", + "inputs": [ + { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "trustedForwarder", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "validateTransfer", + "inputs": [ + { "name": "_from", "type": "address", "internalType": "address" }, + { "name": "_to", "type": "address", "internalType": "address" }, + { "name": "_amount", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [ + { "name": "isValid", "type": "bool", "internalType": "bool" } + ], + "stateMutability": "view" + }, + { + "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": "error", "name": "AccessControlBadConfirmation", "inputs": [] }, + { + "type": "error", + "name": "AccessControlUnauthorizedAccount", + "inputs": [ + { "name": "account", "type": "address", "internalType": "address" }, + { "name": "neededRole", "type": "bytes32", "internalType": "bytes32" } + ] + }, + { + "type": "error", + "name": "RuleAddressList_AdminWithAddressZeroNotAllowed", + "inputs": [] + }, + { "type": "error", "name": "Rulelist_AddressAlreadylisted", "inputs": [] }, + { "type": "error", "name": "Rulelist_AddressNotPresent", "inputs": [] } + ], + "bytecode":"0x60a06040523480156200001157600080fd5b50604051620013ca380380620013ca83398101604081905262000034916200023a565b6001600160a01b0380821660805282908290821662000066576040516317c69b0360e21b815260040160405180910390fd5b62000073600083620000d8565b50620000a07f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6183620000d8565b50620000cd7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec83620000d8565b5050505050620002f1565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200017f576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200013662000189565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000183565b5060005b92915050565b6000620001956200019a565b905090565b6000366014620001aa33620001f6565b8015620001b75750808210155b15620001ee57600036620001cc838562000272565b620001d992829062000294565b620001e491620002c0565b60601c9250505090565b339250505090565b60006200020260805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200023557600080fd5b919050565b600080604083850312156200024e57600080fd5b62000259836200021d565b915062000269602084016200021d565b90509250929050565b818103818111156200018357634e487b7160e01b600052601160045260246000fd5b60008085851115620002a557600080fd5b83861115620002b357600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002e95780818660140360031b1b83161692505b505092915050565b6080516110af6200031b6000396000818161023c015281816102b90152610bf401526110af6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033", + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033", + "sourceMap": "204:1035:100:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;3537:356:102;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1400:190::-;;;;;;:::i;:::-;;:::i;:::-;;3012:107;;;:::i;:::-;;;3346:25:139;;;3334:2;3319:18;3012:107:102;3200:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;1880:203:102:-;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;4371:4:139;4359:17;;;4341:36;;4329:2;4314:18;490:60:106;4199:184:139;3312:146:102;;;;;;:::i;:::-;;:::i;511:274:110:-;;;;;;:::i;:::-;;:::i;1622:107:66:-;;;-1:-1:-1;;;;;1705:17:66;4919:32:139;4901:51;;4889:2;4874:18;1622:107:66;4755:203:139;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2701:190:102:-;;;;;;:::i;:::-;;:::i;2854:136:62:-;;;;;;:::i;:::-;;:::i;313:82:104:-;;361:34;313:82;;2187:49:62;;2232:4;2187:49;;418:355:109;;;;;;:::i;:::-;;:::i;804:433:100:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;2292:171:102:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;219:88:104;;270:37;219:88;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;3537:356:102:-;3637:13;3662:22;3698:16;:23;3687:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3687:35:102;;3662:60;;3737:9;3732:130;3756:16;:23;3752:1;:27;3732:130;;;3814:37;3831:16;3848:1;3831:19;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;3139:20:103;3116:4;3139:20;;;:4;:20;;;;;;;;;3029:137;3814:37:102;3800:8;3809:1;3800:11;;;;;;;;:::i;:::-;:51;;;:11;;;;;;;;;;;:51;3781:3;;3732:130;;;-1:-1:-1;3878:8:102;3537:356;-1:-1:-1;;3537:356:102:o;1400:190::-;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;1537:46:102::1;1560:22;;1537;:46::i;:::-;1400:190:::0;;;:::o;3012:107::-;3064:7;3090:22;2813:16:103;;;2732:104;3090:22:102;3083:29;;3012:107;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;1880:203:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2025:51:102::1;2053:22;;2025:27;:51::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;3312:146:102:-;-1:-1:-1;;;;;3139:20:103;;3396:4:102;3139:20:103;;;:4;:20;;;;;;;;3419:32:102;3029:137:103;511:274:110;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;2701:190:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2834:50:102::1;2860:23;2834:25;:50::i;:::-;2701:190:::0;;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6371:15:139;;;662:51:109;;;6353:34:139;6423:15;;6403:18;;;6396:43;6455:18;;;6448:34;;;549:12:109;;;;662:4;;:30;;6288:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;804:433:100:-;949:5;971:22;987:5;971:15;:22::i;:::-;966:265;;-1:-1:-1;548:2:106;1009:40:100;;966:265;1071:20;1087:3;1071:15;:20::i;:::-;1066:165;;-1:-1:-1;612:2:106;1107:38:100;;1066:165;-1:-1:-1;1189:30:100;1176:44;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;2292:171:102:-:0;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2414:42:102::1;2435:20;2414;:42::i;3199:103:62:-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;:::-;3199:103;:::o;607:406:103:-;724:16;;692:29;750:207;770:24;;;750:207;;;820:4;:22;825:13;;839:1;825:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;820:22:103;;;;;;;;;;;;-1:-1:-1;820:22:103;;;;815:132;;887:4;862;:22;867:13;;881:1;867:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;862:22:103;;;;;;;;;;;;-1:-1:-1;862:22:103;:29;;-1:-1:-1;;862:29:103;;;;;;;;;;909:23;;;:::i;:::-;;;815:132;796:3;;750:207;;;-1:-1:-1;966:16:103;:40;-1:-1:-1;;607:406:103:o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1284:425:103;1420:16;;1388:29;1446:207;1466:24;;;1446:207;;;1515:4;:22;1520:13;;1534:1;1520:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1515:22:103;;;;;;;;;;;;-1:-1:-1;1515:22:103;;;;1511:132;;;1582:5;1557:4;:22;1562:13;;1576:1;1562:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1557:22:103;;;;;;;;;;;;-1:-1:-1;1557:22:103;:30;;-1:-1:-1;;1557:30:103;;;;;;;;;;1605:23;;;:::i;:::-;;;1511:132;1492:3;;1446:207;;3994:182:102;4105:14;4142:27;:25;:27::i;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;2362:249:103;-1:-1:-1;;;;;2449:24:103;;;;;;:4;:24;;;;;;;;2444:91;;2496:28;;-1:-1:-1;;;2496:28:103;;;;;;;;;;;2444:91;-1:-1:-1;;;;;2544:24:103;;2571:5;2544:24;;;:4;:24;;;;;:32;;-1:-1:-1;;2544:32:103;;;2588:16;2586:18;;2588:16;;2571:5;2586:18;;;:::i;:::-;;;;-1:-1:-1;;2362:249:103:o;1903:236::-;-1:-1:-1;;;;;1981:21:103;;;;;;:4;:21;;;;;;;;1977:90;;;2025:31;;-1:-1:-1;;;2025:31:103;;;;;;;;;;;1977:90;-1:-1:-1;;;;;2076:21:103;;;;;;2100:4;2076:21;;;;;;;:28;;-1:-1:-1;;2076:28:103;;;;;;2116:16;2114:18;;2116:16;;2076:21;2114:18;;;:::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;7350:32:139;;3565:47:62;;;7332:51:139;7399:18;;;7392:34;;;7305:18;;3565:47:62;;;;;;;2204:429:66;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;14:286:139:-;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:139;;209:43;;199:71;;266:1;263;256:12;497:127;558:10;553:3;549:20;546:1;539:31;589:4;586:1;579:15;613:4;610:1;603:15;629:173;697:20;;-1:-1:-1;;;;;746:31:139;;736:42;;726:70;;792:1;789;782:12;807:1121;891:6;922:2;965;953:9;944:7;940:23;936:32;933:52;;;981:1;978;971:12;933:52;1021:9;1008:23;1050:18;1091:2;1083:6;1080:14;1077:34;;;1107:1;1104;1097:12;1077:34;1145:6;1134:9;1130:22;1120:32;;1190:7;1183:4;1179:2;1175:13;1171:27;1161:55;;1212:1;1209;1202:12;1161:55;1248:2;1235:16;1270:2;1266;1263:10;1260:36;;;1276:18;;:::i;:::-;1322:2;1319:1;1315:10;1354:2;1348:9;1417:2;1413:7;1408:2;1404;1400:11;1396:25;1388:6;1384:38;1472:6;1460:10;1457:22;1452:2;1440:10;1437:18;1434:46;1431:72;;;1483:18;;:::i;:::-;1519:2;1512:22;1569:18;;;1603:15;;;;-1:-1:-1;1645:11:139;;;1641:20;;;1673:19;;;1670:39;;;1705:1;1702;1695:12;1670:39;1729:11;;;;1749:148;1765:6;1760:3;1757:15;1749:148;;;1831:23;1850:3;1831:23;:::i;:::-;1819:36;;1782:12;;;;1875;;;;1749:148;;;1916:6;807:1121;-1:-1:-1;;;;;;;;807:1121:139:o;1933:642::-;2098:2;2150:21;;;2220:13;;2123:18;;;2242:22;;;2069:4;;2098:2;2321:15;;;;2295:2;2280:18;;;2069:4;2364:185;2378:6;2375:1;2372:13;2364:185;;;2453:13;;2446:21;2439:29;2427:42;;2524:15;;;;2489:12;;;;2400:1;2393:9;2364:185;;;-1:-1:-1;2566:3:139;;1933:642;-1:-1:-1;;;;;;1933:642:139:o;2580:615::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2783:9;2770:23;2812:18;2853:2;2845:6;2842:14;2839:34;;;2869:1;2866;2859:12;2839:34;2907:6;2896:9;2892:22;2882:32;;2952:7;2945:4;2941:2;2937:13;2933:27;2923:55;;2974:1;2971;2964:12;2923:55;3014:2;3001:16;3040:2;3032:6;3029:14;3026:34;;;3056:1;3053;3046:12;3026:34;3109:7;3104:2;3094:6;3091:1;3087:14;3083:2;3079:23;3075:32;3072:45;3069:65;;;3130:1;3127;3120:12;3069:65;3161:2;3153:11;;;;;3183:6;;-1:-1:-1;2580:615:139;;-1:-1:-1;;;;2580:615:139:o;3382:180::-;3441:6;3494:2;3482:9;3473:7;3469:23;3465:32;3462:52;;;3510:1;3507;3500:12;3462:52;-1:-1:-1;3533:23:139;;3382:180;-1:-1:-1;3382:180:139:o;3749:254::-;3817:6;3825;3878:2;3866:9;3857:7;3853:23;3849:32;3846:52;;;3894:1;3891;3884:12;3846:52;3930:9;3917:23;3907:33;;3959:38;3993:2;3982:9;3978:18;3959:38;:::i;:::-;3949:48;;3749:254;;;;;:::o;4008:186::-;4067:6;4120:2;4108:9;4099:7;4095:23;4091:32;4088:52;;;4136:1;4133;4126:12;4088:52;4159:29;4178:9;4159:29;:::i;4388:114::-;4472:4;4465:5;4461:16;4454:5;4451:27;4441:55;;4492:1;4489;4482:12;4507:243;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:52;;;4633:1;4630;4623:12;4585:52;4672:9;4659:23;4691:29;4714:5;4691:29;:::i;4963:548::-;5075:4;5104:2;5133;5122:9;5115:21;5165:6;5159:13;5208:6;5203:2;5192:9;5188:18;5181:34;5233:1;5243:140;5257:6;5254:1;5251:13;5243:140;;;5352:14;;;5348:23;;5342:30;5318:17;;;5337:2;5314:26;5307:66;5272:10;;5243:140;;;5247:3;5432:1;5427:2;5418:6;5407:9;5403:22;5399:31;5392:42;5502:2;5495;5491:7;5486:2;5478:6;5474:15;5470:29;5459:9;5455:45;5451:54;5443:62;;;;4963:548;;;;:::o;5516:328::-;5593:6;5601;5609;5662:2;5650:9;5641:7;5637:23;5633:32;5630:52;;;5678:1;5675;5668:12;5630:52;5701:29;5720:9;5701:29;:::i;:::-;5691:39;;5749:38;5783:2;5772:9;5768:18;5749:38;:::i;:::-;5739:48;;5834:2;5823:9;5819:18;5806:32;5796:42;;5516:328;;;;;:::o;5849:127::-;5910:10;5905:3;5901:20;5898:1;5891:31;5941:4;5938:1;5931:15;5965:4;5962:1;5955:15;6493:247;6561:6;6614:2;6602:9;6593:7;6589:23;6585:32;6582:52;;;6630:1;6627;6620:12;6582:52;6662:9;6656:16;6681:29;6704:5;6681:29;:::i;6745:127::-;6806:10;6801:3;6797:20;6794:1;6787:31;6837:4;6834:1;6827:15;6861:4;6858:1;6851:15;6877:135;6916:3;6937:17;;;6934:43;;6957:18;;:::i;:::-;-1:-1:-1;7004:1:139;6993:13;;6877:135::o;7017:136::-;7056:3;7084:5;7074:39;;7093:18;;:::i;:::-;-1:-1:-1;;;7129:18:139;;7017:136::o;7437:128::-;7504:9;;;7525:11;;;7522:37;;;7539:18;;:::i;7570:331::-;7675:9;7686;7728:8;7716:10;7713:24;7710:44;;;7750:1;7747;7740:12;7710:44;7779:6;7769:8;7766:20;7763:40;;;7799:1;7796;7789:12;7763:40;-1:-1:-1;;7825:23:139;;;7870:25;;;;;-1:-1:-1;7570:331:139:o;7906:337::-;-1:-1:-1;;8027:19:139;;8114:11;;;;8145:2;8137:11;;8134:103;;;8224:2;8218;8211:3;8207:2;8203:12;8200:1;8196:20;8192:29;8188:2;8184:38;8180:47;8171:56;;8134:103;;;7906:337;;;;:::o", + "linkReferences": {}, + "immutableReferences": { + "54247": [ + { "start": 572, "length": 32 }, + { "start": 697, "length": 32 }, + { "start": 3060, "length": 32 } + ] + } + }, + "methodIdentifiers": { + "ADDRESS_LIST_ADD_ROLE()": "948b851e", + "ADDRESS_LIST_REMOVE_ROLE()": "fa83a2da", + "CODE_ADDRESS_FROM_NOT_WHITELISTED()": "5b119c0a", + "CODE_ADDRESS_TO_NOT_WHITELISTED()": "db136dad", + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "addAddressToTheList(address)": "daafd1c7", + "addAddressesToTheList(address[])": "11d1c5ca", + "addressIsListed(address)": "5b577f66", + "addressIsListedBatch(address[])": "0a3640d2", + "canReturnTransferRestrictionCode(uint8)": "7d045df6", + "detectTransferRestriction(address,address,uint256)": "d4ce1415", + "getRoleAdmin(bytes32)": "248a9ca3", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "isTrustedForwarder(address)": "572b6c05", + "messageForTransferRestriction(uint8)": "7f4ab1dd", + "numberListedAddress()": "13be3212", + "removeAddressFromTheList(address)": "893c1440", + "removeAddressesFromTheList(address[])": "3630e2ea", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "supportsInterface(bytes4)": "01ffc9a7", + "trustedForwarder()": "7da0a877", + "validateTransfer(address,address,uint256)": "c6946a12" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"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\":[],\"name\":\"Rulelist_AddressAlreadylisted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rulelist_AddressNotPresent\",\"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\":\"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_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\":\"_newWhitelistAddress\",\"type\":\"address\"}],\"name\":\"addAddressToTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"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\":\"\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"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\":\"_removeWhitelistAddress\",\"type\":\"address\"}],\"name\":\"removeAddressFromTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"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\":{\"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 signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"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`)\"}},\"kind\":\"dev\",\"methods\":{\"addAddressToTheList(address)\":{\"params\":{\"_newWhitelistAddress\":\"The address to whitelist\"}},\"addAddressesToTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses to whitelist\"}},\"addressIsListed(address)\":{\"params\":{\"_targetAddress\":\"The concerned address\"},\"returns\":{\"_0\":\"True if the address is listed, false otherwise\"}},\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"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\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"numberListedAddress()\":{\"returns\":{\"_0\":\"Number of listed addresses\"}},\"removeAddressFromTheList(address)\":{\"params\":{\"_removeWhitelistAddress\":\"The address to remove\"}},\"removeAddressesFromTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses 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.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"a whitelist manager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAddressToTheList(address)\":{\"notice\":\"Add one address to the whitelist If the address already exists, the transaction is reverted to save gas.\"},\"addAddressesToTheList(address[])\":{\"notice\":\"Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert).\"},\"addressIsListed(address)\":{\"notice\":\"Know if an address is listed or not\"},\"addressIsListedBatch(address[])\":{\"notice\":\"batch version of {addressIsListed}\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Check if an addres is in the whitelist or not\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"numberListedAddress()\":{\"notice\":\"Get the number of listed addresses\"},\"removeAddressFromTheList(address)\":{\"notice\":\"Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas.\"},\"removeAddressesFromTheList(address[])\":{\"notice\":\"Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert).\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelist.sol\":\"RuleWhitelist\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/rules/validation/RuleWhitelist.sol\":{\"keccak256\":\"0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690\",\"dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}", + "metadata": { + "compiler": { "version": "0.8.22+commit.4fc1097e" }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "admin", "type": "address" }, + { + "internalType": "address", + "name": "forwarderIrrevocable", + "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": "RuleAddressList_AdminWithAddressZeroNotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Rulelist_AddressAlreadylisted" + }, + { "inputs": [], "type": "error", "name": "Rulelist_AddressNotPresent" }, + { + "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": [], + "stateMutability": "view", + "type": "function", + "name": "ADDRESS_LIST_ADD_ROLE", + "outputs": [ + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "ADDRESS_LIST_REMOVE_ROLE", + "outputs": [ + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "CODE_ADDRESS_TO_NOT_WHITELISTED", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newWhitelistAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addAddressToTheList" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "listWhitelistedAddress", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addAddressesToTheList" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_targetAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "addressIsListed", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_targetAddresses", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function", + "name": "addressIsListedBatch", + "outputs": [ + { "internalType": "bool[]", "name": "", "type": "bool[]" } + ] + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_restrictionCode", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function", + "name": "canReturnTransferRestrictionCode", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "detectTransferRestriction", + "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": "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": "forwarder", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isTrustedForwarder", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_restrictionCode", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function", + "name": "messageForTransferRestriction", + "outputs": [ + { "internalType": "string", "name": "", "type": "string" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "numberListedAddress", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_removeWhitelistAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeAddressFromTheList" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "listWhitelistedAddress", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeAddressesFromTheList" + }, + { + "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": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "supportsInterface", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "trustedForwarder", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_amount", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "validateTransfer", + "outputs": [ + { "internalType": "bool", "name": "isValid", "type": "bool" } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "addAddressToTheList(address)": { + "params": { "_newWhitelistAddress": "The address to whitelist" } + }, + "addAddressesToTheList(address[])": { + "params": { + "listWhitelistedAddress": "an array with the addresses to whitelist" + } + }, + "addressIsListed(address)": { + "params": { "_targetAddress": "The concerned address" }, + "returns": { + "_0": "True if the address is listed, false otherwise" + } + }, + "canReturnTransferRestrictionCode(uint8)": { + "params": { "_restrictionCode": "The target restriction code" }, + "returns": { + "_0": "true if the restriction code is known, false otherwise*" + } + }, + "constructor": { + "params": { + "admin": "Address of the contract (Access Control)", + "forwarderIrrevocable": "Address of the forwarder, required for the gasless support" + } + }, + "detectTransferRestriction(address,address,uint256)": { + "params": { + "_from": "the origin address", + "_to": "the destination address" + }, + "returns": { + "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*" + } + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "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": "Returns `true` if `account` has been granted `role`." + }, + "isTrustedForwarder(address)": { + "details": "Indicates whether any particular address is the trusted forwarder." + }, + "messageForTransferRestriction(uint8)": { + "params": { "_restrictionCode": "The target restriction code" }, + "returns": { + "_0": "true if the transfer is valid, false otherwise*" + } + }, + "numberListedAddress()": { + "returns": { "_0": "Number of listed addresses" } + }, + "removeAddressFromTheList(address)": { + "params": { "_removeWhitelistAddress": "The address to remove" } + }, + "removeAddressesFromTheList(address[])": { + "params": { + "listWhitelistedAddress": "an array with the addresses 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." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "trustedForwarder()": { + "details": "Returns the address of the trusted forwarder." + }, + "validateTransfer(address,address,uint256)": { + "params": { + "_amount": "to transfer", + "_from": "the origin address", + "_to": "the destination address" + }, + "returns": { + "isValid": "=> true if the transfer is valid, false otherwise*" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addAddressToTheList(address)": { + "notice": "Add one address to the whitelist If the address already exists, the transaction is reverted to save gas." + }, + "addAddressesToTheList(address[])": { + "notice": "Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert)." + }, + "addressIsListed(address)": { + "notice": "Know if an address is listed or not" + }, + "addressIsListedBatch(address[])": { + "notice": "batch version of {addressIsListed}" + }, + "canReturnTransferRestrictionCode(uint8)": { + "notice": "To know if the restriction code is valid for this rule or not" + }, + "detectTransferRestriction(address,address,uint256)": { + "notice": "Check if an addres is in the whitelist or not" + }, + "messageForTransferRestriction(uint8)": { + "notice": "Return the corresponding message" + }, + "numberListedAddress()": { + "notice": "Get the number of listed addresses" + }, + "removeAddressFromTheList(address)": { + "notice": "Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas." + }, + "removeAddressesFromTheList(address[])": { + "notice": "Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert)." + }, + "validateTransfer(address,address,uint256)": { + "notice": "Validate a transfer" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", + "CMTAT/=lib/CMTAT/contracts/", + "OZ/=lib/openzeppelin-contracts/contracts/", + "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", + "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/" + ], + "optimizer": { "enabled": true, "runs": 200 }, + "metadata": { "bytecodeHash": "ipfs" }, + "compilationTarget": { + "src/rules/validation/RuleWhitelist.sol": "RuleWhitelist" + }, + "evmVersion": "london", + "libraries": {} + }, + "sources": { + "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": { + "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad", + "urls": [ + "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0", + "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg" + ], + "license": "MPL-2.0" + }, + "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": { + "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed", + "urls": [ + "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423", + "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx" + ], + "license": "MPL-2.0" + }, + "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": { + "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3", + "urls": [ + "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e", + "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF" + ], + "license": "MPL-2.0" + }, + "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": { + "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308", + "urls": [ + "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80", + "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": { + "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41", + "urls": [ + "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26", + "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": { + "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6", + "urls": [ + "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f", + "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK" + ], + "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/introspection/ERC165.sol": { + "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", + "urls": [ + "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", + "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "src/interfaces/IRuleValidation.sol": { + "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1", + "urls": [ + "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9", + "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8" + ], + "license": "MPL-2.0" + }, + "src/modules/MetaTxModuleStandalone.sol": { + "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0", + "urls": [ + "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25", + "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/RuleWhitelist.sol": { + "keccak256": "0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43", + "urls": [ + "bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690", + "dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol": { + "keccak256": "0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400", + "urls": [ + "bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac", + "dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol": { + "keccak256": "0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6", + "urls": [ + "bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531", + "dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol": { + "keccak256": "0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3", + "urls": [ + "bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7", + "dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol": { + "keccak256": "0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2", + "urls": [ + "bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e", + "dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/abstract/RuleCommonInvariantStorage.sol": { + "keccak256": "0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678", + "urls": [ + "bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749", + "dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/abstract/RuleValidateTransfer.sol": { + "keccak256": "0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b", + "urls": [ + "bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd", + "dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt" + ], + "license": "MPL-2.0" + }, + "src/rules/validation/abstract/RuleWhitelistCommon.sol": { + "keccak256": "0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c", + "urls": [ + "bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c", + "dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ" + ], + "license": "MPL-2.0" + } + }, + "version": 1 + }, + "id": 100 +} diff --git a/doc/schema/RuleEngine b/doc/schema/RuleEngine index a10c47c..e908186 100644 --- a/doc/schema/RuleEngine +++ b/doc/schema/RuleEngine @@ -1 +1 @@ -<mxfile host="Electron" modified="2023-11-22T15:29:10.370Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="mWpZs10bCFiKODvFNmPL" version="20.6.2" type="device"><diagram id="NT6XaUAKe-6zpoMFsSYq" name="RuleEngine">1VpRc+I2EP41zLQPx1iSbfBjgPT60JtmLvRS+qbYAjQxFiOLA+7XV8aysSQTHIKJk5dI67Vk73777a5MD41Xu68cr5ffWETiHnSiXQ9NehACCAL5L5Psc4kHlWDBaaSUjoJH+osooaOkGxqRVFMUjMWCrnVhyJKEhEKTYc7ZVlebs1jfdY0XxBI8hji2pU80EstcChHyjxf+JHSxLLb2PTe/ssKFtnqVdIkjtq2I0H0PjTljIh+tdmMSZ9YrDJPf98eJq+WTcZKIJje4Uz4bcB+Tp/3fs5ftcPrPj/++qFV+4nij3nj8bXo3VU8s9oUdtksqyOMah9l8K33dQ6OlWMVyBuQQp+vc+nO6I3K/kf1wxU6EC7KriNTDfiVsRQTfSxV1FQ6U4RR0gOfl8+3REaDQWVZ9UAixcv6iXPtoHjlQFnqDtaBlLcFxks4J/02wHhwX13637EeS6C6Do5yFMU5TGuoG5GyTRJnlJo6cSaPx/b9y8sXpOwAWkll2ue+iQSGY7Ko3TPbV2QPhVL414Up40iMC8wUR5zFCIi1UbL9V/OLVuKWQcRJjQX/qAVbnKrXDA6PyiUtYAKjDAiLD2ynb8JCou6rxYCwEfQNfgbFQbhhroQNyyte+HEzIAtOUvZAks5pkKek3E0OSQNbZcLOK70LBpGNHWTRRyVZ/4WcSP7CUCsoSqfLMhGCrisJdTBfZBcGMyGUbEdOEjEv+fBUrzaPXM7xUEHoFJKgGJH5boeta1r5WjDp6eHpngvOkbXPcno/Ds/HqdSpefaQjATkXxqsfGJAysdJyvPoWguSQRliQqUoCNqKkCw6haWRLFYyhhADhNVG6olGUrTHiJKW/8PNhvQw86+zlDq/rjXrepBZOr8LfjN+yclKbaLVJXVw7fTQcIN0R78NJocLm85S04jnP8tz3TUzuk4Ukvi5UOt6wc5XOoDW6BDpdDi7my09Wt5hOhkN0IQ+65kK35cGhBQ3B5Qg6siKRHRaOUzuoukOEBbCvQIRu4ALNEwXiusuEgeW7SLYIoSgy2HeSCk7DQxX5MeUR2VFR0oQczyry4y3Z5P0FldeUSJxOMYnvWemi71T+jAWb8srQMXgF3pZXCisbaVpKigOUIxZ1rJ1J2VfI0IFhm8DuZsq+9CbtDLCPIpSxQOeMBZ2acua21rJ77RvzXntFDuwUNw3Mvt+9sNsbmN2ed2M2etuBQcKSrEyJcLo8QAHoGMnkD1jIIic5SKCDpFRijr2U58rQxpLKhSprtpwNQeN02C3IBY6rIQUV3dNbIReYhbVvLNQ25Or7VCmxSemjOR25H87pdS2qH8ttR89ysMgGpL/oS5WnzDwxTTNf84NFcz25b6lqWVgaRuhmzMN1zOLs6LWI+DmNY0PUvKup85vu2Su4DjjgfPHi1riuvc8oH56O+/CSPgS0xLyNibdbJ7sD30rR1+hDAvMDj/tqe9MyKUO7DuBHdI5ZVHPYcZuDsbI6qNYG6rY2ygPYEKXdBinwr9IsBwanAvMr5AlYSmDgfUVNnWOdfHyrKR9oH/nlIF/xupi3U2tLmK/CfFaNgTdgvi1WblwPdwvwFn36V2Fli+wD2G9WHp+G/NW52j6abour+w7wdL4GLmqDsN/2W47zoHY+J6jBpwH1CR6HZhp6F4/L6fGHY7n68fd36P5/</diagram></mxfile> \ No newline at end of file +<mxfile host="Electron" modified="2024-07-08T11:13:01.570Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="1DqoXVM6f3_kqLpATKRN" version="20.6.2" type="device"><diagram id="NT6XaUAKe-6zpoMFsSYq" name="RuleEngine">1VpLc+I4EP41VO0e4rIkP/AxkMzMYac2NWEnm70JW4AqxqJkMcD8+pWxbCzJBEIwIblEar3s7q+/7hbuoeF8/ZXjxew7S0jag26y7qG7HoQA+VD+KySbUuL3+6VgymmiJu0Ej/Q3UUJXSZc0Ibk2UTCWCrrQhTHLMhILTYY5Zyt92oSl+qkLPCWW4DHGqS19oomYlVKIULAb+EbodFYdHfheOTLH1Wz1KvkMJ2zVEKH7HhpyxkTZmq+HJC20VymmXPdlz2j9ZJxk4pgF3og/hzzA5Gnz9/PLqj/65+d/N2qXXzhdqjcefh/djtQTi02lh9WMCvK4wHHRX0lb99BgJuap7AHZxPmi1P6Erok8b2A/XHUS4YKsGyL1sF8JmxPBN3KKGoWhUpyCDvD9sr/aGQJUc2ZNG1RCrIw/rffeqUc2lIbeoC1oaQs4guMsnxD+h2A9OKxG/7Q0SLLktgCk7MUpznMa6yrkbJklhe7uXNmTauObf2XnxnVcACvJczHseCisBHfr5oK7TbP3QDiV7024Eu61icB8SsRhlJBEcxbbcg3L+C2GqWScpFjQX7qLtRlLnfDAqHziGhgA6sCAyLB3zpY8JmpV0yOMjWBgICwyNioVY220xU792qfDCVlwGrEXkhVakzwl7WZiSFLIomgu5+ltLJg07KDwJyr56i88JukDy6mgLJNTxkwINm9MuE3ptBgQzPBdthQpzciwZtBXsXK8//qGlSpKb4AEtYAk6Mp5PUvb5/JRV3dP/4Bz7tVtidvDfnjQX/2r8tcA6UhA7on+GkQGpEysdOyvgYUg6MgOTbAgIxUGbExJI2yd04iYyh1jCQLCW/x0TpOk2GPASU5/4/F2vwI+i+L1ti/sD3r+XSugXnUA04Pr7EkdouUnbZ7tOqgfIt0UZ0HKDQy1XW/6+g5sMslJJ6b1LdP+WKbkPptKZrRM+gHJkN+/umQo7IxPgc6n4cmE+skSG9PIsI9OJErP3OiyRNm3oCG4bEFXpiyyCMNpbjvV9fBkBewz8KQXeUBnNPA+pHTPhJFlO4SdRJYRsahi3A+SC07jbab5MSkUWVNRM4VsPzfkuyVF5/1Jl38sl7hXRSaBb0UMx238GRseSy1916AWeFlqqbRsRGopqa5ZdljUsXYgap8hSEeGbiK74qlr14uUPMC+sFDKAlenLOi2ZDSX1ZZdj3sXp77uUh14VfQUmtcD3olFYWgWhf6FCelt9woZy4pkJcH5bAsFoGOkkD9gIVOdbCuBLpJSiTn2Ul9AQxtLKhyqwNlxQARHR8TrglzkehpSUFVDvRVykZleB8ZGXUOuvVqVEpuUPprWkffhtN5WqAapPHYwlo1p0SDO1JFTngr1pDQvbM23Gi3nyXPrqZaGpWKErsbSXYcsLW5oK4+f0DQ1RMfXNm120y17BtMBFxzOX7wW03X3e4sdkf3LFyPwlGoEdES+R3Pvdd0Bh4EVpc9RjUTmT0Heq0VOx7wM7VTAGzt8B9AhS1ouPi5zSVbnCM0MQS3rIkmARwL1unEKgrNUzZHBrMD8yXIPMiUw8KYxTd1p7X18qzoPtW8CZKPc8bywtwOs3xnsm0h/brrBG2DfFTcfnRhfF+YtEg3Ows0W5UfQOS5P3o/6szO2fVONxl0RtuMCXydt4KEuWPttX38chrX7OWENPg2s95A5NGPRu8hcdncfm5XTd9/sofv/AQ==</diagram></mxfile> \ No newline at end of file diff --git a/doc/schema/rule/ruleWhitelistWrapper.drawio b/doc/schema/rule/ruleWhitelistWrapper.drawio index 695db2b..70e72c6 100644 --- a/doc/schema/rule/ruleWhitelistWrapper.drawio +++ b/doc/schema/rule/ruleWhitelistWrapper.drawio @@ -1 +1 @@ -<mxfile host="Electron" modified="2024-06-10T15:08:23.006Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="ZhdH9EA9LXOtab_TQP2a" version="20.6.2" type="device"><diagram id="zM64sRnQbgzkaFHiXnTb" name="RuleWhitelistWrapper">7VrLcpswFP0als3whizj2Eln2k4zzSJJdwrIoKmMPEJ+5esrjMBIsmPsxpgk3STcowfo3MO90sWGcz1Z3lIwTX+QGGLDNuOl4QwN2w4vTf63AFYl4PthCSQUxSVkbYB79AIFKMYlMxTDXOrICMEMTWUwIlkGIyZhgFKykLuNCZbvOgUJ1ID7CGAdfUAxS0vUdhx/0/AVoiStbu17btkyAVVvsZQ8BTFZNCBnZDjXlBBWXk2W1xAX5FXElONudrTWT0ZhxtoMYDcvz7d+bOY2+j0fWZgFafrFLmeZAzwTK/41w3CUJSiD4rHZqiIjX6AJBrzBGSxSxOD9FERF04K7nmMpm2BuWfxyTDImnGmF3NafVTz+HFIGlw1IPPstJBPI6Ip3qaQkaBRCcipaFw23mAJLGx6pQSCkkNRTb8jiF4KvA7hzNO4eClYwytkDZ2QKad4vCl23dxy6uznkMOVa5P+sftEYWjKN4dlZ9DQWFzqLdr9Z7IEY/TY0Zv2m0XfPTmOg0ahRBrP4qsjO3IowyHMUyURRMstiWNzE5BZcIvYoWorrpwK/8IQ1XDa6DVeVkfGlPDaNxqjC3AxbW9W41i7KyYxGcH9qZYAmkO1PIzCWdiK6wxsO9bb4s8IoxIChubx/2eZjcYc7gjK20ZPjy3pyPUUm5brFqOZ2Q5nIVYTpqnoridEmWkuuXvbxKgy7UaF9nAzt7nTotNSh2ysdBmp6cI/UYaAI2r7sVoeX/6PhISr0+qVCRwliqnhaq1A5vriqnE+swuptOq0MrQ8iQr9XIvQ9ZYvnHCtCU57ICzsWoV5teCMRmlIsDF4Phm+np36lTH/X8f5QnWgTdZwyLb2yYgQDRrlh8xnNMcA5NIKhLh7uiO/gGWJZMwCjJCsExR0MKQeK4xWKAL4SDRMUx8UcAwpz9AKe1/MVUpkWS1wv2hsY3rCVeF6Xvnqwq0uX4q5Gszi47cBnXlhB6Mn++Tf5VF3IeJzD0zhUL/Oc48WvE5AlJ6CguwzktcxA/ToUhrayhz52M66msq4PhZZeKXv3kaV6tz5nZNFrdmeNLM1gUu+IO4ks/oeILK66JT12z+JZHUeWLVXP9x5Zqnfrc0aWwwqIGVl/AIhBnq5DiSW7s8DvAOOuzNaIbToczRklf+oPy/buWFSXd56a0WdfKOp5JOpXqScM9hyO20aiSyWkeepx/dSRaEvFMRj8/MYhQgu+uWLp+h2O9U/8n2MX3rYOZPdKoY63J8W1/jSj1IFc/60Uys3ND1rK7pufBTmjvw==</diagram></mxfile> \ No newline at end of file +<mxfile host="Electron" modified="2024-07-08T12:13:05.136Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="gq2LeAhVXaQx1WaH6jqn" version="20.6.2" type="device"><diagram id="zM64sRnQbgzkaFHiXnTb" name="RuleWhitelistWrapper">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</diagram></mxfile> \ No newline at end of file diff --git a/doc/schema/rule/ruleWhitelistWrapperV2.drawio.png b/doc/schema/rule/ruleWhitelistWrapperV2.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..b8295c7c0fb8c8e7328778a40775d74b98341a5c GIT binary patch literal 111165 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 PgJ0?@+R9mqrhfkq0-bwP literal 0 HcmV?d00001 From b220f6861cbadffe662a3b3875121b5673294ca9 Mon Sep 17 00:00:00 2001 From: Ryan Sauge <ryan.sauge@protonmail.com> Date: Tue, 9 Jul 2024 17:58:32 +0200 Subject: [PATCH 2/2] Remove json files --- RuleEngineV2.0.2.json | 1449 ------------------------------------- RuleWhitelistWrapper.json | 1 - RuleWhitelistv2.0.2.json | 1081 --------------------------- 3 files changed, 2531 deletions(-) delete mode 100644 RuleEngineV2.0.2.json delete mode 100644 RuleWhitelistWrapper.json delete mode 100644 RuleWhitelistv2.0.2.json diff --git a/RuleEngineV2.0.2.json b/RuleEngineV2.0.2.json deleted file mode 100644 index aaf230e..0000000 --- a/RuleEngineV2.0.2.json +++ /dev/null @@ -1,1449 +0,0 @@ -{ - "contractName": "RuleEngine", - "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": "DEFAULT_ADMIN_ROLE", - "inputs": [], - "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RULE_ENGINE_OPERATOR_ROLE", - "inputs": [], - "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "TOKEN_CONTRACT_ROLE", - "inputs": [], - "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "addRuleOperation", - "inputs": [ - { - "name": "rule_", - "type": "address", - "internalType": "contract IRuleOperation" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addRuleValidation", - "inputs": [ - { - "name": "rule_", - "type": "address", - "internalType": "contract IRuleValidation" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "clearRulesOperation", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "clearRulesValidation", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "detectTransferRestriction", - "inputs": [ - { "name": "_from", "type": "address", "internalType": "address" }, - { "name": "_to", "type": "address", "internalType": "address" }, - { "name": "_amount", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "detectTransferRestrictionValidation", - "inputs": [ - { "name": "_from", "type": "address", "internalType": "address" }, - { "name": "_to", "type": "address", "internalType": "address" }, - { "name": "_amount", "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": "getRuleIndexOperation", - "inputs": [ - { - "name": "rule_", - "type": "address", - "internalType": "contract IRuleOperation" - } - ], - "outputs": [ - { "name": "index", "type": "uint256", "internalType": "uint256" } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRuleIndexValidation", - "inputs": [ - { - "name": "rule_", - "type": "address", - "internalType": "contract IRuleValidation" - } - ], - "outputs": [ - { "name": "index", "type": "uint256", "internalType": "uint256" } - ], - "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": "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": "operateOnTransfer", - "inputs": [ - { "name": "from", "type": "address", "internalType": "address" }, - { "name": "to", "type": "address", "internalType": "address" }, - { "name": "amount", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [ - { "name": "isValid", "type": "bool", "internalType": "bool" } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "removeRuleOperation", - "inputs": [ - { - "name": "rule_", - "type": "address", - "internalType": "contract IRuleOperation" - }, - { "name": "index", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "removeRuleValidation", - "inputs": [ - { - "name": "rule_", - "type": "address", - "internalType": "contract IRuleValidation" - }, - { "name": "index", "type": "uint256", "internalType": "uint256" } - ], - "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": "ruleOperation", - "inputs": [ - { "name": "ruleId", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [{ "name": "", "type": "address", "internalType": "address" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ruleValidation", - "inputs": [ - { "name": "ruleId", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [{ "name": "", "type": "address", "internalType": "address" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "rulesCountOperation", - "inputs": [], - "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "rulesCountValidation", - "inputs": [], - "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "rulesOperation", - "inputs": [], - "outputs": [ - { "name": "", "type": "address[]", "internalType": "address[]" } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "rulesValidation", - "inputs": [], - "outputs": [ - { "name": "", "type": "address[]", "internalType": "address[]" } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "setRulesOperation", - "inputs": [ - { "name": "rules_", "type": "address[]", "internalType": "address[]" } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setRulesValidation", - "inputs": [ - { "name": "rules_", "type": "address[]", "internalType": "address[]" } - ], - "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": "trustedForwarder", - "inputs": [], - "outputs": [{ "name": "", "type": "address", "internalType": "address" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "validateTransfer", - "inputs": [ - { "name": "_from", "type": "address", "internalType": "address" }, - { "name": "_to", "type": "address", "internalType": "address" }, - { "name": "_amount", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "validateTransferValidation", - "inputs": [ - { "name": "_from", "type": "address", "internalType": "address" }, - { "name": "_to", "type": "address", "internalType": "address" }, - { "name": "_amount", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], - "stateMutability": "view" - }, - { - "type": "event", - "name": "AddRule", - "inputs": [ - { - "name": "rule", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ClearRules", - "inputs": [ - { - "name": "rulesRemoved", - "type": "address[]", - "indexed": false, - "internalType": "address[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RemoveRule", - "inputs": [ - { - "name": "rule", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "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": "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_ArrayIsEmpty", "inputs": [] }, - { - "type": "error", - "name": "RuleEngine_RuleAddressZeroNotAllowed", - "inputs": [] - }, - { "type": "error", "name": "RuleEngine_RuleAlreadyExists", "inputs": [] }, - { "type": "error", "name": "RuleEngine_RuleDoNotMatch", "inputs": [] }, - { "type": "error", "name": "RuleEngine_TransferInvalid", "inputs": [] } - ], - "bytecode":"0x60a06040523480156200001157600080fd5b5060405162001db338038062001db3833981016040819052620000349162000246565b6001600160a01b0380831660805283166200006257604051630872273360e21b815260040160405180910390fd5b6001600160a01b03811615620000a0576200009e7fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a382620000e4565b505b620000ad600084620000e4565b50620000da7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99984620000e4565b505050506200030f565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200018b576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200014262000195565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200018f565b5060005b92915050565b6000620001a1620001a6565b905090565b6000366014620001b63362000202565b8015620001c35750808210155b15620001fa57600036620001d8838562000290565b620001e5928290620002b2565b620001f091620002de565b60601c9250505090565b339250505090565b60006200020e60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200024157600080fd5b919050565b6000806000606084860312156200025c57600080fd5b620002678462000229565b9250620002776020850162000229565b9150620002876040850162000229565b90509250925092565b818103818111156200018f57634e487b7160e01b600052601160045260246000fd5b60008085851115620002c357600080fd5b83861115620002d157600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620003075780818660140360031b1b83161692505b505092915050565b608051611a7a620003396000396000818161033d01528181610384015261137d0152611a7a6000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033", - "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033", - "sourceMap": "323:5144:84:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1001:113:91;;;:::i;:::-;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;860:555:92;;;;;;:::i;:::-;;:::i;:::-;;;1633:4:139;1621:17;;;1603:36;;1591:2;1576:18;860:555:92;1461:184:139;4226:136:62;;;;;;:::i;:::-;;:::i;3255:118:91:-;3344:15;:22;3255:118;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3121:32:139;;;3103:51;;3091:2;3076:18;4051:143:93;2957:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;1622:107:66;1705:17;1622:107;;2978:1092:84;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4097:151:91;;;:::i;:::-;;;;;;;:::i;4143:464:84:-;;;;;;:::i;:::-;;:::i;4282:153:93:-;;;:::i;1794:214:91:-;;;;;;:::i;:::-;;:::i;2502:272:84:-;;;;;;:::i;:::-;;:::i;648:267:91:-;;;;;;:::i;:::-;;:::i;3868:141::-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;2408:191:91:-;;;;;;:::i;:::-;;:::i;3526:187::-;;;;;;:::i;:::-;;:::i;1438:829:84:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;1650:292:92:-;;;;;;:::i;:::-;;:::i;1001:113:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1085:22:91::1;:20;:22::i;:::-;1001:113:::0;:::o;2565:202:62:-;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;860:555:92:-;1049:16;:23;1010:5;;;1082:272;1106:11;1102:1;:15;1082:272;;;1138:17;1174:16;1191:1;1174:19;;;;;;;;:::i;:::-;;;;;;;;;;;1158:100;;-1:-1:-1;;;1158:100:92;;-1:-1:-1;;;;;6735:15:139;;;1158:100:92;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;1174:19:92;;;;1158:79;;6652:18:139;;1158:100:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1138:120;-1:-1:-1;1276:15:92;;;;1272:72;;1318:11;-1:-1:-1;1311:18:92;;-1:-1:-1;;1311:18:92;1272:72;-1:-1:-1;1119:3:92;;1082:272;;;-1:-1:-1;1377:30:92;1371:37;1364:44;;;860:555;;;;;;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;2978:1092:84:-:0;3156:16;:23;3087:13;;3134:19;3189:379;3213:11;3209:1;:15;3189:379;;;3282:16;3299:1;3282:19;;;;;;;;:::i;:::-;;;;;;;;;;;3266:108;;-1:-1:-1;;;3266:108:84;;1633:4:139;1621:17;;3266:108:84;;;1603:36:139;-1:-1:-1;;;;;3282:19:84;;;;3266:90;;1576:18:139;;3266:108:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3245:313;;;3450:16;3467:1;3450:19;;;;;;;;:::i;:::-;;;;;;;;;;;3434:109;;-1:-1:-1;;;3434:109:84;;1633:4:139;1621:17;;3434:109:84;;;1603:36:139;-1:-1:-1;;;;;3450:19:84;;;;3434:91;;1576:18:139;;3434:109:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3434:109:84;;;;;;;;;;;;:::i;:::-;3407:136;2978:1092;-1:-1:-1;;;;2978:1092:84:o;3245:313::-;3226:3;;3189:379;;;-1:-1:-1;;3612:15:84;:22;3649:9;3644:377;3668:11;3664:1;:15;3644:377;;;3737:15;3753:1;3737:18;;;;;;;;:::i;:::-;;;;;;;;;;;3721:107;;-1:-1:-1;;;3721:107:84;;1633:4:139;1621:17;;3721:107:84;;;1603:36:139;-1:-1:-1;;;;;3737:18:84;;;;3721:89;;1576:18:139;;3721:107:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3700:311;;;3904:15;3920:1;3904:18;;;;;;;;:::i;3700:311::-;3681:3;;3644:377;;;-1:-1:-1;;4030:33:84;;;;;;;;;;;;;;;;;;2978:1092;-1:-1:-1;;2978:1092:84:o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;2854:136:62:-:0;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4097:151:91:-;4187:16;4226:15;4219:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4219:22:91;;;;;;;;;;;;;;;;;;;;;;;4097:151;:::o;4143:464:84:-;4299:12;856:32:90;2464:16:62;2475:4;2464:10;:16::i;:::-;4374:65:84::1;4422:4;4428:2;4432:6;4374:47;:65::i;:::-;4356:131;;4471:5;4464:12;;;;4356:131;4544:56;4583:4;4589:2;4593:6;4544:38;:56::i;2490:1:62:-;4143:464:84::0;;;;;;:::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;1794:214:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1909:54:91::1;1931:15;1956:5;1909:21;:54::i;:::-;1978:23;::::0;-1:-1:-1;;;;;1978:23:91;::::1;::::0;::::1;::::0;;;::::1;1794:214:::0;;:::o;2502:272:84:-;2633:4;;2668:46;2694:5;2701:3;2706:7;2668:25;:46::i;:::-;:99;;;;2502:272;-1:-1:-1;;;;2502:272:84:o;648:267:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;773:15:91::1;:22:::0;:26;769:79:::1;;815:22;:20;:22::i;:::-;857:17;867:6;;857:9;:17::i;:::-;884:24;:15;902:6:::0;;884:24:::1;:::i;3868:141::-:0;3953:7;3979:15;3995:6;3979:23;;;;;;;;:::i;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;2408:191:91:-:0;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2549:43:91::1;2578:5;2586;2549:20;:43::i;3526:187::-:0;3616:13;3648:58;3674:15;3699:5;3648:25;:58::i;1438:829:84:-;1578:5;1617:10;1630:123;1700:5;1719:3;1736:7;1630:56;:123::i;:::-;1617:136;-1:-1:-1;1767:45:84;;;;1763:87;;1835:4;-1:-1:-1;1828:11:84;;1763:87;1903:15;:22;1881:19;1935:271;1959:11;1955:1;:15;1935:271;;;1991:17;2027:15;2043:1;2027:18;;;;;;;;:::i;:::-;;;;;;;;;;;2011:99;;-1:-1:-1;;;2011:99:84;;-1:-1:-1;;;;;6735:15:139;;;2011:99:84;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;2027:18:84;;;;2011:78;;6652:18:139;;2011:99:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1991:119;-1:-1:-1;2128:15:84;;;;2124:72;;2170:11;-1:-1:-1;2163:18:84;;-1:-1:-1;;;2163:18:84;2124:72;-1:-1:-1;1972:3:84;;1935:271;;;-1:-1:-1;2229:30:84;2216:44;1438:829;-1:-1:-1;;;;;;1438:829:84:o;4642:138:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;1650:292:92:-:0;1791:4;;1826:56;1862:5;1869:3;1874:7;1826:35;:56::i;3199:103:62:-;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;1200:439:91:-;1363:15;:22;1251:13;;1346:245;1387:5;;1346:245;;1500:1;1496;:5;1488:13;;1529:51;1550:15;1566:5;1550:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1550:22:91;1574:5;1529:20;:51::i;:::-;1394:3;;;:::i;:::-;;;1346:245;;;;1605:27;1616:15;1605:27;;;;;;:::i;:::-;;;;;;;;1241:398;1200:439::o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;4708:182:84;4819:14;4856:27;:25;:27::i;:::-;4849:34;;4708:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;4473:513:91:-;4640:15;:22;4594:12;;;4672:287;4696:11;4692:1;:15;4672:287;;;4728:11;4757:15;4773:1;4757:18;;;;;;;;:::i;:::-;;;;;;;;;;;4742:135;;-1:-1:-1;;;4742:135:91;;-1:-1:-1;;;;;6735:15:139;;;4742:135:91;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;4757:18:91;;;;4742:52;;6652:18:139;;4742:135:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4728:149;;4896:6;4891:58;;4929:5;4922:12;;;;;;;4891:58;-1:-1:-1;4709:3:91;;4672:287;;;-1:-1:-1;4975:4:91;;4473:513;-1:-1:-1;;;;;4473:513:91:o;1351:354:94:-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;2999:182:91:-;3078:55;3103:15;3120:5;3127;3078:24;:55::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9708:32:139;;3565:47:62;;;9690:51:139;9757:18;;;9750:34;;;9663:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;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:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:456;1077:6;1085;1093;1146:2;1134:9;1125:7;1121:23;1117:32;1114:52;;;1162:1;1159;1152:12;1114:52;1201:9;1188:23;1220:31;1245:5;1220:31;:::i;:::-;1270:5;-1:-1:-1;1327:2:139;1312:18;;1299:32;1340:33;1299:32;1340:33;:::i;:::-;1000:456;;1392:7;;-1:-1:-1;;;1446:2:139;1431:18;;;;1418:32;;1000:456::o;1650:315::-;1718:6;1726;1779:2;1767:9;1758:7;1754:23;1750:32;1747:52;;;1795:1;1792;1785:12;1747:52;1831:9;1818:23;1808:33;;1891:2;1880:9;1876:18;1863:32;1904:31;1929:5;1904:31;:::i;:::-;1954:5;1944:15;;;1650:315;;;;;:::o;2152:615::-;2238:6;2246;2299:2;2287:9;2278:7;2274:23;2270:32;2267:52;;;2315:1;2312;2305:12;2267:52;2355:9;2342:23;2384:18;2425:2;2417:6;2414:14;2411:34;;;2441:1;2438;2431:12;2411:34;2479:6;2468:9;2464:22;2454:32;;2524:7;2517:4;2513:2;2509:13;2505:27;2495:55;;2546:1;2543;2536:12;2495:55;2586:2;2573:16;2612:2;2604:6;2601:14;2598:34;;;2628:1;2625;2618:12;2598:34;2681:7;2676:2;2666:6;2663:1;2659:14;2655:2;2651:23;2647:32;2644:45;2641:65;;;2702:1;2699;2692:12;2641:65;2733:2;2725:11;;;;;2755:6;;-1:-1:-1;2152:615:139;;-1:-1:-1;;;;2152:615:139:o;3165:340::-;3258:6;3266;3319:2;3307:9;3298:7;3294:23;3290:32;3287:52;;;3335:1;3332;3325:12;3287:52;3374:9;3361:23;3393:31;3418:5;3393:31;:::i;:::-;3443:5;3495:2;3480:18;;;;3467:32;;-1:-1:-1;;;3165:340:139:o;3510:247::-;3569:6;3622:2;3610:9;3601:7;3597:23;3593:32;3590:52;;;3638:1;3635;3628:12;3590:52;3677:9;3664:23;3696:31;3721:5;3696:31;:::i;3762:114::-;3846:4;3839:5;3835:16;3828:5;3825:27;3815:55;;3866:1;3863;3856:12;3881:243;3938:6;3991:2;3979:9;3970:7;3966:23;3962:32;3959:52;;;4007:1;4004;3997:12;3959:52;4046:9;4033:23;4065:29;4088:5;4065:29;:::i;4129:250::-;4214:1;4224:113;4238:6;4235:1;4232:13;4224:113;;;4314:11;;;4308:18;4295:11;;;4288:39;4260:2;4253:10;4224:113;;;-1:-1:-1;;4371:1:139;4353:16;;4346:27;4129:250::o;4384:396::-;4533:2;4522:9;4515:21;4496:4;4565:6;4559:13;4608:6;4603:2;4592:9;4588:18;4581:34;4624:79;4696:6;4691:2;4680:9;4676:18;4671:2;4663:6;4659:15;4624:79;:::i;:::-;4764:2;4743:15;-1:-1:-1;;4739:29:139;4724:45;;;;4771:2;4720:54;;4384:396;-1:-1:-1;;4384:396:139:o;5062:658::-;5233:2;5285:21;;;5355:13;;5258:18;;;5377:22;;;5204:4;;5233:2;5456:15;;;;5430:2;5415:18;;;5204:4;5499:195;5513:6;5510:1;5507:13;5499:195;;;5578:13;;-1:-1:-1;;;;;5574:39:139;5562:52;;5669:15;;;;5634:12;;;;5610:1;5528:9;5499:195;;;-1:-1:-1;5711:3:139;;5062:658;-1:-1:-1;;;;;;5062:658:139:o;6345:127::-;6406:10;6401:3;6397:20;6394:1;6387:31;6437:4;6434:1;6427:15;6461:4;6458:1;6451:15;6857:247;6925:6;6978:2;6966:9;6957:7;6953:23;6949:32;6946:52;;;6994:1;6991;6984:12;6946:52;7026:9;7020:16;7045:29;7068:5;7045:29;:::i;7241:277::-;7308:6;7361:2;7349:9;7340:7;7336:23;7332:32;7329:52;;;7377:1;7374;7367:12;7329:52;7409:9;7403:16;7462:5;7455:13;7448:21;7441:5;7438:32;7428:60;;7484:1;7481;7474:12;7523:127;7584:10;7579:3;7575:20;7572:1;7565:31;7615:4;7612:1;7605:15;7639:4;7636:1;7629:15;7655:897;7735:6;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7837:9;7831:16;7866:18;7907:2;7899:6;7896:14;7893:34;;;7923:1;7920;7913:12;7893:34;7961:6;7950:9;7946:22;7936:32;;8006:7;7999:4;7995:2;7991:13;7987:27;7977:55;;8028:1;8025;8018:12;7977:55;8057:2;8051:9;8079:2;8075;8072:10;8069:36;;;8085:18;;:::i;:::-;8160:2;8154:9;8128:2;8214:13;;-1:-1:-1;;8210:22:139;;;8234:2;8206:31;8202:40;8190:53;;;8258:18;;;8278:22;;;8255:46;8252:72;;;8304:18;;:::i;:::-;8344:10;8340:2;8333:22;8379:2;8371:6;8364:18;8419:7;8414:2;8409;8405;8401:11;8397:20;8394:33;8391:53;;;8440:1;8437;8430:12;8391:53;8453:68;8518:2;8513;8505:6;8501:15;8496:2;8492;8488:11;8453:68;:::i;:::-;8540:6;7655:897;-1:-1:-1;;;;;;;7655:897:139:o;8557:127::-;8618:10;8613:3;8609:20;8606:1;8599:31;8649:4;8646:1;8639:15;8673:4;8670:1;8663:15;8689:136;8728:3;8756:5;8746:39;;8765:18;;:::i;:::-;-1:-1:-1;;;8801:18:139;;8689:136::o;8830:681::-;8998:2;9050:21;;;9120:13;;9023:18;;;9142:22;;;8969:4;9207:17;;;9247:16;;;8969:4;;8998:2;9195;9180:18;;;8969:4;9291:194;9305:6;9302:1;9299:13;9291:194;;;9370:13;;-1:-1:-1;;;;;9366:39:139;9354:52;;9402:1;9461:14;;;;9426:12;;;;9320:9;9291:194;;9795:128;9862:9;;;9883:11;;;9880:37;;;9897:18;;:::i;9928:331::-;10033:9;10044;10086:8;10074:10;10071:24;10068:44;;;10108:1;10105;10098:12;10068:44;10137:6;10127:8;10124:20;10121:40;;;10157:1;10154;10147:12;10121:40;-1:-1:-1;;10183:23:139;;;10228:25;;;;;-1:-1:-1;9928:331:139:o;10264:337::-;-1:-1:-1;;10385:19:139;;10472:11;;;;10503:2;10495:11;;10492:103;;;10582:2;10576;10569:3;10565:2;10561:12;10558:1;10554:20;10550:29;10546:2;10542:38;10538:47;10529:56;;10492:103;;;10264:337;;;;:::o;10606:127::-;10667:10;10662:3;10658:20;10655:1;10648:31;10698:4;10695:1;10688:15;10722:4;10719:1;10712:15", - "linkReferences": {}, - "immutableReferences": { - "54247": [ - { "start": 829, "length": 32 }, - { "start": 900, "length": 32 }, - { "start": 4989, "length": 32 } - ] - } - }, - "methodIdentifiers": { - "DEFAULT_ADMIN_ROLE()": "a217fddf", - "RULE_ENGINE_OPERATOR_ROLE()": "6728f545", - "TOKEN_CONTRACT_ROLE()": "0fbbfb55", - "addRuleOperation(address)": "c68a651a", - "addRuleValidation(address)": "cd1d4dc7", - "clearRulesOperation()": "001582f7", - "clearRulesValidation()": "8a1b6c8e", - "detectTransferRestriction(address,address,uint256)": "d4ce1415", - "detectTransferRestrictionValidation(address,address,uint256)": "28aa67bc", - "getRoleAdmin(bytes32)": "248a9ca3", - "getRuleIndexOperation(address)": "d0e835f2", - "getRuleIndexValidation(address)": "83304df0", - "grantRole(bytes32,address)": "2f2ff15d", - "hasRole(bytes32,address)": "91d14854", - "isTrustedForwarder(address)": "572b6c05", - "messageForTransferRestriction(uint8)": "7f4ab1dd", - "operateOnTransfer(address,address,uint256)": "c03888c2", - "removeRuleOperation(address,uint256)": "ce29ed35", - "removeRuleValidation(address,uint256)": "4d53374e", - "renounceRole(bytes32,address)": "36568abe", - "revokeRole(bytes32,address)": "d547741f", - "ruleOperation(uint256)": "ca3e16e7", - "ruleValidation(uint256)": "397a7d3c", - "rulesCountOperation()": "323a4616", - "rulesCountValidation()": "8a2021b1", - "rulesOperation()": "a39eda14", - "rulesValidation()": "c57086a1", - "setRulesOperation(address[])": "ca1f6c4d", - "setRulesValidation(address[])": "334a29cc", - "supportsInterface(bytes4)": "01ffc9a7", - "trustedForwarder()": "7da0a877", - "validateTransfer(address,address,uint256)": "c6946a12", - "validateTransferValidation(address,address,uint256)": "eb2647e3" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"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_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_TransferInvalid\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"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\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestrictionValidation\",\"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\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"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\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"operateOnTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"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\":\"ruleOperation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesOperation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"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\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransferValidation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":{\"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 signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"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`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexOperation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesOperation.length otherwise\"}},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"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\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"removeRuleOperation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"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.\"},\"ruleOperation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountOperation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesOperation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"validateTransferValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}}},\"title\":\"Implementation of a ruleEngine as defined by the CMTAT\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleOperation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"clearRulesOperation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"getRuleIndexOperation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the message corresponding to the code\"},\"removeRuleOperation(address,uint256)\":{\"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\"},\"removeRuleValidation(address,uint256)\":{\"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\"},\"ruleOperation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesOperation()\":{\"notice\":\"Get all the rules\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesOperation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"},\"validateTransferValidation(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/RuleEngine.sol\":\"RuleEngine\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol\":{\"keccak256\":\"0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607\",\"dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/RuleEngine.sol\":{\"keccak256\":\"0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b\",\"dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya\"]},\"src/interfaces/IRuleEngineOperation.sol\":{\"keccak256\":\"0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91\",\"dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleOperation.sol\":{\"keccak256\":\"0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce\",\"dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineOperation.sol\":{\"keccak256\":\"0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd\",\"dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs\"]},\"src/modules/RuleEngineValidation.sol\":{\"keccak256\":\"0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a\",\"dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]}},\"version\":1}", - "metadata": { - "compiler": { "version": "0.8.22+commit.4fc1097e" }, - "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_ArrayIsEmpty" }, - { - "inputs": [], - "type": "error", - "name": "RuleEngine_RuleAddressZeroNotAllowed" - }, - { - "inputs": [], - "type": "error", - "name": "RuleEngine_RuleAlreadyExists" - }, - { "inputs": [], "type": "error", "name": "RuleEngine_RuleDoNotMatch" }, - { "inputs": [], "type": "error", "name": "RuleEngine_TransferInvalid" }, - { - "inputs": [ - { - "internalType": "address", - "name": "rule", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "AddRule", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "rulesRemoved", - "type": "address[]", - "indexed": false - } - ], - "type": "event", - "name": "ClearRules", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "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": [], - "stateMutability": "view", - "type": "function", - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { "internalType": "bytes32", "name": "", "type": "bytes32" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "RULE_ENGINE_OPERATOR_ROLE", - "outputs": [ - { "internalType": "bytes32", "name": "", "type": "bytes32" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "TOKEN_CONTRACT_ROLE", - "outputs": [ - { "internalType": "bytes32", "name": "", "type": "bytes32" } - ] - }, - { - "inputs": [ - { - "internalType": "contract IRuleOperation", - "name": "rule_", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "addRuleOperation" - }, - { - "inputs": [ - { - "internalType": "contract IRuleValidation", - "name": "rule_", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "addRuleValidation" - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "clearRulesOperation" - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "clearRulesValidation" - }, - { - "inputs": [ - { "internalType": "address", "name": "_from", "type": "address" }, - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function", - "name": "detectTransferRestriction", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }] - }, - { - "inputs": [ - { "internalType": "address", "name": "_from", "type": "address" }, - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function", - "name": "detectTransferRestrictionValidation", - "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": "contract IRuleOperation", - "name": "rule_", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getRuleIndexOperation", - "outputs": [ - { "internalType": "uint256", "name": "index", "type": "uint256" } - ] - }, - { - "inputs": [ - { - "internalType": "contract IRuleValidation", - "name": "rule_", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getRuleIndexValidation", - "outputs": [ - { "internalType": "uint256", "name": "index", "type": "uint256" } - ] - }, - { - "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": "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": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "operateOnTransfer", - "outputs": [ - { "internalType": "bool", "name": "isValid", "type": "bool" } - ] - }, - { - "inputs": [ - { - "internalType": "contract IRuleOperation", - "name": "rule_", - "type": "address" - }, - { "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "removeRuleOperation" - }, - { - "inputs": [ - { - "internalType": "contract IRuleValidation", - "name": "rule_", - "type": "address" - }, - { "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "removeRuleValidation" - }, - { - "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": "ruleOperation", - "outputs": [ - { "internalType": "address", "name": "", "type": "address" } - ] - }, - { - "inputs": [ - { "internalType": "uint256", "name": "ruleId", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function", - "name": "ruleValidation", - "outputs": [ - { "internalType": "address", "name": "", "type": "address" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "rulesCountOperation", - "outputs": [ - { "internalType": "uint256", "name": "", "type": "uint256" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "rulesCountValidation", - "outputs": [ - { "internalType": "uint256", "name": "", "type": "uint256" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "rulesOperation", - "outputs": [ - { "internalType": "address[]", "name": "", "type": "address[]" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "rulesValidation", - "outputs": [ - { "internalType": "address[]", "name": "", "type": "address[]" } - ] - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "rules_", - "type": "address[]" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "setRulesOperation" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "rules_", - "type": "address[]" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "setRulesValidation" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function", - "name": "supportsInterface", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "trustedForwarder", - "outputs": [ - { "internalType": "address", "name": "", "type": "address" } - ] - }, - { - "inputs": [ - { "internalType": "address", "name": "_from", "type": "address" }, - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function", - "name": "validateTransfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [ - { "internalType": "address", "name": "_from", "type": "address" }, - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function", - "name": "validateTransferValidation", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "params": { - "admin": "Address of the contract (Access Control)", - "forwarderIrrevocable": "Address of the forwarder, required for the gasless support" - } - }, - "detectTransferRestriction(address,address,uint256)": { - "params": { - "_amount": "to transfer", - "_from": "the origin address", - "_to": "the destination address" - }, - "returns": { - "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*" - } - }, - "detectTransferRestrictionValidation(address,address,uint256)": { - "params": { - "_amount": "to transfer", - "_from": "the origin address", - "_to": "the destination address" - }, - "returns": { - "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*" - } - }, - "getRoleAdmin(bytes32)": { - "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." - }, - "getRuleIndexOperation(address)": { - "returns": { - "index": "if the rule is found, _rulesOperation.length otherwise" - } - }, - "getRuleIndexValidation(address)": { - "returns": { - "index": "if the rule is found, _rulesValidation.length otherwise" - } - }, - "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": "Returns `true` if `account` has been granted `role`." - }, - "isTrustedForwarder(address)": { - "details": "Indicates whether any particular address is the trusted forwarder." - }, - "messageForTransferRestriction(uint8)": { - "params": { "_restrictionCode": "The target restriction code" }, - "returns": { - "_0": "True if the transfer is valid, false otherwise*" - } - }, - "removeRuleOperation(address,uint256)": { - "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove", - "params": { - "index": "the position inside the array of rule", - "rule_": "address of the target rule" - } - }, - "removeRuleValidation(address,uint256)": { - "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove", - "params": { - "index": "the position inside the array of rule", - "rule_": "address of the target rule" - } - }, - "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." - }, - "ruleOperation(uint256)": { - "params": { "ruleId": "index of the rule" }, - "returns": { "_0": "a rule address" } - }, - "ruleValidation(uint256)": { - "params": { "ruleId": "index of the rule" }, - "returns": { "_0": "a rule address" } - }, - "rulesCountOperation()": { - "returns": { "_0": "The number of rules inside the array" } - }, - "rulesCountValidation()": { - "returns": { "_0": "The number of rules inside the array" } - }, - "rulesOperation()": { "returns": { "_0": "An array of rules" } }, - "rulesValidation()": { "returns": { "_0": "An array of rules" } }, - "setRulesValidation(address[])": { - "details": "take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]" - }, - "supportsInterface(bytes4)": { - "details": "See {IERC165-supportsInterface}." - }, - "trustedForwarder()": { - "details": "Returns the address of the trusted forwarder." - }, - "validateTransfer(address,address,uint256)": { - "params": { - "_amount": "to transfer", - "_from": "the origin address", - "_to": "the destination address" - }, - "returns": { - "_0": "True if the transfer is valid, false otherwise*" - } - }, - "validateTransferValidation(address,address,uint256)": { - "params": { - "_amount": "to transfer", - "_from": "the origin address", - "_to": "the destination address" - }, - "returns": { - "_0": "True if the transfer is valid, false otherwise*" - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "RULE_ENGINE_OPERATOR_ROLE()": { - "notice": "Role to manage the ruleEngine" - }, - "TOKEN_CONTRACT_ROLE()": { "notice": "token contract" }, - "addRuleOperation(address)": { - "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present" - }, - "addRuleValidation(address)": { - "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present" - }, - "clearRulesOperation()": { - "notice": "Clear all the rules of the array of rules" - }, - "clearRulesValidation()": { - "notice": "Clear all the rules of the array of rules" - }, - "detectTransferRestriction(address,address,uint256)": { - "notice": "Go through all the rule to know if a restriction exists on the transfer" - }, - "detectTransferRestrictionValidation(address,address,uint256)": { - "notice": "Go through all the rule to know if a restriction exists on the transfer" - }, - "getRuleIndexOperation(address)": { - "notice": "Get the index of a rule inside the list" - }, - "getRuleIndexValidation(address)": { - "notice": "Get the index of a rule inside the list" - }, - "messageForTransferRestriction(uint8)": { - "notice": "Return the message corresponding to the code" - }, - "removeRuleOperation(address,uint256)": { - "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" - }, - "removeRuleValidation(address,uint256)": { - "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" - }, - "ruleOperation(uint256)": { - "notice": "Get the rule at the position specified by ruleId" - }, - "ruleValidation(uint256)": { - "notice": "Get the rule at the position specified by ruleId" - }, - "rulesOperation()": { "notice": "Get all the rules" }, - "rulesValidation()": { "notice": "Get all the rules" }, - "setRulesOperation(address[])": { - "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present" - }, - "setRulesValidation(address[])": { - "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present" - }, - "validateTransfer(address,address,uint256)": { - "notice": "Validate a transfer" - }, - "validateTransferValidation(address,address,uint256)": { - "notice": "Validate a transfer" - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", - "CMTAT/=lib/CMTAT/contracts/", - "OZ/=lib/openzeppelin-contracts/contracts/", - "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ], - "optimizer": { "enabled": true, "runs": 200 }, - "metadata": { "bytecodeHash": "ipfs" }, - "compilationTarget": { "src/RuleEngine.sol": "RuleEngine" }, - "evmVersion": "london", - "libraries": {} - }, - "sources": { - "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": { - "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad", - "urls": [ - "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0", - "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg" - ], - "license": "MPL-2.0" - }, - "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": { - "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed", - "urls": [ - "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423", - "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx" - ], - "license": "MPL-2.0" - }, - "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": { - "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3", - "urls": [ - "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e", - "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF" - ], - "license": "MPL-2.0" - }, - "lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol": { - "keccak256": "0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f", - "urls": [ - "bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607", - "dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc" - ], - "license": "MPL-2.0" - }, - "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": { - "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308", - "urls": [ - "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80", - "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": { - "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41", - "urls": [ - "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26", - "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": { - "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6", - "urls": [ - "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f", - "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK" - ], - "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/introspection/ERC165.sol": { - "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", - "urls": [ - "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", - "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { - "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", - "urls": [ - "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", - "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" - ], - "license": "MIT" - }, - "src/RuleEngine.sol": { - "keccak256": "0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5", - "urls": [ - "bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b", - "dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya" - ], - "license": "MPL-2.0" - }, - "src/interfaces/IRuleEngineOperation.sol": { - "keccak256": "0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809", - "urls": [ - "bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91", - "dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76" - ], - "license": "MPL-2.0" - }, - "src/interfaces/IRuleEngineValidation.sol": { - "keccak256": "0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1", - "urls": [ - "bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20", - "dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT" - ], - "license": "MPL-2.0" - }, - "src/interfaces/IRuleOperation.sol": { - "keccak256": "0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6", - "urls": [ - "bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce", - "dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE" - ], - "license": "MPL-2.0" - }, - "src/interfaces/IRuleValidation.sol": { - "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1", - "urls": [ - "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9", - "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8" - ], - "license": "MPL-2.0" - }, - "src/modules/MetaTxModuleStandalone.sol": { - "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0", - "urls": [ - "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25", - "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj" - ], - "license": "MPL-2.0" - }, - "src/modules/RuleEngineInvariantStorage.sol": { - "keccak256": "0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0", - "urls": [ - "bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44", - "dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq" - ], - "license": "MPL-2.0" - }, - "src/modules/RuleEngineOperation.sol": { - "keccak256": "0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a", - "urls": [ - "bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd", - "dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs" - ], - "license": "MPL-2.0" - }, - "src/modules/RuleEngineValidation.sol": { - "keccak256": "0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367", - "urls": [ - "bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a", - "dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w" - ], - "license": "MPL-2.0" - }, - "src/modules/RuleEngineValidationCommon.sol": { - "keccak256": "0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb", - "urls": [ - "bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d", - "dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk" - ], - "license": "MPL-2.0" - }, - "src/modules/RuleInternal.sol": { - "keccak256": "0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c", - "urls": [ - "bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3", - "dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A" - ], - "license": "MPL-2.0" - } - }, - "version": 1 - }, - "id": 84 -} diff --git a/RuleWhitelistWrapper.json b/RuleWhitelistWrapper.json deleted file mode 100644 index 73281c9..0000000 --- a/RuleWhitelistWrapper.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"forwarderIrrevocable","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"TOKEN_CONTRACT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canReturnTransferRestrictionCode","inputs":[{"name":"_restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"clearRulesValidation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"detectTransferRestriction","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"","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":"getRuleIndexValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"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":"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":"pure"},{"type":"function","name":"removeRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"},{"name":"index","type":"uint256","internalType":"uint256"}],"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":"ruleValidation","inputs":[{"name":"ruleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"rulesCountValidation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"rulesValidation","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"setRulesValidation","inputs":[{"name":"rules_","type":"address[]","internalType":"address[]"}],"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":"trustedForwarder","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"validateTransfer","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"isValid","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"AddRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ClearRules","inputs":[{"name":"rulesRemoved","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"RemoveRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"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":"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_ArrayIsEmpty","inputs":[]},{"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_RuleAlreadyExists","inputs":[]},{"type":"error","name":"RuleEngine_RuleDoNotMatch","inputs":[]}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b506040516200197138038062001971833981016040819052620000349162000207565b6001600160a01b0380821660805282166200006257604051630872273360e21b815260040160405180910390fd5b6200006f600083620000a5565b506200009c7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99983620000a5565b505050620002be565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200014c576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200010362000156565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000150565b5060005b92915050565b60006200016262000167565b905090565b60003660146200017733620001c3565b8015620001845750808210155b15620001bb576000366200019983856200023f565b620001a692829062000261565b620001b1916200028d565b60601c9250505090565b339250505090565b6000620001cf60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200020257600080fd5b919050565b600080604083850312156200021b57600080fd5b6200022683620001ea565b91506200023660208401620001ea565b90509250929050565b818103818111156200015057634e487b7160e01b600052601160045260246000fd5b600080858511156200027257600080fd5b838611156200028057600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002b65780818660140360031b1b83161692505b505092915050565b608051611689620002e860003960008181610281015281816102f50152610f4701526116896000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;672:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1498:37:66;;;;;810:19:101;::::1;806:100;;852:43;;-1:-1:-1::0;;;852:43:101::1;;;;;;;;;;;806:100;915:37;2232:4:62;946:5:101::0;915:10:::1;:37::i;:::-;-1:-1:-1::0;962:44:101::1;726:38:90;1000:5:101::0;962:10:::1;:44::i;:::-;;672:341:::0;;378:3013;;6179:316:62;6256:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6272:217;6179:316;;;;:::o;2632:182:101:-;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2401:30;2420:10;2401:18;:30::i;:::-;:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;1830:137::-;1906:4;1942:18;1705:17;;;1622:107;1942:18;-1:-1:-1;;;;;1929:31:66;:9;-1:-1:-1;;;;;1929:31:66;;1922:38;;1830:137;;;:::o;14:177:139:-;93:13;;-1:-1:-1;;;;;135:31:139;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:293::-;275:6;283;336:2;324:9;315:7;311:23;307:32;304:52;;;352:1;349;342:12;304:52;375:40;405:9;375:40;:::i;:::-;365:50;;434:49;479:2;468:9;464:18;434:49;:::i;:::-;424:59;;196:293;;;;;:::o;494:225::-;561:9;;;582:11;;;579:134;;;635:10;630:3;626:20;623:1;616:31;670:4;667:1;660:15;698:4;695:1;688:15;724:331;829:9;840;882:8;870:10;867:24;864:44;;;904:1;901;894:12;864:44;933:6;923:8;920:20;917:40;;;953:1;950;943:12;917:40;-1:-1:-1;;979:23:139;;;1024:25;;;;;-1:-1:-1;724:331:139:o;1060:329::-;-1:-1:-1;;;;;;1181:19:139;;1260:11;;;;1291:2;1283:11;;1280:103;;;1370:2;1364;1357:3;1353:2;1349:12;1346:1;1342:20;1338:29;1334:2;1330:38;1326:47;1317:56;;1280:103;;;1060:329;;;;:::o;:::-;378:3013:101;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;:::-;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2289:32:139;;;2271:51;;2259:2;2244:18;4051:143:93;2125:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;3102:4:139;3090:17;;;3072:36;;3060:2;3045:18;490:60:106;2930:184:139;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;511:274:110;;;;;;:::i;:::-;;:::i;1622:107:66:-;1705:17;1622:107;;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4282:153:93;;;:::i;:::-;;;;;;;:::i;418:355:109:-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;1284:1247:101:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;4226:136::-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;511:274:110:-:0;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;:::-;1163:115:::0;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6144:15:139;;;662:51:109;;;6126:34:139;6196:15;;6176:18;;;6169:43;6228:18;;;6221:34;;;549:12:109;;;;662:4;;:30;;6061:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;:::-;2150:23;::::0;-1:-1:-1;;;;;2150:23:93;::::1;::::0;::::1;::::0;;;::::1;1963:217:::0;;:::o;1284:1247:101:-;1478:16;;;1492:1;1478:16;;;;;;;;1428:5;;;;1478:16;1492:1;1478:16;;;;;;;;-1:-1:-1;;1529:13:101;;;1540:1;1529:13;;;;;;;;1445:49;;-1:-1:-1;1504:22:101;;1529:13;;-1:-1:-1;1540:1:101;1529:13;;;;;;;;-1:-1:-1;;1575:13:101;;;1586:1;1575:13;;;;;;;;1504:38;;-1:-1:-1;1552:20:101;;1575:13;;-1:-1:-1;1586:1:101;1575:13;;;;;;;;;;-1:-1:-1;1575:13:101;1552:36;;1617:5;1598:13;1612:1;1598:16;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;1598:24:101;;;-1:-1:-1;;;;;1598:24:101;;;;;1651:3;1632:13;1646:1;1632:16;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1632:22:101;;;:16;;;;;;;;;;;:22;1686:16;:23;1664:19;1797:478;1821:11;1817:1;:15;1797:478;;;1909:16;1926:1;1909:19;;;;;;;;:::i;:::-;;;;;;;;;;;1893:89;;-1:-1:-1;;;1893:89:101;;-1:-1:-1;;;;;1909:19:101;;;;1893:74;;:89;;1968:13;;1893:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1893:89:101;;;;;;;;;;;;:::i;:::-;1882:100;;2000:8;2009:1;2000:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2016:6;2023:1;2016:9;;;;;;;;:::i;:::-;;;;;;;2015:10;2000:25;1996:129;;;2106:4;2094:6;2101:1;2094:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;1996:129;2142:8;2151:1;2142:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2158:6;2165:1;2158:9;;;;;;;;:::i;:::-;;;;;;;2157:10;2142:25;2138:127;;;2246:4;2234:6;2241:1;2234:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;2138:127;1834:3;;1797:478;;;;2289:6;2296:1;2289:9;;;;;;;;:::i;:::-;;;;;;;2284:241;;548:2:106;2314:40:101;;;;;;;;2284:241;2376:6;2383:1;2376:9;;;;;;;;:::i;:::-;;;;;;;2371:154;;612:2:106;2401:38:101;;;;;;;;2371:154;2483:30;2470:44;;;;;;;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;3199:103::-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;6179:316::-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;:::-;;;;;;;;1406:402;1364:444::o;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;2632:182:101;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;1351:354::-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9098:32:139;;3565:47:62;;;9080:51:139;9147:18;;;9140:34;;;9053:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;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:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:315;1068:6;1076;1129:2;1117:9;1108:7;1104:23;1100:32;1097:52;;;1145:1;1142;1135:12;1097:52;1181:9;1168:23;1158:33;;1241:2;1230:9;1226:18;1213:32;1254:31;1279:5;1254:31;:::i;:::-;1304:5;1294:15;;;1000:315;;;;;:::o;1320:615::-;1406:6;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1523:9;1510:23;1552:18;1593:2;1585:6;1582:14;1579:34;;;1609:1;1606;1599:12;1579:34;1647:6;1636:9;1632:22;1622:32;;1692:7;1685:4;1681:2;1677:13;1673:27;1663:55;;1714:1;1711;1704:12;1663:55;1754:2;1741:16;1780:2;1772:6;1769:14;1766:34;;;1796:1;1793;1786:12;1766:34;1849:7;1844:2;1834:6;1831:1;1827:14;1823:2;1819:23;1815:32;1812:45;1809:65;;;1870:1;1867;1860:12;1809:65;1901:2;1893:11;;;;;1923:6;;-1:-1:-1;1320:615:139;;-1:-1:-1;;;;1320:615:139:o;2333:340::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2542:9;2529:23;2561:31;2586:5;2561:31;:::i;:::-;2611:5;2663:2;2648:18;;;;2635:32;;-1:-1:-1;;;2333:340:139:o;2678:247::-;2737:6;2790:2;2778:9;2769:7;2765:23;2761:32;2758:52;;;2806:1;2803;2796:12;2758:52;2845:9;2832:23;2864:31;2889:5;2864:31;:::i;3119:114::-;3203:4;3196:5;3192:16;3185:5;3182:27;3172:55;;3223:1;3220;3213:12;3238:243;3295:6;3348:2;3336:9;3327:7;3323:23;3319:32;3316:52;;;3364:1;3361;3354:12;3316:52;3403:9;3390:23;3422:29;3445:5;3422:29;:::i;3486:548::-;3598:4;3627:2;3656;3645:9;3638:21;3688:6;3682:13;3731:6;3726:2;3715:9;3711:18;3704:34;3756:1;3766:140;3780:6;3777:1;3774:13;3766:140;;;3875:14;;;3871:23;;3865:30;3841:17;;;3860:2;3837:26;3830:66;3795:10;;3766:140;;;3770:3;3955:1;3950:2;3941:6;3930:9;3926:22;3922:31;3915:42;4025:2;4018;4014:7;4009:2;4001:6;3997:15;3993:29;3982:9;3978:45;3974:54;3966:62;;;;3486:548;;;;:::o;4498:658::-;4669:2;4721:21;;;4791:13;;4694:18;;;4813:22;;;4640:4;;4669:2;4892:15;;;;4866:2;4851:18;;;4640:4;4935:195;4949:6;4946:1;4943:13;4935:195;;;5014:13;;-1:-1:-1;;;;;5010:39:139;4998:52;;5105:15;;;;5070:12;;;;5046:1;4964:9;4935:195;;;-1:-1:-1;5147:3:139;;4498:658;-1:-1:-1;;;;;;4498:658:139:o;5161:456::-;5238:6;5246;5254;5307:2;5295:9;5286:7;5282:23;5278:32;5275:52;;;5323:1;5320;5313:12;5275:52;5362:9;5349:23;5381:31;5406:5;5381:31;:::i;:::-;5431:5;-1:-1:-1;5488:2:139;5473:18;;5460:32;5501:33;5460:32;5501:33;:::i;:::-;5161:456;;5553:7;;-1:-1:-1;;;5607:2:139;5592:18;;;;5579:32;;5161:456::o;5622:127::-;5683:10;5678:3;5674:20;5671:1;5664:31;5714:4;5711:1;5704:15;5738:4;5735:1;5728:15;6266:247;6334:6;6387:2;6375:9;6366:7;6362:23;6358:32;6355:52;;;6403:1;6400;6393:12;6355:52;6435:9;6429:16;6454:29;6477:5;6454:29;:::i;6518:127::-;6579:10;6574:3;6570:20;6567:1;6560:31;6610:4;6607:1;6600:15;6634:4;6631:1;6624:15;6650:164;6726:13;;6775;;6768:21;6758:32;;6748:60;;6804:1;6801;6794:12;6819:1123;6911:6;6942:2;6985;6973:9;6964:7;6960:23;6956:32;6953:52;;;7001:1;6998;6991:12;6953:52;7034:9;7028:16;7063:18;7104:2;7096:6;7093:14;7090:34;;;7120:1;7117;7110:12;7090:34;7158:6;7147:9;7143:22;7133:32;;7203:7;7196:4;7192:2;7188:13;7184:27;7174:55;;7225:1;7222;7215:12;7174:55;7254:2;7248:9;7276:2;7272;7269:10;7266:36;;;7282:18;;:::i;:::-;7328:2;7325:1;7321:10;7360:2;7354:9;7423:2;7419:7;7414:2;7410;7406:11;7402:25;7394:6;7390:38;7478:6;7466:10;7463:22;7458:2;7446:10;7443:18;7440:46;7437:72;;;7489:18;;:::i;:::-;7525:2;7518:22;7575:18;;;7609:15;;;;-1:-1:-1;7651:11:139;;;7647:20;;;7679:19;;;7676:39;;;7711:1;7708;7701:12;7676:39;7735:11;;;;7755:156;7771:6;7766:3;7763:15;7755:156;;;7837:31;7864:3;7837:31;:::i;:::-;7825:44;;7788:12;;;;7889;;;;7755:156;;;7930:6;6819:1123;-1:-1:-1;;;;;;;;6819:1123:139:o;7947:127::-;8008:10;8003:3;7999:20;7996:1;7989:31;8039:4;8036:1;8029:15;8063:4;8060:1;8053:15;8079:136;8118:3;8146:5;8136:39;;8155:18;;:::i;:::-;-1:-1:-1;;;8191:18:139;;8079:136::o;8220:681::-;8388:2;8440:21;;;8510:13;;8413:18;;;8532:22;;;8359:4;8597:17;;;8637:16;;;8359:4;;8388:2;8585;8570:18;;;8359:4;8681:194;8695:6;8692:1;8689:13;8681:194;;;8760:13;;-1:-1:-1;;;;;8756:39:139;8744:52;;8792:1;8851:14;;;;8816:12;;;;8710:9;8681:194;;9185:128;9252:9;;;9273:11;;;9270:37;;;9287:18;;:::i;9318:331::-;9423:9;9434;9476:8;9464:10;9461:24;9458:44;;;9498:1;9495;9488:12;9458:44;9527:6;9517:8;9514:20;9511:40;;;9547:1;9544;9537:12;9511:40;-1:-1:-1;;9573:23:139;;;9618:25;;;;;-1:-1:-1;9318:331:139:o;9654:337::-;-1:-1:-1;;9775:19:139;;9862:11;;;;9893:2;9885:11;;9882:103;;;9972:2;9966;9959:3;9955:2;9951:12;9948:1;9944:20;9940:29;9936:2;9932:38;9928:47;9919:56;;9882:103;;;9654:337;;;;:::o;9996:127::-;10057:10;10052:3;10048:20;10045:1;10038:31;10088:4;10085:1;10078:15;10112:4;10109:1;10102:15","linkReferences":{},"immutableReferences":{"54247":[{"start":641,"length":32},{"start":757,"length":32},{"start":3911,"length":32}]}},"methodIdentifiers":{"CODE_ADDRESS_FROM_NOT_WHITELISTED()":"5b119c0a","CODE_ADDRESS_TO_NOT_WHITELISTED()":"db136dad","DEFAULT_ADMIN_ROLE()":"a217fddf","RULE_ENGINE_OPERATOR_ROLE()":"6728f545","TOKEN_CONTRACT_ROLE()":"0fbbfb55","addRuleValidation(address)":"cd1d4dc7","canReturnTransferRestrictionCode(uint8)":"7d045df6","clearRulesValidation()":"8a1b6c8e","detectTransferRestriction(address,address,uint256)":"d4ce1415","getRoleAdmin(bytes32)":"248a9ca3","getRuleIndexValidation(address)":"83304df0","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","messageForTransferRestriction(uint8)":"7f4ab1dd","removeRuleValidation(address,uint256)":"4d53374e","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","ruleValidation(uint256)":"397a7d3c","rulesCountValidation()":"8a2021b1","rulesValidation()":"c57086a1","setRulesValidation(address[])":"334a29cc","supportsInterface(bytes4)":"01ffc9a7","trustedForwarder()":"7da0a877","validateTransfer(address,address,uint256)":"c6946a12"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"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\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"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\":\"CODE_ADDRESS_FROM_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\":[],\"name\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"canReturnTransferRestrictionCode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"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\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"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\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"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\":{\"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 signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"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`)\"}},\"kind\":\"dev\",\"methods\":{\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"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\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"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.\"},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"Wrapper to call several different whitelist rules\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the whitelist rules to know if a restriction exists on the transfer\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"removeRuleValidation(address,uint256)\":{\"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\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelistWrapper.sol\":\"RuleWhitelistWrapper\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]},\"src/rules/validation/RuleWhitelistWrapper.sol\":{\"keccak256\":\"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644\",\"dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"forwarderIrrevocable","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_ArrayIsEmpty"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAlreadyExists"},{"inputs":[],"type":"error","name":"RuleEngine_RuleDoNotMatch"},{"inputs":[{"internalType":"address","name":"rule","type":"address","indexed":true}],"type":"event","name":"AddRule","anonymous":false},{"inputs":[{"internalType":"address[]","name":"rulesRemoved","type":"address[]","indexed":false}],"type":"event","name":"ClearRules","anonymous":false},{"inputs":[{"internalType":"address","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":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"TOKEN_CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRuleValidation"},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"canReturnTransferRestrictionCode","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"clearRulesValidation"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestriction","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":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"view","type":"function","name":"getRuleIndexValidation","outputs":[{"internalType":"uint256","name":"index","type":"uint256"}]},{"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":"forwarder","type":"address"}],"stateMutability":"view","type":"function","name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRuleValidation"},{"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":"ruleValidation","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesCountValidation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesValidation","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address[]","name":"rules_","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setRulesValidation"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function","name":"validateTransfer","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"canReturnTransferRestrictionCode(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the restriction code is known, false otherwise*"}},"constructor":{"params":{"admin":"Address of the contract (Access Control)","forwarderIrrevocable":"Address of the forwarder, required for the gasless support"}},"detectTransferRestriction(address,address,uint256)":{"params":{"_from":"the origin address","_to":"the destination address"},"returns":{"_0":"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getRuleIndexValidation(address)":{"returns":{"index":"if the rule is found, _rulesValidation.length otherwise"}},"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":"Returns `true` if `account` has been granted `role`."},"isTrustedForwarder(address)":{"details":"Indicates whether any particular address is the trusted forwarder."},"messageForTransferRestriction(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the transfer is valid, false otherwise*"}},"removeRuleValidation(address,uint256)":{"details":"To reduce the array size, the last rule is moved to the location occupied by the rule to remove","params":{"index":"the position inside the array of rule","rule_":"address of the target rule"}},"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."},"ruleValidation(uint256)":{"params":{"ruleId":"index of the rule"},"returns":{"_0":"a rule address"}},"rulesCountValidation()":{"returns":{"_0":"The number of rules inside the array"}},"rulesValidation()":{"returns":{"_0":"An array of rules"}},"setRulesValidation(address[])":{"details":"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]"},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"trustedForwarder()":{"details":"Returns the address of the trusted forwarder."},"validateTransfer(address,address,uint256)":{"params":{"_amount":"to transfer","_from":"the origin address","_to":"the destination address"},"returns":{"isValid":"=> true if the transfer is valid, false otherwise*"}}},"version":1},"userdoc":{"kind":"user","methods":{"RULE_ENGINE_OPERATOR_ROLE()":{"notice":"Role to manage the ruleEngine"},"TOKEN_CONTRACT_ROLE()":{"notice":"token contract"},"addRuleValidation(address)":{"notice":"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"},"canReturnTransferRestrictionCode(uint8)":{"notice":"To know if the restriction code is valid for this rule or not"},"clearRulesValidation()":{"notice":"Clear all the rules of the array of rules"},"detectTransferRestriction(address,address,uint256)":{"notice":"Go through all the whitelist rules to know if a restriction exists on the transfer"},"getRuleIndexValidation(address)":{"notice":"Get the index of a rule inside the list"},"messageForTransferRestriction(uint8)":{"notice":"Return the corresponding message"},"removeRuleValidation(address,uint256)":{"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"},"ruleValidation(uint256)":{"notice":"Get the rule at the position specified by ruleId"},"rulesValidation()":{"notice":"Get all the rules"},"setRulesValidation(address[])":{"notice":"Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"},"validateTransfer(address,address,uint256)":{"notice":"Validate a transfer"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","CMTAT/=lib/CMTAT/contracts/","OZ/=lib/openzeppelin-contracts/contracts/","ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/rules/validation/RuleWhitelistWrapper.sol":"RuleWhitelistWrapper"},"evmVersion":"london","libraries":{}},"sources":{"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol":{"keccak256":"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad","urls":["bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0","dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol":{"keccak256":"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed","urls":["bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423","dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol":{"keccak256":"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3","urls":["bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e","dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"],"license":"MPL-2.0"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol":{"keccak256":"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6","urls":["bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f","dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"],"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/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"src/interfaces/IRuleEngineValidation.sol":{"keccak256":"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1","urls":["bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20","dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT"],"license":"MPL-2.0"},"src/interfaces/IRuleValidation.sol":{"keccak256":"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1","urls":["bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9","dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"],"license":"MPL-2.0"},"src/modules/MetaTxModuleStandalone.sol":{"keccak256":"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0","urls":["bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25","dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"],"license":"MPL-2.0"},"src/modules/RuleEngineInvariantStorage.sol":{"keccak256":"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0","urls":["bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44","dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq"],"license":"MPL-2.0"},"src/modules/RuleEngineValidationCommon.sol":{"keccak256":"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb","urls":["bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d","dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk"],"license":"MPL-2.0"},"src/modules/RuleInternal.sol":{"keccak256":"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c","urls":["bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3","dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A"],"license":"MPL-2.0"},"src/rules/validation/RuleWhitelistWrapper.sol":{"keccak256":"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785","urls":["bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644","dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol":{"keccak256":"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400","urls":["bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac","dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol":{"keccak256":"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6","urls":["bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531","dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol":{"keccak256":"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3","urls":["bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7","dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol":{"keccak256":"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2","urls":["bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e","dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleCommonInvariantStorage.sol":{"keccak256":"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678","urls":["bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749","dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleValidateTransfer.sol":{"keccak256":"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b","urls":["bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd","dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleWhitelistCommon.sol":{"keccak256":"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c","urls":["bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c","dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ"],"license":"MPL-2.0"}},"version":1},"id":101} \ No newline at end of file diff --git a/RuleWhitelistv2.0.2.json b/RuleWhitelistv2.0.2.json deleted file mode 100644 index 21cfa2a..0000000 --- a/RuleWhitelistv2.0.2.json +++ /dev/null @@ -1,1081 +0,0 @@ -{ - "contractName": "RuleWhitelist", - "abi": [ - { - "type": "constructor", - "inputs": [ - { "name": "admin", "type": "address", "internalType": "address" }, - { - "name": "forwarderIrrevocable", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "ADDRESS_LIST_ADD_ROLE", - "inputs": [], - "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ADDRESS_LIST_REMOVE_ROLE", - "inputs": [], - "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED", - "inputs": [], - "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "CODE_ADDRESS_TO_NOT_WHITELISTED", - "inputs": [], - "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "DEFAULT_ADMIN_ROLE", - "inputs": [], - "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "addAddressToTheList", - "inputs": [ - { - "name": "_newWhitelistAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addAddressesToTheList", - "inputs": [ - { - "name": "listWhitelistedAddress", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressIsListed", - "inputs": [ - { - "name": "_targetAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "addressIsListedBatch", - "inputs": [ - { - "name": "_targetAddresses", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [{ "name": "", "type": "bool[]", "internalType": "bool[]" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "canReturnTransferRestrictionCode", - "inputs": [ - { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" } - ], - "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "detectTransferRestriction", - "inputs": [ - { "name": "_from", "type": "address", "internalType": "address" }, - { "name": "_to", "type": "address", "internalType": "address" }, - { "name": "", "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": "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": "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": "pure" - }, - { - "type": "function", - "name": "numberListedAddress", - "inputs": [], - "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "removeAddressFromTheList", - "inputs": [ - { - "name": "_removeWhitelistAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "removeAddressesFromTheList", - "inputs": [ - { - "name": "listWhitelistedAddress", - "type": "address[]", - "internalType": "address[]" - } - ], - "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": "supportsInterface", - "inputs": [ - { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" } - ], - "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "trustedForwarder", - "inputs": [], - "outputs": [{ "name": "", "type": "address", "internalType": "address" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "validateTransfer", - "inputs": [ - { "name": "_from", "type": "address", "internalType": "address" }, - { "name": "_to", "type": "address", "internalType": "address" }, - { "name": "_amount", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [ - { "name": "isValid", "type": "bool", "internalType": "bool" } - ], - "stateMutability": "view" - }, - { - "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": "error", "name": "AccessControlBadConfirmation", "inputs": [] }, - { - "type": "error", - "name": "AccessControlUnauthorizedAccount", - "inputs": [ - { "name": "account", "type": "address", "internalType": "address" }, - { "name": "neededRole", "type": "bytes32", "internalType": "bytes32" } - ] - }, - { - "type": "error", - "name": "RuleAddressList_AdminWithAddressZeroNotAllowed", - "inputs": [] - }, - { "type": "error", "name": "Rulelist_AddressAlreadylisted", "inputs": [] }, - { "type": "error", "name": "Rulelist_AddressNotPresent", "inputs": [] } - ], - "bytecode":"0x60a06040523480156200001157600080fd5b50604051620013ca380380620013ca83398101604081905262000034916200023a565b6001600160a01b0380821660805282908290821662000066576040516317c69b0360e21b815260040160405180910390fd5b62000073600083620000d8565b50620000a07f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6183620000d8565b50620000cd7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec83620000d8565b5050505050620002f1565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200017f576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200013662000189565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000183565b5060005b92915050565b6000620001956200019a565b905090565b6000366014620001aa33620001f6565b8015620001b75750808210155b15620001ee57600036620001cc838562000272565b620001d992829062000294565b620001e491620002c0565b60601c9250505090565b339250505090565b60006200020260805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200023557600080fd5b919050565b600080604083850312156200024e57600080fd5b62000259836200021d565b915062000269602084016200021d565b90509250929050565b818103818111156200018357634e487b7160e01b600052601160045260246000fd5b60008085851115620002a557600080fd5b83861115620002b357600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002e95780818660140360031b1b83161692505b505092915050565b6080516110af6200031b6000396000818161023c015281816102b90152610bf401526110af6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033", - "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033", - "sourceMap": "204:1035:100:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;3537:356:102;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1400:190::-;;;;;;:::i;:::-;;:::i;:::-;;3012:107;;;:::i;:::-;;;3346:25:139;;;3334:2;3319:18;3012:107:102;3200:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;1880:203:102:-;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;4371:4:139;4359:17;;;4341:36;;4329:2;4314:18;490:60:106;4199:184:139;3312:146:102;;;;;;:::i;:::-;;:::i;511:274:110:-;;;;;;:::i;:::-;;:::i;1622:107:66:-;;;-1:-1:-1;;;;;1705:17:66;4919:32:139;4901:51;;4889:2;4874:18;1622:107:66;4755:203:139;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2701:190:102:-;;;;;;:::i;:::-;;:::i;2854:136:62:-;;;;;;:::i;:::-;;:::i;313:82:104:-;;361:34;313:82;;2187:49:62;;2232:4;2187:49;;418:355:109;;;;;;:::i;:::-;;:::i;804:433:100:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;2292:171:102:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;219:88:104;;270:37;219:88;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;3537:356:102:-;3637:13;3662:22;3698:16;:23;3687:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3687:35:102;;3662:60;;3737:9;3732:130;3756:16;:23;3752:1;:27;3732:130;;;3814:37;3831:16;3848:1;3831:19;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;3139:20:103;3116:4;3139:20;;;:4;:20;;;;;;;;;3029:137;3814:37:102;3800:8;3809:1;3800:11;;;;;;;;:::i;:::-;:51;;;:11;;;;;;;;;;;:51;3781:3;;3732:130;;;-1:-1:-1;3878:8:102;3537:356;-1:-1:-1;;3537:356:102:o;1400:190::-;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;1537:46:102::1;1560:22;;1537;:46::i;:::-;1400:190:::0;;;:::o;3012:107::-;3064:7;3090:22;2813:16:103;;;2732:104;3090:22:102;3083:29;;3012:107;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;1880:203:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2025:51:102::1;2053:22;;2025:27;:51::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;3312:146:102:-;-1:-1:-1;;;;;3139:20:103;;3396:4:102;3139:20:103;;;:4;:20;;;;;;;;3419:32:102;3029:137:103;511:274:110;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;2701:190:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2834:50:102::1;2860:23;2834:25;:50::i;:::-;2701:190:::0;;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6371:15:139;;;662:51:109;;;6353:34:139;6423:15;;6403:18;;;6396:43;6455:18;;;6448:34;;;549:12:109;;;;662:4;;:30;;6288:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;804:433:100:-;949:5;971:22;987:5;971:15;:22::i;:::-;966:265;;-1:-1:-1;548:2:106;1009:40:100;;966:265;1071:20;1087:3;1071:15;:20::i;:::-;1066:165;;-1:-1:-1;612:2:106;1107:38:100;;1066:165;-1:-1:-1;1189:30:100;1176:44;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;2292:171:102:-:0;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2414:42:102::1;2435:20;2414;:42::i;3199:103:62:-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;:::-;3199:103;:::o;607:406:103:-;724:16;;692:29;750:207;770:24;;;750:207;;;820:4;:22;825:13;;839:1;825:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;820:22:103;;;;;;;;;;;;-1:-1:-1;820:22:103;;;;815:132;;887:4;862;:22;867:13;;881:1;867:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;862:22:103;;;;;;;;;;;;-1:-1:-1;862:22:103;:29;;-1:-1:-1;;862:29:103;;;;;;;;;;909:23;;;:::i;:::-;;;815:132;796:3;;750:207;;;-1:-1:-1;966:16:103;:40;-1:-1:-1;;607:406:103:o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1284:425:103;1420:16;;1388:29;1446:207;1466:24;;;1446:207;;;1515:4;:22;1520:13;;1534:1;1520:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1515:22:103;;;;;;;;;;;;-1:-1:-1;1515:22:103;;;;1511:132;;;1582:5;1557:4;:22;1562:13;;1576:1;1562:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1557:22:103;;;;;;;;;;;;-1:-1:-1;1557:22:103;:30;;-1:-1:-1;;1557:30:103;;;;;;;;;;1605:23;;;:::i;:::-;;;1511:132;1492:3;;1446:207;;3994:182:102;4105:14;4142:27;:25;:27::i;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;2362:249:103;-1:-1:-1;;;;;2449:24:103;;;;;;:4;:24;;;;;;;;2444:91;;2496:28;;-1:-1:-1;;;2496:28:103;;;;;;;;;;;2444:91;-1:-1:-1;;;;;2544:24:103;;2571:5;2544:24;;;:4;:24;;;;;:32;;-1:-1:-1;;2544:32:103;;;2588:16;2586:18;;2588:16;;2571:5;2586:18;;;:::i;:::-;;;;-1:-1:-1;;2362:249:103:o;1903:236::-;-1:-1:-1;;;;;1981:21:103;;;;;;:4;:21;;;;;;;;1977:90;;;2025:31;;-1:-1:-1;;;2025:31:103;;;;;;;;;;;1977:90;-1:-1:-1;;;;;2076:21:103;;;;;;2100:4;2076:21;;;;;;;:28;;-1:-1:-1;;2076:28:103;;;;;;2116:16;2114:18;;2116:16;;2076:21;2114:18;;;:::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;7350:32:139;;3565:47:62;;;7332:51:139;7399:18;;;7392:34;;;7305:18;;3565:47:62;;;;;;;2204:429:66;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;14:286:139:-;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:139;;209:43;;199:71;;266:1;263;256:12;497:127;558:10;553:3;549:20;546:1;539:31;589:4;586:1;579:15;613:4;610:1;603:15;629:173;697:20;;-1:-1:-1;;;;;746:31:139;;736:42;;726:70;;792:1;789;782:12;807:1121;891:6;922:2;965;953:9;944:7;940:23;936:32;933:52;;;981:1;978;971:12;933:52;1021:9;1008:23;1050:18;1091:2;1083:6;1080:14;1077:34;;;1107:1;1104;1097:12;1077:34;1145:6;1134:9;1130:22;1120:32;;1190:7;1183:4;1179:2;1175:13;1171:27;1161:55;;1212:1;1209;1202:12;1161:55;1248:2;1235:16;1270:2;1266;1263:10;1260:36;;;1276:18;;:::i;:::-;1322:2;1319:1;1315:10;1354:2;1348:9;1417:2;1413:7;1408:2;1404;1400:11;1396:25;1388:6;1384:38;1472:6;1460:10;1457:22;1452:2;1440:10;1437:18;1434:46;1431:72;;;1483:18;;:::i;:::-;1519:2;1512:22;1569:18;;;1603:15;;;;-1:-1:-1;1645:11:139;;;1641:20;;;1673:19;;;1670:39;;;1705:1;1702;1695:12;1670:39;1729:11;;;;1749:148;1765:6;1760:3;1757:15;1749:148;;;1831:23;1850:3;1831:23;:::i;:::-;1819:36;;1782:12;;;;1875;;;;1749:148;;;1916:6;807:1121;-1:-1:-1;;;;;;;;807:1121:139:o;1933:642::-;2098:2;2150:21;;;2220:13;;2123:18;;;2242:22;;;2069:4;;2098:2;2321:15;;;;2295:2;2280:18;;;2069:4;2364:185;2378:6;2375:1;2372:13;2364:185;;;2453:13;;2446:21;2439:29;2427:42;;2524:15;;;;2489:12;;;;2400:1;2393:9;2364:185;;;-1:-1:-1;2566:3:139;;1933:642;-1:-1:-1;;;;;;1933:642:139:o;2580:615::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2783:9;2770:23;2812:18;2853:2;2845:6;2842:14;2839:34;;;2869:1;2866;2859:12;2839:34;2907:6;2896:9;2892:22;2882:32;;2952:7;2945:4;2941:2;2937:13;2933:27;2923:55;;2974:1;2971;2964:12;2923:55;3014:2;3001:16;3040:2;3032:6;3029:14;3026:34;;;3056:1;3053;3046:12;3026:34;3109:7;3104:2;3094:6;3091:1;3087:14;3083:2;3079:23;3075:32;3072:45;3069:65;;;3130:1;3127;3120:12;3069:65;3161:2;3153:11;;;;;3183:6;;-1:-1:-1;2580:615:139;;-1:-1:-1;;;;2580:615:139:o;3382:180::-;3441:6;3494:2;3482:9;3473:7;3469:23;3465:32;3462:52;;;3510:1;3507;3500:12;3462:52;-1:-1:-1;3533:23:139;;3382:180;-1:-1:-1;3382:180:139:o;3749:254::-;3817:6;3825;3878:2;3866:9;3857:7;3853:23;3849:32;3846:52;;;3894:1;3891;3884:12;3846:52;3930:9;3917:23;3907:33;;3959:38;3993:2;3982:9;3978:18;3959:38;:::i;:::-;3949:48;;3749:254;;;;;:::o;4008:186::-;4067:6;4120:2;4108:9;4099:7;4095:23;4091:32;4088:52;;;4136:1;4133;4126:12;4088:52;4159:29;4178:9;4159:29;:::i;4388:114::-;4472:4;4465:5;4461:16;4454:5;4451:27;4441:55;;4492:1;4489;4482:12;4507:243;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:52;;;4633:1;4630;4623:12;4585:52;4672:9;4659:23;4691:29;4714:5;4691:29;:::i;4963:548::-;5075:4;5104:2;5133;5122:9;5115:21;5165:6;5159:13;5208:6;5203:2;5192:9;5188:18;5181:34;5233:1;5243:140;5257:6;5254:1;5251:13;5243:140;;;5352:14;;;5348:23;;5342:30;5318:17;;;5337:2;5314:26;5307:66;5272:10;;5243:140;;;5247:3;5432:1;5427:2;5418:6;5407:9;5403:22;5399:31;5392:42;5502:2;5495;5491:7;5486:2;5478:6;5474:15;5470:29;5459:9;5455:45;5451:54;5443:62;;;;4963:548;;;;:::o;5516:328::-;5593:6;5601;5609;5662:2;5650:9;5641:7;5637:23;5633:32;5630:52;;;5678:1;5675;5668:12;5630:52;5701:29;5720:9;5701:29;:::i;:::-;5691:39;;5749:38;5783:2;5772:9;5768:18;5749:38;:::i;:::-;5739:48;;5834:2;5823:9;5819:18;5806:32;5796:42;;5516:328;;;;;:::o;5849:127::-;5910:10;5905:3;5901:20;5898:1;5891:31;5941:4;5938:1;5931:15;5965:4;5962:1;5955:15;6493:247;6561:6;6614:2;6602:9;6593:7;6589:23;6585:32;6582:52;;;6630:1;6627;6620:12;6582:52;6662:9;6656:16;6681:29;6704:5;6681:29;:::i;6745:127::-;6806:10;6801:3;6797:20;6794:1;6787:31;6837:4;6834:1;6827:15;6861:4;6858:1;6851:15;6877:135;6916:3;6937:17;;;6934:43;;6957:18;;:::i;:::-;-1:-1:-1;7004:1:139;6993:13;;6877:135::o;7017:136::-;7056:3;7084:5;7074:39;;7093:18;;:::i;:::-;-1:-1:-1;;;7129:18:139;;7017:136::o;7437:128::-;7504:9;;;7525:11;;;7522:37;;;7539:18;;:::i;7570:331::-;7675:9;7686;7728:8;7716:10;7713:24;7710:44;;;7750:1;7747;7740:12;7710:44;7779:6;7769:8;7766:20;7763:40;;;7799:1;7796;7789:12;7763:40;-1:-1:-1;;7825:23:139;;;7870:25;;;;;-1:-1:-1;7570:331:139:o;7906:337::-;-1:-1:-1;;8027:19:139;;8114:11;;;;8145:2;8137:11;;8134:103;;;8224:2;8218;8211:3;8207:2;8203:12;8200:1;8196:20;8192:29;8188:2;8184:38;8180:47;8171:56;;8134:103;;;7906:337;;;;:::o", - "linkReferences": {}, - "immutableReferences": { - "54247": [ - { "start": 572, "length": 32 }, - { "start": 697, "length": 32 }, - { "start": 3060, "length": 32 } - ] - } - }, - "methodIdentifiers": { - "ADDRESS_LIST_ADD_ROLE()": "948b851e", - "ADDRESS_LIST_REMOVE_ROLE()": "fa83a2da", - "CODE_ADDRESS_FROM_NOT_WHITELISTED()": "5b119c0a", - "CODE_ADDRESS_TO_NOT_WHITELISTED()": "db136dad", - "DEFAULT_ADMIN_ROLE()": "a217fddf", - "addAddressToTheList(address)": "daafd1c7", - "addAddressesToTheList(address[])": "11d1c5ca", - "addressIsListed(address)": "5b577f66", - "addressIsListedBatch(address[])": "0a3640d2", - "canReturnTransferRestrictionCode(uint8)": "7d045df6", - "detectTransferRestriction(address,address,uint256)": "d4ce1415", - "getRoleAdmin(bytes32)": "248a9ca3", - "grantRole(bytes32,address)": "2f2ff15d", - "hasRole(bytes32,address)": "91d14854", - "isTrustedForwarder(address)": "572b6c05", - "messageForTransferRestriction(uint8)": "7f4ab1dd", - "numberListedAddress()": "13be3212", - "removeAddressFromTheList(address)": "893c1440", - "removeAddressesFromTheList(address[])": "3630e2ea", - "renounceRole(bytes32,address)": "36568abe", - "revokeRole(bytes32,address)": "d547741f", - "supportsInterface(bytes4)": "01ffc9a7", - "trustedForwarder()": "7da0a877", - "validateTransfer(address,address,uint256)": "c6946a12" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"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\":[],\"name\":\"Rulelist_AddressAlreadylisted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rulelist_AddressNotPresent\",\"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\":\"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_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\":\"_newWhitelistAddress\",\"type\":\"address\"}],\"name\":\"addAddressToTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"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\":\"\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"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\":\"_removeWhitelistAddress\",\"type\":\"address\"}],\"name\":\"removeAddressFromTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"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\":{\"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 signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"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`)\"}},\"kind\":\"dev\",\"methods\":{\"addAddressToTheList(address)\":{\"params\":{\"_newWhitelistAddress\":\"The address to whitelist\"}},\"addAddressesToTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses to whitelist\"}},\"addressIsListed(address)\":{\"params\":{\"_targetAddress\":\"The concerned address\"},\"returns\":{\"_0\":\"True if the address is listed, false otherwise\"}},\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"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\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"numberListedAddress()\":{\"returns\":{\"_0\":\"Number of listed addresses\"}},\"removeAddressFromTheList(address)\":{\"params\":{\"_removeWhitelistAddress\":\"The address to remove\"}},\"removeAddressesFromTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses 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.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"a whitelist manager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAddressToTheList(address)\":{\"notice\":\"Add one address to the whitelist If the address already exists, the transaction is reverted to save gas.\"},\"addAddressesToTheList(address[])\":{\"notice\":\"Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert).\"},\"addressIsListed(address)\":{\"notice\":\"Know if an address is listed or not\"},\"addressIsListedBatch(address[])\":{\"notice\":\"batch version of {addressIsListed}\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Check if an addres is in the whitelist or not\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"numberListedAddress()\":{\"notice\":\"Get the number of listed addresses\"},\"removeAddressFromTheList(address)\":{\"notice\":\"Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas.\"},\"removeAddressesFromTheList(address[])\":{\"notice\":\"Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert).\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelist.sol\":\"RuleWhitelist\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/rules/validation/RuleWhitelist.sol\":{\"keccak256\":\"0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690\",\"dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}", - "metadata": { - "compiler": { "version": "0.8.22+commit.4fc1097e" }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { "internalType": "address", "name": "admin", "type": "address" }, - { - "internalType": "address", - "name": "forwarderIrrevocable", - "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": "RuleAddressList_AdminWithAddressZeroNotAllowed" - }, - { - "inputs": [], - "type": "error", - "name": "Rulelist_AddressAlreadylisted" - }, - { "inputs": [], "type": "error", "name": "Rulelist_AddressNotPresent" }, - { - "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": [], - "stateMutability": "view", - "type": "function", - "name": "ADDRESS_LIST_ADD_ROLE", - "outputs": [ - { "internalType": "bytes32", "name": "", "type": "bytes32" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "ADDRESS_LIST_REMOVE_ROLE", - "outputs": [ - { "internalType": "bytes32", "name": "", "type": "bytes32" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "CODE_ADDRESS_TO_NOT_WHITELISTED", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { "internalType": "bytes32", "name": "", "type": "bytes32" } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newWhitelistAddress", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "addAddressToTheList" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "listWhitelistedAddress", - "type": "address[]" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "addAddressesToTheList" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_targetAddress", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "addressIsListed", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_targetAddresses", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function", - "name": "addressIsListedBatch", - "outputs": [ - { "internalType": "bool[]", "name": "", "type": "bool[]" } - ] - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_restrictionCode", - "type": "uint8" - } - ], - "stateMutability": "pure", - "type": "function", - "name": "canReturnTransferRestrictionCode", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [ - { "internalType": "address", "name": "_from", "type": "address" }, - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function", - "name": "detectTransferRestriction", - "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": "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": "forwarder", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isTrustedForwarder", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_restrictionCode", - "type": "uint8" - } - ], - "stateMutability": "pure", - "type": "function", - "name": "messageForTransferRestriction", - "outputs": [ - { "internalType": "string", "name": "", "type": "string" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "numberListedAddress", - "outputs": [ - { "internalType": "uint256", "name": "", "type": "uint256" } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_removeWhitelistAddress", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "removeAddressFromTheList" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "listWhitelistedAddress", - "type": "address[]" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "removeAddressesFromTheList" - }, - { - "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": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function", - "name": "supportsInterface", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "trustedForwarder", - "outputs": [ - { "internalType": "address", "name": "", "type": "address" } - ] - }, - { - "inputs": [ - { "internalType": "address", "name": "_from", "type": "address" }, - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function", - "name": "validateTransfer", - "outputs": [ - { "internalType": "bool", "name": "isValid", "type": "bool" } - ] - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "addAddressToTheList(address)": { - "params": { "_newWhitelistAddress": "The address to whitelist" } - }, - "addAddressesToTheList(address[])": { - "params": { - "listWhitelistedAddress": "an array with the addresses to whitelist" - } - }, - "addressIsListed(address)": { - "params": { "_targetAddress": "The concerned address" }, - "returns": { - "_0": "True if the address is listed, false otherwise" - } - }, - "canReturnTransferRestrictionCode(uint8)": { - "params": { "_restrictionCode": "The target restriction code" }, - "returns": { - "_0": "true if the restriction code is known, false otherwise*" - } - }, - "constructor": { - "params": { - "admin": "Address of the contract (Access Control)", - "forwarderIrrevocable": "Address of the forwarder, required for the gasless support" - } - }, - "detectTransferRestriction(address,address,uint256)": { - "params": { - "_from": "the origin address", - "_to": "the destination address" - }, - "returns": { - "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*" - } - }, - "getRoleAdmin(bytes32)": { - "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." - }, - "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": "Returns `true` if `account` has been granted `role`." - }, - "isTrustedForwarder(address)": { - "details": "Indicates whether any particular address is the trusted forwarder." - }, - "messageForTransferRestriction(uint8)": { - "params": { "_restrictionCode": "The target restriction code" }, - "returns": { - "_0": "true if the transfer is valid, false otherwise*" - } - }, - "numberListedAddress()": { - "returns": { "_0": "Number of listed addresses" } - }, - "removeAddressFromTheList(address)": { - "params": { "_removeWhitelistAddress": "The address to remove" } - }, - "removeAddressesFromTheList(address[])": { - "params": { - "listWhitelistedAddress": "an array with the addresses 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." - }, - "supportsInterface(bytes4)": { - "details": "See {IERC165-supportsInterface}." - }, - "trustedForwarder()": { - "details": "Returns the address of the trusted forwarder." - }, - "validateTransfer(address,address,uint256)": { - "params": { - "_amount": "to transfer", - "_from": "the origin address", - "_to": "the destination address" - }, - "returns": { - "isValid": "=> true if the transfer is valid, false otherwise*" - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "addAddressToTheList(address)": { - "notice": "Add one address to the whitelist If the address already exists, the transaction is reverted to save gas." - }, - "addAddressesToTheList(address[])": { - "notice": "Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert)." - }, - "addressIsListed(address)": { - "notice": "Know if an address is listed or not" - }, - "addressIsListedBatch(address[])": { - "notice": "batch version of {addressIsListed}" - }, - "canReturnTransferRestrictionCode(uint8)": { - "notice": "To know if the restriction code is valid for this rule or not" - }, - "detectTransferRestriction(address,address,uint256)": { - "notice": "Check if an addres is in the whitelist or not" - }, - "messageForTransferRestriction(uint8)": { - "notice": "Return the corresponding message" - }, - "numberListedAddress()": { - "notice": "Get the number of listed addresses" - }, - "removeAddressFromTheList(address)": { - "notice": "Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas." - }, - "removeAddressesFromTheList(address[])": { - "notice": "Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert)." - }, - "validateTransfer(address,address,uint256)": { - "notice": "Validate a transfer" - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", - "CMTAT/=lib/CMTAT/contracts/", - "OZ/=lib/openzeppelin-contracts/contracts/", - "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ], - "optimizer": { "enabled": true, "runs": 200 }, - "metadata": { "bytecodeHash": "ipfs" }, - "compilationTarget": { - "src/rules/validation/RuleWhitelist.sol": "RuleWhitelist" - }, - "evmVersion": "london", - "libraries": {} - }, - "sources": { - "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": { - "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad", - "urls": [ - "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0", - "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg" - ], - "license": "MPL-2.0" - }, - "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": { - "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed", - "urls": [ - "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423", - "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx" - ], - "license": "MPL-2.0" - }, - "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": { - "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3", - "urls": [ - "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e", - "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF" - ], - "license": "MPL-2.0" - }, - "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": { - "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308", - "urls": [ - "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80", - "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": { - "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41", - "urls": [ - "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26", - "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": { - "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6", - "urls": [ - "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f", - "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK" - ], - "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/introspection/ERC165.sol": { - "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", - "urls": [ - "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", - "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { - "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", - "urls": [ - "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", - "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" - ], - "license": "MIT" - }, - "src/interfaces/IRuleValidation.sol": { - "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1", - "urls": [ - "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9", - "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8" - ], - "license": "MPL-2.0" - }, - "src/modules/MetaTxModuleStandalone.sol": { - "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0", - "urls": [ - "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25", - "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/RuleWhitelist.sol": { - "keccak256": "0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43", - "urls": [ - "bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690", - "dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol": { - "keccak256": "0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400", - "urls": [ - "bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac", - "dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol": { - "keccak256": "0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6", - "urls": [ - "bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531", - "dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol": { - "keccak256": "0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3", - "urls": [ - "bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7", - "dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol": { - "keccak256": "0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2", - "urls": [ - "bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e", - "dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/abstract/RuleCommonInvariantStorage.sol": { - "keccak256": "0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678", - "urls": [ - "bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749", - "dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/abstract/RuleValidateTransfer.sol": { - "keccak256": "0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b", - "urls": [ - "bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd", - "dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt" - ], - "license": "MPL-2.0" - }, - "src/rules/validation/abstract/RuleWhitelistCommon.sol": { - "keccak256": "0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c", - "urls": [ - "bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c", - "dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ" - ], - "license": "MPL-2.0" - } - }, - "version": 1 - }, - "id": 100 -}