diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5cdc0f92..743239e1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,6 +6,7 @@ env: FOUNDRY_PROFILE: ci jobs: + foundry-test: strategy: fail-fast: true @@ -16,15 +17,16 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive + fetch-depth: 0 - name: List files in the repository run: | - ls ${{ github.workspace }} - - - uses: chill-viking/npm-ci@latest - name: Install NPM Dependencies + ls -R ${{ github.workspace }} + + - name: Run install + uses: borales/actions-yarn@v4 with: - working_directory: ${{ github.workspace }} + cmd: install # will run `yarn install` command - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 @@ -34,7 +36,7 @@ jobs: - name: Run Forge build run: | forge --version - forge build --sizes + forge build --force --sizes id: build - name: Run Forge tests @@ -67,4 +69,4 @@ jobs: - name: Test uses: ambersun1234/hardhat-test-action@v0.0.1 with: - network: hardhat \ No newline at end of file + network: hardhat diff --git a/.prettierrc b/.prettierrc index 0e23fe30..6ce911d6 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,5 +2,6 @@ "trailingComma": "es5", "tabWidth": 4, "semi": false, - "singleQuote": false + "singleQuote": false, + "bracketSpacing": true } \ No newline at end of file diff --git a/.solhint.json b/.solhint.json index f7798eb5..0fe768e1 100644 --- a/.solhint.json +++ b/.solhint.json @@ -3,18 +3,18 @@ "plugins": ["prettier"], "rules": { "code-complexity": ["error", 8], - "compiler-version": ["error", ">=0.5.8"], + "compiler-version": ["error", ">=0.8.0"], "const-name-snakecase": "off", "constructor-syntax": "error", "func-visibility": ["error", { "ignoreConstructors": true }], "max-line-length": ["error", 120], "not-rely-on-time": "off", - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ], - "reason-string": ["warn", { "maxLength": 64 }] + "reason-string": ["warn", { "maxLength": 64 }], + "no-unused-import": "error", + "no-unused-vars": "error", + "no-inline-assembly": "off", + "avoid-low-level-calls": "off", + "no-global-import": "error", + "prettier/prettier": "error" } } \ No newline at end of file diff --git a/GUIDELINES.md b/GUIDELINES.md index 5b259c0f..a820eb99 100644 --- a/GUIDELINES.md +++ b/GUIDELINES.md @@ -18,6 +18,13 @@ The test suite coverage must be kept as close to 100% as possible, enforced in p Test should use Foundry, unless for some reason js or hardhat are needed (for example, upgrades). +The test function names will follow + +``` +- test_contextCamel_descriptionOfTheTestCamel +- context = method name, contract or functionality. +``` + In some cases unit tests may be insufficient and complementary techniques should be used: 1. Property-based tests (aka. fuzzing) for math-heavy code. @@ -40,7 +47,7 @@ Modularity should be pursued, but not at the cost of the above priorities. For contributors, project guidelines and processes must be documented publicly. -Every method and contract must have Natspec +Every method and contract must have Natspec, using the `///` flavour always. For users, features must be abundantly documented. Documentation should include answers to common questions, solutions to common problems, and recommendations for critical decisions that the user may face. @@ -77,7 +84,7 @@ Pull requests are squash-merged to keep the `main` branch history clean. The tit We welcome conventional commits, with prefixes the title with "fix:" or "feat:". -Work in progress pull requests should be submitted as Drafts and should not be prefixed with "WIP:". +Work in progress pull requests should be submitted as Drafts and should **not** be prefixed with "WIP:". Branch names don't matter, and commit messages within a pull request mostly don't matter either, although they can help the review process. @@ -120,7 +127,9 @@ In addition to the official Solidity Style Guide we have a number of other conve interface IERC777 { ``` -* Group contracts by functionality within folders if possible. +* Group contracts by functionality within folders if possible. + +* Interfaces should go inside the `interface` folder, mirroring the folder structure of the implementations * Folder names must be lowercase, hyphen separated. @@ -134,4 +143,24 @@ In addition to the official Solidity Style Guide we have a number of other conve ExampleContract.sol ``` +* Acronyms should be + * Uppercase all if in contract name (`UUPSUpgradeable`, `IPAsset`) + * Camelcase in properties and function names (`ipAssetId`), except if they are defined otherwise in external contracts or interfaces (`tokenURI`) + * Unchecked arithmetic blocks should contain comments explaining why overflow is guaranteed not to happen. If the reason is immediately apparent from the line above the unchecked block, the comment may be omitted. + +* Interfaces should contain methods an events. Structs showing in an interface should be grouped in a library + +* Function parameter names will have the **suffix** `_` + +* Naming conventions + - Contract: CamelCase (adjectiveNoun) + - Struct (noun) + - Event (past-tense) + - Function Name (verb noun) + - local variable (noun / compound noun) + - Booleans (use `isXXX`) + - `isValid` + - `valid` + - Modifier (prepositionNoun) + - `onlyOwner` \ No newline at end of file diff --git a/broadcast/GrantRole.s.sol/5/run-1697136928.json b/broadcast/GrantRole.s.sol/5/run-1697136928.json new file mode 100644 index 00000000..98dffea4 --- /dev/null +++ b/broadcast/GrantRole.s.sol/5/run-1697136928.json @@ -0,0 +1,39 @@ +{ + "transactions": [ + { + "hash": "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", + "function": "grantRole(bytes32,address)", + "arguments": [ + "0x637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9", + "0xB6288e57bf7406B35ab4F70Fd1135E907107e386" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0x3b698f6ea479672d5ff21d6bc352a2de477a6c64", + "gas": "0x12f1f", + "value": "0x0", + "data": "0x2f2ff15d637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e386", + "nonce": "0x6e", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac" + ], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/GrantRole.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697136928, + "chain": 5, + "multi": false, + "commit": "5bd60a5" +} \ No newline at end of file diff --git a/broadcast/GrantRole.s.sol/5/run-1697136952.json b/broadcast/GrantRole.s.sol/5/run-1697136952.json new file mode 100644 index 00000000..1cd0c268 --- /dev/null +++ b/broadcast/GrantRole.s.sol/5/run-1697136952.json @@ -0,0 +1,71 @@ +{ + "transactions": [ + { + "hash": "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", + "function": "grantRole(bytes32,address)", + "arguments": [ + "0x637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9", + "0xB6288e57bf7406B35ab4F70Fd1135E907107e386" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0x3b698f6ea479672d5ff21d6bc352a2de477a6c64", + "gas": "0x12f1f", + "value": "0x0", + "data": "0x2f2ff15d637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e386", + "nonce": "0x6e", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac", + "transactionIndex": "0x3", + "blockHash": "0xb6635783395aa0162a31ba79c92dccdc4930479e47724210908ce84595b8cba2", + "blockNumber": "0x966095", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", + "cumulativeGasUsed": "0x68a62", + "gasUsed": "0xdb75", + "contractAddress": null, + "logs": [ + { + "address": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9", + "0x000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e386", + "0x000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e386" + ], + "data": "0x", + "blockHash": "0xb6635783395aa0162a31ba79c92dccdc4930479e47724210908ce84595b8cba2", + "blockNumber": "0x966095", + "transactionHash": "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac", + "transactionIndex": "0x3", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000002000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000080000000000000000000000000000000000000000000100000000000002010000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/GrantRole.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697136952, + "chain": 5, + "multi": false, + "commit": "5bd60a5" +} \ No newline at end of file diff --git a/broadcast/GrantRole.s.sol/5/run-latest.json b/broadcast/GrantRole.s.sol/5/run-latest.json new file mode 100644 index 00000000..1cd0c268 --- /dev/null +++ b/broadcast/GrantRole.s.sol/5/run-latest.json @@ -0,0 +1,71 @@ +{ + "transactions": [ + { + "hash": "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", + "function": "grantRole(bytes32,address)", + "arguments": [ + "0x637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9", + "0xB6288e57bf7406B35ab4F70Fd1135E907107e386" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0x3b698f6ea479672d5ff21d6bc352a2de477a6c64", + "gas": "0x12f1f", + "value": "0x0", + "data": "0x2f2ff15d637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e386", + "nonce": "0x6e", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac", + "transactionIndex": "0x3", + "blockHash": "0xb6635783395aa0162a31ba79c92dccdc4930479e47724210908ce84595b8cba2", + "blockNumber": "0x966095", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", + "cumulativeGasUsed": "0x68a62", + "gasUsed": "0xdb75", + "contractAddress": null, + "logs": [ + { + "address": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x637821dcee84aabec9c8cf4f6f643013a24ad27fd41511ffd937aea80d8619a9", + "0x000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e386", + "0x000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e386" + ], + "data": "0x", + "blockHash": "0xb6635783395aa0162a31ba79c92dccdc4930479e47724210908ce84595b8cba2", + "blockNumber": "0x966095", + "transactionHash": "0x19986ffc0c641ee380a6e4d049f8f8c75b15f4318e6b6e0961e473d76ec67fac", + "transactionIndex": "0x3", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000002000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000080000000000000000000000000000000000000000000100000000000002010000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/GrantRole.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697136952, + "chain": 5, + "multi": false, + "commit": "5bd60a5" +} \ No newline at end of file diff --git a/broadcast/RelationshipProcessors.s.sol/5/run-1697154335.json b/broadcast/RelationshipProcessors.s.sol/5/run-1697154335.json new file mode 100644 index 00000000..82dcedf4 --- /dev/null +++ b/broadcast/RelationshipProcessors.s.sol/5/run-1697154335.json @@ -0,0 +1,129 @@ +{ + "transactions": [ + { + "hash": "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "transactionType": "CREATE", + "contractName": "PermissionlessRelationshipProcessor", + "contractAddress": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x4dd59", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161042c38038061042c83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516103786100b4600039600061012801526103786000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461018a565b610075565b604051901515815260200160405180910390f35b61004e610070366004610245565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195945050505050565b60006020828403121561019c57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101cc57600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101f757600080fd5b919050565b60008083601f84011261020e57600080fd5b50813567ffffffffffffffff81111561022657600080fd5b60208301915083602082850101111561023e57600080fd5b9250929050565b60008060008084860361010081121561025d57600080fd5b60c081121561026b57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156102b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526102c4886101d3565b8352602088013560208401526102dc604089016101d3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561031657600080fd5b5050610324878288016101fc565b9094509250610337905060e086016101d3565b90509295919450925056fea2646970667358221220863794073dba6a3d7e2e544ab79983d7362a6e7dc861054679117a143d23fe4d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x72", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "transactionType": "CREATE", + "contractName": "DstOwnerRelationshipProcessor", + "contractAddress": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6203b", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055438038061055483398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a06100b4600039600061012801526104a06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610289565b610075565b604051901515815260200160405180910390f35b61004e610070366004610350565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f091815260200190565b602060405180830381865afa15801561020d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610231919061044d565b73ffffffffffffffffffffffffffffffffffffffff161461027e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561029b57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102cb57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102f457600080fd5b50565b8035610302816102d2565b919050565b60008083601f84011261031957600080fd5b50813567ffffffffffffffff81111561033157600080fd5b60208301915083602082850101111561034957600080fd5b9250929050565b60008060008084860361010081121561036857600080fd5b60c081121561037657600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103cf886102f7565b8352602088013560208401526103e7604089016102f7565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042157600080fd5b505061042f87828801610307565b9094509250610442905060e086016102f7565b905092959194509250565b60006020828403121561045f57600080fd5b81516102cb816102d256fea26469706673582212203c36bb14a954a0ad2d21ec434aff88f81d1883ac62a8075688eb34c228cbe86664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x73", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "transactionType": "CREATE", + "contractName": "SrcOwnerRelationshipProcessor", + "contractAddress": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x62523", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055a38038061055a83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a66100b4600039600061012801526104a66000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461028f565b610075565b604051901515815260200160405180910390f35b61004e610070366004610356565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102379190610453565b73ffffffffffffffffffffffffffffffffffffffff1614610284576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b6000602082840312156102a157600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102d157600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102fa57600080fd5b50565b8035610308816102d8565b919050565b60008083601f84011261031f57600080fd5b50813567ffffffffffffffff81111561033757600080fd5b60208301915083602082850101111561034f57600080fd5b9250929050565b60008060008084860361010081121561036e57600080fd5b60c081121561037c57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103d5886102fd565b8352602088013560208401526103ed604089016102fd565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042757600080fd5b50506104358782880161030d565b9094509250610448905060e086016102fd565b905092959194509250565b60006020828403121561046557600080fd5b81516102d1816102d856fea264697066735822122051247d64c0854516927f1e038fe7110b316ec76b37aae66f1a13df04667b349264736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x74", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "transactionType": "CREATE", + "contractName": "SrcDstOwnerRelationshipProcessor", + "contractAddress": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6f36a", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161061638038061061683398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516105626100b4600039600061012801526105626000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461034b565b610075565b604051901515815260200160405180910390f35b61004e610070366004610412565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610237919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614158061030957508173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016102af91815260200190565b602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f0919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610340576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561035d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038d57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b657600080fd5b50565b80356103c481610394565b919050565b60008083601f8401126103db57600080fd5b50813567ffffffffffffffff8111156103f357600080fd5b60208301915083602082850101111561040b57600080fd5b9250929050565b60008060008084860361010081121561042a57600080fd5b60c081121561043857600080fd5b5060405160c0810167ffffffffffffffff8282108183111715610484577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052610491886103b9565b8352602088013560208401526104a9604089016103b9565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104e357600080fd5b50506104f1878288016103c9565b9094509250610504905060e086016103b9565b905092959194509250565b60006020828403121561052157600080fd5b815161038d8161039456fea2646970667358221220b1ab8522f546340f99de7d14d3fd37c0549548fef768bb123be2b723fa54ff7d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x75", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd", + "transactionType": "CREATE", + "contractName": "SrcRequestOrDstOwnerRelationshipProcessor", + "contractAddress": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6ecbe", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161061038038061061083398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b60805161055c6100b46000396000610128015261055c6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610345565b610075565b604051901515815260200160405180910390f35b61004e61007036600461040c565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610196565b90505b949350505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f291815260200190565b602060405180830381865afa15801561020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102339190610509565b73ffffffffffffffffffffffffffffffffffffffff16036102565750600161018e565b845160208601516040517f6352211e000000000000000000000000000000000000000000000000000000008152600481019190915273ffffffffffffffffffffffffffffffffffffffff848116921690636352211e90602401602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f09190610509565b73ffffffffffffffffffffffffffffffffffffffff16036103135750600061018e565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561035757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038757600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b057600080fd5b50565b80356103be8161038e565b919050565b60008083601f8401126103d557600080fd5b50813567ffffffffffffffff8111156103ed57600080fd5b60208301915083602082850101111561040557600080fd5b9250929050565b60008060008084860361010081121561042457600080fd5b60c081121561043257600080fd5b5060405160c0810167ffffffffffffffff828210818311171561047e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8160405261048b886103b3565b8352602088013560208401526104a3604089016103b3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104dd57600080fd5b50506104eb878288016103c3565b90945092506104fe905060e086016103b3565b905092959194509250565b60006020828403121561051b57600080fd5b81516103878161038e56fea2646970667358221220ac4338d7bf36cfde0cd3655dd89735d5ad9b7beeba946ddd02690d7a5ef5053664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x76", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd" + ], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/RelationshipProcessors.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697154335, + "chain": 5, + "multi": false, + "commit": "6217fe2" +} \ No newline at end of file diff --git a/broadcast/RelationshipProcessors.s.sol/5/run-1697154343.json b/broadcast/RelationshipProcessors.s.sol/5/run-1697154343.json new file mode 100644 index 00000000..a2c7ec16 --- /dev/null +++ b/broadcast/RelationshipProcessors.s.sol/5/run-1697154343.json @@ -0,0 +1,204 @@ +{ + "transactions": [ + { + "hash": "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "transactionType": "CREATE", + "contractName": "PermissionlessRelationshipProcessor", + "contractAddress": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x4dd59", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161042c38038061042c83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516103786100b4600039600061012801526103786000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461018a565b610075565b604051901515815260200160405180910390f35b61004e610070366004610245565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195945050505050565b60006020828403121561019c57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101cc57600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101f757600080fd5b919050565b60008083601f84011261020e57600080fd5b50813567ffffffffffffffff81111561022657600080fd5b60208301915083602082850101111561023e57600080fd5b9250929050565b60008060008084860361010081121561025d57600080fd5b60c081121561026b57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156102b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526102c4886101d3565b8352602088013560208401526102dc604089016101d3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561031657600080fd5b5050610324878288016101fc565b9094509250610337905060e086016101d3565b90509295919450925056fea2646970667358221220863794073dba6a3d7e2e544ab79983d7362a6e7dc861054679117a143d23fe4d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x72", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "transactionType": "CREATE", + "contractName": "DstOwnerRelationshipProcessor", + "contractAddress": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6203b", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055438038061055483398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a06100b4600039600061012801526104a06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610289565b610075565b604051901515815260200160405180910390f35b61004e610070366004610350565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f091815260200190565b602060405180830381865afa15801561020d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610231919061044d565b73ffffffffffffffffffffffffffffffffffffffff161461027e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561029b57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102cb57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102f457600080fd5b50565b8035610302816102d2565b919050565b60008083601f84011261031957600080fd5b50813567ffffffffffffffff81111561033157600080fd5b60208301915083602082850101111561034957600080fd5b9250929050565b60008060008084860361010081121561036857600080fd5b60c081121561037657600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103cf886102f7565b8352602088013560208401526103e7604089016102f7565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042157600080fd5b505061042f87828801610307565b9094509250610442905060e086016102f7565b905092959194509250565b60006020828403121561045f57600080fd5b81516102cb816102d256fea26469706673582212203c36bb14a954a0ad2d21ec434aff88f81d1883ac62a8075688eb34c228cbe86664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x73", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "transactionType": "CREATE", + "contractName": "SrcOwnerRelationshipProcessor", + "contractAddress": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x62523", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055a38038061055a83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a66100b4600039600061012801526104a66000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461028f565b610075565b604051901515815260200160405180910390f35b61004e610070366004610356565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102379190610453565b73ffffffffffffffffffffffffffffffffffffffff1614610284576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b6000602082840312156102a157600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102d157600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102fa57600080fd5b50565b8035610308816102d8565b919050565b60008083601f84011261031f57600080fd5b50813567ffffffffffffffff81111561033757600080fd5b60208301915083602082850101111561034f57600080fd5b9250929050565b60008060008084860361010081121561036e57600080fd5b60c081121561037c57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103d5886102fd565b8352602088013560208401526103ed604089016102fd565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042757600080fd5b50506104358782880161030d565b9094509250610448905060e086016102fd565b905092959194509250565b60006020828403121561046557600080fd5b81516102d1816102d856fea264697066735822122051247d64c0854516927f1e038fe7110b316ec76b37aae66f1a13df04667b349264736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x74", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "transactionType": "CREATE", + "contractName": "SrcDstOwnerRelationshipProcessor", + "contractAddress": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6f36a", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161061638038061061683398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516105626100b4600039600061012801526105626000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461034b565b610075565b604051901515815260200160405180910390f35b61004e610070366004610412565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610237919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614158061030957508173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016102af91815260200190565b602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f0919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610340576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561035d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038d57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b657600080fd5b50565b80356103c481610394565b919050565b60008083601f8401126103db57600080fd5b50813567ffffffffffffffff8111156103f357600080fd5b60208301915083602082850101111561040b57600080fd5b9250929050565b60008060008084860361010081121561042a57600080fd5b60c081121561043857600080fd5b5060405160c0810167ffffffffffffffff8282108183111715610484577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052610491886103b9565b8352602088013560208401526104a9604089016103b9565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104e357600080fd5b50506104f1878288016103c9565b9094509250610504905060e086016103b9565b905092959194509250565b60006020828403121561052157600080fd5b815161038d8161039456fea2646970667358221220b1ab8522f546340f99de7d14d3fd37c0549548fef768bb123be2b723fa54ff7d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x75", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd", + "transactionType": "CREATE", + "contractName": "SrcRequestOrDstOwnerRelationshipProcessor", + "contractAddress": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6ecbe", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161061038038061061083398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b60805161055c6100b46000396000610128015261055c6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610345565b610075565b604051901515815260200160405180910390f35b61004e61007036600461040c565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610196565b90505b949350505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f291815260200190565b602060405180830381865afa15801561020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102339190610509565b73ffffffffffffffffffffffffffffffffffffffff16036102565750600161018e565b845160208601516040517f6352211e000000000000000000000000000000000000000000000000000000008152600481019190915273ffffffffffffffffffffffffffffffffffffffff848116921690636352211e90602401602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f09190610509565b73ffffffffffffffffffffffffffffffffffffffff16036103135750600061018e565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561035757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038757600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b057600080fd5b50565b80356103be8161038e565b919050565b60008083601f8401126103d557600080fd5b50813567ffffffffffffffff8111156103ed57600080fd5b60208301915083602082850101111561040557600080fd5b9250929050565b60008060008084860361010081121561042457600080fd5b60c081121561043257600080fd5b5060405160c0810167ffffffffffffffff828210818311171561047e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8160405261048b886103b3565b8352602088013560208401526104a3604089016103b3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104dd57600080fd5b50506104eb878288016103c3565b90945092506104fe905060e086016103b3565b905092959194509250565b60006020828403121561051b57600080fd5b81516103878161038e56fea2646970667358221220ac4338d7bf36cfde0cd3655dd89735d5ad9b7beeba946ddd02690d7a5ef5053664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x76", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "transactionIndex": "0x1", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x798fb", + "gasUsed": "0x3be3c", + "contractAddress": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "transactionIndex": "0x2", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0xc4fa8", + "gasUsed": "0x4b6ad", + "contractAddress": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "transactionIndex": "0x3", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x110a1b", + "gasUsed": "0x4ba73", + "contractAddress": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "transactionIndex": "0x4", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x166347", + "gasUsed": "0x5592c", + "contractAddress": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd", + "transactionIndex": "0x5", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x1bb751", + "gasUsed": "0x5540a", + "contractAddress": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/RelationshipProcessors.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697154343, + "chain": 5, + "multi": false, + "commit": "6217fe2" +} \ No newline at end of file diff --git a/broadcast/RelationshipProcessors.s.sol/5/run-1697154426.json b/broadcast/RelationshipProcessors.s.sol/5/run-1697154426.json new file mode 100644 index 00000000..1dce013b --- /dev/null +++ b/broadcast/RelationshipProcessors.s.sol/5/run-1697154426.json @@ -0,0 +1,204 @@ +{ + "transactions": [ + { + "hash": "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "transactionType": "CREATE", + "contractName": "PermissionlessRelationshipProcessor", + "contractAddress": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x4dd59", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161042c38038061042c83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516103786100b4600039600061012801526103786000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461018a565b610075565b604051901515815260200160405180910390f35b61004e610070366004610245565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195945050505050565b60006020828403121561019c57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101cc57600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101f757600080fd5b919050565b60008083601f84011261020e57600080fd5b50813567ffffffffffffffff81111561022657600080fd5b60208301915083602082850101111561023e57600080fd5b9250929050565b60008060008084860361010081121561025d57600080fd5b60c081121561026b57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156102b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526102c4886101d3565b8352602088013560208401526102dc604089016101d3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561031657600080fd5b5050610324878288016101fc565b9094509250610337905060e086016101d3565b90509295919450925056fea2646970667358221220863794073dba6a3d7e2e544ab79983d7362a6e7dc861054679117a143d23fe4d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x72", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "transactionType": "CREATE", + "contractName": "DstOwnerRelationshipProcessor", + "contractAddress": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6203b", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055438038061055483398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a06100b4600039600061012801526104a06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610289565b610075565b604051901515815260200160405180910390f35b61004e610070366004610350565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f091815260200190565b602060405180830381865afa15801561020d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610231919061044d565b73ffffffffffffffffffffffffffffffffffffffff161461027e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561029b57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102cb57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102f457600080fd5b50565b8035610302816102d2565b919050565b60008083601f84011261031957600080fd5b50813567ffffffffffffffff81111561033157600080fd5b60208301915083602082850101111561034957600080fd5b9250929050565b60008060008084860361010081121561036857600080fd5b60c081121561037657600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103cf886102f7565b8352602088013560208401526103e7604089016102f7565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042157600080fd5b505061042f87828801610307565b9094509250610442905060e086016102f7565b905092959194509250565b60006020828403121561045f57600080fd5b81516102cb816102d256fea26469706673582212203c36bb14a954a0ad2d21ec434aff88f81d1883ac62a8075688eb34c228cbe86664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x73", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "transactionType": "CREATE", + "contractName": "SrcOwnerRelationshipProcessor", + "contractAddress": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x62523", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055a38038061055a83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a66100b4600039600061012801526104a66000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461028f565b610075565b604051901515815260200160405180910390f35b61004e610070366004610356565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102379190610453565b73ffffffffffffffffffffffffffffffffffffffff1614610284576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b6000602082840312156102a157600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102d157600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102fa57600080fd5b50565b8035610308816102d8565b919050565b60008083601f84011261031f57600080fd5b50813567ffffffffffffffff81111561033757600080fd5b60208301915083602082850101111561034f57600080fd5b9250929050565b60008060008084860361010081121561036e57600080fd5b60c081121561037c57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103d5886102fd565b8352602088013560208401526103ed604089016102fd565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042757600080fd5b50506104358782880161030d565b9094509250610448905060e086016102fd565b905092959194509250565b60006020828403121561046557600080fd5b81516102d1816102d856fea264697066735822122051247d64c0854516927f1e038fe7110b316ec76b37aae66f1a13df04667b349264736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x74", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "transactionType": "CREATE", + "contractName": "SrcDstOwnerRelationshipProcessor", + "contractAddress": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6f36a", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161061638038061061683398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516105626100b4600039600061012801526105626000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461034b565b610075565b604051901515815260200160405180910390f35b61004e610070366004610412565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610237919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614158061030957508173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016102af91815260200190565b602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f0919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610340576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561035d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038d57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b657600080fd5b50565b80356103c481610394565b919050565b60008083601f8401126103db57600080fd5b50813567ffffffffffffffff8111156103f357600080fd5b60208301915083602082850101111561040b57600080fd5b9250929050565b60008060008084860361010081121561042a57600080fd5b60c081121561043857600080fd5b5060405160c0810167ffffffffffffffff8282108183111715610484577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052610491886103b9565b8352602088013560208401526104a9604089016103b9565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104e357600080fd5b50506104f1878288016103c9565b9094509250610504905060e086016103b9565b905092959194509250565b60006020828403121561052157600080fd5b815161038d8161039456fea2646970667358221220b1ab8522f546340f99de7d14d3fd37c0549548fef768bb123be2b723fa54ff7d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x75", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd", + "transactionType": "CREATE", + "contractName": "SrcRequestOrDstOwnerRelationshipProcessor", + "contractAddress": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6ecbe", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161061038038061061083398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b60805161055c6100b46000396000610128015261055c6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610345565b610075565b604051901515815260200160405180910390f35b61004e61007036600461040c565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610196565b90505b949350505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f291815260200190565b602060405180830381865afa15801561020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102339190610509565b73ffffffffffffffffffffffffffffffffffffffff16036102565750600161018e565b845160208601516040517f6352211e000000000000000000000000000000000000000000000000000000008152600481019190915273ffffffffffffffffffffffffffffffffffffffff848116921690636352211e90602401602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f09190610509565b73ffffffffffffffffffffffffffffffffffffffff16036103135750600061018e565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561035757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038757600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b057600080fd5b50565b80356103be8161038e565b919050565b60008083601f8401126103d557600080fd5b50813567ffffffffffffffff8111156103ed57600080fd5b60208301915083602082850101111561040557600080fd5b9250929050565b60008060008084860361010081121561042457600080fd5b60c081121561043257600080fd5b5060405160c0810167ffffffffffffffff828210818311171561047e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8160405261048b886103b3565b8352602088013560208401526104a3604089016103b3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104dd57600080fd5b50506104eb878288016103c3565b90945092506104fe905060e086016103b3565b905092959194509250565b60006020828403121561051b57600080fd5b81516103878161038e56fea2646970667358221220ac4338d7bf36cfde0cd3655dd89735d5ad9b7beeba946ddd02690d7a5ef5053664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x76", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "transactionIndex": "0x1", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x798fb", + "gasUsed": "0x3be3c", + "contractAddress": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "transactionIndex": "0x2", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0xc4fa8", + "gasUsed": "0x4b6ad", + "contractAddress": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "transactionIndex": "0x3", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x110a1b", + "gasUsed": "0x4ba73", + "contractAddress": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "transactionIndex": "0x4", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x166347", + "gasUsed": "0x5592c", + "contractAddress": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd", + "transactionIndex": "0x5", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x1bb751", + "gasUsed": "0x5540a", + "contractAddress": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/RelationshipProcessors.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697154426, + "chain": 5, + "multi": false, + "commit": "6217fe2" +} \ No newline at end of file diff --git a/broadcast/RelationshipProcessors.s.sol/5/run-latest.json b/broadcast/RelationshipProcessors.s.sol/5/run-latest.json index 32d998f7..1dce013b 100644 --- a/broadcast/RelationshipProcessors.s.sol/5/run-latest.json +++ b/broadcast/RelationshipProcessors.s.sol/5/run-latest.json @@ -1,13 +1,101 @@ { "transactions": [ { - "hash": "0x718adba1f9e7c44a336887a7698f69ee71dbf0c9e963541c1ddf61ee779439c0", + "hash": "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "transactionType": "CREATE", + "contractName": "PermissionlessRelationshipProcessor", + "contractAddress": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x4dd59", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161042c38038061042c83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516103786100b4600039600061012801526103786000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461018a565b610075565b604051901515815260200160405180910390f35b61004e610070366004610245565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195945050505050565b60006020828403121561019c57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101cc57600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101f757600080fd5b919050565b60008083601f84011261020e57600080fd5b50813567ffffffffffffffff81111561022657600080fd5b60208301915083602082850101111561023e57600080fd5b9250929050565b60008060008084860361010081121561025d57600080fd5b60c081121561026b57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156102b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526102c4886101d3565b8352602088013560208401526102dc604089016101d3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561031657600080fd5b5050610324878288016101fc565b9094509250610337905060e086016101d3565b90509295919450925056fea2646970667358221220863794073dba6a3d7e2e544ab79983d7362a6e7dc861054679117a143d23fe4d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x72", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "transactionType": "CREATE", + "contractName": "DstOwnerRelationshipProcessor", + "contractAddress": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6203b", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055438038061055483398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a06100b4600039600061012801526104a06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610289565b610075565b604051901515815260200160405180910390f35b61004e610070366004610350565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f091815260200190565b602060405180830381865afa15801561020d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610231919061044d565b73ffffffffffffffffffffffffffffffffffffffff161461027e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561029b57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102cb57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102f457600080fd5b50565b8035610302816102d2565b919050565b60008083601f84011261031957600080fd5b50813567ffffffffffffffff81111561033157600080fd5b60208301915083602082850101111561034957600080fd5b9250929050565b60008060008084860361010081121561036857600080fd5b60c081121561037657600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103cf886102f7565b8352602088013560208401526103e7604089016102f7565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042157600080fd5b505061042f87828801610307565b9094509250610442905060e086016102f7565b905092959194509250565b60006020828403121561045f57600080fd5b81516102cb816102d256fea26469706673582212203c36bb14a954a0ad2d21ec434aff88f81d1883ac62a8075688eb34c228cbe86664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x73", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "transactionType": "CREATE", + "contractName": "SrcOwnerRelationshipProcessor", + "contractAddress": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x62523", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161055a38038061055a83398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516104a66100b4600039600061012801526104a66000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461028f565b610075565b604051901515815260200160405180910390f35b61004e610070366004610356565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102379190610453565b73ffffffffffffffffffffffffffffffffffffffff1614610284576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b6000602082840312156102a157600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102d157600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146102fa57600080fd5b50565b8035610308816102d8565b919050565b60008083601f84011261031f57600080fd5b50813567ffffffffffffffff81111561033757600080fd5b60208301915083602082850101111561034f57600080fd5b9250929050565b60008060008084860361010081121561036e57600080fd5b60c081121561037c57600080fd5b5060405160c0810167ffffffffffffffff82821081831117156103c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b816040526103d5886102fd565b8352602088013560208401526103ed604089016102fd565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c088013592508083111561042757600080fd5b50506104358782880161030d565b9094509250610448905060e086016102fd565b905092959194509250565b60006020828403121561046557600080fd5b81516102d1816102d856fea264697066735822122051247d64c0854516927f1e038fe7110b316ec76b37aae66f1a13df04667b349264736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x74", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "transactionType": "CREATE", + "contractName": "SrcDstOwnerRelationshipProcessor", + "contractAddress": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "function": null, + "arguments": [ + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "gas": "0x6f36a", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161061638038061061683398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b6080516105626100b4600039600061012801526105626000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e61004936600461034b565b610075565b604051901515815260200160405180910390f35b61004e610070366004610412565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610194565b95945050505050565b835160208501516040517f6352211e00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff80861693911691636352211e916101f69160040190815260200190565b602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610237919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614158061030957508173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016102af91815260200190565b602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f0919061050f565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610340576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001949350505050565b60006020828403121561035d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038d57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b657600080fd5b50565b80356103c481610394565b919050565b60008083601f8401126103db57600080fd5b50813567ffffffffffffffff8111156103f357600080fd5b60208301915083602082850101111561040b57600080fd5b9250929050565b60008060008084860361010081121561042a57600080fd5b60c081121561043857600080fd5b5060405160c0810167ffffffffffffffff8282108183111715610484577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052610491886103b9565b8352602088013560208401526104a9604089016103b9565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104e357600080fd5b50506104f1878288016103c9565b9094509250610504905060e086016103b9565b905092959194509250565b60006020828403121561052157600080fd5b815161038d8161039456fea2646970667358221220b1ab8522f546340f99de7d14d3fd37c0549548fef768bb123be2b723fa54ff7d64736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x75", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd", "transactionType": "CREATE", "contractName": "SrcRequestOrDstOwnerRelationshipProcessor", - "contractAddress": "0x5C10cC663aE967877dE42572a5FD9B823321F0F4", + "contractAddress": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9", "function": null, "arguments": [ - "0xb146cB898E95953f353bf5A50Fb8f129eC0D5AAb" + "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9" ], "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", "transaction": { @@ -15,8 +103,8 @@ "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", "gas": "0x6ecbe", "value": "0x0", - "data": "0x60a060405234801561001057600080fd5b5060405161061038038061061083398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b60805161055c6100b46000396000610128015261055c6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610345565b610075565b604051901515815260200160405180910390f35b61004e61007036600461040c565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610196565b90505b949350505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f291815260200190565b602060405180830381865afa15801561020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102339190610509565b73ffffffffffffffffffffffffffffffffffffffff16036102565750600161018e565b845160208601516040517f6352211e000000000000000000000000000000000000000000000000000000008152600481019190915273ffffffffffffffffffffffffffffffffffffffff848116921690636352211e90602401602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f09190610509565b73ffffffffffffffffffffffffffffffffffffffff16036103135750600061018e565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561035757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038757600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b057600080fd5b50565b80356103be8161038e565b919050565b60008083601f8401126103d557600080fd5b50813567ffffffffffffffff8111156103ed57600080fd5b60208301915083602082850101111561040557600080fd5b9250929050565b60008060008084860361010081121561042457600080fd5b60c081121561043257600080fd5b5060405160c0810167ffffffffffffffff828210818311171561047e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8160405261048b886103b3565b8352602088013560208401526104a3604089016103b3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104dd57600080fd5b50506104eb878288016103c3565b90945092506104fe905060e086016103b3565b905092959194509250565b60006020828403121561051b57600080fd5b81516103878161038e56fea26469706673582212209db05e8a3e807abb833d0c4ab6a3e359fa038709ebfaab1555fb7f63fd28ba4964736f6c63430008130033000000000000000000000000b146cb898e95953f353bf5a50fb8f129ec0d5aab", - "nonce": "0x3b", + "data": "0x60a060405234801561001057600080fd5b5060405161061038038061061083398101604081905261002f91610069565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660805250610099565b60006020828403121561007b57600080fd5b81516001600160a01b038116811461009257600080fd5b9392505050565b60805161055c6100b46000396000610128015261055c6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806363c7c03614610062575b600080fd5b61004e610049366004610345565b610075565b604051901515815260200160405180910390f35b61004e61007036600461040c565b61010e565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061010857507fffffffff0000000000000000000000000000000000000000000000000000000082167f63c7c03600000000000000000000000000000000000000000000000000000000145b92915050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017f576040517f482aa9df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61018b85858585610196565b90505b949350505050565b60008173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16636352211e87606001516040518263ffffffff1660e01b81526004016101f291815260200190565b602060405180830381865afa15801561020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102339190610509565b73ffffffffffffffffffffffffffffffffffffffff16036102565750600161018e565b845160208601516040517f6352211e000000000000000000000000000000000000000000000000000000008152600481019190915273ffffffffffffffffffffffffffffffffffffffff848116921690636352211e90602401602060405180830381865afa1580156102cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f09190610509565b73ffffffffffffffffffffffffffffffffffffffff16036103135750600061018e565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561035757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461038757600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103b057600080fd5b50565b80356103be8161038e565b919050565b60008083601f8401126103d557600080fd5b50813567ffffffffffffffff8111156103ed57600080fd5b60208301915083602082850101111561040557600080fd5b9250929050565b60008060008084860361010081121561042457600080fd5b60c081121561043257600080fd5b5060405160c0810167ffffffffffffffff828210818311171561047e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8160405261048b886103b3565b8352602088013560208401526104a3604089016103b3565b6040840152606088013560608401526080880135608084015260a088013560a084015282965060c08801359250808311156104dd57600080fd5b50506104eb878288016103c3565b90945092506104fe905060e086016103b3565b905092959194509250565b60006020828403121561051b57600080fd5b81516103878161038e56fea2646970667358221220ac4338d7bf36cfde0cd3655dd89735d5ad9b7beeba946ddd02690d7a5ef5053664736f6c63430008130033000000000000000000000000babd5b7e6104da4482b60f76b6b6fc31df9252e9", + "nonce": "0x76", "accessList": [] }, "additionalContracts": [], @@ -25,28 +113,92 @@ ], "receipts": [ { - "transactionHash": "0x718adba1f9e7c44a336887a7698f69ee71dbf0c9e963541c1ddf61ee779439c0", - "transactionIndex": "0x15", - "blockHash": "0x1fb121e64e5765e41e6b6e919dd8685786c797ff166ba8aac1915d685b6fcd8d", - "blockNumber": "0x8fca8a", + "transactionHash": "0xf8a6b1495eafc37ab62716d1e3c9c98ef264f8125bb123ecb34012d111b3012f", + "transactionIndex": "0x1", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x798fb", + "gasUsed": "0x3be3c", + "contractAddress": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x237eb2aabb4d84fea2c400ac4fc99d4b42839f6e1622da64051e433bb464d6b4", + "transactionIndex": "0x2", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0xc4fa8", + "gasUsed": "0x4b6ad", + "contractAddress": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xf79737663b0f0f4f5735391c8d197aa136aa37f69d1ed47fd8b84af7e506a63d", + "transactionIndex": "0x3", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x110a1b", + "gasUsed": "0x4ba73", + "contractAddress": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x4716ec8da8e60feb030023689e611af842dba727bf827038f9771259d9edeb15", + "transactionIndex": "0x4", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": null, + "cumulativeGasUsed": "0x166347", + "gasUsed": "0x5592c", + "contractAddress": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x6fa23adcc0dc3b6a97c85c82a4739801d343a05a3aa3ba47d12786ca9715c9bd", + "transactionIndex": "0x5", + "blockHash": "0x6360a8b6ad67f79d8617d063bcafe90242b69876f141db4cbe91601ccc9f9a85", + "blockNumber": "0x9664f0", "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", "to": null, - "cumulativeGasUsed": "0x295d9d", + "cumulativeGasUsed": "0x1bb751", "gasUsed": "0x5540a", - "contractAddress": "0x5C10cC663aE967877dE42572a5FD9B823321F0F4", + "contractAddress": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9", "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x19a879654" + "effectiveGasPrice": "0xb2d05e07" } ], "libraries": [], "pending": [], "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/RelationshipProcessors.s.sol/5/run-latest.json", "returns": {}, - "timestamp": 1690563966, + "timestamp": 1697154426, "chain": 5, "multi": false, - "commit": "3137031" + "commit": "6217fe2" } \ No newline at end of file diff --git a/broadcast/SetAppearsInRelationship.s.sol/5/run-1697137204.json b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697137204.json new file mode 100644 index 00000000..a953ad7a --- /dev/null +++ b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697137204.json @@ -0,0 +1,39 @@ +{ + "transactions": [ + { + "hash": "0xae4f5234edf367c6af168f1c4de4e1259e59d2ab018c90617330de478d4d7f14", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "APPEARS_IN", + "([2, 4, 5, 6], false, [1], false, true, 0x5C10cC663aE967877dE42572a5FD9B823321F0F4, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x323d4", + "value": "0x0", + "data": "0x44dd5e2a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005c10cc663ae967877de42572a5fd9b823321f0f4000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e3860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x70", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xae4f5234edf367c6af168f1c4de4e1259e59d2ab018c90617330de478d4d7f14" + ], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697137204, + "chain": 5, + "multi": false, + "commit": "5bd60a5" +} \ No newline at end of file diff --git a/broadcast/SetAppearsInRelationship.s.sol/5/run-1697137216.json b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697137216.json new file mode 100644 index 00000000..69404248 --- /dev/null +++ b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697137216.json @@ -0,0 +1,69 @@ +{ + "transactions": [ + { + "hash": "0xae4f5234edf367c6af168f1c4de4e1259e59d2ab018c90617330de478d4d7f14", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "APPEARS_IN", + "([2, 4, 5, 6], false, [1], false, true, 0x5C10cC663aE967877dE42572a5FD9B823321F0F4, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x323d4", + "value": "0x0", + "data": "0x44dd5e2a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005c10cc663ae967877de42572a5fd9b823321f0f4000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e3860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x70", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xae4f5234edf367c6af168f1c4de4e1259e59d2ab018c90617330de478d4d7f14", + "transactionIndex": "0x2", + "blockHash": "0x881c7a64cfab19f56642d6923fa609350b7465871ae91aaa81f0d12f96e7d4da", + "blockNumber": "0x9660a3", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "cumulativeGasUsed": "0x6f410", + "gasUsed": "0x245f6", + "contractAddress": null, + "logs": [ + { + "address": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "topics": [ + "0x23d823dca554930dda2141543b0575ecace98e873be3b3fa7dbc7b7c2e8dba6d", + "0x472511bc397e46b55b56292ba067168f2f5ceb640570883cadf0daafda894c1d" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000005c10cc663ae967877de42572a5fd9b823321f0f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e00000000000000000000000000000000000000000000", + "blockHash": "0x881c7a64cfab19f56642d6923fa609350b7465871ae91aaa81f0d12f96e7d4da", + "blockNumber": "0x9660a3", + "transactionHash": "0xae4f5234edf367c6af168f1c4de4e1259e59d2ab018c90617330de478d4d7f14", + "transactionIndex": "0x2", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000008000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000020000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e09" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697137216, + "chain": 5, + "multi": false, + "commit": "5bd60a5" +} \ No newline at end of file diff --git a/broadcast/SetAppearsInRelationship.s.sol/5/run-1697162391.json b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697162391.json new file mode 100644 index 00000000..e1b194c5 --- /dev/null +++ b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697162391.json @@ -0,0 +1,39 @@ +{ + "transactions": [ + { + "hash": "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "APPEARS_IN", + "([2, 4, 5, 6], false, [1], false, true, 0xfC367bb4047D7621B998C536E54Fa88838A6ACA9, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x18574", + "value": "0x0", + "data": "0x44dd5e2a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fc367bb4047d7621b998c536e54fa88838a6aca9000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e3860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x77", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f" + ], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697162391, + "chain": 5, + "multi": false, + "commit": "6217fe2" +} \ No newline at end of file diff --git a/broadcast/SetAppearsInRelationship.s.sol/5/run-1697162404.json b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697162404.json new file mode 100644 index 00000000..f59fb7bc --- /dev/null +++ b/broadcast/SetAppearsInRelationship.s.sol/5/run-1697162404.json @@ -0,0 +1,69 @@ +{ + "transactions": [ + { + "hash": "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "APPEARS_IN", + "([2, 4, 5, 6], false, [1], false, true, 0xfC367bb4047D7621B998C536E54Fa88838A6ACA9, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x18574", + "value": "0x0", + "data": "0x44dd5e2a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fc367bb4047d7621b998c536e54fa88838a6aca9000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e3860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x77", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f", + "transactionIndex": "0x1", + "blockHash": "0x5239bcf0a0f357ff62e4ec3638b077d06d804bd835faab1679d32c6cf2ba54f1", + "blockNumber": "0x966703", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "cumulativeGasUsed": "0x16bfe", + "gasUsed": "0x119f6", + "contractAddress": null, + "logs": [ + { + "address": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "topics": [ + "0x23d823dca554930dda2141543b0575ecace98e873be3b3fa7dbc7b7c2e8dba6d", + "0x472511bc397e46b55b56292ba067168f2f5ceb640570883cadf0daafda894c1d" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fc367bb4047d7621b998c536e54fa88838a6aca9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e00000000000000000000000000000000000000000000", + "blockHash": "0x5239bcf0a0f357ff62e4ec3638b077d06d804bd835faab1679d32c6cf2ba54f1", + "blockNumber": "0x966703", + "transactionHash": "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000008000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000020000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e0b" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697162404, + "chain": 5, + "multi": false, + "commit": "6217fe2" +} \ No newline at end of file diff --git a/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json b/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json index 2ee85e9b..f59fb7bc 100644 --- a/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json +++ b/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json @@ -1,21 +1,24 @@ { "transactions": [ { - "hash": "0xed8f1d4c20b5829fa49161a25de211603c68b2ee3577e46b48e201f798e4470d", + "hash": "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f", "transactionType": "CALL", - "contractName": "ERC1967Proxy", - "contractAddress": "0xb146cB898E95953f353bf5A50Fb8f129eC0D5AAb", - "function": null, - "arguments": null, + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "APPEARS_IN", + "([2, 4, 5, 6], false, [1], false, true, 0xfC367bb4047D7621B998C536E54Fa88838A6ACA9, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", "transaction": { "type": "0x02", "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", - "to": "0xb146cb898e95953f353bf5a50fb8f129ec0d5aab", - "gas": "0x323d4", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x18574", "value": "0x0", - "data": "0x44dd5e2a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005c10cc663ae967877de42572a5fd9b823321f0f4000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e3860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x3c", + "data": "0x44dd5e2a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fc367bb4047d7621b998c536e54fa88838a6aca9000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e3860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x77", "accessList": [] }, "additionalContracts": [], @@ -24,43 +27,43 @@ ], "receipts": [ { - "transactionHash": "0xed8f1d4c20b5829fa49161a25de211603c68b2ee3577e46b48e201f798e4470d", - "transactionIndex": "0x8", - "blockHash": "0x993c3ec34db067273436e0cd6437895104a7eb6c00ef1c4f8c02f27f0fbadfb6", - "blockNumber": "0x8fcaac", + "transactionHash": "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f", + "transactionIndex": "0x1", + "blockHash": "0x5239bcf0a0f357ff62e4ec3638b077d06d804bd835faab1679d32c6cf2ba54f1", + "blockNumber": "0x966703", "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", - "to": "0xb146cB898E95953f353bf5A50Fb8f129eC0D5AAb", - "cumulativeGasUsed": "0x14ac9c", - "gasUsed": "0x245f6", + "to": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "cumulativeGasUsed": "0x16bfe", + "gasUsed": "0x119f6", "contractAddress": null, "logs": [ { - "address": "0xb146cB898E95953f353bf5A50Fb8f129eC0D5AAb", + "address": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", "topics": [ "0x23d823dca554930dda2141543b0575ecace98e873be3b3fa7dbc7b7c2e8dba6d", "0x472511bc397e46b55b56292ba067168f2f5ceb640570883cadf0daafda894c1d" ], - "data": "0x00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000005c10cc663ae967877de42572a5fd9b823321f0f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e00000000000000000000000000000000000000000000", - "blockHash": "0x993c3ec34db067273436e0cd6437895104a7eb6c00ef1c4f8c02f27f0fbadfb6", - "blockNumber": "0x8fcaac", - "transactionHash": "0xed8f1d4c20b5829fa49161a25de211603c68b2ee3577e46b48e201f798e4470d", - "transactionIndex": "0x8", - "logIndex": "0x18", + "data": "0x0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fc367bb4047d7621b998c536e54fa88838a6aca9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a415050454152535f494e00000000000000000000000000000000000000000000", + "blockHash": "0x5239bcf0a0f357ff62e4ec3638b077d06d804bd835faab1679d32c6cf2ba54f1", + "blockNumber": "0x966703", + "transactionHash": "0x1fe4f92911ece3b2e8586a3b523e76d5944adb2eca2ee3eb6451fb4d10a7049f", + "transactionIndex": "0x1", + "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000008000000000000000000010000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000008040000000000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000008000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000020000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x18e0de510" + "effectiveGasPrice": "0xb2d05e0b" } ], "libraries": [], "pending": [], "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetAppearsInRelationship.s.sol/5/run-latest.json", "returns": {}, - "timestamp": 1690564518, + "timestamp": 1697162404, "chain": 5, "multi": false, - "commit": "3137031" + "commit": "6217fe2" } \ No newline at end of file diff --git a/broadcast/SetTestRelationship.s.sol/5/run-1697137083.json b/broadcast/SetTestRelationship.s.sol/5/run-1697137083.json new file mode 100644 index 00000000..a6d04d83 --- /dev/null +++ b/broadcast/SetTestRelationship.s.sol/5/run-1697137083.json @@ -0,0 +1,39 @@ +{ + "transactions": [ + { + "hash": "0xb7baf2b7308c9b0fe4846056e141f60ab0e6656d4c0e093f6e1e58234e31ea08", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "TEST_RELATIONSHIP", + "([1, 2, 3, 4, 5, 6], true, [1, 2, 3, 4, 5, 6], true, true, 0xA5ee53c74f75bB4A149c55d8A24E5dF563897B0f, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x33c58", + "value": "0x0", + "data": "0x44dd5e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e5348495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5ee53c74f75bb4a149c55d8a24e5df563897b0f000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006", + "nonce": "0x6f", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xb7baf2b7308c9b0fe4846056e141f60ab0e6656d4c0e093f6e1e58234e31ea08" + ], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetTestRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697137083, + "chain": 5, + "multi": false, + "commit": "5bd60a5" +} \ No newline at end of file diff --git a/broadcast/SetTestRelationship.s.sol/5/run-1697137145.json b/broadcast/SetTestRelationship.s.sol/5/run-1697137145.json new file mode 100644 index 00000000..3d8c4d39 --- /dev/null +++ b/broadcast/SetTestRelationship.s.sol/5/run-1697137145.json @@ -0,0 +1,69 @@ +{ + "transactions": [ + { + "hash": "0xb7baf2b7308c9b0fe4846056e141f60ab0e6656d4c0e093f6e1e58234e31ea08", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "TEST_RELATIONSHIP", + "([1, 2, 3, 4, 5, 6], true, [1, 2, 3, 4, 5, 6], true, true, 0xA5ee53c74f75bB4A149c55d8A24E5dF563897B0f, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x33c58", + "value": "0x0", + "data": "0x44dd5e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e5348495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5ee53c74f75bb4a149c55d8a24e5df563897b0f000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006", + "nonce": "0x6f", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb7baf2b7308c9b0fe4846056e141f60ab0e6656d4c0e093f6e1e58234e31ea08", + "transactionIndex": "0x3", + "blockHash": "0x546d3e3f5441b049d28951030fa0a203cf0af2f065831d94e5895c1a47373d44", + "blockNumber": "0x96609f", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "cumulativeGasUsed": "0xb0723", + "gasUsed": "0x257b5", + "contractAddress": null, + "logs": [ + { + "address": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "topics": [ + "0x23d823dca554930dda2141543b0575ecace98e873be3b3fa7dbc7b7c2e8dba6d", + "0x683621362ba100a18914ac9e6e6c9388fdf9e0de20bed62f0b9c36aa49404e7a" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000100ff0000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5ee53c74f75bb4a149c55d8a24e5df563897b0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e53484950000000000000000000000000000000", + "blockHash": "0x546d3e3f5441b049d28951030fa0a203cf0af2f065831d94e5895c1a47373d44", + "blockNumber": "0x96609f", + "transactionHash": "0xb7baf2b7308c9b0fe4846056e141f60ab0e6656d4c0e093f6e1e58234e31ea08", + "transactionIndex": "0x3", + "logIndex": "0x4", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000080000000000000000000008000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000020000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetTestRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697137145, + "chain": 5, + "multi": false, + "commit": "5bd60a5" +} \ No newline at end of file diff --git a/broadcast/SetTestRelationship.s.sol/5/run-1697162422.json b/broadcast/SetTestRelationship.s.sol/5/run-1697162422.json new file mode 100644 index 00000000..df8e57d3 --- /dev/null +++ b/broadcast/SetTestRelationship.s.sol/5/run-1697162422.json @@ -0,0 +1,39 @@ +{ + "transactions": [ + { + "hash": "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "TEST_RELATIONSHIP", + "([1, 2, 3, 4, 5, 6], true, [1, 2, 3, 4, 5, 6], true, true, 0x379694d591cD310C3610EDb3D8D5CD625cA013a2, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x19df8", + "value": "0x0", + "data": "0x44dd5e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e5348495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379694d591cd310c3610edb3d8d5cd625ca013a2000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006", + "nonce": "0x78", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c" + ], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetTestRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697162422, + "chain": 5, + "multi": false, + "commit": "6217fe2" +} \ No newline at end of file diff --git a/broadcast/SetTestRelationship.s.sol/5/run-1697162429.json b/broadcast/SetTestRelationship.s.sol/5/run-1697162429.json new file mode 100644 index 00000000..fce0db94 --- /dev/null +++ b/broadcast/SetTestRelationship.s.sol/5/run-1697162429.json @@ -0,0 +1,69 @@ +{ + "transactions": [ + { + "hash": "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "TEST_RELATIONSHIP", + "([1, 2, 3, 4, 5, 6], true, [1, 2, 3, 4, 5, 6], true, true, 0x379694d591cD310C3610EDb3D8D5CD625cA013a2, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x19df8", + "value": "0x0", + "data": "0x44dd5e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e5348495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379694d591cd310c3610edb3d8d5cd625ca013a2000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006", + "nonce": "0x78", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c", + "transactionIndex": "0x3", + "blockHash": "0x14ae11eea8e2e533c26a4185d1476540cd97c1bdfc6fe9cdf4dff76436a91d81", + "blockNumber": "0x966705", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "cumulativeGasUsed": "0x61183", + "gasUsed": "0x12bb5", + "contractAddress": null, + "logs": [ + { + "address": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "topics": [ + "0x23d823dca554930dda2141543b0575ecace98e873be3b3fa7dbc7b7c2e8dba6d", + "0x683621362ba100a18914ac9e6e6c9388fdf9e0de20bed62f0b9c36aa49404e7a" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000100ff0000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379694d591cd310c3610edb3d8d5cd625ca013a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e53484950000000000000000000000000000000", + "blockHash": "0x14ae11eea8e2e533c26a4185d1476540cd97c1bdfc6fe9cdf4dff76436a91d81", + "blockNumber": "0x966705", + "transactionHash": "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c", + "transactionIndex": "0x3", + "logIndex": "0xa", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000080000000000000000000008000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000020000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e09" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetTestRelationship.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697162429, + "chain": 5, + "multi": false, + "commit": "6217fe2" +} \ No newline at end of file diff --git a/broadcast/SetTestRelationship.s.sol/5/run-latest.json b/broadcast/SetTestRelationship.s.sol/5/run-latest.json index 5b195562..fce0db94 100644 --- a/broadcast/SetTestRelationship.s.sol/5/run-latest.json +++ b/broadcast/SetTestRelationship.s.sol/5/run-latest.json @@ -1,21 +1,24 @@ { "transactions": [ { - "hash": "0xe2c504089f80974335479e5aab7278eddbfbcd74d61c41fb299197f11e0b20c5", + "hash": "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c", "transactionType": "CALL", - "contractName": "ERC1967Proxy", - "contractAddress": "0xb146cB898E95953f353bf5A50Fb8f129eC0D5AAb", - "function": null, - "arguments": null, + "contractName": null, + "contractAddress": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "function": "setRelationshipConfig(string,(uint8[],bool,uint8[],bool,bool,address,address,(uint112,uint112,bool))):(bytes32)", + "arguments": [ + "TEST_RELATIONSHIP", + "([1, 2, 3, 4, 5, 6], true, [1, 2, 3, 4, 5, 6], true, true, 0x379694d591cD310C3610EDb3D8D5CD625cA013a2, 0xB6288e57bf7406B35ab4F70Fd1135E907107e386, (0, 0, false))" + ], "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", "transaction": { "type": "0x02", "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", - "to": "0xb146cb898e95953f353bf5a50fb8f129ec0d5aab", - "gas": "0x33c58", + "to": "0xbabd5b7e6104da4482b60f76b6b6fc31df9252e9", + "gas": "0x19df8", "value": "0x0", - "data": "0x44dd5e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e5348495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5ee53c74f75bb4a149c55d8a24e5df563897b0f000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006", - "nonce": "0x37", + "data": "0x44dd5e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e5348495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379694d591cd310c3610edb3d8d5cd625ca013a2000000000000000000000000b6288e57bf7406b35ab4f70fd1135e907107e38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006", + "nonce": "0x78", "accessList": [] }, "additionalContracts": [], @@ -24,43 +27,43 @@ ], "receipts": [ { - "transactionHash": "0xe2c504089f80974335479e5aab7278eddbfbcd74d61c41fb299197f11e0b20c5", - "transactionIndex": "0xf", - "blockHash": "0xc15ecef5a0262469c697b30d3da679d31681d5d49f8ccd495f795bae188a0fb2", - "blockNumber": "0x8fc956", + "transactionHash": "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c", + "transactionIndex": "0x3", + "blockHash": "0x14ae11eea8e2e533c26a4185d1476540cd97c1bdfc6fe9cdf4dff76436a91d81", + "blockNumber": "0x966705", "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", - "to": "0xb146cB898E95953f353bf5A50Fb8f129eC0D5AAb", - "cumulativeGasUsed": "0x1c3ca9", - "gasUsed": "0x257b5", + "to": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", + "cumulativeGasUsed": "0x61183", + "gasUsed": "0x12bb5", "contractAddress": null, "logs": [ { - "address": "0xb146cB898E95953f353bf5A50Fb8f129eC0D5AAb", + "address": "0xBAbD5B7E6104Da4482B60F76b6B6fC31DF9252e9", "topics": [ "0x23d823dca554930dda2141543b0575ecace98e873be3b3fa7dbc7b7c2e8dba6d", "0x683621362ba100a18914ac9e6e6c9388fdf9e0de20bed62f0b9c36aa49404e7a" ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000100ff0000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5ee53c74f75bb4a149c55d8a24e5df563897b0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e53484950000000000000000000000000000000", - "blockHash": "0xc15ecef5a0262469c697b30d3da679d31681d5d49f8ccd495f795bae188a0fb2", - "blockNumber": "0x8fc956", - "transactionHash": "0xe2c504089f80974335479e5aab7278eddbfbcd74d61c41fb299197f11e0b20c5", - "transactionIndex": "0xf", - "logIndex": "0x1e", + "data": "0x0000000000000000000000000000000000000000000000000000000000000100ff0000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379694d591cd310c3610edb3d8d5cd625ca013a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011544553545f52454c4154494f4e53484950000000000000000000000000000000", + "blockHash": "0x14ae11eea8e2e533c26a4185d1476540cd97c1bdfc6fe9cdf4dff76436a91d81", + "blockNumber": "0x966705", + "transactionHash": "0x4a29a2ca317a2fc999149389d9394c3bfebbd74d88ce62fd159d01e22f0fd26c", + "transactionIndex": "0x3", + "logIndex": "0xa", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000100000000000000000000000000000000080000000000000000000008000000000000000000000000000000000000000000000008000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000040080000000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000080000000000000000000008000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000020000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x22be82780" + "effectiveGasPrice": "0xb2d05e09" } ], "libraries": [], "pending": [], "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetTestRelationship.s.sol/5/run-latest.json", "returns": {}, - "timestamp": 1690559031, + "timestamp": 1697162429, "chain": 5, "multi": false, - "commit": "2c27544" + "commit": "6217fe2" } \ No newline at end of file diff --git a/broadcast/SetupFranchiseLicensing.s.sol/5/run-1697045080.json b/broadcast/SetupFranchiseLicensing.s.sol/5/run-1697045080.json new file mode 100644 index 00000000..e94a26c2 --- /dev/null +++ b/broadcast/SetupFranchiseLicensing.s.sol/5/run-1697045080.json @@ -0,0 +1,39 @@ +{ + "transactions": [ + { + "hash": "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x08341162Ea337B086dCa69E13ECf76F868F7025A", + "function": "configureFranchiseLicensing(uint256,((bool,uint256),(address,bytes),(bool,uint256),(address,bytes),bool,address,string))", + "arguments": [ + "67", + "((true, 0), (0x0000000000000000000000000000000000000000, 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000), (true, 0), (0x0000000000000000000000000000000000000000, 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000), false, 0x0000000000000000000000000000000000000001, https://commercial.license)" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0x08341162ea337b086dca69e13ecf76f868f7025a", + "gas": "0x5223b", + "value": "0x0", + "data": "0x4f0bf5b6000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f636f6d6d65726369616c2e6c6963656e7365000000000000", + "nonce": "0x69", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae" + ], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetupFranchiseLicensing.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697045080, + "chain": 5, + "multi": false, + "commit": "a2f2e1c" +} \ No newline at end of file diff --git a/broadcast/SetupFranchiseLicensing.s.sol/5/run-1697045099.json b/broadcast/SetupFranchiseLicensing.s.sol/5/run-1697045099.json new file mode 100644 index 00000000..0fcf512a --- /dev/null +++ b/broadcast/SetupFranchiseLicensing.s.sol/5/run-1697045099.json @@ -0,0 +1,68 @@ +{ + "transactions": [ + { + "hash": "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x08341162Ea337B086dCa69E13ECf76F868F7025A", + "function": "configureFranchiseLicensing(uint256,((bool,uint256),(address,bytes),(bool,uint256),(address,bytes),bool,address,string))", + "arguments": [ + "67", + "((true, 0), (0x0000000000000000000000000000000000000000, 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000), (true, 0), (0x0000000000000000000000000000000000000000, 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000), false, 0x0000000000000000000000000000000000000001, https://commercial.license)" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0x08341162ea337b086dca69e13ecf76f868f7025a", + "gas": "0x5223b", + "value": "0x0", + "data": "0x4f0bf5b6000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f636f6d6d65726369616c2e6c6963656e7365000000000000", + "nonce": "0x69", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae", + "transactionIndex": "0x0", + "blockHash": "0x5a1e8597583953c1a0a0f5e52ed899153ab934101f67529ef5a8913ee395a853", + "blockNumber": "0x964939", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0x08341162Ea337B086dCa69E13ECf76F868F7025A", + "cumulativeGasUsed": "0x3b77c", + "gasUsed": "0x3b77c", + "contractAddress": null, + "logs": [ + { + "address": "0x08341162Ea337B086dCa69E13ECf76F868F7025A", + "topics": [ + "0xe6fbfbfdd71227edcd5ffab5dbc0fac8662dffc1be715c591efb2214665b9de5" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f636f6d6d65726369616c2e6c6963656e7365000000000000", + "blockHash": "0x5a1e8597583953c1a0a0f5e52ed899153ab934101f67529ef5a8913ee395a853", + "blockNumber": "0x964939", + "transactionHash": "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e0a" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetupFranchiseLicensing.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697045099, + "chain": 5, + "multi": false, + "commit": "a2f2e1c" +} \ No newline at end of file diff --git a/broadcast/SetupFranchiseLicensing.s.sol/5/run-latest.json b/broadcast/SetupFranchiseLicensing.s.sol/5/run-latest.json new file mode 100644 index 00000000..0fcf512a --- /dev/null +++ b/broadcast/SetupFranchiseLicensing.s.sol/5/run-latest.json @@ -0,0 +1,68 @@ +{ + "transactions": [ + { + "hash": "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x08341162Ea337B086dCa69E13ECf76F868F7025A", + "function": "configureFranchiseLicensing(uint256,((bool,uint256),(address,bytes),(bool,uint256),(address,bytes),bool,address,string))", + "arguments": [ + "67", + "((true, 0), (0x0000000000000000000000000000000000000000, 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000), (true, 0), (0x0000000000000000000000000000000000000000, 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000), false, 0x0000000000000000000000000000000000000001, https://commercial.license)" + ], + "rpc": "https://eth-goerli.g.alchemy.com/v2/7WyRjkZW0XJmt7tb4OqO9YTp5z_iVl-o", + "transaction": { + "type": "0x02", + "from": "0xb6288e57bf7406b35ab4f70fd1135e907107e386", + "to": "0x08341162ea337b086dca69e13ecf76f868f7025a", + "gas": "0x5223b", + "value": "0x0", + "data": "0x4f0bf5b6000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f636f6d6d65726369616c2e6c6963656e7365000000000000", + "nonce": "0x69", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae", + "transactionIndex": "0x0", + "blockHash": "0x5a1e8597583953c1a0a0f5e52ed899153ab934101f67529ef5a8913ee395a853", + "blockNumber": "0x964939", + "from": "0xB6288e57bf7406B35ab4F70Fd1135E907107e386", + "to": "0x08341162Ea337B086dCa69E13ECf76F868F7025A", + "cumulativeGasUsed": "0x3b77c", + "gasUsed": "0x3b77c", + "contractAddress": null, + "logs": [ + { + "address": "0x08341162Ea337B086dCa69E13ECf76F868F7025A", + "topics": [ + "0xe6fbfbfdd71227edcd5ffab5dbc0fac8662dffc1be715c591efb2214665b9de5" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f636f6d6d65726369616c2e6c6963656e7365000000000000", + "blockHash": "0x5a1e8597583953c1a0a0f5e52ed899153ab934101f67529ef5a8913ee395a853", + "blockNumber": "0x964939", + "transactionHash": "0xdfc2808ada975f924666be3e2f660359651b6270bdc83ad20cf3afcb1f0487ae", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e0a" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/drmanhattan/Workspace/StoryProtocol/protocol-contracts/broadcast/SetupFranchiseLicensing.s.sol/5/run-latest.json", + "returns": {}, + "timestamp": 1697045099, + "chain": 5, + "multi": false, + "commit": "a2f2e1c" +} \ No newline at end of file diff --git a/contracts/FranchiseRegistry.sol b/contracts/FranchiseRegistry.sol index 30eba55d..1336da2b 100644 --- a/contracts/FranchiseRegistry.sol +++ b/contracts/FranchiseRegistry.sol @@ -1,17 +1,14 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -import { IPAsset } from "./IPAsset.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { AccessControl } from "contracts/lib/AccessControl.sol"; import { IPAssetRegistryFactory } from "./ip-assets/IPAssetRegistryFactory.sol"; import { AccessControlledUpgradeable } from "./access-control/AccessControlledUpgradeable.sol"; -import { UPGRADER_ROLE } from "./access-control/ProtocolRoles.sol"; -import { ZeroAddress, Unauthorized } from "./errors/General.sol"; -import { IVersioned } from "./utils/IVersioned.sol"; -import { IIPAssetRegistry } from "./ip-assets/IIPAssetRegistry.sol"; -import { LibIPAssetId } from "./ip-assets/LibIPAssetId.sol"; +import { IVersioned } from "contracts/interfaces/utils/IVersioned.sol"; +import { IIPAssetRegistry } from "contracts/interfaces/ip-assets/IIPAssetRegistry.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import { ERC721Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; -import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; contract FranchiseRegistry is UUPSUpgradeable, @@ -27,8 +24,8 @@ contract FranchiseRegistry is string symbol, string tokenURI ); - error AlreadyRegistered(); + /// TODO: Add franchise interface and place this in separate lib struct FranchiseCreationParams { string name; string symbol; @@ -46,82 +43,97 @@ contract FranchiseRegistry is IPAssetRegistryFactory public immutable FACTORY; // keccak256(bytes.concat(bytes32(uint256(keccak256("story-protocol.franchise-registry.storage")) - 1))) - bytes32 private constant _STORAGE_LOCATION = 0x5648324915b730d22cca7279385130ad43fd4829d795fb20e9ab398bfe537e8f; + bytes32 private constant _STORAGE_LOCATION = + 0x5648324915b730d22cca7279385130ad43fd4829d795fb20e9ab398bfe537e8f; uint256 public constant PROTOCOL_ROOT_ID = 0; address public constant PROTOCOL_ROOT_ADDRESS = address(0); string private constant _VERSION = "0.1.0"; - constructor(address _factory) { - if (_factory == address(0)) revert ZeroAddress(); - FACTORY = IPAssetRegistryFactory(_factory); + constructor(address factory_) { + if (factory_ == address(0)) revert Errors.ZeroAddress(); + FACTORY = IPAssetRegistryFactory(factory_); _disableInitializers(); } - function initialize(address accessControl) public initializer { - __UUPSUpgradeable_init(); - __AccessControlledUpgradeable_init(accessControl); - __ERC721_init("Story Protocol", "SP"); - } - - function _getFranchiseStorage() private pure returns (FranchiseStorage storage $) { - assembly { - $.slot := _STORAGE_LOCATION - } - } - - function version() external pure override returns (string memory) { - return _VERSION; - } - - function registerFranchise(FranchiseCreationParams calldata params) external returns (uint256, address) { + function registerFranchise( + FranchiseCreationParams calldata params_ + ) external returns (uint256, address) { FranchiseStorage storage $ = _getFranchiseStorage(); uint256 nextId = ++$.franchiseIds; - address ipAssetRegistry = FACTORY.createFranchiseIPAssets( + address ipAssetRegistry = FACTORY.createFranchiseIpAssets( nextId, - params.name, - params.symbol, - params.description + params_.name, + params_.symbol, + params_.description ); $.ipAssetRegistries[nextId] = ipAssetRegistry; - $.tokenURIs[nextId] = params.tokenURI; + $.tokenURIs[nextId] = params_.tokenURI; _safeMint(msg.sender, nextId); // TODO: set licensing restrictions per franchise, maybe grant commercial root license to the franchise NFT - - emit FranchiseRegistered(msg.sender, nextId, ipAssetRegistry, params.name, params.symbol, params.tokenURI); - - return (nextId, ipAssetRegistry); - } - function ipAssetRegistryForId( - uint256 franchiseId - ) public view returns (address) { - FranchiseStorage storage $ = _getFranchiseStorage(); - return $.ipAssetRegistries[franchiseId]; + emit FranchiseRegistered( + msg.sender, + nextId, + ipAssetRegistry, + params_.name, + params_.symbol, + params_.tokenURI + ); + + return (nextId, ipAssetRegistry); } - - /** - * @notice checks if an address is a valid SP IPAssetRegistry. - * @param ipAssetRegistry the address to check - * @return true if it's a valid SP IPAssetRegistry, false otherwise - */ - function isIpAssetRegistry(address ipAssetRegistry) external view returns(bool) { - try IIPAssetRegistry(ipAssetRegistry).franchiseId() returns (uint256 franchiseId) { - return ipAssetRegistryForId(franchiseId) == ipAssetRegistry; + /// @notice checks if an address is a valid SP IPAssetRegistry. + /// @param ipAssetRegistry_ the address to check + /// @return true if it's a valid SP IPAssetRegistry, false otherwise + function isIpAssetRegistry( + address ipAssetRegistry_ + ) external view returns (bool) { + try IIPAssetRegistry(ipAssetRegistry_).franchiseId() returns ( + uint256 franchiseId + ) { + return ipAssetRegistryForId(franchiseId) == ipAssetRegistry_; } catch { return false; } } + function version() external pure override returns (string memory) { + return _VERSION; + } + + function initialize(address accessControl_) public initializer { + __UUPSUpgradeable_init(); + __AccessControlledUpgradeable_init(accessControl_); + __ERC721_init("Story Protocol", "SP"); + } + + function ipAssetRegistryForId( + uint256 franchiseId_ + ) public view returns (address) { + FranchiseStorage storage $ = _getFranchiseStorage(); + return $.ipAssetRegistries[franchiseId_]; + } - function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { - _requireMinted(tokenId); + function tokenURI( + uint256 tokenId_ + ) public view virtual override returns (string memory) { + _requireMinted(tokenId_); FranchiseStorage storage $ = _getFranchiseStorage(); - return $.tokenURIs[tokenId]; - } + return $.tokenURIs[tokenId_]; + } function _authorizeUpgrade( - address newImplementation - ) internal virtual override onlyRole(UPGRADER_ROLE) {} - + address newImplementation_ + ) internal virtual override onlyRole(AccessControl.UPGRADER_ROLE) {} + + function _getFranchiseStorage() + private + pure + returns (FranchiseStorage storage $) + { + assembly { + $.slot := _STORAGE_LOCATION + } + } } diff --git a/contracts/IPAsset.sol b/contracts/IPAsset.sol deleted file mode 100644 index efbffc01..00000000 --- a/contracts/IPAsset.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.13; - - -enum IPAsset { - UNDEFINED, - STORY, - CHARACTER, - ART, - GROUP, - LOCATION, - ITEM -} - -uint8 constant EXTERNAL_ASSET = type(uint8).max; \ No newline at end of file diff --git a/contracts/access-control/AccessControlSingleton.sol b/contracts/access-control/AccessControlSingleton.sol index b8e050e5..21a14743 100644 --- a/contracts/access-control/AccessControlSingleton.sol +++ b/contracts/access-control/AccessControlSingleton.sol @@ -2,44 +2,47 @@ pragma solidity ^0.8.13; -import { PROTOCOL_ADMIN_ROLE, UPGRADER_ROLE } from "./ProtocolRoles.sol"; -import { IVersioned } from "../utils/IVersioned.sol"; -import { ZeroAddress } from "../errors/General.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { AccessControl } from "contracts/lib/AccessControl.sol"; +import { IVersioned } from "contracts/interfaces/utils/IVersioned.sol"; import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol"; import { AccessControlUpgradeable } from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -// TODO: Evaluate making this contract AccessControlEnumerableUpgradeable so it could enforce unique roles -// (as in only 1 address can have a role at a time) -contract AccessControlSingleton is AccessControlUpgradeable, UUPSUpgradeable, Multicall, IVersioned { - +/// @notice AccessControlSingleton contract. Manages protocol admin keys. Other contracts might inherit +/// AccessControlled or its upgradeable version to use the onlyRole modifier. +/// TODO: Evaluate making this contract AccessControlEnumerableUpgradeable so it could enforce unique roles +/// (as in only 1 address can have a role at a time) +contract AccessControlSingleton is + AccessControlUpgradeable, + UUPSUpgradeable, + Multicall, + IVersioned +{ string public constant version = "0.1.0"; - /** - * @notice Initializer method, access point to initialize inheritance tree. - * @param _admin address to be the PROTOCOL_ADMIN_ROLE. - */ - function initialize(address _admin) external initializer { - if (_admin == address(0)) revert ZeroAddress(); + /// @notice Initializer method, access point to initialize inheritance tree. + /// @param admin_ address to be the PROTOCOL_ADMIN_ROLE. + function initialize(address admin_) external initializer { + if (admin_ == address(0)) revert Errors.ZeroAddress(); __AccessControl_init(); __UUPSUpgradeable_init(); - _grantRole(PROTOCOL_ADMIN_ROLE, _admin); + _grantRole(AccessControl.PROTOCOL_ADMIN_ROLE, admin_); } - /** - * @notice Method for PROTOCOL_ADMIN_ROLE to create new roles, and define their role admin. - * @param role id of the new role. Should be keccak256(""). - * @param admin role id that will be the role admin for the new role. - */ - function setRoleAdmin(bytes32 role, bytes32 admin) external onlyRole(PROTOCOL_ADMIN_ROLE) { - _setRoleAdmin(role, admin); + /// @notice Method for PROTOCOL_ADMIN_ROLE to create new roles, and define their role admin. + /// @param role_ id of the new role. Should be keccak256(""). + /// @param admin_ role id that will be the role admin for the new role. + function setRoleAdmin( + bytes32 role_, + bytes32 admin_ + ) external onlyRole(AccessControl.PROTOCOL_ADMIN_ROLE) { + _setRoleAdmin(role_, admin_); } - /** - * @notice Access control for the upgrade process (UPGRADER_ROLE) - * @param newImplementation address of the new deployed implementation. - */ - function _authorizeUpgrade(address newImplementation) internal virtual override onlyRole(UPGRADER_ROLE) { - } - -} \ No newline at end of file + /// @notice Access control for the upgrade process (UPGRADER_ROLE) + /// @param newImplementation_ address of the new deployed implementation. + function _authorizeUpgrade( + address newImplementation_ + ) internal virtual override onlyRole(AccessControl.UPGRADER_ROLE) {} +} diff --git a/contracts/access-control/AccessControlled.sol b/contracts/access-control/AccessControlled.sol index 746fdf4f..a8d4f903 100644 --- a/contracts/access-control/AccessControlled.sol +++ b/contracts/access-control/AccessControlled.sol @@ -2,55 +2,54 @@ pragma solidity ^0.8.9; +import { AccessControl } from "contracts/lib/AccessControl.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { IAccessControlled } from "contracts/interfaces/access-control/IAccessControlled.sol"; import { IAccessControl } from "@openzeppelin/contracts/access/IAccessControl.sol"; +// solhint-disable-next-line max-line-length import { ERC165CheckerUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165CheckerUpgradeable.sol"; -import { PROTOCOL_ADMIN_ROLE } from "./ProtocolRoles.sol"; import { UnsupportedInterface } from "../errors/General.sol"; -abstract contract AccessControlled { - +abstract contract AccessControlled is IAccessControlled { using ERC165CheckerUpgradeable for address; IAccessControl private _accessControl; - event AccessControlUpdated(address indexed accessControl); - error MissingRole(bytes32 role, address account); - - /** - * @notice Checks if msg.sender has `role`, reverts if not. - * @param role the role to be tested, defined in Roles.sol and set in AccessManager instance. - */ - modifier onlyRole(bytes32 role) { - if (!hasRole(role, msg.sender)) { - revert MissingRole(role, msg.sender); + /// @notice Checks if msg.sender has `role`, reverts if not. + /// @param role_ the role to be tested, defined in Roles.sol and set in AccessManager instance. + modifier onlyRole(bytes32 role_) { + if (!hasRole(role_, msg.sender)) { + revert Errors.MissingRole(role_, msg.sender); } _; } - constructor(address accessControl) { - if (!accessControl.supportsInterface(type(IAccessControl).interfaceId)) revert UnsupportedInterface("IAccessControl"); - _accessControl = IAccessControl(accessControl); - emit AccessControlUpdated(accessControl); + constructor(address accessControl_) { + if (!accessControl_.supportsInterface(type(IAccessControl).interfaceId)) + revert Errors.UnsupportedInterface("IAccessControl"); + _accessControl = IAccessControl(accessControl_); + emit AccessControlUpdated(accessControl_); } - /** - * @notice Checks if `account has `role` assigned. - * @param role the role to be tested, defined in Roles.sol and set in AccessManager instance. - * @param account the address to be tested for the role. - * @return return true if account has role, false otherwise. - */ - function hasRole(bytes32 role, address account) internal view returns (bool) { - return _accessControl.hasRole(role, account); + /// @notice Sets AccessManager instance. Restricted to PROTOCOL_ADMIN_ROLE + /// @param accessControl_ address of the new instance of AccessControlSingleton. + function setAccessControl( + address accessControl_ + ) public onlyRole(AccessControl.PROTOCOL_ADMIN_ROLE) { + if (!accessControl_.supportsInterface(type(IAccessControl).interfaceId)) + revert Errors.UnsupportedInterface("IAccessControl"); + _accessControl = IAccessControl(accessControl_); + emit AccessControlUpdated(accessControl_); } - /** - * @notice Sets AccessManager instance. Restricted to PROTOCOL_ADMIN_ROLE - * @param accessControl address of the new instance of AccessControlSingleton. - */ - function setAccessControl(address accessControl) public onlyRole(PROTOCOL_ADMIN_ROLE) { - if (!accessControl.supportsInterface(type(IAccessControl).interfaceId)) revert UnsupportedInterface("IAccessControl"); - _accessControl = IAccessControl(accessControl); - emit AccessControlUpdated(accessControl); + /// @notice Checks if `account has `role` assigned. + /// @param role_ the role to be tested, defined in Roles.sol and set in AccessManager instance. + /// @param account_ the address to be tested for the role. + /// @return return true if account has role, false otherwise. + function hasRole( + bytes32 role_, + address account_ + ) internal view returns (bool) { + return _accessControl.hasRole(role_, account_); } - -} \ No newline at end of file +} diff --git a/contracts/access-control/AccessControlledUpgradeable.sol b/contracts/access-control/AccessControlledUpgradeable.sol index a4b5810e..5be70d73 100644 --- a/contracts/access-control/AccessControlledUpgradeable.sol +++ b/contracts/access-control/AccessControlledUpgradeable.sol @@ -1,81 +1,83 @@ // SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.9; +pragma solidity ^0.8.19; import { IAccessControl } from "@openzeppelin/contracts/access/IAccessControl.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +// solhint-disable-next-line max-line-length import { ERC165CheckerUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165CheckerUpgradeable.sol"; -import { PROTOCOL_ADMIN_ROLE } from "./ProtocolRoles.sol"; -import { UnsupportedInterface } from "../errors/General.sol"; - -abstract contract AccessControlledUpgradeable is UUPSUpgradeable { +import { AccessControl } from "contracts/lib/AccessControl.sol"; +import { IAccessControlled } from "contracts/interfaces/access-control/IAccessControlled.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +abstract contract AccessControlledUpgradeable is UUPSUpgradeable, IAccessControlled { using ERC165CheckerUpgradeable for address; - event AccessControlUpdated(address indexed accessControl); - error MissingRole(bytes32 role, address account); - /// @custom:storage-location erc7201:story-protocol.access-controlled-upgradeable.storage struct AccessControlledStorage { IAccessControl accessControl; } // keccak256(bytes.concat(bytes32(uint256(keccak256("story-protocol.access-controlled-upgradeable.storage")) - 1))) - bytes32 private constant _STORAGE_LOCATION = 0x06c308ca3b780cede1217f5877d0c7fbf50796d93f836cb3b60e6457b0cf03b6; + bytes32 private constant _STORAGE_LOCATION = + 0x06c308ca3b780cede1217f5877d0c7fbf50796d93f836cb3b60e6457b0cf03b6; - /** - * @notice Checks if msg.sender has `role`, reverts if not. - * @param role the role to be tested, defined in Roles.sol and set in AccessManager instance. - */ - modifier onlyRole(bytes32 role) { - if (!hasRole(role, msg.sender)) { - revert MissingRole(role, msg.sender); + /// @notice Checks if msg.sender has `role`, reverts if not. + /// @param role_ the role to be tested, defined in Roles.sol and set in AccessManager instance. + modifier onlyRole(bytes32 role_) { + if (!hasRole(role_, msg.sender)) { + revert Errors.MissingRole(role_, msg.sender); } _; } - /** - * @notice Initializer method, access point to initialize inheritance tree. - * @param accessControl address of AccessManager. - */ - function __AccessControlledUpgradeable_init(address accessControl) internal initializer { - if (!accessControl.supportsInterface(type(IAccessControl).interfaceId)) revert UnsupportedInterface("IAccessControl"); + /// @notice Sets AccessManager instance. Restricted to PROTOCOL_ADMIN_ROLE + /// @param accessControl_ address of the new instance of AccessControlSingleton. + function setAccessControl( + address accessControl_ + ) public onlyRole(AccessControl.PROTOCOL_ADMIN_ROLE) { + if (!accessControl_.supportsInterface(type(IAccessControl).interfaceId)) + revert Errors.UnsupportedInterface("IAccessControl"); AccessControlledStorage storage $ = _getAccessControlledUpgradeable(); - $.accessControl = IAccessControl(accessControl); - emit AccessControlUpdated(accessControl); - } - - function _getAccessControlledUpgradeable() private pure returns (AccessControlledStorage storage $) { - assembly { - $.slot := _STORAGE_LOCATION - } + $.accessControl = IAccessControl(accessControl_); + emit AccessControlUpdated(accessControl_); } - /** - * @notice Checks if `account has `role` assigned. - * @param role the role to be tested, defined in Roles.sol and set in AccessManager instance. - * @param account the address to be tested for the role. - * @return return true if account has role, false otherwise. - */ - function hasRole(bytes32 role, address account) internal view returns (bool) { + function getAccessControl() public view returns (address) { AccessControlledStorage storage $ = _getAccessControlledUpgradeable(); - return $.accessControl.hasRole(role, account); + return address($.accessControl); } - /** - * @notice Sets AccessManager instance. Restricted to PROTOCOL_ADMIN_ROLE - * @param accessControl address of the new instance of AccessControlSingleton. - */ - function setAccessControl(address accessControl) public onlyRole(PROTOCOL_ADMIN_ROLE) { - if (!accessControl.supportsInterface(type(IAccessControl).interfaceId)) revert UnsupportedInterface("IAccessControl"); + /// @notice Initializer method, access point to initialize inheritance tree. + /// @param accessControl_ address of AccessManager. + function __AccessControlledUpgradeable_init( + address accessControl_ + ) internal initializer { + if (!accessControl_.supportsInterface(type(IAccessControl).interfaceId)) + revert Errors.UnsupportedInterface("IAccessControl"); AccessControlledStorage storage $ = _getAccessControlledUpgradeable(); - $.accessControl = IAccessControl(accessControl); - emit AccessControlUpdated(accessControl); + $.accessControl = IAccessControl(accessControl_); + emit AccessControlUpdated(accessControl_); } - function getAccessControl() public view returns (address) { + /// @notice Checks if `account has `role` assigned. + /// @param role_ the role to be tested, defined in Roles.sol and set in AccessManager instance. + /// @param account_ the address to be tested for the role. + /// @return return true if account has role, false otherwise. + function hasRole( + bytes32 role_, + address account_ + ) internal view returns (bool) { AccessControlledStorage storage $ = _getAccessControlledUpgradeable(); - return address($.accessControl); + return $.accessControl.hasRole(role_, account_); } -} \ No newline at end of file + function _getAccessControlledUpgradeable() + private + pure + returns (AccessControlledStorage storage $) + { + assembly { + $.slot := _STORAGE_LOCATION + } + } +} diff --git a/contracts/access-control/ProtocolRoles.sol b/contracts/access-control/ProtocolRoles.sol deleted file mode 100644 index 35f781de..00000000 --- a/contracts/access-control/ProtocolRoles.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.13; - -// This roles are used by the AccessControlSingleton, accessed by AccessControlled contracts. - -// Default admin role as per OZ AccessControl system. All other roles stem from this. -bytes32 constant PROTOCOL_ADMIN_ROLE = bytes32(0); -// Role that can upgrade UUPS contracts or Beacon Proxies -bytes32 constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); -// Role that can perform admin tasks on the Protocol Relationship Module contract (e.g. adding new protocol-wide links) -bytes32 constant RELATIONSHIP_MANAGER_ROLE = keccak256("RELATIONSHIP_MANAGER_ROLE"); -// Role that can perform admin tasks on the Licensing Module contracts (setNonCommercialLicenseURI) -bytes32 constant LICENSING_MANAGER_ROLE = keccak256("LICENSING_MANAGER_ROLE"); \ No newline at end of file diff --git a/contracts/errors/General.sol b/contracts/errors/General.sol index 308b3631..a20ef42c 100644 --- a/contracts/errors/General.sol +++ b/contracts/errors/General.sol @@ -8,4 +8,4 @@ error UnsupportedInterface(string name); error Unauthorized(); error NonExistentID(uint256 id); error EmptyArray(); -error LengthMismatch(); \ No newline at end of file +error LengthMismatch(); diff --git a/contracts/interfaces/ICollectModule.sol b/contracts/interfaces/ICollectModule.sol deleted file mode 100644 index 89287fa9..00000000 --- a/contracts/interfaces/ICollectModule.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -import { InitCollectParams, CollectParams } from "../lib/CollectModuleStructs.sol"; -import { ICollectModuleEventsAndErrors } from "./ICollectModuleEventsAndErrors.sol"; - -/// @title Collect Module Interface -/// @notice The collect module enables IP assets to be minted as NFTs mirroring -/// their binding IP assets in a franchise-configurable format. -interface ICollectModule is ICollectModuleEventsAndErrors { - - /// @notice Initializes the collect module for a specific IP asset. - /// @param initCollectParams Collect module init data, including IP asset - /// id, collect NFT impl address, and generic unformatted init data. - function initCollect(InitCollectParams calldata initCollectParams) external; - - /// @notice Performs a collect on a specific IP asset for a collector. - /// @param collectParams Collect module collect data, including IP asset id, - /// collector address, and generic unformatted collect and NFT data. - /// @return collectNFT The address of the collected NFT. - /// @return collectNFTId The id of the collected collect NFT. - function collect(CollectParams calldata collectParams) external returns (address collectNFT, uint256 collectNFTId); - - /// @notice Returns the collect NFT address associated with an IP asset. - /// @param franchiseId The id of the franchise of the specified IP asset. - /// @param ipAssetId The id of the specified IP asset within the franchise. - /// @return The Collect NFT address if it exists, else the zero address. - function getCollectNFT(uint256 franchiseId, uint256 ipAssetId) external returns (address); - -} diff --git a/contracts/interfaces/ICollectModuleEventsAndErrors.sol b/contracts/interfaces/ICollectModuleEventsAndErrors.sol deleted file mode 100644 index 8a2bc47e..00000000 --- a/contracts/interfaces/ICollectModuleEventsAndErrors.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -/// @title Collect Module Events & Errors Interface -interface ICollectModuleEventsAndErrors { - - /// @notice Collect module caller is unauthorized. - error CollectModuleCallerUnauthorized(); - - /// @notice Collect NFT has already been initialized. - error CollectModuleCollectNotYetInitialized(); - - /// @notice Collect action is not authorized for the collect module. - error CollectModuleCollectUnauthorized(); - - /// @notice Collect module IP asset is already initialized. - error CollectModuleIPAssetAlreadyInitialized(); - - /// @notice Collect module IP asset does not exist. - error CollectModuleIPAssetNonExistent(); - - /// @notice Collect module provided IP asset registry does not exist. - error CollectModuleIPAssetRegistryNonExistent(); - -} diff --git a/contracts/interfaces/ICollectNFTEventsAndErrors.sol b/contracts/interfaces/ICollectNFTEventsAndErrors.sol deleted file mode 100644 index dd8ceb78..00000000 --- a/contracts/interfaces/ICollectNFTEventsAndErrors.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -interface ICollectNFTEventsAndErrors { - - /// @notice Collect NFT has already been initialized. - error CollectNFTAlreadyInitialized(); - - /// @notice Caller of the Collect NFT is not authorized. - error CollectNFTCallerUnauthorized(); - - /// @notice Collector address is not valid. - error CollectNFTCollectorInvalid(); - - /// @notice IP asset bound to the Collect NFT does not exist. - error CollectNFTIPAssetNonExistent(); - -} diff --git a/contracts/interfaces/IERC721Errors.sol b/contracts/interfaces/IERC721Errors.sol deleted file mode 100644 index 4a294e9b..00000000 --- a/contracts/interfaces/IERC721Errors.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -/// @title ERC-721 Errors Interface -interface IERC721Errors { - - /// @notice Originating address does not own the NFT. - error ERC721OwnerInvalid(); - - /// @notice Receiving address cannot be the zero address. - error ERC721ReceiverInvalid(); - - /// @notice Receiving contract does not implement the ERC-721 wallet interface. - error ERC721SafeTransferUnsupported(); - - /// @notice Sender is not NFT owner, approved address, or owner operator. - error ERC721SenderUnauthorized(); - - /// @notice Token has already been minted. - error ERC721TokenAlreadyMinted(); - - /// @notice NFT does not exist. - error ERC721TokenNonExistent(); - -} diff --git a/contracts/interfaces/access-control/IAccessControlled.sol b/contracts/interfaces/access-control/IAccessControlled.sol new file mode 100644 index 00000000..d748dfd1 --- /dev/null +++ b/contracts/interfaces/access-control/IAccessControlled.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +/// @title Access Controlled Interface +interface IAccessControlled { + + event AccessControlUpdated(address indexed accessControl); + +} diff --git a/contracts/interfaces/ip-accounts/IERC6551Account.sol b/contracts/interfaces/ip-accounts/IERC6551Account.sol new file mode 100644 index 00000000..38d706bf --- /dev/null +++ b/contracts/interfaces/ip-accounts/IERC6551Account.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.13; + +/// @dev the ERC-165 identifier for this interface is `0x6faff5f1` +interface IERC6551Account { + + /// @dev Allows the account to receive Ether + /// Accounts MUST implement a `receive` function + /// Accounts MAY perform arbitrary logic to restrict conditions + /// under which Ether can be received + receive() external payable; + + + /// @dev Returns the identifier of the non-fungible token which owns the account + /// The return value of this function MUST be constant - it MUST NOT change over time + /// @return chainId The EIP-155 ID of the chain the token exists on + /// @return tokenContract The contract address of the token + /// @return tokenId The ID of the token + function token() + external + view + returns (uint256 chainId, address tokenContract, uint256 tokenId); + + + /// @dev Returns a value that SHOULD be modified each time the account changes state + /// @return The current account state + function state() external view returns (uint256); + + + /// @dev Returns a magic value indicating whether a given signer is authorized to act on behalf + /// of the account + /// MUST return the bytes4 magic value 0x523e3260 if the given signer is valid + /// By default, the holder of the non-fungible token the account is bound to MUST be considered + /// a valid signer + /// Accounts MAY implement additional authorization logic which invalidates the holder as a + /// signer or grants signing permissions to other non-holder accounts + /// @param signer The address to check signing authorization for + /// @param context Additional data used to determine whether the signer is valid + /// @return magicValue Magic value indicating whether the signer is valid + function isValidSigner( + address signer, + bytes calldata context + ) external view returns (bytes4 magicValue); +} diff --git a/contracts/interfaces/ip-accounts/IIPAccount.sol b/contracts/interfaces/ip-accounts/IIPAccount.sol new file mode 100644 index 00000000..2e00a2aa --- /dev/null +++ b/contracts/interfaces/ip-accounts/IIPAccount.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.13; + +import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; +import { IERC1155Receiver } from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; +import { IERC6551Account } from "./IERC6551Account.sol"; + +interface IIPAccount is IERC6551Account, IERC721Receiver, IERC1155Receiver { + function safeTransferFrom( + address nftContract_, + address from_, + address to_, + uint256 tokenId_ + ) external; + + function sendRoyaltyForDistribution( + address distributor_, + address token_ + ) external; +} diff --git a/contracts/ip-accounts/IIPAccountRegistry.sol b/contracts/interfaces/ip-accounts/IIPAccountRegistry.sol similarity index 50% rename from contracts/ip-accounts/IIPAccountRegistry.sol rename to contracts/interfaces/ip-accounts/IIPAccountRegistry.sol index 41b375d2..0964fae3 100644 --- a/contracts/ip-accounts/IIPAccountRegistry.sol +++ b/contracts/interfaces/ip-accounts/IIPAccountRegistry.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.13; interface IIPAccountRegistry { + event AccountCreated( address account, address implementation, @@ -11,26 +12,21 @@ interface IIPAccountRegistry { uint256 salt ); - error NonExistIpAccountImpl(); - error IpAccountInitializationFailed(); - function createAccount( - uint256 chainId, - address tokenContract, - uint256 tokenId, + uint256 chainId_, + address tokenContract_, + uint256 tokenId_, bytes calldata initData ) external returns (address); function account( - uint256 chainId, - address tokenContract, - uint256 tokenId + uint256 chainId_, + address tokenContract_, + uint256 tokenId_ ) external view returns (address); - /** - * @notice Returns the IPAccount implementation address. - * - * @return address The IPAccount implementation address. - */ - function getIPAccountImpl() external view returns (address); + + /// @notice Returns the IPAccount implementation address. + /// @return address The IPAccount implementation address. + function getIpAccountImpl() external view returns (address); } diff --git a/contracts/ip-assets/IIPAssetRegistry.sol b/contracts/interfaces/ip-assets/IIPAssetRegistry.sol similarity index 67% rename from contracts/ip-assets/IIPAssetRegistry.sol rename to contracts/interfaces/ip-assets/IIPAssetRegistry.sol index 37586f1c..aef47e3c 100644 --- a/contracts/ip-assets/IIPAssetRegistry.sol +++ b/contracts/interfaces/ip-assets/IIPAssetRegistry.sol @@ -5,7 +5,7 @@ import { IVersioned } from "../utils/IVersioned.sol"; import { IIPAssetDataManager } from "./storage/IIPAssetDataManager.sol"; import { IERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; import { IERC5218 } from "../modules/licensing/IERC5218.sol"; -import { IPAsset } from "../IPAsset.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; interface IIPAssetRegistry is IVersioned, @@ -13,15 +13,14 @@ interface IIPAssetRegistry is IERC5218, IIPAssetDataManager { - function franchiseId() external view returns (uint256); - - function createIPAsset( - IPAsset sb, - string calldata name, - string calldata _description, - string calldata mediaUrl, - address to, - uint256 parentIpAssetId + function createIpAsset( + IPAsset.IPAssetType ipAsset_, + string calldata name_, + string calldata description_, + string calldata mediaUrl_, + address to_, + uint256 parentIpAssetId_ ) external returns (uint256); + function franchiseId() external view returns (uint256); } diff --git a/contracts/ip-assets/events/IIPAssetEventEmitter.sol b/contracts/interfaces/ip-assets/events/IIPAssetEventEmitter.sol similarity index 57% rename from contracts/ip-assets/events/IIPAssetEventEmitter.sol rename to contracts/interfaces/ip-assets/events/IIPAssetEventEmitter.sol index 313bf7dd..10cfd9e8 100644 --- a/contracts/ip-assets/events/IIPAssetEventEmitter.sol +++ b/contracts/interfaces/ip-assets/events/IIPAssetEventEmitter.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { IPAsset } from "contracts/IPAsset.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; interface IIPAssetEventEmitter { @@ -9,9 +9,9 @@ interface IIPAssetEventEmitter { uint256 indexed franchiseId, address indexed ipAssetRegistry, uint256 ipAssetId, - IPAsset ipAssetType + IPAsset.IPAssetType ipAssetType ); - function emitIPAssetCreation(uint256 franchiseId, uint256 ipAssetId) external; + function emitIpAssetCreation(uint256 franchiseId_, uint256 ipAssetId_) external; -} \ No newline at end of file +} diff --git a/contracts/ip-assets/storage/IIPAssetDataManager.sol b/contracts/interfaces/ip-assets/storage/IIPAssetDataManager.sol similarity index 54% rename from contracts/ip-assets/storage/IIPAssetDataManager.sol rename to contracts/interfaces/ip-assets/storage/IIPAssetDataManager.sol index 9f42b1c6..8a8ffb6f 100644 --- a/contracts/ip-assets/storage/IIPAssetDataManager.sol +++ b/contracts/interfaces/ip-assets/storage/IIPAssetDataManager.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { IPAsset } from "contracts/IPAsset.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; interface IIPAssetDataManager { event IPAssetWritten( - uint256 indexed IPAssetId, - IPAsset indexed blockType, + uint256 indexed ipAssetId, + IPAsset.IPAssetType indexed blockType, string name, string description, string mediaUrl @@ -17,9 +17,9 @@ interface IIPAssetDataManager { string name; string description; string mediaUrl; - IPAsset blockType; + IPAsset.IPAssetType blockType; } - function readIPAsset(uint256 IPAssetId) external view returns (IPAssetData memory); + function readIPAsset(uint256 ipAssetId_) external view returns (IPAssetData memory); -} \ No newline at end of file +} diff --git a/contracts/interfaces/modules/collect/ICollectModule.sol b/contracts/interfaces/modules/collect/ICollectModule.sol new file mode 100644 index 00000000..cb9afbd5 --- /dev/null +++ b/contracts/interfaces/modules/collect/ICollectModule.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +import { Collect } from "contracts/lib/modules/Collect.sol"; + +/// @title Collect Module Interface +/// @notice The collect module enables IP assets to be minted as NFTs mirroring +/// their binding IP assets in a franchise-configurable format. +interface ICollectModule { + + /// @dev Emits when a Collect action is invoked. + /// TODO: Once global IPs are supported, we can index the collect NFTs as well. + event Collected( + uint256 indexed franchiseid_, + uint256 indexed ipAssetId_, + address indexed collector_, + address collectNft_, + uint256 collectNftId_, + bytes collectData_, + bytes collectNftData_ + ); + + /// @dev Emits when a new collect NFT is deployed. + event NewCollectNFT( + uint256 indexed franchiseId_, + uint256 indexed ipAssetId_, + address collectNFT_ + ); + + /// @notice Initializes the collect module for a specific IP asset. + /// @param initCollectParams_ Collect module init data, including IP asset + /// id, collect NFT impl address, and generic unformatted init data. + function initCollect(Collect.InitCollectParams calldata initCollectParams_) external; + + /// @notice Performs a collect on a specific IP asset for a collector. + /// @param collectParams_ Collect module collect data, including IP asset id, + /// collector address, and generic unformatted collect and NFT data. + /// @return collectNft The address of the collected NFT. + /// @return collectNftId The id of the collected collect NFT. + function collect( + Collect.CollectParams calldata collectParams_ + ) external payable returns (address collectNft, uint256 collectNftId); + + /// @notice Returns the collect NFT address associated with an IP asset. + /// @param franchiseId_ The id of the franchise of the specified IP asset. + /// @param ipAssetId_ The id of the specified IP asset within the franchise. + /// @return The Collect NFT address if it exists, else the zero address. + function getCollectNFT( + uint256 franchiseId_, + uint256 ipAssetId_ + ) external returns (address); +} diff --git a/contracts/interfaces/ICollectNFT.sol b/contracts/interfaces/modules/collect/ICollectNFT.sol similarity index 52% rename from contracts/interfaces/ICollectNFT.sol rename to contracts/interfaces/modules/collect/ICollectNFT.sol index 87fae861..f5a34951 100644 --- a/contracts/interfaces/ICollectNFT.sol +++ b/contracts/interfaces/modules/collect/ICollectNFT.sol @@ -3,26 +3,27 @@ pragma solidity ^0.8.18; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { ICollectNFTEventsAndErrors } from "./ICollectNFTEventsAndErrors.sol"; -import { InitCollectNFTParams } from "contracts/lib/CollectNFTStructs.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; /// @title Collect NFT Interface /// @notice Contracts implementing the Collect NFT interface may be collected /// through a collect module for a bound franchise IP asset. -interface ICollectNFT is IERC721, ICollectNFTEventsAndErrors { - - /// @notice Returns the total # of collect NFTs that exist for an IP asset. - /// @return The total number of collect NFTs in the collection. - function totalSupply() external view returns (uint256); - +interface ICollectNFT is IERC721 { /// @notice Initializes a collect NFT for subsequent collection. - /// @param initParams Collect NFT init data, including bound franchise IP + /// @param initParams_ Collect NFT init data, including bound franchise IP /// asset registry, IP asset id, and generic unformatted init data. - function initialize(InitCollectNFTParams calldata initParams) external; + function initialize(Collect.InitCollectNFTParams calldata initParams_) external; /// @notice Performs a collect, minting the NFT to address `collector`. - /// @param collector The address of the target designated for collection. - /// @param data Additional unformatted bytes data for optional processing. - /// @return tokenId The id of the minted collect NFT. - function collect(address collector, bytes calldata data) external returns (uint256); + /// @param collector_ The address of the target designated for collection. + /// @param data_ Additional unformatted bytes data for optional processing. + /// @return tokenId_ The id of the minted collect NFT. + function collect( + address collector_, + bytes calldata data_ + ) external returns (uint256); + + /// @notice Returns the total # of collect NFTs that exist for an IP asset. + /// @return The total number of collect NFTs in the collection. + function totalSupply() external view returns (uint256); } diff --git a/contracts/interfaces/modules/collect/ICollectPaymentModule.sol b/contracts/interfaces/modules/collect/ICollectPaymentModule.sol new file mode 100644 index 00000000..1c2e9d08 --- /dev/null +++ b/contracts/interfaces/modules/collect/ICollectPaymentModule.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { ICollectModule } from "./ICollectModule.sol"; + +/// @title Collect Payment Module Interface +/// @notice The collect payment module enables IP assets to be bound to NFTs +/// that can be minted for a configurable fee. +interface ICollectPaymentModule is ICollectModule { + /// @notice Initializes the collect payment module for a specific IP asset. + /// @param initCollectParams_ Collect module init data, including IP asset + /// id, collect NFT impl address, and payment module init data. + function initCollect( + Collect.InitCollectParams calldata initCollectParams_ + ) external override(ICollectModule); + + /// @notice Performs a collect on a specific IP asset, processing the module + /// configured payment in the process. + /// @param collectParams_ Collect module collect data, including IP asset id, + /// collector address, and collect payment module processing data. + /// @return collectNft The address of the collected NFT. + /// @return collectNftId The id of the collected collect NFT. + function collect( + Collect.CollectParams calldata collectParams_ + ) + external + payable + override(ICollectModule) + returns (address collectNft, uint256 collectNftId); + + /// @notice Returns the collect payment info associated with an IP asset. + /// @param franchiseId_ The id of the franchise of the specified IP asset. + /// @param ipAssetId_ The id of the specified IP asset within the franchise. + /// @return Payment info associated with the configured IP asset collect. + function getPaymentInfo( + uint256 franchiseId_, + uint256 ipAssetId_ + ) external view returns (Collect.CollectPaymentInfo memory); +} diff --git a/contracts/modules/licensing/IERC5218.sol b/contracts/interfaces/modules/licensing/IERC5218.sol similarity index 97% rename from contracts/modules/licensing/IERC5218.sol rename to contracts/interfaces/modules/licensing/IERC5218.sol index d3ac7fbf..dd8b3416 100644 --- a/contracts/modules/licensing/IERC5218.sol +++ b/contracts/interfaces/modules/licensing/IERC5218.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import { IERC721Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import { ITermsProcessor } from "./terms/ITermsProcessor.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; /// @title ERC-5218: NFT Rights Management interface IERC5218 is IERC721Upgradeable { @@ -34,10 +35,56 @@ interface IERC5218 is IERC721Upgradeable { /// `transfer` function call. event TransferLicense(uint256 _licenseId, address _licenseHolder); - struct TermsProcessorConfig { - ITermsProcessor processor; - bytes data; - } + + /// @notice Create a new license. + /// @dev Throws unless the NFT `_tokenId` exists. Throws unless the parent + /// license `_parentLicenseId` is active, or `_parentLicenseId` is a special + /// identifier not referring to any license (such as 0) and the NFT + /// `_tokenId` doesn't have a root license tethered to it. Throws unless the + /// message sender is eligible to create the license, i.e., either the + /// license to be created is a root license and `msg.sender` is the NFT owner, + /// or the license to be created is a sublicense and `msg.sender` is the holder + /// of the parent license. + /// @param _tokenId The identifier for the NFT the license is issued upon + /// @param _parentLicenseId The identifier for the parent license + /// @param _licenseHolder The address of the license holder + /// @param _uri The URI of the license terms + /// @param _revoker The revoker address + /// @param _commercial Whether the license granted is commercial or non commercial + /// @param _canSublicense Whether the license holder can sublicense the license + /// @param _terms The license terms + /// @return The identifier of the created license + function createLicense( + uint256 _tokenId, + uint256 _parentLicenseId, + address _licenseHolder, + string memory _uri, + address _revoker, + bool _commercial, // NOTE: MODIFIED ERC-5218 + bool _canSublicense, // NOTE: MODIFIED ERC-5218 + Licensing.TermsProcessorConfig memory _terms // NOTE: MODIFIED ERC-5218 + ) external returns (uint256); + + /// @notice Revoke a license. + /// @dev Throws unless the license is active and the message sender is the + /// eligible revoker. This function should be used for revoking both root + /// licenses and sublicenses. Note that if a root license is revoked, the + /// NFT should be transferred back to its creator. + /// @param _licenseId The identifier for the queried license + function revokeLicense(uint256 _licenseId) external; + + /// @notice Transfer a sublicense. + /// @dev Throws unless the sublicense is active and `msg.sender` is the license + /// holder. Note that the root license of an NFT should be tethered to and + /// transferred with the NFT. Whenever an NFT is transferred by calling the + /// ERC721 `transfer` function, the holder of the root license should be + /// changed to the new NFT owner. + /// @param _licenseId The identifier for the queried license + /// @param _licenseHolder The new license holder + function transferSublicense( + uint256 _licenseId, + address _licenseHolder + ) external; /// @notice Check if a license is active. /// @dev A non-existing or revoked license is inactive and this function must @@ -100,55 +147,4 @@ interface IERC5218 is IERC721Upgradeable { uint256 _tokenId, bool _commercial // NOTE: MODIFIED ERC-5218 ) external view returns (uint256); - - /// @notice Create a new license. - /// @dev Throws unless the NFT `_tokenId` exists. Throws unless the parent - /// license `_parentLicenseId` is active, or `_parentLicenseId` is a special - /// identifier not referring to any license (such as 0) and the NFT - /// `_tokenId` doesn't have a root license tethered to it. Throws unless the - /// message sender is eligible to create the license, i.e., either the - /// license to be created is a root license and `msg.sender` is the NFT owner, - /// or the license to be created is a sublicense and `msg.sender` is the holder - /// of the parent license. - /// @param _tokenId The identifier for the NFT the license is issued upon - /// @param _parentLicenseId The identifier for the parent license - /// @param _licenseHolder The address of the license holder - /// @param _uri The URI of the license terms - /// @param _revoker The revoker address - /// @param _commercial Whether the license granted is commercial or non commercial - /// @param _canSublicense Whether the license holder can sublicense the license - /// @param _terms The license terms - /// @return The identifier of the created license - function createLicense( - uint256 _tokenId, - uint256 _parentLicenseId, - address _licenseHolder, - string memory _uri, - address _revoker, - bool _commercial, // NOTE: MODIFIED ERC-5218 - bool _canSublicense, // NOTE: MODIFIED ERC-5218 - TermsProcessorConfig memory _terms // NOTE: MODIFIED ERC-5218 - ) external returns (uint256); - - /// @notice Revoke a license. - /// @dev Throws unless the license is active and the message sender is the - /// eligible revoker. This function should be used for revoking both root - /// licenses and sublicenses. Note that if a root license is revoked, the - /// NFT should be transferred back to its creator. - /// @param _licenseId The identifier for the queried license - function revokeLicense(uint256 _licenseId) external; - - /// @notice Transfer a sublicense. - /// @dev Throws unless the sublicense is active and `msg.sender` is the license - /// holder. Note that the root license of an NFT should be tethered to and - /// transferred with the NFT. Whenever an NFT is transferred by calling the - /// ERC721 `transfer` function, the holder of the root license should be - /// changed to the new NFT owner. - /// @param _licenseId The identifier for the queried license - /// @param _licenseHolder The new license holder - function transferSublicense( - uint256 _licenseId, - address _licenseHolder - ) external; - } diff --git a/contracts/modules/licensing/ILicenseRegistry.sol b/contracts/interfaces/modules/licensing/ILicenseRegistry.sol similarity index 56% rename from contracts/modules/licensing/ILicenseRegistry.sol rename to contracts/interfaces/modules/licensing/ILicenseRegistry.sol index b25403e3..5d0703f0 100644 --- a/contracts/modules/licensing/ILicenseRegistry.sol +++ b/contracts/interfaces/modules/licensing/ILicenseRegistry.sol @@ -3,15 +3,14 @@ pragma solidity ^0.8.13; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -/** - * @title ILicenseRegistry - * @author Raul Martinez - * @notice Interface for NFT tracking the ownership of tradeable Licenses emitted by a RightsManager. - */ + +/// @title ILicenseRegistry +/// @author Raul Martinez +/// @notice Interface for NFT tracking the ownership of tradeable Licenses emitted by a RightsManager. interface ILicenseRegistry is IERC721 { - function mint(address to, uint256 tokenId) external; - function exists(uint256 tokenId) external view returns (bool); + function mint(address to_, uint256 tokenId_) external; + function exists(uint256 tokenId_) external view returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function getRightsManager() external view returns (address); diff --git a/contracts/interfaces/modules/licensing/ILicensingModule.sol b/contracts/interfaces/modules/licensing/ILicensingModule.sol new file mode 100644 index 00000000..5c485a0f --- /dev/null +++ b/contracts/interfaces/modules/licensing/ILicensingModule.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.13; +import { ZeroAddress, Unauthorized } from "contracts/errors/General.sol"; +import { FranchiseRegistry } from "contracts/FranchiseRegistry.sol"; +import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { AccessControlledUpgradeable } from "contracts/access-control/AccessControlledUpgradeable.sol"; +import { ITermsProcessor } from "./terms/ITermsProcessor.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; +import { IERC5218 } from "./IERC5218.sol"; + +interface ILicensingModule { + + event NonCommercialLicenseUriSet(string uri); + + event FranchiseConfigSet(uint256 franchiseId, Licensing.FranchiseConfig config); + + function configureFranchiseLicensing(uint256 franchiseId_, Licensing.FranchiseConfig memory config_) external; + function getFranchiseConfig(uint256 franchiseId_) external view returns (Licensing.FranchiseConfig memory); + function getNonCommercialLicenseURI() external view returns (string memory); + +} diff --git a/contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol b/contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol new file mode 100644 index 00000000..9804d740 --- /dev/null +++ b/contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + + +/// @title ITermsProcessor +/// @author Raul Martinez +/// @notice Interface for licensing terms processors, which encode, decode and execute the terms set on an IERC5218 license parameters, +/// in particular the TermsProcessorConfig struct for the terms parameter in createLicense() +interface ITermsProcessor is IERC165 { + + + /// @notice Executes the terms set on a license on creation. + /// This should be called after decodeTerms() + /// @return newData the new data to be set on the license + function executeTerms(bytes calldata data_) external returns(bytes memory newData); + + /// returns true if the terms have been executed successfully or they don't need to be executed, false otherwise + function termsExecutedSuccessfully(bytes calldata data_) external view returns(bool); + +} \ No newline at end of file diff --git a/contracts/interfaces/modules/relationships/IRelationshipModule.sol b/contracts/interfaces/modules/relationships/IRelationshipModule.sol new file mode 100644 index 00000000..7dd14ca3 --- /dev/null +++ b/contracts/interfaces/modules/relationships/IRelationshipModule.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.13; + +import { IRelationshipProcessor } from "./processors/IRelationshipProcessor.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; + +interface IRelationshipModule { + + event RelationSet( + address sourceContract, + uint256 sourceId, + address destContract, + uint256 destId, + bytes32 indexed relationshipId, + uint256 endTime + ); + event RelationUnset( + address sourceContract, + uint256 sourceId, + address destContract, + uint256 destId, + bytes32 indexed relationshipId + ); + event RelationPendingProcessor( + address sourceContract, + uint256 sourceId, + address destContract, + uint256 destId, + bytes32 indexed relationshipId + ); + + event RelationshipConfigSet( + string name, + bytes32 indexed relationshipId, + uint256 sourceIpAssetTypeMask, + uint256 destIpAssetTypeMask, + bool onlySameFranchise, + address processor, + uint256 maxTtl, + uint256 minTtl, + bool renewable + ); + + event RelationshipConfigUnset(bytes32 indexed relationshipId); + + function relate(Relationship.RelationshipParams calldata params_, bytes calldata data_) external; + function unrelate(Relationship.RelationshipParams calldata params_) external; + function setRelationshipConfig(string calldata name_, Relationship.SetRelationshipConfigParams calldata params_) external returns(bytes32 relationshipId); + function unsetRelationshipConfig(bytes32 relationshipId_) external; + function areTheyRelated(Relationship.RelationshipParams calldata params_) external view returns (bool); + function isRelationshipExpired(Relationship.RelationshipParams calldata params_) external view returns (bool); + function getRelationshipId(string calldata name_) external view returns (bytes32); + function getRelationshipConfig(bytes32 relationshipId_) external view returns (Relationship.RelationshipConfig memory); + function getRelationshipConfigDecoded(bytes32 relationshipId_) external view returns (Relationship.SetRelationshipConfigParams memory); +} diff --git a/contracts/interfaces/modules/relationships/processors/IRelationshipProcessor.sol b/contracts/interfaces/modules/relationships/processors/IRelationshipProcessor.sol new file mode 100644 index 00000000..2c3f593c --- /dev/null +++ b/contracts/interfaces/modules/relationships/processors/IRelationshipProcessor.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.13; + +import { Relationship } from "contracts/lib/modules/Relationship.sol"; + +/// @title IRelationshipProcessor +/// @dev Interface for relationship processors. +/// Relationship processors are used to process relationships between IP Assets before they are set. +/// They are set per relationship config in a IRelationshipModule +interface IRelationshipProcessor { + + + /// @dev Processes a relationship between two IP Assets before it is set. This can be use for validity checks, actions, etc. It must: + /// - revert if the relationship is invalid + /// - return true if the relationship is valid and the relationship should be set immediately in the relationship module. + /// - return false if the relationship is valid but there is need for further processing. + /// In this case, the relationship module will emit a RelationPendingProcessor event. + /// This can be leveraged for multi-step relationship setting, e.g. for a relationship that requires approval from the destination IP Asset owner. + function processRelationship(Relationship.RelationshipParams memory params_, bytes calldata data_, address caller_) external returns(bool); +} diff --git a/contracts/modules/royalties/IRoyaltyDistributor.sol b/contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol similarity index 61% rename from contracts/modules/royalties/IRoyaltyDistributor.sol rename to contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol index 8f28ee73..847e0051 100644 --- a/contracts/modules/royalties/IRoyaltyDistributor.sol +++ b/contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol @@ -43,37 +43,37 @@ interface IRoyaltyDistributor { event UpdateDistribution(address indexed account); /// @notice Set royalty policy to specified IP Asset. - /// @param nftContract address of NFT collection contract. - /// @param tokenId The NFT token Id of NFT collection contract. - /// @param royaltyPolicy The royalty distribution policy. - /// @param data The initial data of the royalty distribution policy. - function setRoyaltyPolicy(address nftContract, uint256 tokenId, address royaltyPolicy, bytes calldata data) external; - - /// @notice Get royalty policy for specified IP Asset. - /// @param nftContract address of NFT collection contract. - /// @param tokenId The NFT token Id of NFT collection contract. - /// @return The address of royalty distribution policy. - function getRoyaltyPolicy(address nftContract, uint256 tokenId) external view returns (address); + /// @param nftContract_ address of NFT collection contract. + /// @param tokenId_ The NFT token Id of NFT collection contract. + /// @param royaltyPolicy_ The royalty distribution policy. + /// @param data_ The initial data of the royalty distribution policy. + function setRoyaltyPolicy(address nftContract_, uint256 tokenId_, address royaltyPolicy_, bytes calldata data_) external; /// @notice update royalty distribution plan for given IP Asset. - /// @param nftContract address of NFT collection contract. - /// @param tokenId The NFT token Id of NFT collection contract. - /// @param data The royalty distribution plan data. - function updateDistribution(address nftContract, uint256 tokenId, bytes calldata data) external; + /// @param nftContract_ address of NFT collection contract. + /// @param tokenId_ The NFT token Id of NFT collection contract. + /// @param data_ The royalty distribution plan data. + function updateDistribution(address nftContract_, uint256 tokenId_, bytes calldata data_) external; /// @notice distribute royalty to each recipient according to royalty distribution plan for given IP Asset. - /// @param nftContract address of NFT collection contract. - /// @param tokenId The NFT token Id of NFT collection contract. - /// @param token The ERC20 token for royalty. - function distribute(address nftContract, uint256 tokenId, address token) external; + /// @param nftContract_ address of NFT collection contract. + /// @param tokenId_ The NFT token Id of NFT collection contract. + /// @param token_ The ERC20 token for royalty. + function distribute(address nftContract_, uint256 tokenId_, address token_) external; /// @notice claim royalty to account. - /// @param account address of the account to which withdraw royalty which distributed before. - function claim(address account, address token) external; + /// @param account_ address of the account to which withdraw royalty which distributed before. + function claim(address account_, address token_) external; /// @notice pause the royalty distribution. function pause() external; /// @notice unpause the royalty distribution. function unpause() external; -} \ No newline at end of file + + /// @notice Get royalty policy for specified IP Asset. + /// @param nftContract_ address of NFT collection contract. + /// @param tokenId_ The NFT token Id of NFT collection contract. + /// @return The address of royalty distribution policy. + function getRoyaltyPolicy(address nftContract_, uint256 tokenId_) external view returns (address); +} diff --git a/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol b/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol new file mode 100644 index 00000000..b561d843 --- /dev/null +++ b/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +/// @title Royalty Policy Interface +/// @notice The Royalty policy perform concrete operations of distributing royalty. +interface IRoyaltyPolicy { + + /// @notice initialize the royalty policy for the specified IP Account + /// @param account_ IP Account associated with the policy. + /// @param data_ The initial data of the royalty distribution policy. + function initPolicy(address account_, bytes calldata data_) external; + + /// @notice update distribute plan for the specified IP Account + /// @param account_ IP Account associated with the policy. + /// @param data_ The distribution plan data. + function updateDistribution(address account_, bytes calldata data_) external; + + /// @notice Distribute royalty to each recipient according to royalty distribution plan for given IP Asset. + /// @param account_ IP Account associated with the policy. + /// @param token_ The ERC20 token for royalty. + function distribute(address account_, address token_) external; +} \ No newline at end of file diff --git a/contracts/modules/royalties/ISplitMain.sol b/contracts/interfaces/modules/royalties/ISplitMain.sol similarity index 89% rename from contracts/modules/royalties/ISplitMain.sol rename to contracts/interfaces/modules/royalties/ISplitMain.sol index d5923193..30f344b9 100644 --- a/contracts/modules/royalties/ISplitMain.sol +++ b/contracts/interfaces/modules/royalties/ISplitMain.sol @@ -1,10 +1,9 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; -import {ERC20} from "solmate/src/tokens/ERC20.sol"; +import { ERC20 } from "solmate/src/tokens/ERC20.sol"; interface ISplitMain { - error InvalidSplit__TooFewAccounts(uint256 accountsLength); function createSplit( address[] calldata accounts, @@ -30,9 +29,9 @@ interface ISplitMain { address distributorAddress ) external; + function withdraw(address account, uint256 withdrawETH, ERC20[] calldata tokens) external; + function getETHBalance(address account) external view returns (uint256); function getERC20Balance(address account, ERC20 token) external view returns (uint256); - - function withdraw(address account, uint256 withdrawETH, ERC20[] calldata tokens) external; } diff --git a/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol b/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol new file mode 100644 index 00000000..b561d843 --- /dev/null +++ b/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +/// @title Royalty Policy Interface +/// @notice The Royalty policy perform concrete operations of distributing royalty. +interface IRoyaltyPolicy { + + /// @notice initialize the royalty policy for the specified IP Account + /// @param account_ IP Account associated with the policy. + /// @param data_ The initial data of the royalty distribution policy. + function initPolicy(address account_, bytes calldata data_) external; + + /// @notice update distribute plan for the specified IP Account + /// @param account_ IP Account associated with the policy. + /// @param data_ The distribution plan data. + function updateDistribution(address account_, bytes calldata data_) external; + + /// @notice Distribute royalty to each recipient according to royalty distribution plan for given IP Asset. + /// @param account_ IP Account associated with the policy. + /// @param token_ The ERC20 token for royalty. + function distribute(address account_, address token_) external; +} \ No newline at end of file diff --git a/contracts/utils/IVersioned.sol b/contracts/interfaces/utils/IVersioned.sol similarity index 98% rename from contracts/utils/IVersioned.sol rename to contracts/interfaces/utils/IVersioned.sol index 30ab1f74..8585b248 100644 --- a/contracts/utils/IVersioned.sol +++ b/contracts/interfaces/utils/IVersioned.sol @@ -3,7 +3,5 @@ pragma solidity ^0.8.13; interface IVersioned { - function version() external pure returns (string memory); - -} \ No newline at end of file +} diff --git a/contracts/ip-accounts/IERC6551Account.sol b/contracts/ip-accounts/IERC6551Account.sol deleted file mode 100644 index 0f1de74c..00000000 --- a/contracts/ip-accounts/IERC6551Account.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.13; - -/// @dev the ERC-165 identifier for this interface is `0x6faff5f1` -interface IERC6551Account { - /** - * @dev Allows the account to receive Ether - * - * Accounts MUST implement a `receive` function - * - * Accounts MAY perform arbitrary logic to restrict conditions - * under which Ether can be received - */ - receive() external payable; - - /** - * @dev Returns the identifier of the non-fungible token which owns the account - * - * The return value of this function MUST be constant - it MUST NOT change over time - * - * @return chainId The EIP-155 ID of the chain the token exists on - * @return tokenContract The contract address of the token - * @return tokenId The ID of the token - */ - function token() - external - view - returns ( - uint256 chainId, - address tokenContract, - uint256 tokenId - ); - - /** - * @dev Returns a value that SHOULD be modified each time the account changes state - * - * @return The current account state - */ - function state() external view returns (uint256); - - /** - * @dev Returns a magic value indicating whether a given signer is authorized to act on behalf - * of the account - * - * MUST return the bytes4 magic value 0x523e3260 if the given signer is valid - * - * By default, the holder of the non-fungible token the account is bound to MUST be considered - * a valid signer - * - * Accounts MAY implement additional authorization logic which invalidates the holder as a - * signer or grants signing permissions to other non-holder accounts - * - * @param signer The address to check signing authorization for - * @param context Additional data used to determine whether the signer is valid - * @return magicValue Magic value indicating whether the signer is valid - */ - function isValidSigner(address signer, bytes calldata context) - external - view - returns (bytes4 magicValue); -} diff --git a/contracts/ip-accounts/IIPAccount.sol b/contracts/ip-accounts/IIPAccount.sol deleted file mode 100644 index 6a58f8b4..00000000 --- a/contracts/ip-accounts/IIPAccount.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.13; - -import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; -import "./IERC6551Account.sol"; - -interface IIPAccount is IERC6551Account, IERC721Receiver, IERC1155Receiver { - function safeTransferFrom(address nftContract, address from, address to, uint256 tokenId) external; - function sendRoyaltyForDistribution(address distributor, address token) external; -} diff --git a/contracts/ip-accounts/IPAccountImpl.sol b/contracts/ip-accounts/IPAccountImpl.sol index 1fed0b1b..d761c244 100644 --- a/contracts/ip-accounts/IPAccountImpl.sol +++ b/contracts/ip-accounts/IPAccountImpl.sol @@ -1,26 +1,20 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -import "@openzeppelin/contracts/interfaces/IERC1271.sol"; -import "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol"; -import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; -import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "./IERC6551Account.sol"; -import "./IIPAccount.sol"; - -/** - * @title IPAccountImpl - */ -contract IPAccountImpl is - IERC165, - IIPAccount, - IERC1271 -{ +import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol"; +import { SignatureChecker } from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol"; +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; +import { IERC1155Receiver } from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { IERC6551Account } from "contracts/interfaces/ip-accounts/IERC6551Account.sol"; +import { IIPAccount } from "contracts/interfaces/ip-accounts/IIPAccount.sol"; +import { Errors } from "contracts/lib/Errors.sol"; + +/// @title IPAccountImpl +contract IPAccountImpl is IERC165, IIPAccount, IERC1271 { using SafeERC20 for IERC20; uint256 public state; @@ -31,26 +25,70 @@ contract IPAccountImpl is receive() external payable {} - function supportsInterface(bytes4 interfaceId) external pure returns (bool) { - return (interfaceId == type(IERC6551Account).interfaceId || - interfaceId == type(IERC1155Receiver).interfaceId || - interfaceId == type(IERC721Receiver).interfaceId || - interfaceId == type(IERC165).interfaceId); + /// @dev {See IIPAccount-safeTransferFrom} + function safeTransferFrom( + address nftContract_, + address from_, + address to_, + uint256 tokenId_ + ) external { + if (!_isValidSigner(msg.sender)) revert Errors.IPAccountImpl_CallerNotOwner(); + ++state; + IERC721(nftContract_).safeTransferFrom(from_, to_, tokenId_); + } + + // TODO: authorization check that only the royaltyDistributor can call this function + function sendRoyaltyForDistribution( + address distributor_, + address erc20_ + ) external { + IERC20(erc20_).safeTransfer( + distributor_, + IERC20(erc20_).balanceOf(address(this)) + + withdrawn[erc20_] - + entitled[erc20_] + ); + } + + function isValidSignature( + bytes32 hash_, + bytes memory signature_ + ) external view returns (bytes4 magicValue) { + bool isValid = SignatureChecker.isValidSignatureNow( + owner(), + hash_, + signature_ + ); + if (isValid) { + return IERC1271.isValidSignature.selector; + } + + return ""; + } + + /// @dev {See IERC6551Account-isValidSigner} + function isValidSigner( + address signer_, + bytes calldata + ) external view returns (bytes4) { + if (_isValidSigner(signer_)) { + return IERC6551Account.isValidSigner.selector; + } + + return bytes4(0); + } + + function supportsInterface( + bytes4 interfaceId_ + ) external pure returns (bool) { + return (interfaceId_ == type(IERC6551Account).interfaceId || + interfaceId_ == type(IERC1155Receiver).interfaceId || + interfaceId_ == type(IERC721Receiver).interfaceId || + interfaceId_ == type(IERC165).interfaceId); } - /** - * @dev {See IERC6551Account-token} - */ - function token() - public - view - override - returns ( - uint256, - address, - uint256 - ) - { + /// @dev {See IERC6551Account-token} + function token() public view override returns (uint256, address, uint256) { bytes memory footer = new bytes(0x60); // 0x4d = 77 bytes (ERC-1167 Header, address, ERC-1167 Footer, salt) // 0x60 = 96 bytes (chainId, tokenContract, tokenId) @@ -68,55 +106,14 @@ contract IPAccountImpl is return abi.decode(footer, (uint256, address, uint256)); } - function isValidSignature(bytes32 hash, bytes memory signature) - external - view - returns (bytes4 magicValue) - { - bool isValid = SignatureChecker.isValidSignatureNow(owner(), hash, signature); - if (isValid) { - return IERC1271.isValidSignature.selector; - } - - return ""; - } - - /** - * @dev {See IERC6551Account-isValidSigner} - */ - function isValidSigner(address signer, bytes calldata) external view returns (bytes4) { - if (_isValidSigner(signer)) { - return IERC6551Account.isValidSigner.selector; - } - - return bytes4(0); - } - function owner() public view returns (address) { (uint256 chainId, address contractAddress, uint256 tokenId) = token(); if (chainId != block.chainid) return address(0); return IERC721(contractAddress).ownerOf(tokenId); } - function _isValidSigner(address signer) internal view returns (bool) { - return signer == owner(); - } - - /** - * @dev {See IIPAccount-safeTransferFrom} - */ - function safeTransferFrom(address nftContract, address from, address to, uint256 tokenId) external { - require(_isValidSigner(msg.sender), "Caller is not owner"); - ++state; - IERC721(nftContract).safeTransferFrom(from, to, tokenId); - } - - // TODO: authorization check that only the royaltyDistributor can call this function - function sendRoyaltyForDistribution(address distributor, address erc20) external { - IERC20(erc20).safeTransfer( - distributor, - IERC20(erc20).balanceOf(address(this)) + withdrawn[erc20] - entitled[erc20] - ); + function _isValidSigner(address signer_) internal view returns (bool) { + return signer_ == owner(); } function onERC721Received( diff --git a/contracts/ip-accounts/IPAccountRegistry.sol b/contracts/ip-accounts/IPAccountRegistry.sol index dd14ddf3..98e0c28e 100644 --- a/contracts/ip-accounts/IPAccountRegistry.sol +++ b/contracts/ip-accounts/IPAccountRegistry.sol @@ -1,60 +1,71 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -import "@openzeppelin/contracts/utils/Create2.sol"; -import "./IIPAccountRegistry.sol"; +import { Create2 } from "@openzeppelin/contracts/utils/Create2.sol"; +import { IIPAccountRegistry } from "contracts/interfaces/ip-accounts/IIPAccountRegistry.sol"; +import { Errors } from "contracts/lib/Errors.sol"; contract IPAccountRegistry is IIPAccountRegistry { address internal immutable IP_ACCOUNT_IMPL; uint256 internal immutable IP_ACCOUNT_SALT; - constructor(address ipAccountImpl) { - if (ipAccountImpl == address(0)) revert NonExistIpAccountImpl(); - IP_ACCOUNT_IMPL = ipAccountImpl; + constructor(address ipAccountImpl_) { + if (ipAccountImpl_ == address(0)) revert Errors.IPAccountRegistry_NonExistentIpAccountImpl(); + IP_ACCOUNT_IMPL = ipAccountImpl_; IP_ACCOUNT_SALT = 0; } function createAccount( - uint256 chainId, - address tokenContract, - uint256 tokenId, - bytes calldata initData + uint256 chainId_, + address tokenContract_, + uint256 tokenId_, + bytes calldata initData_ ) external returns (address) { bytes memory code = _getCreationCode( IP_ACCOUNT_IMPL, - chainId, - tokenContract, - tokenId, + chainId_, + tokenContract_, + tokenId_, IP_ACCOUNT_SALT ); - address _account = Create2.computeAddress(bytes32(IP_ACCOUNT_SALT), keccak256(code)); + address _account = Create2.computeAddress( + bytes32(IP_ACCOUNT_SALT), + keccak256(code) + ); if (_account.code.length != 0) return _account; - emit AccountCreated(_account, IP_ACCOUNT_IMPL, chainId, tokenContract, tokenId, IP_ACCOUNT_SALT); + emit AccountCreated( + _account, + IP_ACCOUNT_IMPL, + chainId_, + tokenContract_, + tokenId_, + IP_ACCOUNT_SALT + ); _account = Create2.deploy(0, bytes32(IP_ACCOUNT_SALT), code); - if (initData.length != 0) { - (bool success, ) = _account.call(initData); - if (!success) revert IpAccountInitializationFailed(); + if (initData_.length != 0) { + (bool success, ) = _account.call(initData_); + if (!success) revert Errors.IPAccountRegistry_InitializationFailed(); } return _account; } function account( - uint256 chainId, - address tokenContract, - uint256 tokenId + uint256 chainId_, + address tokenContract_, + uint256 tokenId_ ) external view returns (address) { bytes32 bytecodeHash = keccak256( _getCreationCode( IP_ACCOUNT_IMPL, - chainId, - tokenContract, - tokenId, + chainId_, + tokenContract_, + tokenId_, IP_ACCOUNT_SALT ) ); @@ -63,7 +74,7 @@ contract IPAccountRegistry is IIPAccountRegistry { } /// @inheritdoc IIPAccountRegistry - function getIPAccountImpl() external view override returns (address) { + function getIpAccountImpl() external view override returns (address) { return IP_ACCOUNT_IMPL; } @@ -74,7 +85,6 @@ contract IPAccountRegistry is IIPAccountRegistry { uint256 tokenId_, uint256 salt_ ) internal pure returns (bytes memory) { - return // Proxy that delegate call to IPAccountProxy // | 0x00000000 36 calldatasize cds // | 0x00000001 3d returndatasize 0 cds @@ -100,11 +110,12 @@ contract IPAccountRegistry is IIPAccountRegistry { // | | 0x0000002a fd revert // | `-> 0x0000002b 5b jumpdest 0 rds // \ 0x0000002c f3 return - abi.encodePacked( - hex"3d60ad80600a3d3981f3363d3d373d3d3d363d73", - implementation_, - hex"5af43d82803e903d91602b57fd5bf3", - abi.encode(salt_, chainId_, tokenContract_, tokenId_) - ); + return + abi.encodePacked( + hex"3d60ad80600a3d3981f3363d3d373d3d3d363d73", + implementation_, + hex"5af43d82803e903d91602b57fd5bf3", + abi.encode(salt_, chainId_, tokenContract_, tokenId_) + ); } } diff --git a/contracts/ip-assets/IPAssetRegistry.sol b/contracts/ip-assets/IPAssetRegistry.sol index 33f4a885..a3f4fa7a 100644 --- a/contracts/ip-assets/IPAssetRegistry.sol +++ b/contracts/ip-assets/IPAssetRegistry.sol @@ -1,32 +1,30 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -import { IIPAssetRegistry } from "./IIPAssetRegistry.sol"; -import { ICollectModule } from "contracts/interfaces/ICollectModule.sol"; -import { LibIPAssetId } from "./LibIPAssetId.sol"; -import { Unauthorized, ZeroAmount, ZeroAddress } from "../errors/General.sol"; -import { IPAsset } from "contracts/IPAsset.sol"; -import { InitCollectParams } from "contracts/lib/CollectModuleStructs.sol"; -import { IIPAssetEventEmitter } from "./events/IIPAssetEventEmitter.sol"; +import { IIPAssetRegistry } from "contracts/interfaces/ip-assets/IIPAssetRegistry.sol"; +import { ICollectModule } from "contracts/interfaces/modules/collect/ICollectModule.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { IIPAssetEventEmitter } from "contracts/interfaces/ip-assets/events/IIPAssetEventEmitter.sol"; import { IPAssetDataManager } from "./storage/IPAssetDataManager.sol"; -import { ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; +import { ERC721Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import { IERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; import { MulticallUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol"; import { RightsManager } from "../modules/licensing/RightsManager.sol"; -import { ILicensingModule } from "../modules/licensing/ILicensingModule.sol"; +import { ILicensingModule } from "contracts/interfaces/modules/licensing/ILicensingModule.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; contract IPAssetRegistry is IPAssetDataManager, RightsManager, MulticallUpgradeable { - error IdOverBounds(); - error LicensingNotConfigured(); /// @custom:storage-location erc7201:story-protocol.ip-assets-registry.storage struct IPAssetRegistryStorage { - /// @dev IPAssetId => id counter - mapping(IPAsset => uint256) ids; + /// @dev ipAssetId => id counter + mapping(IPAsset.IPAssetType => uint256) ids; string description; uint256 franchiseId; } @@ -41,200 +39,235 @@ contract IPAssetRegistry is string private constant _VERSION = "0.1.0"; uint256 private constant _ROOT_IP_ASSET = 0; - constructor(address _eventEmitter, address _licensingModule, address _franchiseRegistry, address _collectModule) RightsManager(_franchiseRegistry) { + constructor( + address eventEmitter_, + address licensingModule_, + address franchiseRegistry_, + address collectModule_ + ) RightsManager(franchiseRegistry_) { // TODO: should Franchise owner be able to change this? - if (_eventEmitter == address(0)) revert ZeroAddress(); - EVENT_EMITTER = IIPAssetEventEmitter(_eventEmitter); - if (_licensingModule == address(0)) revert ZeroAddress(); - LICENSING_MODULE = ILicensingModule(_licensingModule); - if (_collectModule == address(0)) revert ZeroAddress(); - COLLECT_MODULE = ICollectModule(_collectModule); + if (eventEmitter_ == address(0)) revert Errors.ZeroAddress(); + EVENT_EMITTER = IIPAssetEventEmitter(eventEmitter_); + if (licensingModule_ == address(0)) revert Errors.ZeroAddress(); + LICENSING_MODULE = ILicensingModule(licensingModule_); + if (collectModule_ == address(0)) revert Errors.ZeroAddress(); + COLLECT_MODULE = ICollectModule(collectModule_); _disableInitializers(); } - function initialize( - uint256 _franchiseId, - string calldata _name, - string calldata _symbol, - string calldata _description - ) public initializer { - __RightsManager_init(_name, _symbol); - __Multicall_init(); - if (_franchiseId == 0) revert ZeroAmount(); + function description() external view returns (string memory) { IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); - $.franchiseId = _franchiseId; - $.description = _description; + return $.description; } - function _getIPAssetRegistryStorage() - private - pure - returns (IPAssetRegistryStorage storage $) - { - assembly { - $.slot := _STORAGE_LOCATION - } + function franchiseId() external view returns (uint256) { + IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); + return $.franchiseId; } function version() external pure virtual returns (string memory) { return _VERSION; } - /** - * Creates a new IPAsset, and assigns licenses (rights) to it, according to the Franchise config in LicensingModule. - * A Non commercial license is always assigned, and if the IPAsset is a root IPAsset, a commercial license may also be assigned. - * @dev reverts if LicensingModule is not configured for the Franchise. - * Logs to IPAssetEventEmitter, common contract for all IPAsset registries. - * @param ipAssetType the type of IPAsset to create - * @param name IPAsset name - * @param _description short description of the IPAsset - * @param mediaUrl url to the IPAsset media and metadata - * @param to holder of the IPAsset (and thus the licenses) - * @param parentIpAssetId 0 if this is a root IPAsset, if it is a derivative, set the parent IPAsset id - * @return the created IPAsset id - */ - function createIPAsset( - IPAsset ipAssetType, - string calldata name, - string calldata _description, - string calldata mediaUrl, - address to, - uint256 parentIpAssetId - ) - public - returns (uint256) - { - if (ipAssetType == IPAsset.UNDEFINED) revert InvalidBlockType(); - uint256 ipAssetId = _mintBlock(to, ipAssetType); - _writeIPAsset(ipAssetId, name, _description, mediaUrl); + function initialize( + uint256 franchiseId_, + string calldata name_, + string calldata symbol_, + string calldata description_ + ) public initializer { + __RightsManager_init(name_, symbol_); + __Multicall_init(); + if (franchiseId_ == 0) revert Errors.ZeroAmount(); + IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); + $.franchiseId = franchiseId_; + $.description = description_; + } + + /// Creates a new IPAsset, and assigns licenses (rights) to it, according to the Franchise + /// config in LicensingModule. + /// A Non commercial license is always assigned, and if the IPAsset is a root IPAsset, + /// a commercial license may also be assigned. + /// @dev reverts if LicensingModule is not configured for the Franchise. + /// Logs to IPAssetEventEmitter, common contract for all IPAsset registries. + /// @param ipAssetType_ the type of IPAsset to create + /// @param name_ IPAsset name + /// @param description_ short description of the IPAsset + /// @param mediaUrl_ url to the IPAsset media and metadata + /// @param to_ holder of the IPAsset (and thus the licenses) + /// @param parentIpAssetId_ 0 if this is a root IPAsset, if it is a derivative, set the parent IPAsset id + /// @param collectData_ Additional data passed for collect module initialization + /// @return the created IPAsset id + function createIpAsset( + IPAsset.IPAssetType ipAssetType_, + string calldata name_, + string calldata description_, + string calldata mediaUrl_, + address to_, + uint256 parentIpAssetId_, + bytes calldata collectData_ + ) public returns (uint256) { + if (ipAssetType_ == IPAsset.IPAssetType.UNDEFINED) revert Errors.IPAsset_InvalidType(IPAsset.IPAssetType.UNDEFINED); + uint256 ipAssetId = _mintBlock(to_, ipAssetType_); + _writeIPAsset(ipAssetId, name_, description_, mediaUrl_); IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); uint256 _franchiseId = $.franchiseId; - EVENT_EMITTER.emitIPAssetCreation(_franchiseId, ipAssetId); - + EVENT_EMITTER.emitIpAssetCreation(_franchiseId, ipAssetId); // Non commercial - ILicensingModule.FranchiseConfig memory config = LICENSING_MODULE.getFranchiseConfig(_franchiseId); - if (config.revoker == address(0)) revert LicensingNotConfigured(); - - _setNonCommercialRights(ipAssetId, parentIpAssetId, to, config.revoker, config.nonCommercialConfig, config.nonCommercialTerms); + Licensing.FranchiseConfig memory config = LICENSING_MODULE + .getFranchiseConfig(_franchiseId); + if (config.revoker == address(0)) revert Errors.IPAssetRegistry_LicensingNotConfigured(); + _setNonCommercialRights( + ipAssetId, + parentIpAssetId_, + to_, + config.revoker, + config.nonCommercialConfig, + config.nonCommercialTerms + ); // If non derivative IpAsset, then franchise config may dictate commercial rights // Derivative works do not have commercial rights unless a deal with the relevant licensor is made - if (config.rootIpAssetHasCommercialRights && parentIpAssetId == 0) { + if (config.rootIpAssetHasCommercialRights && parentIpAssetId_ == 0) { // Commercial - _setCommercialRights(ipAssetId, _ROOT_IP_ASSET, to, config.revoker, config.commercialLicenseUri, config.commercialConfig, config.commercialTerms); + _setCommercialRights( + ipAssetId, + _ROOT_IP_ASSET, + to_, + config.revoker, + config.commercialLicenseUri, + config.commercialConfig, + config.commercialTerms + ); } // TODO: Add collect NFT impl and data overrides - COLLECT_MODULE.initCollect(InitCollectParams({ - franchiseId: _franchiseId, - ipAssetId: ipAssetId, - collectNFTImpl: address(0), // Default collect module NFT impl - data: "" - })); + COLLECT_MODULE.initCollect( + Collect.InitCollectParams({ + franchiseId: _franchiseId, + ipAssetId: ipAssetId, + collectNftImpl: address(0), // Default collect module NFT impl + data: collectData_ + }) + ); return ipAssetId; } - /** - * Sets the non commercial rights for an IPAsset, with terms from the Franchise config in LicensingModule. - * If no parent asset id is provided, the root IPAsset id is used if it exists in the Franchise config. - * @param ipAssetId the IPAsset id - * @param parentIpAssetId in case this is a derivative IPAsset, set the parent IPAsset id, 0 otherwise - * @param holder of the IPAsset and licenses - * @param revoker of the license. Can't be zero or changed later - * @param config Franchise config - * @param terms for the license to be active - */ - function _setNonCommercialRights(uint256 ipAssetId, uint256 parentIpAssetId, address holder, address revoker, ILicensingModule.IpAssetConfig memory config, TermsProcessorConfig memory terms) internal { - uint256 parentLicenseId = parentIpAssetId == 0 ? config.franchiseRootLicenseId : getLicenseIdByTokenId(parentIpAssetId, false); + function tokenURI( + uint256 tokenId_ + ) public view override returns (string memory) { + // TODO: should this reference the license too? + return readIPAsset(tokenId_).mediaUrl; + } + + function supportsInterface( + bytes4 interfaceId_ + ) + public + view + virtual + override(ERC721Upgradeable, IERC165Upgradeable) + returns (bool) + { + return + interfaceId_ == type(IIPAssetRegistry).interfaceId || + super.supportsInterface(interfaceId_); + } + + /// Sets the non commercial rights for an IPAsset, with terms from the Franchise config in LicensingModule. + /// If no parent asset id is provided, the root IPAsset id is used if it exists in the Franchise config. + /// @param ipAssetId_ the IPAsset id + /// @param parentIpAssetId_ in case this is a derivative IPAsset, set the parent IPAsset id, 0 otherwise + /// @param holder_ of the IPAsset and licenses + /// @param revoker_ of the license. Can't be zero or changed later + /// @param config_ Franchise config + /// @param terms_ for the license to be active + function _setNonCommercialRights( + uint256 ipAssetId_, + uint256 parentIpAssetId_, + address holder_, + address revoker_, + Licensing.IpAssetConfig memory config_, + Licensing.TermsProcessorConfig memory terms_ + ) internal { + uint256 parentLicenseId = parentIpAssetId_ == 0 + ? config_.franchiseRootLicenseId + : getLicenseIdByTokenId(parentIpAssetId_, false); _createLicense( - ipAssetId, + ipAssetId_, parentLicenseId, - holder, + holder_, LICENSING_MODULE.getNonCommercialLicenseURI(), - revoker, + revoker_, false, - config.canSublicense, - terms, + config_.canSublicense, + terms_, false ); } - /** - * Sets the commercial rights for an IPAsset, with terms from the Franchise config in LicensingModule. - * If no parent asset id is provided, the root IPAsset id is used if it exists in the Franchise config. - * @param ipAssetId the IPAsset id - * @param parentIpAssetId in case this is a derivative IPAsset, set the parent IPAsset id, 0 otherwise - * @param holder of the IPAsset and licenses - * @param revoker of the license. Can't be zero or changed later - * @param config Franchise config - * @param terms for the license to be active - */ - function _setCommercialRights(uint256 ipAssetId, uint256 parentIpAssetId, address holder, address revoker, string memory licenseUri, ILicensingModule.IpAssetConfig memory config, TermsProcessorConfig memory terms) internal { - uint256 parentLicenseId = parentIpAssetId == _ROOT_IP_ASSET ? config.franchiseRootLicenseId : getLicenseIdByTokenId(parentIpAssetId, true); + /// Sets the commercial rights for an IPAsset, with terms from the Franchise config in LicensingModule. + /// If no parent asset id is provided, the root IPAsset id is used if it exists in the Franchise config. + /// @param ipAssetId_ the IPAsset id + /// @param parentIpAssetId_ in case this is a derivative IPAsset, set the parent IPAsset id, 0 otherwise + /// @param holder_ of the IPAsset and licenses + /// @param revoker_ of the license. Can't be zero or changed later + /// @param config_ Franchise config + /// @param terms_ for the license to be active + function _setCommercialRights( + uint256 ipAssetId_, + uint256 parentIpAssetId_, + address holder_, + address revoker_, + string memory licenseUri_, + Licensing.IpAssetConfig memory config_, + Licensing.TermsProcessorConfig memory terms_ + ) internal { + uint256 parentLicenseId = parentIpAssetId_ == _ROOT_IP_ASSET + ? config_.franchiseRootLicenseId + : getLicenseIdByTokenId(parentIpAssetId_, true); _createLicense( - ipAssetId, + ipAssetId_, parentLicenseId, - holder, - licenseUri, - revoker, + holder_, + licenseUri_, + revoker_, true, - config.canSublicense, - terms, + config_.canSublicense, + terms_, false ); } - /** - * mints the IPAsset block, and assigns the next id to it. - * @param to holder - * @param sb ip asset type - */ - function _mintBlock(address to, IPAsset sb) private returns (uint256) { - uint256 nextId = currentIdFor(sb) + 1; - if (nextId > LibIPAssetId._lastId(sb)) revert IdOverBounds(); + /// mints the IPAsset block, and assigns the next id to it. + /// @param to_ holder + /// @param ipAssetId_ ip asset type + function _mintBlock( + address to_, + IPAsset.IPAssetType ipAssetId_ + ) private returns (uint256) { + uint256 nextId = currentIdFor(ipAssetId_) + 1; + if (nextId > IPAsset._lastId(ipAssetId_)) revert Errors.IPAssetRegistry_IdOverBounds(); IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); - $.ids[sb] = nextId; - _safeMint(to, nextId); + $.ids[ipAssetId_] = nextId; + _safeMint(to_, nextId); return nextId; } - function currentIdFor(IPAsset sb) public view returns (uint256) { + function currentIdFor(IPAsset.IPAssetType ipAssetId_) public view returns (uint256) { IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); - uint256 currentId = $.ids[sb]; + uint256 currentId = $.ids[ipAssetId_]; if (currentId == 0) { - return LibIPAssetId._zeroId(sb); + return IPAsset._zeroId(ipAssetId_); } else { return currentId; } } - function description() external view returns (string memory) { - IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); - return $.description; - } - - function franchiseId() external view returns (uint256) { - IPAssetRegistryStorage storage $ = _getIPAssetRegistryStorage(); - return $.franchiseId; - } - - function tokenURI( - uint256 tokenId - ) public view override returns (string memory) { - // TODO: should this reference the license too? - return readIPAsset(tokenId).mediaUrl; - } - - function supportsInterface( - bytes4 interfaceId - ) - public - view - virtual - override(ERC721Upgradeable, IERC165Upgradeable) - returns (bool) + function _getIPAssetRegistryStorage() + private + pure + returns (IPAssetRegistryStorage storage $) { - return - interfaceId == type(IIPAssetRegistry).interfaceId || - super.supportsInterface(interfaceId); + assembly { + $.slot := _STORAGE_LOCATION + } } - } diff --git a/contracts/ip-assets/IPAssetRegistryFactory.sol b/contracts/ip-assets/IPAssetRegistryFactory.sol index ae8536b7..b1e6ce8e 100644 --- a/contracts/ip-assets/IPAssetRegistryFactory.sol +++ b/contracts/ip-assets/IPAssetRegistryFactory.sol @@ -2,22 +2,26 @@ pragma solidity ^0.8.13; -import { IIPAssetRegistry } from "./IIPAssetRegistry.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { UpgradeableBeacon } from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import { BeaconProxy } from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; +import { IIPAssetRegistry } from "contracts/interfaces/ip-assets/IIPAssetRegistry.sol"; import { IPAssetRegistry } from "./IPAssetRegistry.sol"; -import { ZeroAddress } from "../errors/General.sol"; -import { IVersioned } from "../utils/IVersioned.sol"; +import { IVersioned } from "contracts/interfaces/utils/IVersioned.sol"; import { UnsupportedInterface } from "../errors/General.sol"; import { LicenseRegistry } from "../modules/licensing/LicenseRegistry.sol"; import { RevertingIPAssetRegistry } from "contracts/utils/RevertingIPAssetRegistry.sol"; -import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { UpgradeableBeacon } from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; -import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import { BeaconProxy } from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; +import { Errors } from "contracts/lib/Errors.sol"; contract IPAssetRegistryFactory is Ownable { using ERC165Checker for address; - event FranchiseCreated(address indexed collection, string name, string indexed symbol); + event FranchiseCreated( + address indexed collection, + string name, + string indexed symbol + ); event FranchisesUpgraded(address indexed newImplementation, string version); UpgradeableBeacon public immutable BEACON; @@ -27,30 +31,44 @@ contract IPAssetRegistryFactory is Ownable { BEACON = new UpgradeableBeacon(address(new RevertingIPAssetRegistry())); } - function createFranchiseIPAssets( - uint256 franchiseId, - string calldata name, - string calldata symbol, - string calldata description + function createFranchiseIpAssets( + uint256 franchiseId_, + string calldata name_, + string calldata symbol_, + string calldata description_ ) external returns (address) { bytes memory data = abi.encodeWithSelector( - bytes4(keccak256(bytes("initialize(uint256,string,string,string)"))), - franchiseId, - name, - symbol, - description + bytes4( + keccak256(bytes("initialize(uint256,string,string,string)")) + ), + franchiseId_, + name_, + symbol_, + description_ ); address proxy = address(new BeaconProxy(address(BEACON), data)); - LicenseRegistry licenseRegistry = new LicenseRegistry(proxy, string.concat("Licenses for ", name), string.concat("sl", symbol)); + LicenseRegistry licenseRegistry = new LicenseRegistry( + proxy, + string.concat("Licenses for ", name_), + string.concat("sl", symbol_) + ); IPAssetRegistry(proxy).setLicenseRegistry(address(licenseRegistry)); - - emit FranchiseCreated(proxy, name, symbol); + emit FranchiseCreated(proxy, name_, symbol_); return proxy; } - function upgradeFranchises(address newImplementation) external onlyOwner { - if (!newImplementation.supportsInterface(type(IIPAssetRegistry).interfaceId)) revert UnsupportedInterface("IIPAssetRegistry"); - BEACON.upgradeTo(newImplementation); - emit FranchisesUpgraded(address(newImplementation), IVersioned(newImplementation).version()); + function upgradeFranchises(address newImplementation_) external onlyOwner { + if ( + !newImplementation_.supportsInterface( + type(IIPAssetRegistry).interfaceId + ) + ) { + revert Errors.UnsupportedInterface("IIPAssetRegistry"); + } + BEACON.upgradeTo(newImplementation_); + emit FranchisesUpgraded( + address(newImplementation_), + IVersioned(newImplementation_).version() + ); } } diff --git a/contracts/ip-assets/LibIPAssetId.sol b/contracts/ip-assets/LibIPAssetId.sol deleted file mode 100644 index 1885ee04..00000000 --- a/contracts/ip-assets/LibIPAssetId.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.13; - -import { IPAsset } from "contracts/IPAsset.sol"; - -library LibIPAssetId { - - error InvalidIPAsset(IPAsset ipAsset); - - uint256 private constant _ID_RANGE = 10 ** 12; - - function _zeroId(IPAsset ipAsset) internal pure returns (uint256) { - if (ipAsset == IPAsset.UNDEFINED) revert InvalidIPAsset(ipAsset); - return _ID_RANGE * (uint256(ipAsset) - 1); - } - - function _lastId(IPAsset ipAsset) internal pure returns (uint256) { - if (ipAsset == IPAsset.UNDEFINED) revert InvalidIPAsset(ipAsset); - return (_ID_RANGE * uint256(ipAsset)) - 1; - } - - function _ipAssetTypeFor(uint256 id) internal pure returns (IPAsset) { - // End of _ID_RANGE is zero (undefined) for each IPAsset - // Also, we don't support ids higher than the last IPAsset enum item - if (id % _ID_RANGE == 0 || id > _ID_RANGE * (uint256(IPAsset.ITEM))) return IPAsset.UNDEFINED; - return IPAsset((id / _ID_RANGE) + 1); - } - -} \ No newline at end of file diff --git a/contracts/ip-assets/events/CommonIPAssetEventEmitter.sol b/contracts/ip-assets/events/CommonIPAssetEventEmitter.sol index 899aa646..7fd44601 100644 --- a/contracts/ip-assets/events/CommonIPAssetEventEmitter.sol +++ b/contracts/ip-assets/events/CommonIPAssetEventEmitter.sol @@ -1,23 +1,23 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { IIPAssetEventEmitter } from "./IIPAssetEventEmitter.sol"; -import { LibIPAssetId } from "contracts/ip-assets/LibIPAssetId.sol"; +import { IIPAssetEventEmitter } from "contracts/interfaces/ip-assets/events/IIPAssetEventEmitter.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; import { FranchiseRegistry } from "contracts/FranchiseRegistry.sol"; -import { ZeroAddress, Unauthorized } from "contracts/errors/General.sol"; +import { Errors } from "contracts/lib/Errors.sol"; contract CommonIPAssetEventEmitter is IIPAssetEventEmitter { FranchiseRegistry public immutable FRANCHISE_REGISTRY; - constructor(address _franchiseRegistry) { - if (_franchiseRegistry == address(0)) revert ZeroAddress(); - FRANCHISE_REGISTRY = FranchiseRegistry(_franchiseRegistry); + constructor(address franchiseRegistry_) { + if (franchiseRegistry_ == address(0)) revert Errors.ZeroAddress(); + FRANCHISE_REGISTRY = FranchiseRegistry(franchiseRegistry_); } - function emitIPAssetCreation(uint256 franchiseId, uint256 ipAssetId) override external { - if(FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId) != msg.sender) revert Unauthorized(); - emit IPAssetCreated(franchiseId, msg.sender, ipAssetId, LibIPAssetId._ipAssetTypeFor(ipAssetId)); + function emitIpAssetCreation(uint256 franchiseId_, uint256 ipAssetId_) override external { + if(FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId_) != msg.sender) revert Errors.Unauthorized(); + emit IPAssetCreated(franchiseId_, msg.sender, ipAssetId_, IPAsset._ipAssetTypeFor(ipAssetId_)); } -} \ No newline at end of file +} diff --git a/contracts/ip-assets/storage/IPAssetDataManager.sol b/contracts/ip-assets/storage/IPAssetDataManager.sol index cb4fa026..b46e723c 100644 --- a/contracts/ip-assets/storage/IPAssetDataManager.sol +++ b/contracts/ip-assets/storage/IPAssetDataManager.sol @@ -1,16 +1,14 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { LibIPAssetId } from "contracts/ip-assets/LibIPAssetId.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; import { Unauthorized, NonExistentID, ZeroAddress } from "contracts/errors/General.sol"; -import { IIPAssetDataManager } from "./IIPAssetDataManager.sol"; +import { IIPAssetDataManager } from "contracts/interfaces/ip-assets/storage/IIPAssetDataManager.sol"; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import { IPAsset } from "contracts/IPAsset.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; abstract contract IPAssetDataManager is Initializable, IIPAssetDataManager { - error InvalidBlockType(); - /// @custom:storage-location erc7201:story-protocol.ip-asset-data.storage struct IPAssetDataStorage { mapping(uint256 => IPAssetData) ipAssetsData; @@ -21,33 +19,33 @@ abstract contract IPAssetDataManager is Initializable, IIPAssetDataManager { function __IPAssetData_init() public initializer {} - function _getIPAssetDataStorage() private pure returns (IPAssetDataStorage storage $) { - assembly { - $.slot := _STORAGE_LOCATION - } + function readIPAsset(uint256 ipAssetId_) public view returns (IPAssetData memory) { + IPAssetDataStorage storage $ = _getIPAssetDataStorage(); + return $.ipAssetsData[ipAssetId_]; } - + function _writeIPAsset( - uint256 ipAssetId, - string calldata name, - string calldata description, - string calldata mediaUrl - ) internal returns (IPAsset) { + uint256 ipAssetId_, + string calldata name_, + string calldata description_, + string calldata mediaUrl_ + ) internal returns (IPAsset.IPAssetType) { IPAssetDataStorage storage $ = _getIPAssetDataStorage(); - IPAssetData storage sbd = $.ipAssetsData[ipAssetId]; - if (sbd.blockType == IPAsset.UNDEFINED) { - sbd.blockType = LibIPAssetId._ipAssetTypeFor(ipAssetId); + IPAssetData storage ipAsseData = $.ipAssetsData[ipAssetId_]; + if (ipAsseData.blockType == IPAsset.IPAssetType.UNDEFINED) { + ipAsseData.blockType = IPAsset._ipAssetTypeFor(ipAssetId_); } - sbd.name = name; - sbd.description = description; - sbd.mediaUrl = mediaUrl; - emit IPAssetWritten(ipAssetId, sbd.blockType, name, description, mediaUrl); - return sbd.blockType; + ipAsseData.name = name_; + ipAsseData.description = description_; + ipAsseData.mediaUrl = mediaUrl_; + emit IPAssetWritten(ipAssetId_, ipAsseData.blockType, name_, description_, mediaUrl_); + return ipAsseData.blockType; } - function readIPAsset(uint256 ipAssetId) public view returns (IPAssetData memory) { - IPAssetDataStorage storage $ = _getIPAssetDataStorage(); - return $.ipAssetsData[ipAssetId]; + function _getIPAssetDataStorage() private pure returns (IPAssetDataStorage storage $) { + assembly { + $.slot := _STORAGE_LOCATION + } } -} \ No newline at end of file +} diff --git a/contracts/lib/AccessControl.sol b/contracts/lib/AccessControl.sol new file mode 100644 index 00000000..3f642604 --- /dev/null +++ b/contracts/lib/AccessControl.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +/// @title Access Control Library +/// @notice Library for access control helpers and protocol role definitions. +/// These roles are used by the AccessControlSingleton, accessed by AccessControlled contracts. +library AccessControl { + + // Default admin role as per OZ AccessControl system. All other roles stem from this. + bytes32 constant PROTOCOL_ADMIN_ROLE = bytes32(0); + + // Role that can upgrade UUPS contracts or Beacon Proxies + bytes32 constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + // Role that can perform admin tasks on the Protocol Relationship Module contract (e.g. adding new protocol-wide links) + bytes32 constant RELATIONSHIP_MANAGER_ROLE = keccak256( "RELATIONSHIP_MANAGER_ROLE"); + + // Role that can perform admin tasks on the Licensing Module contracts (setNonCommercialLicenseURI) + bytes32 constant LICENSING_MANAGER_ROLE = keccak256("LICENSING_MANAGER_ROLE"); + +} diff --git a/contracts/lib/CollectModuleStructs.sol b/contracts/lib/CollectModuleStructs.sol deleted file mode 100644 index 7e13a84b..00000000 --- a/contracts/lib/CollectModuleStructs.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -/// @notice Parameters passed to initialize a collect module for an IP asset. -struct InitCollectParams { - uint256 franchiseId; // The id of the franchise tied to the IP asset. - uint256 ipAssetId; // The id of the IP asset under the franchise. - address collectNFTImpl; // The address of the collect NFT impl to use. - bytes data; // Additional data to be used for initialization. -} - -/// @notice Parameters passed for collect processing for an IP asset. -struct CollectParams { - uint256 franchiseId; // The id of the franchise tied to the IP asset. - uint256 ipAssetId; // The id of the IP asset being collected. - address collector; // The address designated for NFT collection. - bytes collectData; // Additional data passed for module collection. - bytes collectNFTInitData; // Additional data passed for NFT initialization. - bytes collectNFTData; // Additional data passed for NFT collection. -} - -/// @notice Collect module settings saved for a franchise IP asset. -/// @dev A zero address `collectNFTImpl` means to use a module default NFT impl. -struct CollectInfo { - bool initialized; // Whether the collect module was initialized. - address collectNFT; // The collect NFT that an IP asset is bound to. - address collectNFTImpl; // The collect NFT impl address being used. -} diff --git a/contracts/lib/CollectNFTStructs.sol b/contracts/lib/CollectNFTStructs.sol deleted file mode 100644 index 02c262b0..00000000 --- a/contracts/lib/CollectNFTStructs.sol +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -/// @notice Parameters passed to initialize a collect NFT. -struct InitCollectNFTParams { - address ipAssetRegistry; // Address of the registry of the bound IP asset. - uint256 ipAssetId; // The id of the IP asset bound to the collect NFT. - bytes data; // Additional data used for NFT initialization. -} diff --git a/contracts/lib/Errors.sol b/contracts/lib/Errors.sol new file mode 100644 index 00000000..4778194b --- /dev/null +++ b/contracts/lib/Errors.sol @@ -0,0 +1,286 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +import { IPAsset } from "contracts/lib/IPAsset.sol"; + +/// @title Errors +/// @notice Library for all contract errors, including a set of global errors. +library Errors { + + //////////////////////////////////////////////////////////////////////////// + // Globals // + //////////////////////////////////////////////////////////////////////////// + + /// @notice The provided array may not be empty. + error EmptyArray(); + + /// @notice The arrays may not have a mismatch in length. + error LengthMismatch(); + + /// @notice The provided role does not exist for the given account. + error MissingRole(bytes32 role, address account); + + /// @notice The provided identifier does not exist. + error NonExistentID(uint256 id); + + /// @notice The caller is not authorized to perform the call. + error Unauthorized(); + + /// @notice The provided interface is not supported. + error UnsupportedInterface(string name); + + /// @notice The zero address may not be used as input. + error ZeroAddress(); + + /// @notice The amount specified may not be zero. + error ZeroAmount(); + + //////////////////////////////////////////////////////////////////////////// + // BaseRelationshipProcessor // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Call may only be processed by the relationship module. + error BaseRelationshipProcessor_OnlyRelationshipModule(); + + //////////////////////////////////////////////////////////////////////////// + // CollectModule // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Collect module caller is unauthorized. + error CollectModule_CallerUnauthorized(); + + /// @notice Collect NFT has already been initialized. + error CollectModule_CollectNotYetInitialized(); + + /// @notice Collect action is not authorized for the collect module. + error CollectModule_CollectUnauthorized(); + + /// @notice Collect module IP asset is already initialized. + error CollectModule_IPAssetAlreadyInitialized(); + + /// @notice Collect module IP asset does not exist. + error CollectModule_IPAssetNonExistent(); + + /// @notice Collect module provided IP asset registry does not exist. + error CollectModule_IPAssetRegistryNonExistent(); + + //////////////////////////////////////////////////////////////////////////// + // CollectPaymentModule // + //////////////////////////////////////////////////////////////////////////// +// + /// @notice The configured collect module payment amount is invalid. + error CollectPaymentModule_AmountInvalid(); + + /// @notice The ERC-20 transfer failed when processing the payment collect. + error CollectPaymentModule_ERC20TransferFailed(); + + /// @notice The collect ERC-20 transfer was not properly ABI-encoded. + error CollectPaymentModule_ERC20TransferInvalidABIEncoding(); + + /// @notice The collect ERC-20 transfer returned a non-successful value. + error CollectPaymentModule_ERC20TransferInvalidReturnValue(); + + /// @notice Invalid settings were configured for the collect payment module. + error CollectPaymentModule_InvalidSettings(); + + /// @notice Native tokens are not allowed for the configured payment module. + error CollectPaymentModule_NativeTokenNotAllowed(); + + /// @notice Native tokens failed to transfer for the payment collect. + error CollectPaymentModule_NativeTransferFailed(); + + /// @notice Invalid parameters were passed in to the payment collect. + error CollectPaymentModule_PaymentParamsInvalid(); + + /// @notice Insufficient funds were provided for the payment collect. + error CollectPaymentModule_PaymentInsufficient(); + + /// @notice The token provided for the payment collect is invalid. + error CollectPaymentModule_TokenInvalid(); + + //////////////////////////////////////////////////////////////////////////// + // CollectNFT // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Collect NFT has already been initialized. + error CollectNFT_AlreadyInitialized(); + + /// @notice Caller of the Collect NFT is not authorized. + error CollectNFT_CallerUnauthorized(); + + /// @notice Collector address is not valid. + error CollectNFT_CollectorInvalid(); + + /// @notice IP asset bound to the Collect NFT does not exist. + error CollectNFT_IPAssetNonExistent(); + + //////////////////////////////////////////////////////////////////////////// + // ERC721 // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Originating address does not own the NFT. + error ERC721_OwnerInvalid(); + + /// @notice Receiving address cannot be the zero address. + error ERC721_ReceiverInvalid(); + + /// @notice Receiving contract does not implement the ERC-721 wallet interface. + error ERC721_SafeTransferUnsupported(); + + /// @notice Sender is not NFT owner, approved address, or owner operator. + error ERC721_SenderUnauthorized(); + + /// @notice Token has already been minted. + error ERC721_TokenAlreadyMinted(); + + /// @notice NFT does not exist. + error ERC721_TokenNonExistent(); + + //////////////////////////////////////////////////////////////////////////// + // IPAccountImpl // + //////////////////////////////////////////////////////////////////////////// + + /// @notice IP account caller is not the owner. + error IPAccountImpl_CallerNotOwner(); + + //////////////////////////////////////////////////////////////////////////// + // IPAccountRegistry // + //////////////////////////////////////////////////////////////////////////// + + /// @notice IP account implementation does not exist. + error IPAccountRegistry_NonExistentIpAccountImpl(); + + /// @notice IP account initialization failed. + error IPAccountRegistry_InitializationFailed(); + + //////////////////////////////////////////////////////////////////////////// + // IPAsset // + //////////////////////////////////////////////////////////////////////////// + + /// @notice IP asset array is invalid. + error IPAsset_InvalidIPAssetArray(); + + /// @notice IP asset is invalid. + error IPAsset_InvalidType(IPAsset.IPAssetType ipAsset); + + //////////////////////////////////////////////////////////////////////////// + // IPAssetRegistry // + //////////////////////////////////////////////////////////////////////////// + + /// @notice IP identifier is over bounds. + error IPAssetRegistry_IdOverBounds(); + + /// @notice Licensing is not configured. + error IPAssetRegistry_LicensingNotConfigured(); + + //////////////////////////////////////////////////////////////////////////// + // LibDuration // + //////////////////////////////////////////////////////////////////////////// + + /// @notice The caller is not the designated renwer. + error LibDuration_CallerNotRenewer(); + + /// @notice The start time is not valid. + error LibDuration_InvalidStartTime(); + + /// @notice The proposed license is not renewable. + error LibDuration_NotRenewable(); + + /// @notice A zero TTL may not be used for configuration. + error LibDuration_ZeroTTL(); + + //////////////////////////////////////////////////////////////////////////// + // LicensingModule // + //////////////////////////////////////////////////////////////////////////// + + /// @notice The franchise does not exist. + error LicensingModule_NonExistentFranchise(); + + /// @notice The root license is not active + error LicensingModule_RootLicenseNotActive(uint256 rootLicenseId); + + /// @notice The revoker may not be a zero address. + error LicensingModule_ZeroRevokerAddress(); + + //////////////////////////////////////////////////////////////////////////// + // RightsManager // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Root license is already configured. + error RightsManager_AlreadyHasRootLicense(); + + /// @notice License cannot be sublicensed. + error RightsManager_CannotSublicense(); + + /// @notice Commercial terms do not match. + error RightsManager_CommercialTermsMismatch(); + + /// @notice License is inactive. + error RightsManager_InactiveLicense(); + + /// @notice Parent license is inactive. + error RightsManager_InactiveParentLicense(); + + /// @notice The license registry is not configured. + error RightsManager_LicenseRegistryNotConfigured(); + + /// @notice NFT is not associated with a license. + error RightsManager_NFTHasNoAssociatedLicense(); + + /// @notice Caller is not owner of parent license. + error RightsManager_NotOwnerOfParentLicense(); + + /// @notice The targeted license is not a sublicense. + error RightsManager_NotSublicense(); + + /// @notice Sender is not the license revoker. + error RightsManager_SenderNotRevoker(); + + /// @notice A create franchise root license must be used. + error RightsManager_UseCreateFranchiseRootLicenseInstead(); + + /// @notice The revoker may not be the zero address. + error RightsManager_ZeroRevokerAddress(); + + //////////////////////////////////////////////////////////////////////////// + // MultiTermsProcessor // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Too many terms were selected. + error MultiTermsProcessor_TooManyTermsProcessors(); + + //////////////////////////////////////////////////////////////////////////// + // RelationshipModule // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Unable to relate to another franchise. + error RelationshipModule_CannotRelateToOtherFranchise(); + + /// @notice The intent has already been registered. + error RelationshipModule_IntentAlreadyRegistered(); + + /// @notice The selected TTL is not valid. + error RelationshipModule_InvalidTTL(); + + /// @notice The selected end timestamp is not valid. + error RelationshipModule_InvalidEndTimestamp(); + + /// @notice Relationship does not exist. + error RelationshipModule_NonExistingRelationship(); + + /// @notice The relationship source IP type is not supported. + error RelationshipModule_UnsupportedRelationshipSrc(); + + /// @notice The relationship destination IP type is not supported. + error RelationshipModule_UnsupportedRelationshipDst(); + + //////////////////////////////////////////////////////////////////////////// + // RoyaltyNFT // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Mismatch between parity of accounts and their respective allocations. + error RoyaltyNFT_AccountsAndAllocationsMismatch(uint256 accountsLength, uint256 allocationsLength); + + /// @notice Invalid summation for royalty NFT allocations. + error RoyaltyNFT_InvalidAllocationsSum(uint32 allocationsSum); +} diff --git a/contracts/lib/IPAsset.sol b/contracts/lib/IPAsset.sol new file mode 100644 index 00000000..9d81dc25 --- /dev/null +++ b/contracts/lib/IPAsset.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { Errors } from "./Errors.sol"; + +/// @title IP Asset Library +/// @notice Library for constants, structs, and helper functions for IP assets. +library IPAsset { + + uint8 constant EXTERNAL_ASSET = type(uint8).max; + + uint256 private constant _ID_RANGE = 10 ** 12; + + enum IPAssetType { + UNDEFINED, + STORY, + CHARACTER, + ART, + GROUP, + LOCATION, + ITEM + } + + function _zeroId(IPAssetType ipAsset_) internal pure returns (uint256) { + if (ipAsset_ == IPAssetType.UNDEFINED) revert Errors.IPAsset_InvalidType(ipAsset_); + return _ID_RANGE * (uint256(ipAsset_) - 1); + } + + function _lastId(IPAssetType ipAsset_) internal pure returns (uint256) { + if (ipAsset_ == IPAssetType.UNDEFINED) revert Errors.IPAsset_InvalidType(ipAsset_); + return (_ID_RANGE * uint256(ipAsset_)) - 1; + } + + function _ipAssetTypeFor(uint256 id_) internal pure returns (IPAssetType) { + // End of _ID_RANGE is zero (undefined) for each IPAsset + // Also, we don't support ids higher than the last IPAsset enum item + if (id_ % _ID_RANGE == 0 || id_ > _ID_RANGE * (uint256(IPAssetType.ITEM))) + return IPAssetType.UNDEFINED; + return IPAsset.IPAssetType((id_ / _ID_RANGE) + 1); + } +} diff --git a/contracts/lib/modules/Collect.sol b/contracts/lib/modules/Collect.sol new file mode 100644 index 00000000..3c91d6cf --- /dev/null +++ b/contracts/lib/modules/Collect.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +/// @title Collect Module Library +library Collect { + + //////////////////////////////////////////////////////////////////////////// + // CollectModule // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Parameters passed to initialize a collect module for an IP asset. + struct InitCollectParams { + uint256 franchiseId; // The id of the franchise tied to the IP asset. + uint256 ipAssetId; // The id of the IP asset under the franchise. + address collectNftImpl; // The address of the collect NFT impl to use. + bytes data; // Additional data to be used for initialization. + } + + /// @notice Parameters passed for collect processing for an IP asset. + struct CollectParams { + uint256 franchiseId; // The id of the franchise tied to the IP asset. + uint256 ipAssetId; // The id of the IP asset being collected. + address collector; // The address designated for NFT collection. + bytes collectData; // Additional data passed for module collection. + bytes collectNftInitData; // Additional data passed for NFT initialization. + bytes collectNftData; // Additional data passed for NFT collection. + } + + /// @notice Collect module settings saved for a franchise IP asset. + /// @dev A zero address `collectNftImpl` means to use a module default NFT impl. + struct CollectInfo { + bool initialized; // Whether the collect module was initialized. + address collectNft; // The collect NFT that an IP asset is bound to. + address collectNftImpl; // The collect NFT impl address being used. + } + + /// @notice Identifies the collect payment type configured for an IP asset. + /// TODO: Add ERC-721 and ERC-1155 as configurable payment types. + enum PaymentType { + NATIVE, // Utilize the native token (e.g. ETH on Ethereum or OP on Optimism) + ERC20 // Utilize an ERC-20 token + } + + /// @notice Payment collect module settings saved for a franchise IP asset. + struct CollectPaymentInfo { + address paymentToken; // The payment token address (if not native). + PaymentType paymentType; // The type of payment being made. + uint256 paymentAmount; // The required amount of the payment token. + address payable paymentRecipient; // Payment receipient address. + } + + /// @notice Parameters passed for collect payment processing for an IP asset. + /// TODO: Add a signature field to accept signature-relayed collects. + struct CollectPaymentParams { + address paymentToken; // The payment token address (if not native). + PaymentType paymentType; // The type of payment being made. + uint256 paymentAmount; // The required amount of the payment token. + } + + //////////////////////////////////////////////////////////////////////////// + // CollectNFT // + //////////////////////////////////////////////////////////////////////////// + + /// @notice Parameters passed to initialize a collect NFT. + struct InitCollectNFTParams { + address ipAssetRegistry; // Address of the registry of the bound IP asset. + uint256 ipAssetId; // The id of the IP asset bound to the collect NFT. + bytes data; // Additional data used for NFT initialization. + } + +} diff --git a/contracts/lib/modules/Licensing.sol b/contracts/lib/modules/Licensing.sol new file mode 100644 index 00000000..14b5d2a1 --- /dev/null +++ b/contracts/lib/modules/Licensing.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +import { ITermsProcessor } from "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; + +/// @title Licensing Module Library +library Licensing { + + /// @notice Configuration for terms processing. + struct TermsProcessorConfig { + ITermsProcessor processor; + bytes data; + } + + /// @notice IP asset configuration for IP licensing. + struct IpAssetConfig { + bool canSublicense; // If false, this IPAsset cannot be parentLicenseId of any other IPAsset + uint256 franchiseRootLicenseId; // If set, root IPAsset licenses will have this as their parentLicenseId + // TODO: allowed license terms? processors? + // TODO: limit medium of sublicenses? As in, you can only license prose to prose? something like LibIPAssetMask? + // TODO: limit who you can sublicense to? + } + + /// @notice Franchise configuration for IP licensing. + struct FranchiseConfig { + IpAssetConfig nonCommercialConfig; + TermsProcessorConfig nonCommercialTerms; + IpAssetConfig commercialConfig; + TermsProcessorConfig commercialTerms; + bool rootIpAssetHasCommercialRights; + address revoker; + string commercialLicenseUri; + } + + + /// @notice Core licensing structure. + struct License { + bool active; + bool canSublicense; + bool commercial; + uint256 parentLicenseId; + uint256 tokenId; + address revoker; + string uri; // NOTE: should we merge this with IPAssetRegistry tokenURI for Licenses who are rights? + ITermsProcessor termsProcessor; + bytes termsData; + } + +} diff --git a/contracts/lib/modules/Relationship.sol b/contracts/lib/modules/Relationship.sol new file mode 100644 index 00000000..7fa18bf0 --- /dev/null +++ b/contracts/lib/modules/Relationship.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { IRelationshipProcessor } from "contracts/interfaces/modules/relationships/processors/IRelationshipProcessor.sol"; + +/// @title Relationship Module Library +library Relationship { + + /// @notice Configures relationship TTLs and renewals. + struct TimeConfig { + uint112 maxTtl; + uint112 minTtl; + bool renewable; + } + + /// @notice Core relationship module configuration. + struct RelationshipConfig { + uint256 sourceIpAssetTypeMask; + uint256 destIpAssetTypeMask; + bool onlySameFranchise; + IRelationshipProcessor processor; + address disputer; + TimeConfig timeConfig; + } + + /// @notice Core relationship module setter configuration. + struct SetRelationshipConfigParams { + IPAsset.IPAssetType[] sourceIpAssets; + bool allowedExternalSource; + IPAsset.IPAssetType[] destIpAssets; + bool allowedExternalDest; + bool onlySameFranchise; + address processor; + address disputer; + TimeConfig timeConfig; + } + + /// @notice Core relationship parameters. + struct RelationshipParams { + address sourceContract; + uint256 sourceId; + address destContract; + uint256 destId; + bytes32 relationshipId; + uint256 ttl; + } + +} diff --git a/contracts/lib/modules/Royalties.sol b/contracts/lib/modules/Royalties.sol new file mode 100644 index 00000000..dd4d9d3f --- /dev/null +++ b/contracts/lib/modules/Royalties.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +/// @title Royalties Module Library +library Royalties { + + /// @notice Struct for configuring royalty allocations. + struct ProportionData { + address[] accounts; + uint32[] percentAllocations; + } + +} diff --git a/contracts/modules/collect/CollectModuleBase.sol b/contracts/modules/collect/CollectModuleBase.sol index 6a2217ed..dece3cc6 100644 --- a/contracts/modules/collect/CollectModuleBase.sol +++ b/contracts/modules/collect/CollectModuleBase.sol @@ -5,15 +5,14 @@ import { Clones } from '@openzeppelin/contracts/proxy/Clones.sol'; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import { ICollectModule } from "contracts/interfaces/ICollectModule.sol"; -import { ICollectModuleEventsAndErrors } from "contracts/interfaces/ICollectModuleEventsAndErrors.sol"; -import { ICollectNFT } from "contracts/interfaces/ICollectNFT.sol"; +import { ICollectModule } from "contracts/interfaces/modules/collect/ICollectModule.sol"; +import { ICollectNFT } from "contracts/interfaces/modules/collect/ICollectNFT.sol"; import { AccessControlledUpgradeable } from "contracts/access-control/AccessControlledUpgradeable.sol"; -import { CollectInfo, InitCollectParams, CollectParams } from "contracts/lib/CollectModuleStructs.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; import { FranchiseRegistry } from "contracts/FranchiseRegistry.sol"; -import { InitCollectNFTParams } from "contracts/lib/CollectNFTStructs.sol"; -import { IIPAssetRegistry } from "contracts/ip-assets/IIPAssetRegistry.sol"; +import { IIPAssetRegistry } from "contracts/interfaces/ip-assets/IIPAssetRegistry.sol"; /// @title Collect Module Base Implementation @@ -21,7 +20,7 @@ import { IIPAssetRegistry } from "contracts/ip-assets/IIPAssetRegistry.sol"; /// extended when creating collect modules for franchise IP assets. /// A collect module allows users to bind enrolled IP assets to NFTs /// that may be minted according to franchise configured collect rules. -abstract contract CollectModuleBase is UUPSUpgradeable, AccessControlledUpgradeable, ICollectModule { +abstract contract CollectModuleBase is AccessControlledUpgradeable, ICollectModule { // The Story Protocol franchise registry - used for IP asset identification. FranchiseRegistry public immutable FRANCHISE_REGISTRY; @@ -30,155 +29,169 @@ abstract contract CollectModuleBase is UUPSUpgradeable, AccessControlledUpgradea address public immutable DEFAULT_COLLECT_NFT_IMPL; // The ERC-1967 storage slot associated with the collect module, given by: - // keccak256("story-protocol.simple-payment-collect-module.storage") - 1; + // keccak256("story-protocol.collect-module.storage") - 1; bytes32 private constant _COLLECT_MODULE_STORAGE = 0xd16687d5cf786234491b4cc484b2a64f24855aadee9b1b73824db1ed2840fd0b; // ERC-1967 style storage slots used for collect module storage. struct CollectModuleStorage { // Maps IP assets (franchiseId, ipAssetId) to collect module settings. - mapping(uint256 => mapping(uint256 => CollectInfo)) collectInfo; + mapping(uint256 => mapping(uint256 => Collect.CollectInfo)) collectInfo; } /// @notice Instantiates a new collect module. - /// @param franchiseRegistry The protocol-wide franchise registry address. - /// @param defaultCollectNFTImpl The default collect NFT impl address. - constructor(address franchiseRegistry, address defaultCollectNFTImpl) { - FRANCHISE_REGISTRY = FranchiseRegistry(franchiseRegistry); - DEFAULT_COLLECT_NFT_IMPL = defaultCollectNFTImpl; + /// @param franchiseRegistry_ The protocol-wide franchise registry address. + /// @param defaultCollectNftImpl_ The default collect NFT impl address. + constructor(address franchiseRegistry_, address defaultCollectNftImpl_) { + FRANCHISE_REGISTRY = FranchiseRegistry(franchiseRegistry_); + DEFAULT_COLLECT_NFT_IMPL = defaultCollectNftImpl_; _disableInitializers(); } - /// @notice Returns the collect NFT address associated with an IP asset. - /// @param franchiseId The id of the franchise of the specified IP asset. - /// @param ipAssetId The id of the specified IP asset within the franchise. - /// @return The Collect NFT address if it exists, else the zero address. - function getCollectNFT(uint256 franchiseId, uint256 ipAssetId) public view returns (address) { - CollectInfo memory info = _getCollectModuleStorage().collectInfo[franchiseId][ipAssetId]; - return info.collectNFT; - } - /// @notice Initializes the collect module for a specific IP asset. - /// @param initCollectParams Collect module init data, including IP asset + /// @param initCollectParams_ Collect module init data, including IP asset /// id, collect NFT impl address, and generic unformatted init data. /// @dev If no collect NFT impl address is passed, the default module-wide /// collect NFT impl `DEFAULT_COLLECT_NFT_IMPL` will be used instead. - function initCollect(InitCollectParams calldata initCollectParams) external { + function initCollect(Collect.InitCollectParams calldata initCollectParams_) public virtual { // An IP asset is identified by the tuple (franchiseId, ipAssetId). - uint256 franchiseId = initCollectParams.franchiseId; - uint256 ipAssetId = initCollectParams.ipAssetId; + uint256 franchiseId = initCollectParams_.franchiseId; + uint256 ipAssetId = initCollectParams_.ipAssetId; // Only the IP asset registry may initialize its asset's collect module. - address collectNFTImpl = initCollectParams.collectNFTImpl; + address collectNftImpl = initCollectParams_.collectNftImpl; if (msg.sender != FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId)) { - revert CollectModuleCallerUnauthorized(); + revert Errors.CollectModule_CallerUnauthorized(); } // Revert if an IP asset collect module has already been initialized. CollectModuleStorage storage $ = _getCollectModuleStorage(); if ($.collectInfo[franchiseId][ipAssetId].initialized) { - revert CollectModuleIPAssetAlreadyInitialized(); + revert Errors.CollectModule_IPAssetAlreadyInitialized(); } // If an NFT impl address is not passed in, use the module default. - if (collectNFTImpl != address(0)) { - $.collectInfo[franchiseId][ipAssetId].collectNFTImpl = collectNFTImpl; + if (collectNftImpl != address(0)) { + $.collectInfo[franchiseId][ipAssetId].collectNftImpl = collectNftImpl; } $.collectInfo[franchiseId][ipAssetId].initialized = true; // Perform any additional collect module initialization. - _initCollect(initCollectParams); + _initCollect(initCollectParams_); } /// @notice Performs a collect on a specific IP asset for a collector. - /// @param collectParams Collect module collect data, including IP asset id, + /// @param collectParams_ Collect module collect data, including IP asset id, /// collector address, and generic unformatted collect and NFT data. /// @dev When a collect is processed for the first time for an IP asset, the /// collect NFT is deployed based on its configuered NFT impl address. - /// @return collectNFT The address of the collected NFT. - /// @return collectNFTId The id of the collected collect NFT. - function collect(CollectParams calldata collectParams) external returns (address collectNFT, uint256 collectNFTId){ + /// @return collectNft The address of the collected NFT. + /// @return collectNftId The id of the collected collect NFT. + function collect(Collect.CollectParams calldata collectParams_) public virtual payable returns (address collectNft, uint256 collectNftId) { // An IP asset is identified by the tuple (franchiseId, ipAssetId). - uint256 franchiseId = collectParams.franchiseId; - uint256 ipAssetId = collectParams.ipAssetId; + uint256 franchiseId = collectParams_.franchiseId; + uint256 ipAssetId = collectParams_.ipAssetId; // If collects are not authorized for the configured IP asset, revert. if (!_isCollectAuthorized(franchiseId, ipAssetId)) { - revert CollectModuleCollectUnauthorized(); + revert Errors.CollectModule_CollectUnauthorized(); } // Check that the specified IP asset actually exists. address ipAssetRegistry = FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId); if (ipAssetRegistry == address(0)) { - revert CollectModuleIPAssetRegistryNonExistent(); + revert Errors.CollectModule_IPAssetRegistryNonExistent(); } try IIPAssetRegistry(ipAssetRegistry).ownerOf(ipAssetId) { } catch { - revert CollectModuleIPAssetNonExistent(); + revert Errors.CollectModule_IPAssetNonExistent(); } // Get the bound collect NFT, deploying it if it has yet to exist. - collectNFT = _getCollectNFT(franchiseId, ipAssetRegistry, ipAssetId, collectParams.collectNFTInitData); + collectNft = _getCollectNft(franchiseId, ipAssetRegistry, ipAssetId, collectParams_.collectNftInitData); // Perform the collect, minting a collect NFT for the collector. - collectNFTId = ICollectNFT(collectNFT).collect(collectParams.collector, collectParams.collectNFTData); + collectNftId = ICollectNFT(collectNft).collect(collectParams_.collector, collectParams_.collectNftData); // Perform any additional collect module processing. - _collect(collectParams); + _collect(collectParams_); + + // Emit the Collect event. + emit Collected( + franchiseId, + ipAssetId, + collectParams_.collector, + collectNft, + collectNftId, + collectParams_.collectData, + collectParams_.collectNftData + ); + + return (collectNft, collectNftId); + } - return (collectNFT, collectNFTId); + /// @notice Returns the collect NFT address associated with an IP asset. + /// @param franchiseId_ The id of the franchise of the specified IP asset. + /// @param ipAssetId_ The id of the specified IP asset within the franchise. + /// @return The Collect NFT address if it exists, else the zero address. + function getCollectNFT(uint256 franchiseId_, uint256 ipAssetId_) public view returns (address) { + Collect.CollectInfo memory info = _getCollectModuleStorage().collectInfo[franchiseId_][ipAssetId_]; + return info.collectNft; } /// @dev Perform any additional processing on collect module initialization. - /// @param initCollectParams Collect module init data, including IP asset + /// @param initCollectParams_ Collect module init data, including IP asset /// id, collect NFT impl address, and generic unformatted init data. - function _initCollect(InitCollectParams calldata initCollectParams) internal virtual {} + function _initCollect(Collect.InitCollectParams calldata initCollectParams_) internal virtual {} /// @dev Perform any additional processing on collect module collection. - /// @param collectParams Collect module collect data, including IP asset id, + /// @param collectParams_ Collect module collect data, including IP asset id, /// collector address, and generic unformatted collect and NFT data. - function _collect(CollectParams calldata collectParams) internal virtual {} - - /// @dev Performs any authorization on an IP asset collection. - /// @param franchiseId The id of the franchise of the specified IP asset. - /// @param ipAssetId The id of the specified IP asset within the franchise. - function _isCollectAuthorized(uint256 franchiseId, uint256 ipAssetId) internal view virtual returns (bool); + function _collect(Collect.CollectParams calldata collectParams_) internal virtual {} /// @dev Gets a collect NFT, deploying one if it does not yet exist. - /// @param franchiseId The id of the franchise of the specified IP asset. - /// @param ipAssetId The id of the specified IP asset within the franchise. - /// @param initData Additional unformatted collect NFT initialization data. - function _getCollectNFT(uint256 franchiseId, address ipAssetRegistry, uint256 ipAssetId, bytes memory initData) internal returns (address) { + /// @param franchiseId_ The id of the franchise of the specified IP asset. + /// @param ipAssetId_ The id of the specified IP asset within the franchise. + /// @param initData_ Additional unformatted collect NFT initialization data. + function _getCollectNft(uint256 franchiseId_, address ipAssetRegistry_, uint256 ipAssetId_, bytes memory initData_) internal returns (address) { // Retrieve the collect module settings for the IP asset. CollectModuleStorage storage $ = _getCollectModuleStorage(); - CollectInfo storage info = $.collectInfo[franchiseId][ipAssetId]; + Collect.CollectInfo storage info = $.collectInfo[franchiseId_][ipAssetId_]; if (!info.initialized) { - revert CollectModuleCollectNotYetInitialized(); + revert Errors.CollectModule_CollectNotYetInitialized(); } - address collectNFT = info.collectNFT; + address collectNft = info.collectNft; // If the collect NFT does not yet exist, deploy and initialize it. - if (collectNFT == address(0)) { - address collectNFTImpl = info.collectNFTImpl; + if (collectNft == address(0)) { + address collectNftImpl = info.collectNftImpl; // If a custom collect NFT impementation is configured, use it, else // default to the franchise-wide collect NFT implementation. - collectNFT = collectNFTImpl == address(0) ? Clones.clone(DEFAULT_COLLECT_NFT_IMPL) : Clones.clone(collectNFTImpl); + collectNft = collectNftImpl == address(0) ? Clones.clone(DEFAULT_COLLECT_NFT_IMPL) : Clones.clone(collectNftImpl); // Perform collect NFT initialization for the IP asset. - ICollectNFT(collectNFT).initialize(InitCollectNFTParams({ - ipAssetRegistry: ipAssetRegistry, - ipAssetId: ipAssetId, - data: initData + ICollectNFT(collectNft).initialize(Collect.InitCollectNFTParams({ + ipAssetRegistry: ipAssetRegistry_, + ipAssetId: ipAssetId_, + data: initData_ })); - $.collectInfo[franchiseId][ipAssetId].collectNFT = collectNFT; + $.collectInfo[franchiseId_][ipAssetId_].collectNft = collectNft; + + // Emit the event indicating a new Collect NFT was created. + emit NewCollectNFT(franchiseId_, ipAssetId_, collectNft); } - return collectNFT; + return collectNft; } + /// @dev Performs any authorization on an IP asset collection. + /// @param franchiseId_ The id of the franchise of the specified IP asset. + /// @param ipAssetId_ The id of the specified IP asset within the franchise. + function _isCollectAuthorized(uint256 franchiseId_, uint256 ipAssetId_) internal view virtual returns (bool); + /// @dev Gets the ERC-1967 configured collect module storage slot. function _getCollectModuleStorage() private pure returns (CollectModuleStorage storage $) { assembly { diff --git a/contracts/modules/collect/CollectPaymentModuleBase.sol b/contracts/modules/collect/CollectPaymentModuleBase.sol new file mode 100644 index 00000000..988f8a80 --- /dev/null +++ b/contracts/modules/collect/CollectPaymentModuleBase.sol @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import { ICollectPaymentModule } from "contracts/interfaces/modules/collect/ICollectPaymentModule.sol"; + +import { CollectModuleBase } from "./CollectModuleBase.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; + +/// @title Collect Payment Module Base +/// @notice This is the Story Protocol base payment collect module, which allows +/// binding enrolled IP assets to NFTs that can be minted for a specific +/// fee according to franchise configured payment rules. +abstract contract CollectPaymentModuleBase is CollectModuleBase, ICollectPaymentModule { + + // ERC-1967 style storage slots used for collect payment module storage. + struct CollectPaymentModuleStorage { + + // Maps IP assets (franchiseId, ipAssetId) to collect payment settings. + mapping(uint256 => mapping(uint256 => Collect.CollectPaymentInfo)) paymentInfo; + } + + // The ERC-1967 storage slot associated with the collect payment module: + // keccak256("story-protocol.collect-paymnt-module.storage") - 1; + bytes32 private constant _COLLECT_PAYMENT_MODULE_STORAGE = 0x5dfab49ded706b2f2f30c864b856c7ede3dea7f2e0652ef85d5676b6e4568675; + + /// @notice Instantiates a new collect payment module. + /// @param franchiseRegistry_ The protocol-wide franchise registry address. + /// @param defaultCollectNftImpl_ The default collect NFT impl address. + constructor( + address franchiseRegistry_, + address defaultCollectNftImpl_ + ) CollectModuleBase(franchiseRegistry_, defaultCollectNftImpl_) {} + + /// @notice Initializes the collect payment module for a specific IP asset. + /// @param initCollectParams_ Collect module init data, including IP asset + /// id, collect NFT impl address, and payment module init data. + function initCollect(Collect.InitCollectParams calldata initCollectParams_) public virtual override(CollectModuleBase, ICollectPaymentModule) { + super.initCollect(initCollectParams_); + } + + /// @notice Performs a collect on a specific IP asset, processing the module + /// configured payment in the process. + /// @param collectParams_ Collect module collect data, including IP asset id, + /// collector address, and collect payment module processing data. + /// @return collectNft The address of the collected NFT. + /// @return collectNftId The id of the collected collect NFT. + /// TODO: Add payment reentrancy guard + function collect(Collect.CollectParams calldata collectParams_) public virtual payable override(CollectModuleBase, ICollectPaymentModule) returns (address collectNft, uint256 collectNftId) { + return super.collect(collectParams_); + } + + /// @notice Returns the collect payment info associated with an IP asset. + /// @param franchiseId_ The id of the franchise of the specified IP asset. + /// @param ipAssetId_ The id of the specified IP asset within the franchise. + /// @return Payment info associated with the configured IP asset collect. + function getPaymentInfo(uint256 franchiseId_, uint256 ipAssetId_) public view returns (Collect.CollectPaymentInfo memory) { + CollectPaymentModuleStorage storage $ = _getCollectPaymentModuleStorage(); + return $.paymentInfo[franchiseId_][ipAssetId_]; + } + + /// @dev Perform initialization of the collect payment module. + /// @param initCollectParams_ Collect module init data, which includes + /// unformatted data used for collect payment module initialization. + function _initCollect(Collect.InitCollectParams calldata initCollectParams_) internal virtual override(CollectModuleBase) { + + // Decode the payment initialization info. + Collect.CollectPaymentInfo memory paymentInfo = abi.decode(initCollectParams_.data, (Collect.CollectPaymentInfo)); + + // Validate that the payment information is valid. + _validatePaymentInfo(paymentInfo); + + CollectPaymentModuleStorage storage $ = _getCollectPaymentModuleStorage(); + $.paymentInfo[initCollectParams_.franchiseId][initCollectParams_.ipAssetId] = paymentInfo; + } + + /// @dev Perform collect module payment processing. + /// @param collectParams_ Collect module collect data, which includes + /// unformatted data used for collect payment module processing. + function _collect(Collect.CollectParams calldata collectParams_) internal virtual override(CollectModuleBase) { + + // Decode the payment processing info. + Collect.CollectPaymentParams memory paymentParams = abi.decode(collectParams_.collectData, (Collect.CollectPaymentParams)); + + // Process the payment. + _processPayment(collectParams_.franchiseId, collectParams_.ipAssetId, collectParams_.collector, paymentParams); + } + + /// @dev Processes the payment for a given IP asset collect action. + /// @param franchiseId_ Id of the franchise of the IP asset being processed. + /// @param ipAssetId_ Id of the IP asset being processed. + /// @param collector_ Address of collector, who is responsible for payment. + /// @param paymentParams_ Collect params configuring the IP asset payment. + /// TODO: Allow delegation of payments to other addresses by the collector. + function _processPayment( + uint256 franchiseId_, + uint256 ipAssetId_, + address collector_, + Collect.CollectPaymentParams memory paymentParams_ + ) internal virtual { + + // Get the current payment info settings for the IP asset. + CollectPaymentModuleStorage storage $ = _getCollectPaymentModuleStorage(); + Collect.CollectPaymentInfo memory paymentInfo = $.paymentInfo[franchiseId_][ipAssetId_]; + + // Validate the passed in payment parameters. + // TODO: Optimize struct re-use to be more memory efficient. + _validatePaymentProcessing(paymentInfo, paymentParams_, collector_); + + if (paymentInfo.paymentType == Collect.PaymentType.NATIVE) { + _transferNativeTokens( + paymentInfo.paymentRecipient, paymentInfo.paymentAmount); + } else if (paymentInfo.paymentType == Collect.PaymentType.ERC20) { + _transferERC20( + paymentInfo.paymentToken, + collector_, + paymentInfo.paymentRecipient, + paymentInfo.paymentAmount + ); + } + } + + /// @dev Checks whether the collect payment info to be configured is valid. + /// @param paymentInfo_ Settings for collect payment such as amount or token. + function _validatePaymentInfo(Collect.CollectPaymentInfo memory paymentInfo_) internal virtual { + + // Revert if a zero payment amount is specified. + if (paymentInfo_.paymentAmount == 0) { + revert Errors.CollectPaymentModule_AmountInvalid(); + } + + Collect.PaymentType paymentType = paymentInfo_.paymentType; + if (paymentType == Collect.PaymentType.NATIVE) { + if (paymentInfo_.paymentToken != address(0)) { + revert Errors.CollectPaymentModule_InvalidSettings(); + } + } else if (paymentType == Collect.PaymentType.ERC20) { + // Revert if the specified token is not a contract. + if (paymentInfo_.paymentToken.code.length == 0) { + revert Errors.CollectPaymentModule_TokenInvalid(); + } + } + // TODO: Add support for ERC-721 and ERC-1155 payment validation. + } + + /// @dev Checks whether payment processing parameters are valid. + /// @param paymentInfo_ Currently configured info for the collect payment. + /// @param paymentParams_ Parameters passed for collect payment processing. + function _validatePaymentProcessing(Collect.CollectPaymentInfo memory paymentInfo_, Collect.CollectPaymentParams memory paymentParams_, address collector_) internal virtual { + + uint256 paymentAmount = paymentInfo_.paymentAmount; + address paymentToken = paymentInfo_.paymentToken; + Collect.PaymentType paymentType = paymentInfo_.paymentType; + + if ( + paymentParams_.paymentType != paymentType || + paymentParams_.paymentToken != paymentToken || + paymentParams_.paymentAmount < paymentAmount + ) { + revert Errors.CollectPaymentModule_PaymentParamsInvalid(); + } + + if (paymentType == Collect.PaymentType.NATIVE) { + if (msg.value < paymentAmount) { + revert Errors.CollectPaymentModule_PaymentInsufficient(); + } + } else if (paymentType == Collect.PaymentType.ERC20) { + if (msg.value != 0) { + revert Errors.CollectPaymentModule_NativeTokenNotAllowed(); + } + if (IERC20(paymentToken).balanceOf(collector_) < paymentAmount) { + revert Errors.CollectPaymentModule_PaymentInsufficient(); + } + } + // TODO: Add support for ERC-721 and ERC-1155 payment processing. + } + + /// @dev Transfers `amount` of the native token to address `to`. `msg.value` + /// is assumed to have been forwarded from the collector to the module. + /// @param to_ Recipient address of the native tokens. + /// @param amount_ The amount of native tokens to send to the recipient. + /// TODO: Allow for native token transfers via relayers. + function _transferNativeTokens( + address payable to_, + uint256 amount_ + ) internal { + (bool ok, ) = to_.call{ value: amount_ }(""); + + // If the call was unsuccessful, revert. + if (!ok) { + revert Errors.CollectPaymentModule_NativeTransferFailed(); + } + } + + /// @dev Transfers `amount` of ERC-20 token `token` from `from` to `to`. + /// NOTE: Approvals MUST be set on this contract for transfers to work. + /// @param token_ Address of the ERC-20 token contract. + /// @param from_ Address whose ERC-20 funds are being transferred from. + /// @param to_ Recipient address of the ERC-20 transfer. + /// @param amount_ The amount of the ERC-20 to transfer. + /// TODO: Allow for ERC-2612 permit based transfers. + function _transferERC20( + address token_, + address from_, + address to_, + uint256 amount_ + ) internal { + // Perform an ERC-20 `transferFrom` call, collecting the returned data. + (bool ok, bytes memory data) = token_.call( + abi.encodeWithSelector( + IERC20.transferFrom.selector, + from_, + to_, + amount_ + ) + ); + + // If the call was unsuccessful, revert. + if (!ok) { + revert Errors.CollectPaymentModule_ERC20TransferFailed(); + } + + // Perform additional checks if the returned data is not empty. + if (data.length != 0) { + + // If there was returned data, revert on unsupported ABI encoding. + if (data.length < 32) { + revert Errors.CollectPaymentModule_ERC20TransferInvalidABIEncoding(); + } + + // If the token responded with an unsuccessful return value, revert. + if (!abi.decode(data, (bool))) { + revert Errors.CollectPaymentModule_ERC20TransferInvalidReturnValue(); + } + } + } + + /// @dev Gets the ERC-1967 configured collect payment module storage slot. + function _getCollectPaymentModuleStorage() private pure returns (CollectPaymentModuleStorage storage $) { + assembly { + $.slot := _COLLECT_PAYMENT_MODULE_STORAGE + } + } +} diff --git a/contracts/modules/collect/SimpleCollectModule.sol b/contracts/modules/collect/SimpleCollectModule.sol index 310bdb99..f0c3ce23 100644 --- a/contracts/modules/collect/SimpleCollectModule.sol +++ b/contracts/modules/collect/SimpleCollectModule.sol @@ -2,31 +2,31 @@ pragma solidity ^0.8.18; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { UPGRADER_ROLE } from "contracts/access-control/ProtocolRoles.sol"; +import { AccessControl } from "contracts/lib/AccessControl.sol"; import { CollectModuleBase } from "contracts/modules/collect/CollectModuleBase.sol"; /// @title Simple Collect Module /// @notice This simple collect module binds IP assets to mintable NFTs. -contract MockCollectModule is CollectModuleBase { +contract SimpleCollectModule is CollectModuleBase { /// @notice Initializes a mock collect module. - /// @param franchiseRegistry The protocol-wide franchise registry address. - /// @param defaultCollectNFTImpl The default collect NFT impl address. - constructor(address franchiseRegistry, address defaultCollectNFTImpl) CollectModuleBase(franchiseRegistry, defaultCollectNFTImpl) {} + /// @param franchiseRegistry_ The protocol-wide franchise registry address. + /// @param defaultCollectNftImpl_ The default collect NFT impl address. + constructor(address franchiseRegistry_, address defaultCollectNftImpl_) CollectModuleBase(franchiseRegistry_, defaultCollectNftImpl_) {} /// @notice Initializes the collect module via UUPS proxying. - /// @param accessControl The address utilized for contract access control. - function initialize(address accessControl) public initializer { + /// @param accessControl_ The address utilized for contract access control. + function initialize(address accessControl_) public initializer { __UUPSUpgradeable_init(); - __AccessControlledUpgradeable_init(accessControl); + __AccessControlledUpgradeable_init(accessControl_); } + /// @dev Additional authorization necessitated by UUPS module upgrades. + function _authorizeUpgrade(address newImplementation_) internal override onlyRole(AccessControl.UPGRADER_ROLE) {} + /// @dev Checks whether the collect action is authorized for an IP asset. - function _isCollectAuthorized(uint256 franchiseId, uint256 ipAssetId) internal view override returns (bool) { - address ipAssetRegistry = FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId); - return msg.sender == IERC721(ipAssetRegistry).ownerOf(ipAssetId); + function _isCollectAuthorized(uint256 franchiseId_, uint256 ipAssetId_) internal view override returns (bool) { + address ipAssetRegistry = FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId_); + return msg.sender == IERC721(ipAssetRegistry).ownerOf(ipAssetId_); } - - /// @dev Additional authorization necessitated by UUPS module upgrades. - function _authorizeUpgrade(address newImplementation) internal override onlyRole(UPGRADER_ROLE) {} } diff --git a/contracts/modules/collect/nft/CollectNFTBase.sol b/contracts/modules/collect/nft/CollectNFTBase.sol index f561b850..c548aad7 100644 --- a/contracts/modules/collect/nft/CollectNFTBase.sol +++ b/contracts/modules/collect/nft/CollectNFTBase.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.18; -import { ICollectModule } from "contracts/interfaces/ICollectModule.sol"; -import { ICollectNFT } from "contracts/interfaces/ICollectNFT.sol"; -import { IIPAssetRegistry } from "contracts/ip-assets/IIPAssetRegistry.sol"; +import { ICollectModule } from "contracts/interfaces/modules/collect/ICollectModule.sol"; +import { ICollectNFT } from "contracts/interfaces/modules/collect/ICollectNFT.sol"; +import { IIPAssetRegistry } from "contracts/interfaces/ip-assets/IIPAssetRegistry.sol"; -import { InitCollectNFTParams } from "contracts/lib/CollectNFTStructs.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; import { ERC721 } from "./ERC721.sol"; /// @title Collect NFT Base Contract @@ -30,7 +31,7 @@ abstract contract CollectNFTBase is ERC721, ICollectNFT { /// @notice Ensures calls may only be invoked by the parent collect module. modifier onlyCollectModule() { if (msg.sender != address(collectModule)) { - revert CollectNFTCallerUnauthorized(); + revert Errors.CollectNFT_CallerUnauthorized(); } _; } @@ -42,52 +43,52 @@ abstract contract CollectNFTBase is ERC721, ICollectNFT { _initialized = true; } - /// @notice Returns the total # of collect NFTs that exist for an IP asset. - /// @return The total number of collect NFTs in the collection. - function totalSupply() public view virtual returns (uint256) { - return _totalSupply; - } - /// @notice Initializes a collect NFT for subsequent collection. - /// @param initParams Collect NFT init data, including bound franchise IP + /// @param initParams_ Collect NFT init data, including bound franchise IP /// asset registry, IP asset id, and generic unformatted init data. - function initialize(InitCollectNFTParams calldata initParams) public virtual { + function initialize(Collect.InitCollectNFTParams calldata initParams_) public virtual { // Revert if this collect NFT has already been initialized. if (_initialized) { - revert CollectNFTAlreadyInitialized(); + revert Errors.CollectNFT_AlreadyInitialized(); } _initialized = true; collectModule = ICollectModule(msg.sender); - ipAssetRegistry = IIPAssetRegistry(initParams.ipAssetRegistry); - ipAssetId = initParams.ipAssetId; + ipAssetRegistry = IIPAssetRegistry(initParams_.ipAssetRegistry); + ipAssetId = initParams_.ipAssetId; // Ensure the bound IP asset in fact exists. try ipAssetRegistry.ownerOf(ipAssetId) { } catch { - revert CollectNFTIPAssetNonExistent(); + revert Errors.CollectNFT_IPAssetNonExistent(); } // Perform any additional collect NFT initialization. - _initialize(initParams.data); + _initialize(initParams_.data); } /// @notice Performs a collect, minting the NFT to address `collector`. - /// @param collector The address of the target designated for collection. - /// @param data Additional unformatted bytes data for optional processing. + /// @param collector_ The address of the target designated for collection. + /// @param data_ Additional unformatted bytes data for optional processing. /// @return tokenId The id of the minted collect NFT. - function collect(address collector, bytes calldata data) onlyCollectModule public virtual returns (uint256 tokenId) { + function collect(address collector_, bytes calldata data_) onlyCollectModule public virtual returns (uint256 tokenId) { tokenId = _totalSupply; - _mint(collector, tokenId); - _collect(data); + _mint(collector_, tokenId); + _collect(data_); + } + + /// @notice Returns the total # of collect NFTs that exist for an IP asset. + /// @return The total number of collect NFTs in the collection. + function totalSupply() public view virtual returns (uint256) { + return _totalSupply; } /// @dev Performs any additional initialization of the collect NFT. - /// @param data Additional unformatted data to be used for initialization. - function _initialize(bytes calldata data) internal virtual {} + /// @param data_ Additional unformatted data to be used for initialization. + function _initialize(bytes calldata data_) internal virtual {} /// @dev Performs any additional collect processing for the collect NFT. - /// @param data Additional unformatted data to be used for collection. - function _collect(bytes calldata data) internal virtual {} + /// @param data_ Additional unformatted data to be used for collection. + function _collect(bytes calldata data_) internal virtual {} } diff --git a/contracts/modules/collect/nft/ERC721.sol b/contracts/modules/collect/nft/ERC721.sol index c2110e42..edc0e838 100644 --- a/contracts/modules/collect/nft/ERC721.sol +++ b/contracts/modules/collect/nft/ERC721.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.18; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import { IERC721Errors } from "../../../interfaces/IERC721Errors.sol"; +import { Errors } from "contracts/lib/Errors.sol"; /// @title Minimal Collect Module ERC-721 Contract /// @notice This is a barebones ERC-721 contract that does not implement the @@ -16,7 +16,7 @@ import { IERC721Errors } from "../../../interfaces/IERC721Errors.sol"; /// requiring a constructor for IP asset specific intialization /// - MAY not be upgradeable, thus not necessarily requiring a more /// involved IERC721Upgradeable extension -abstract contract ERC721 is IERC721, IERC721Errors { +abstract contract ERC721 is IERC721 { /// @notice Maps tokens to their owner addresses. mapping(uint256 => address) public ownerOf; @@ -38,149 +38,149 @@ abstract contract ERC721 is IERC721, IERC721Errors { bytes4 private constant _ERC721_INTERFACE_ID = 0x80ac58cd; /// @notice Sets the operator for `msg.sender` to `operator`. - /// @param operator The operator address managing NFTs of `msg.sender`. - /// @param approved Whether operator can manage NFTs of `msg.sender`. - function setApprovalForAll(address operator, bool approved) external { - isApprovedForAll[msg.sender][operator] = approved; - emit ApprovalForAll(msg.sender, operator, approved); - } - - /// @notice Sets approved address of NFT `id` to address `approved`. - /// @param approved The new approved address for the NFT. - /// @param tokenId The id of the NFT to approve. - function approve(address approved, uint256 tokenId) public virtual { - address owner = ownerOf[tokenId]; - - // Revert unless msg.sender is the owner or approved operator. - if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { - revert ERC721SenderUnauthorized(); - } - - getApproved[tokenId] = approved; - emit Approval(owner, approved, tokenId); + /// @param operator_ The operator address managing NFTs of `msg.sender`. + /// @param approved_ Whether operator can manage NFTs of `msg.sender`. + function setApprovalForAll(address operator_, bool approved_) external { + isApprovedForAll[msg.sender][operator_] = approved_; + emit ApprovalForAll(msg.sender, operator_, approved_); } /// @notice Transfers NFT of id `id` from address `from` to address `to`, /// with safety checks ensuring `to` is capable of receiving the NFT. /// @dev Safety checks are only performed if `to` is a smart contract. - /// @param from The existing owner address of the NFT to be transferred. - /// @param to The new owner address of the NFT being transferred. - /// @param data Additional data in bytes to pass to the receiver. - /// @param tokenId The id of the NFT being transferred. + /// @param from_ The existing owner address of the NFT to be transferred. + /// @param to_ The new owner address of the NFT being transferred. + /// @param data_ Additional data in bytes to pass to the receiver. + /// @param tokenId_ The id of the NFT being transferred. function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory data + address from_, + address to_, + uint256 tokenId_, + bytes memory data_ ) external { - transferFrom(from, to, tokenId); + transferFrom(from_, to_, tokenId_); if ( - to.code.length != 0 && - IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) + to_.code.length != 0 && + IERC721Receiver(to_).onERC721Received(msg.sender, from_, tokenId_, data_) != IERC721Receiver.onERC721Received.selector ) { - revert ERC721SafeTransferUnsupported(); + revert Errors.ERC721_SafeTransferUnsupported(); } } /// @notice Transfers NFT of id `id` from address `from` to address `to`, /// with safety checks ensuring `to` is capable of receiving the NFT. /// @dev Safety checks are only performed if `to` is a smart contract. - /// @param from The existing owner address of the NFT to be transferred. - /// @param to The new owner address of the NFT being transferred. - /// @param tokenId The id of the NFT being transferred. + /// @param from_ The existing owner address of the NFT to be transferred. + /// @param to_ The new owner address of the NFT being transferred. + /// @param tokenId_ The id of the NFT being transferred. function safeTransferFrom( - address from, - address to, - uint256 tokenId + address from_, + address to_, + uint256 tokenId_ ) external { - transferFrom(from, to, tokenId); + transferFrom(from_, to_, tokenId_); if ( - to.code.length != 0 && - IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, "") + to_.code.length != 0 && + IERC721Receiver(to_).onERC721Received(msg.sender, from_, tokenId_, "") != IERC721Receiver.onERC721Received.selector ) { - revert ERC721SafeTransferUnsupported(); + revert Errors.ERC721_SafeTransferUnsupported(); } } + /// @notice Sets approved address of NFT `id` to address `approved`. + /// @param approved_ The new approved address for the NFT. + /// @param tokenId_ The id of the NFT to approve. + function approve(address approved_, uint256 tokenId_) public virtual { + address owner = ownerOf[tokenId_]; + + // Revert unless msg.sender is the owner or approved operator. + if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { + revert Errors.ERC721_SenderUnauthorized(); + } + + getApproved[tokenId_] = approved_; + emit Approval(owner, approved_, tokenId_); + } + /// @notice Transfers NFT of id `id` from address `from` to address `to`, /// without performing any safety checks. /// @dev Existence of an NFT is inferred by having a non-zero owner address. /// Transfers clear owner approvals without `Approval` events emitted. - /// @param from The existing owner address of the NFT being transferred. - /// @param to The new owner address of the NFT being transferred. - /// @param tokenId The id of the NFT being transferred. + /// @param from_ The existing owner address of the NFT being transferred. + /// @param to_ The new owner address of the NFT being transferred. + /// @param tokenId_ The id of the NFT being transferred. function transferFrom( - address from, - address to, - uint256 tokenId + address from_, + address to_, + uint256 tokenId_ ) public virtual { - if (from != ownerOf[tokenId]) { - revert ERC721OwnerInvalid(); + if (from_ != ownerOf[tokenId_]) { + revert Errors.ERC721_OwnerInvalid(); } if ( - msg.sender != from && - msg.sender != getApproved[tokenId] && - !isApprovedForAll[from][msg.sender] + msg.sender != from_ && + msg.sender != getApproved[tokenId_] && + !isApprovedForAll[from_][msg.sender] ) { - revert ERC721SenderUnauthorized(); + revert Errors.ERC721_SenderUnauthorized(); } - if (to == address(0)) { - revert ERC721ReceiverInvalid(); + if (to_ == address(0)) { + revert Errors.ERC721_ReceiverInvalid(); } - delete getApproved[tokenId]; + delete getApproved[tokenId_]; unchecked { - balanceOf[from]--; - balanceOf[to]++; + balanceOf[from_]--; + balanceOf[to_]++; } - ownerOf[tokenId] = to; - emit Transfer(from, to, tokenId); + ownerOf[tokenId_] = to_; + emit Transfer(from_, to_, tokenId_); } /// @notice Checks if interface of identifier `id` is supported. - /// @param id The ERC-165 interface identifier. + /// @param id_ The ERC-165 interface identifier. /// @return True if interface id `id` is supported, false otherwise. - function supportsInterface(bytes4 id) public view virtual override(IERC165) returns (bool) { - return id == _ERC165_INTERFACE_ID || - id == _ERC721_INTERFACE_ID; + function supportsInterface(bytes4 id_) public view virtual override(IERC165) returns (bool) { + return id_ == _ERC165_INTERFACE_ID || + id_ == _ERC721_INTERFACE_ID; } /// @dev Mints an NFT of identifier `tokenId` to recipient address `to`. - /// @param to Address of the new NFT owner. - /// @param tokenId Id of the NFT being minted. - function _mint(address to, uint256 tokenId) internal virtual { - if (to == address(0)) { - revert ERC721ReceiverInvalid(); + /// @param to_ Address of the new NFT owner. + /// @param tokenId_ Id of the NFT being minted. + function _mint(address to_, uint256 tokenId_) internal virtual { + if (to_ == address(0)) { + revert Errors.ERC721_ReceiverInvalid(); } - if (ownerOf[tokenId] != address(0)) { - revert ERC721TokenAlreadyMinted(); + if (ownerOf[tokenId_] != address(0)) { + revert Errors.ERC721_TokenAlreadyMinted(); } unchecked { _totalSupply++; - balanceOf[to]++; + balanceOf[to_]++; } - ownerOf[tokenId] = to; - emit Transfer(address(0), to, tokenId); + ownerOf[tokenId_] = to_; + emit Transfer(address(0), to_, tokenId_); } /// @dev Burns an NFT with identifier `tokenId`. - /// @param tokenId The id of the NFT being burned. - function _burn(uint256 tokenId) internal virtual { - address owner = ownerOf[tokenId]; + /// @param tokenId_ The id of the NFT being burned. + function _burn(uint256 tokenId_) internal virtual { + address owner = ownerOf[tokenId_]; if (owner == address(0)) { - revert ERC721TokenNonExistent(); + revert Errors.ERC721_TokenNonExistent(); } unchecked { @@ -188,8 +188,8 @@ abstract contract ERC721 is IERC721, IERC721Errors { balanceOf[owner]--; } - delete ownerOf[tokenId]; - delete getApproved[tokenId]; - emit Transfer(owner, address(0), tokenId); + delete ownerOf[tokenId_]; + delete getApproved[tokenId_]; + emit Transfer(owner, address(0), tokenId_); } } diff --git a/contracts/modules/licensing/ILicensingModule.sol b/contracts/modules/licensing/ILicensingModule.sol deleted file mode 100644 index 7a05e69a..00000000 --- a/contracts/modules/licensing/ILicensingModule.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.13; -import { ZeroAddress, Unauthorized } from "contracts/errors/General.sol"; -import { FranchiseRegistry } from "contracts/FranchiseRegistry.sol"; -import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import { AccessControlledUpgradeable } from "contracts/access-control/AccessControlledUpgradeable.sol"; -import { UPGRADER_ROLE, LICENSING_MANAGER_ROLE } from "contracts/access-control/ProtocolRoles.sol"; -import { ITermsProcessor } from "./terms/ITermsProcessor.sol"; -import { IERC5218 } from "./IERC5218.sol"; - -interface ILicensingModule { - - struct IpAssetConfig { - bool canSublicense; // If false, this IPAsset cannot be parentLicenseId of any other IPAsset - uint256 franchiseRootLicenseId; // If set, root IPAsset licenses will have this as their parentLicenseId - // TODO: allowed license terms? processors? - // TODO: limit medium of sublicenses? As in, you can only license prose to prose? something like LibIPAssetMask? - // TODO: limit who you can sublicense to? - } - - struct FranchiseConfig { - IpAssetConfig nonCommercialConfig; - IERC5218.TermsProcessorConfig nonCommercialTerms; - IpAssetConfig commercialConfig; - IERC5218.TermsProcessorConfig commercialTerms; - bool rootIpAssetHasCommercialRights; - address revoker; - string commercialLicenseUri; - - } - - event FranchiseConfigSet(uint256 franchiseId, FranchiseConfig config); - - - function configureFranchiseLicensing(uint256 franchiseId, FranchiseConfig memory config) external; - function getFranchiseConfig(uint256 franchiseId) external view returns (FranchiseConfig memory); - function getNonCommercialLicenseURI() external view returns (string memory); - -} \ No newline at end of file diff --git a/contracts/modules/licensing/LicenseRegistry.sol b/contracts/modules/licensing/LicenseRegistry.sol index 4c071976..fc656ca0 100644 --- a/contracts/modules/licensing/LicenseRegistry.sol +++ b/contracts/modules/licensing/LicenseRegistry.sol @@ -2,66 +2,63 @@ pragma solidity ^0.8.13; import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import { ZeroAddress, Unauthorized } from "contracts/errors/General.sol"; -import { IERC5218 } from "./IERC5218.sol"; -import { ILicenseRegistry } from "./ILicenseRegistry.sol"; +import { IERC5218 } from "contracts/interfaces/modules/licensing/IERC5218.sol"; +import { ILicenseRegistry } from "contracts/interfaces/modules/licensing/ILicenseRegistry.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -/** - * @title LicenseRegistry - * @author Raul Martinez - * @notice Simple NFT tracking the ownership of tradeable Licenses emitted by a RightsManager. - */ + +/// @title LicenseRegistry +/// @author Raul Martinez +/// @notice Simple NFT tracking the ownership of tradeable Licenses emitted by a RightsManager. contract LicenseRegistry is ILicenseRegistry, ERC721 { IERC5218 private immutable _RIGHTS_MANAGER; - constructor(address _rightsManager, string memory _name, string memory _symbol) ERC721(_name, _symbol) { - if (_rightsManager == address(0)) { - revert ZeroAddress(); + constructor(address rightsManager_, string memory name_, string memory symbol_) ERC721(name_, symbol_) { + if (rightsManager_ == address(0)) { + revert Errors.ZeroAddress(); } - _RIGHTS_MANAGER = IERC5218(_rightsManager); + _RIGHTS_MANAGER = IERC5218(rightsManager_); } modifier onlyRightsManager() { - if (msg.sender != address(_RIGHTS_MANAGER)) revert Unauthorized(); + if (msg.sender != address(_RIGHTS_MANAGER)) revert Errors.Unauthorized(); _; } - - /** - * @notice Mint a License to the given address. Only caller allowed is the RightsManager. - * @param to The address to mint the License to. - * @param tokenId The ID of the License to mint. - */ - function mint(address to, uint256 tokenId) external onlyRightsManager { - _mint(to, tokenId); - } - - function exists(uint256 tokenId) external view returns (bool) { - return _exists(tokenId); - } - function _beforeTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override { - // Minting has already been checked by the RightsManager, but transfers need to pass some checks. - if (from != address(0)) { - _RIGHTS_MANAGER.transferSublicense(firstTokenId, to); - } - super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + /// @notice Mint a License to the given address. Only caller allowed is the RightsManager. + /// @param to_ The address to mint the License to. + /// @param tokenId_ The ID of the License to mint. + function mint(address to_, uint256 tokenId_) external onlyRightsManager { + _mint(to_, tokenId_); } function getRightsManager() external view override returns (address) { return address(_RIGHTS_MANAGER); } + function exists(uint256 tokenId_) external view returns (bool) { + return _exists(tokenId_); + } + function name() public view override(ERC721, ILicenseRegistry) returns (string memory) { return super.name(); } - + function symbol() public view override(ERC721, ILicenseRegistry) returns (string memory) { return super.symbol(); } -} \ No newline at end of file + function _beforeTokenTransfer( + address from_, + address to_, + uint256 firstTokenId_, + uint256 batchSize_ + ) internal virtual override { + // Minting has already been checked by the RightsManager, but transfers need to pass some checks. + if (from_ != address(0)) { + _RIGHTS_MANAGER.transferSublicense(firstTokenId_, to_); + } + super._beforeTokenTransfer(from_, to_, firstTokenId_, batchSize_); + } +} diff --git a/contracts/modules/licensing/LicensingModule.sol b/contracts/modules/licensing/LicensingModule.sol index 4ed8fd3a..d22fc505 100644 --- a/contracts/modules/licensing/LicensingModule.sol +++ b/contracts/modules/licensing/LicensingModule.sol @@ -1,113 +1,104 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -import { ZeroAddress, Unauthorized } from "contracts/errors/General.sol"; +import { Errors } from "contracts/lib/Errors.sol"; import { FranchiseRegistry } from "contracts/FranchiseRegistry.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import { AccessControlledUpgradeable } from "contracts/access-control/AccessControlledUpgradeable.sol"; -import { UPGRADER_ROLE, LICENSING_MANAGER_ROLE } from "contracts/access-control/ProtocolRoles.sol"; -import { ITermsProcessor } from "./terms/ITermsProcessor.sol"; -import { IERC5218 } from "./IERC5218.sol"; -import { ILicensingModule } from "./ILicensingModule.sol"; +import { AccessControl } from "contracts/lib/AccessControl.sol"; +import { ITermsProcessor } from "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; +import { IERC5218 } from "contracts/interfaces/modules/licensing/IERC5218.sol"; +import { ILicensingModule } from "contracts/interfaces/modules/licensing/ILicensingModule.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; -/** - * @title LicensingModule - * @author Raul Martinez - * @notice Contract for configuring and managing licensing for a Franchise. - * A licensing framework may be definbed through a FranchiseConfig, which is set by the Franchise owner. - * The non commercial license URI is set by a protocol admin key, since it will be common for all Story Protocol - */ + +/// @title LicensingModule +/// @author Raul Martinez +/// @notice Contract for configuring and managing licensing for a Franchise. +/// A licensing framework may be definbed through a FranchiseConfig, which is set by the Franchise owner. +/// The non commercial license URI is set by a protocol admin key, since it will be common for all Story Protocol contract LicensingModule is ILicensingModule, AccessControlledUpgradeable { struct LicensingModuleStorage { /// franchiseId => FranchiseConfig - mapping(uint256 => FranchiseConfig) franchiseConfigs; + mapping(uint256 => Licensing.FranchiseConfig) franchiseConfigs; string nonCommercialLicenseURI; } - event NonCommercialLicenseUriSet(string uri); - - error NonExistentFranchise(); - error RootLicenseNotActive(uint256 rootLicenseId); - error ZeroRevokerAddress(); - // keccak256(bytes.concat(bytes32(uint256(keccak256("story-protocol.licensing-module.storage")) - 1))) bytes32 private constant _STORAGE_LOCATION = 0x80b4ea8c21e869c68acfd93c8ef2c0d867835b92e2fded15a1d74d7e7ff3312d; FranchiseRegistry public immutable FRANCHISE_REGISTRY; - constructor(address franchiseRegistry) { - if (franchiseRegistry == address(0)) { - revert ZeroAddress(); + constructor(address franchiseRegistry_) { + if (franchiseRegistry_ == address(0)) { + revert Errors.ZeroAddress(); } - FRANCHISE_REGISTRY = FranchiseRegistry(franchiseRegistry); + FRANCHISE_REGISTRY = FranchiseRegistry(franchiseRegistry_); _disableInitializers(); } - function initialize(address accessControl, string calldata nonCommercialLicenseUri) public initializer { - __AccessControlledUpgradeable_init(accessControl); - _getLicensingModuleStorage().nonCommercialLicenseURI = nonCommercialLicenseUri; + /// Set the URI for non-commercial licenses across Story Protocol. Setting this does NOT affect existing licenses, only new ones. + /// @param nonCommercialLicenseURI_ The URI to set for non-commercial licenses + function setNonCommercialLicenseURI(string calldata nonCommercialLicenseURI_) external onlyRole(AccessControl.LICENSING_MANAGER_ROLE) { + _getLicensingModuleStorage().nonCommercialLicenseURI = nonCommercialLicenseURI_; + emit NonCommercialLicenseUriSet(nonCommercialLicenseURI_); } - function _getLicensingModuleStorage() internal pure returns (LicensingModuleStorage storage $) { - bytes32 position = _STORAGE_LOCATION; - assembly { - $.slot := position + + /// Set the FranchiseConfig for a Franchise, configuring its licensing framework. + /// @dev if setting root licenses, they should be active. A revoker address must be set, and it will be + /// common for all licenses in the Franchise. + /// @param franchiseId_ The ID of the Franchise to set the config for + /// @param config_ The FranchiseConfig to set + function configureFranchiseLicensing(uint256 franchiseId_, Licensing.FranchiseConfig memory config_) external { + if (msg.sender != FRANCHISE_REGISTRY.ownerOf(franchiseId_)) { + revert Errors.Unauthorized(); + } + _verifyRootLicense(franchiseId_, config_.nonCommercialConfig.franchiseRootLicenseId); + _verifyRootLicense(franchiseId_, config_.commercialConfig.franchiseRootLicenseId); + if (config_.revoker == address(0)) { + revert Errors.LicensingModule_ZeroRevokerAddress(); } + LicensingModuleStorage storage $ = _getLicensingModuleStorage(); + $.franchiseConfigs[franchiseId_] = config_; + emit FranchiseConfigSet(franchiseId_, config_); + } + + function initialize(address accessControl_, string calldata nonCommercialLicenseUri_) public initializer { + __AccessControlledUpgradeable_init(accessControl_); + _getLicensingModuleStorage().nonCommercialLicenseURI = nonCommercialLicenseUri_; } function getNonCommercialLicenseURI() public view returns (string memory) { return _getLicensingModuleStorage().nonCommercialLicenseURI; } - /** - * Set the URI for non-commercial licenses across Story Protocol. Setting this does NOT affect existing licenses, only new ones. - * @param _nonCommercialLicenseURI The URI to set for non-commercial licenses - */ - function setNonCommercialLicenseURI(string calldata _nonCommercialLicenseURI) external onlyRole(LICENSING_MANAGER_ROLE) { - _getLicensingModuleStorage().nonCommercialLicenseURI = _nonCommercialLicenseURI; - emit NonCommercialLicenseUriSet(_nonCommercialLicenseURI); + function getFranchiseConfig(uint256 franchiseId_) public view returns (Licensing.FranchiseConfig memory) { + return _getLicensingModuleStorage().franchiseConfigs[franchiseId_]; } - /** - * Set the FranchiseConfig for a Franchise, configuring its licensing framework. - * @dev if setting root licenses, they should be active. A revoker address must be set, and it will be - * common for all licenses in the Franchise. - * @param franchiseId The ID of the Franchise to set the config for - * @param config The FranchiseConfig to set - */ - function configureFranchiseLicensing(uint256 franchiseId, FranchiseConfig memory config) external { - if (msg.sender != FRANCHISE_REGISTRY.ownerOf(franchiseId)) { - revert Unauthorized(); - } - _verifyRootLicense(franchiseId, config.nonCommercialConfig.franchiseRootLicenseId); - _verifyRootLicense(franchiseId, config.commercialConfig.franchiseRootLicenseId); - if (config.revoker == address(0)) { - revert ZeroRevokerAddress(); - } - LicensingModuleStorage storage $ = _getLicensingModuleStorage(); - $.franchiseConfigs[franchiseId] = config; - emit FranchiseConfigSet(franchiseId, config); - } + function _authorizeUpgrade( + address newImplementation_ + ) internal virtual override onlyRole(AccessControl.UPGRADER_ROLE) {} - function _verifyRootLicense(uint256 franchiseId, uint256 rootLicenseId) internal view { - if (rootLicenseId != 0) { - IERC5218 rightsManager = IERC5218(FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId)); + function _verifyRootLicense(uint256 franchiseId_, uint256 rootLicenseId_) internal view { + if (rootLicenseId_ != 0) { + IERC5218 rightsManager = IERC5218(FRANCHISE_REGISTRY.ipAssetRegistryForId(franchiseId_)); if (address(rightsManager) == address(0)) { // FRANCHISE_REGISTRY.ownerOf(franchiseId) should take care of this, // but leaving it in case IPAssetRegistration creation fails somewhow. - revert NonExistentFranchise(); + revert Errors.LicensingModule_NonExistentFranchise(); } - if (!rightsManager.isLicenseActive(rootLicenseId)) { - revert RootLicenseNotActive(rootLicenseId); + if (!rightsManager.isLicenseActive(rootLicenseId_)) { + revert Errors.LicensingModule_RootLicenseNotActive(rootLicenseId_); } } } - function getFranchiseConfig(uint256 franchiseId) public view returns (FranchiseConfig memory) { - return _getLicensingModuleStorage().franchiseConfigs[franchiseId]; + function _getLicensingModuleStorage() internal pure returns (LicensingModuleStorage storage $) { + bytes32 position = _STORAGE_LOCATION; + assembly { + $.slot := position + } } - - function _authorizeUpgrade( - address newImplementation - ) internal virtual override onlyRole(UPGRADER_ROLE) {} -} \ No newline at end of file +} diff --git a/contracts/modules/licensing/RightsManager.sol b/contracts/modules/licensing/RightsManager.sol index f64a153b..0efa0298 100644 --- a/contracts/modules/licensing/RightsManager.sol +++ b/contracts/modules/licensing/RightsManager.sol @@ -3,59 +3,32 @@ pragma solidity ^0.8.13; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import { ERC721Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import { LibDuration } from "../timing/LibDuration.sol"; -import { UPGRADER_ROLE } from "contracts/access-control/ProtocolRoles.sol"; -import { IERC5218 } from "./IERC5218.sol"; -import { ILicenseRegistry } from "./ILicenseRegistry.sol"; -import { NonExistentID, Unauthorized, ZeroAddress, UnsupportedInterface } from "contracts/errors/General.sol"; +import { IERC5218 } from "contracts/interfaces/modules/licensing/IERC5218.sol"; +import { ILicenseRegistry } from "contracts/interfaces/modules/licensing/ILicenseRegistry.sol"; import { ERC165CheckerUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165CheckerUpgradeable.sol"; import { ERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; -import { ITermsProcessor } from "./terms/ITermsProcessor.sol"; - -/** - * @title RightsManager - * @author Raul Martinez - * @notice IERC-5218 implementation. - Allows us to grant 2 type of licenses: - 1. Rights: Licenses tied to a tokenId (IPAsset id), in which the license holder is always the owner of the tokenId. Each tokenId can have commercial or non commercial license tied to it defining it. - 2. Tradeable Licenses): The license holder is the owner of the correspondent LicenseRegistry NFT. They are either: - 2.1 Franchise root license: LicenseRegistry enabled license minted by a Franchise owner to govern commercial or non commercial rights for all the IPAssetRegistries. - 2.2 Sublicense: a license coming from Rights or other Licenses, minted by the parent license owner. These would be the future "movie adaptation" type licenses that can be sold. - Allows license holders to execute terms to activate the license to activate them. - Tracks active licenses along the license trees. - */ +import { ITermsProcessor } from "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; + +/// @title RightsManager +/// @author Raul Martinez +/// @notice IERC-5218 implementation. +/// Allows us to grant 2 type of licenses: +/// 1. Rights: Licenses tied to a tokenId (IPAsset id), in which the license holder is always the owner of the tokenId. Each tokenId can have commercial or non commercial license tied to it defining it. +/// 2. Tradeable Licenses): The license holder is the owner of the correspondent LicenseRegistry NFT. They are either: +/// 2.1 Franchise root license: LicenseRegistry enabled license minted by a Franchise owner to govern commercial or non commercial rights for all the IPAssetRegistries. +/// 2.2 Sublicense: a license coming from Rights or other Licenses, minted by the parent license owner. These would be the future "movie adaptation" type licenses that can be sold. +/// Allows license holders to execute terms to activate the license to activate them. +/// Tracks active licenses along the license trees. abstract contract RightsManager is ERC721Upgradeable, IERC5218 { using ERC165CheckerUpgradeable for address; - error NotOwnerOfParentLicense(); - error InactiveLicense(); - error InactiveParentLicense(); - error CannotSublicense(); - error CommercialTermsMismatch(); - error SenderNotRevoker(); - error NotSublicense(); - error AlreadyHasRootLicense(); - error ZeroRevokerAddress(); - error NFTHasNoAssociatedLicense(); - error UseCreateFranchiseRootLicenseInstead(); - error LicenseRegistryNotConfigured(); - - struct License { - bool active; - bool canSublicense; - bool commercial; - uint256 parentLicenseId; - uint256 tokenId; - address revoker; - string uri; // NOTE: should we merge this with IPAssetRegistry tokenURI for Licenses who are rights? - ITermsProcessor termsProcessor; - bytes termsData; - } - struct RightsManagerStorage { - mapping(uint256 => License) licenses; + mapping(uint256 => Licensing.License) licenses; // keccack256(commercial, tokenId) => licenseId mapping(bytes32 => uint256) licensesForTokenId; uint256 licenseCounter; @@ -68,366 +41,355 @@ abstract contract RightsManager is uint256 public constant FRANCHISE_REGISTRY_OWNED_TOKEN_ID = type(uint256).max; IERC721 public immutable FRANCHISE_REGISTRY; - constructor(address _franchiseRegistry) { - if (_franchiseRegistry == address(0)) { - revert ZeroAddress(); + constructor(address franchiseRegistry_) { + if (franchiseRegistry_ == address(0)) { + revert Errors.ZeroAddress(); } - FRANCHISE_REGISTRY = IERC721(_franchiseRegistry); - - } + FRANCHISE_REGISTRY = IERC721(franchiseRegistry_); - function __RightsManager_init( - string calldata name, - string calldata symbol - ) public initializer { - __ERC721_init(name, symbol); } - - function setLicenseRegistry(address _licenseRegistry) external { + function setLicenseRegistry(address licenseRegistry_) external { // NOTE: This assumes no need to change ILicenseRegistry implementation. - if (address(_getRightsManagerStorage().licenseRegistry) != address(0)) revert Unauthorized(); - if (_licenseRegistry == address(0)) revert ZeroAddress(); - _getRightsManagerStorage().licenseRegistry = ILicenseRegistry(_licenseRegistry); + if (address(_getRightsManagerStorage().licenseRegistry) != address(0)) revert Errors.Unauthorized(); + if (licenseRegistry_ == address(0)) revert Errors.ZeroAddress(); + _getRightsManagerStorage().licenseRegistry = ILicenseRegistry(licenseRegistry_); } - function _getRightsManagerStorage() - private - pure - returns (RightsManagerStorage storage $) - { - assembly { - $.slot := _STORAGE_LOCATION - } - } - - /** - * Creates a tradeable sublicense. - * @dev Throws if trying to create a franchise level or root license. - * @param _tokenId The tokenId of the IPAsset to create the sublicense for. - * @param _parentLicenseId The parent license to create the sublicense from. - * @param _licenseHolder The address of the sublicense holder, will own the ILicenseRegistry NFT. - * @param _uri License terms URI. - * @param _revoker address that can revoke the license. - * @param _commercial if the license is commercial or not. - * @param _canSublicense if the license can be parentLicense of another one - * @param _terms the on chain terms of the license, via executor and data - * @return licenseId - */ + /// Creates a tradeable sublicense. + /// @dev Throws if trying to create a franchise level or root license. + /// @param tokenId_ The tokenId of the IPAsset to create the sublicense for. + /// @param parentLicenseId_ The parent license to create the sublicense from. + /// @param licenseHolder_ The address of the sublicense holder, will own the ILicenseRegistry NFT. + /// @param uri_ License terms URI. + /// @param revoker_ address that can revoke the license. + /// @param commercial_ if the license is commercial or not. + /// @param canSublicense_ if the license can be parentLicense of another one + /// @param terms_ the on chain terms of the license, via executor and data + /// @return licenseId function createLicense( - uint256 _tokenId, // Question: should sublicenses be created with a tokenId or just a parentLicenseId? - uint256 _parentLicenseId, - address _licenseHolder, - string memory _uri, - address _revoker, - bool _commercial, - bool _canSublicense, - TermsProcessorConfig memory _terms + uint256 tokenId_, // Question: should sublicenses be created with a tokenId or just a parentLicenseId? + uint256 parentLicenseId_, + address licenseHolder_, + string memory uri_, + address revoker_, + bool commercial_, + bool canSublicense_, + Licensing.TermsProcessorConfig memory terms_ ) external override returns (uint256) { - if (_tokenId == FRANCHISE_REGISTRY_OWNED_TOKEN_ID || _parentLicenseId == _UNSET_LICENSE_ID) { - revert UseCreateFranchiseRootLicenseInstead(); + if (tokenId_ == FRANCHISE_REGISTRY_OWNED_TOKEN_ID || parentLicenseId_ == _UNSET_LICENSE_ID) { + revert Errors.RightsManager_UseCreateFranchiseRootLicenseInstead(); } - if (msg.sender != getLicenseHolder(_parentLicenseId)) revert Unauthorized(); + if (msg.sender != getLicenseHolder(parentLicenseId_)) revert Errors.Unauthorized(); return _createLicense( - _tokenId, - _parentLicenseId, - _licenseHolder, - _uri, - _revoker, - _commercial, - _canSublicense, - _terms, + tokenId_, + parentLicenseId_, + licenseHolder_, + uri_, + revoker_, + commercial_, + canSublicense_, + terms_, true ); } - /** - * Creates the root licenses that all other licenses of a Franchise may be based on. - * @dev Throws if caller not owner of the FranchiseRegistry NFt. - * @param franchiseId in the FranhiseRegistry - * @param _licenseHolder The address of the sublicense holder, will own the ILicenseRegistry NFT. - * @param _uri License terms URI. - * @param _revoker address that can revoke the license. - * @param _commercial if the license is commercial or not. - * @param _canSublicense if the license can be parentLicense of another one - * @param _terms the on chain terms of the license, via executor and data - * @return licenseId - */ + /// Creates the root licenses that all other licenses of a Franchise may be based on. + /// @dev Throws if caller not owner of the FranchiseRegistry NFt. + /// @param franchiseId_ in the FranhiseRegistry + /// @param licenseHolder_ The address of the sublicense holder, will own the ILicenseRegistry NFT. + /// @param uri_ License terms URI. + /// @param revoker_ address that can revoke the license. + /// @param commercial_ if the license is commercial or not. + /// @param canSublicense_ if the license can be parentLicense of another one + /// @param terms_ the on chain terms of the license, via executor and data + /// @return licenseId function createFranchiseRootLicense( - uint256 franchiseId, - address _licenseHolder, - string memory _uri, - address _revoker, - bool _commercial, - bool _canSublicense, - TermsProcessorConfig memory _terms + uint256 franchiseId_, + address licenseHolder_, + string memory uri_, + address revoker_, + bool commercial_, + bool canSublicense_, + Licensing.TermsProcessorConfig memory terms_ ) external returns (uint256) { - if (msg.sender != FRANCHISE_REGISTRY.ownerOf(franchiseId)) revert Unauthorized(); + if (msg.sender != FRANCHISE_REGISTRY.ownerOf(franchiseId_)) revert Errors.Unauthorized(); return _createLicense( FRANCHISE_REGISTRY_OWNED_TOKEN_ID, _UNSET_LICENSE_ID, - _licenseHolder, - _uri, - _revoker, - _commercial, - _canSublicense, - _terms, + licenseHolder_, + uri_, + revoker_, + commercial_, + canSublicense_, + terms_, true ); } + function revokeLicense(uint256 licenseId_) external override { + if (!isLicenseSet(licenseId_)) revert Errors.NonExistentID(licenseId_); + RightsManagerStorage storage $ = _getRightsManagerStorage(); + Licensing.License storage license = $.licenses[licenseId_]; + if (msg.sender != license.revoker) revert Errors.RightsManager_SenderNotRevoker(); + license.active = false; + emit RevokeLicense(licenseId_); + // TODO: should we burn the license if it's from the LicenseRegistry? + // TODO: delete the rootLicenseForTokenId mapping for licenseId if root license + } + + + /// If set, runs the TermsExecutor with the terms data stored in the license. + /// If the terms execution returns different data, the license is updated with the new data. + /// @param licenseId_ The identifier for the queried license + function executeTerms(uint256 licenseId_) external { + RightsManagerStorage storage $ = _getRightsManagerStorage(); + if (msg.sender != $.licenseRegistry.ownerOf(licenseId_)) revert Errors.Unauthorized(); + Licensing.License storage license = $.licenses[licenseId_]; + if (license.termsProcessor != ITermsProcessor(address(0))) { + bytes memory newData = license.termsProcessor.executeTerms(license.termsData); + if (keccak256(license.termsData) != keccak256(newData)) { + license.termsData = newData; + emit TermsUpdated(licenseId_, address(license.termsProcessor), newData); + } + } + emit ExecuteTerms(licenseId_, license.termsData); + } + + function getLicenseTokenId( + uint256 licenseId_ + ) external view override returns (uint256) { + return _getRightsManagerStorage().licenses[licenseId_].tokenId; + } + + function getParentLicenseId( + uint256 licenseId_ + ) external view override returns (uint256) { + return _getRightsManagerStorage().licenses[licenseId_].parentLicenseId; + } + + function getLicenseURI( + uint256 licenseId_ + ) external view override returns (string memory) { + return _getRightsManagerStorage().licenses[licenseId_].uri; + } + + function getLicenseRevoker( + uint256 licenseId_ + ) external view override returns (address) { + return _getRightsManagerStorage().licenses[licenseId_].revoker; + } + + function getLicenseRegistry() external view returns (ILicenseRegistry) { + return _getRightsManagerStorage().licenseRegistry; + } + + function __RightsManager_init( + string calldata name_, + string calldata symbol_ + ) public initializer { + __ERC721_init(name_, symbol_); + } + + /// Since the LicenseRegistry tracks sublicense ownership, this method can only be called by the LicenseRegistry. + /// @dev Throws if the license is not active. Basically exists to not break ERC-5218. + /// @param licenseId_ the license to transfer + /// @param licenseHolder_ the new license holder + function transferSublicense( + uint256 licenseId_, + address licenseHolder_ + ) public virtual override(IERC5218) { + RightsManagerStorage storage $ = _getRightsManagerStorage(); + if (msg.sender != address($.licenseRegistry)) revert Errors.Unauthorized(); + if (!isLicenseActive(licenseId_)) revert Errors.RightsManager_InactiveLicense(); + emit TransferLicense(licenseId_, licenseHolder_); + } + + function getLicense(uint256 licenseId_) public view returns (Licensing.License memory, address holder) { + return ( + _getRightsManagerStorage().licenses[licenseId_], + getLicenseHolder(licenseId_) + ); + } + + /// returns true if the license is active (non revoked and terms returning true) and all its parent licenses are active, false otherwise + function isLicenseActive( + uint256 licenseId_ + ) public view virtual returns (bool) { + // TODO: limit to the tree depth + if (licenseId_ == 0) return false; + RightsManagerStorage storage $ = _getRightsManagerStorage(); + while (licenseId_ != 0) { + Licensing.License memory license = $.licenses[licenseId_]; + if (!_isActiveAndTermsOk(license)) return false; + licenseId_ = license.parentLicenseId; + } + return true; + } + + function getLicenseHolder( + uint256 licenseId_ + ) public view override returns (address) { + RightsManagerStorage storage $ = _getRightsManagerStorage(); + if ($.licenseRegistry.exists(licenseId_)) { + return $.licenseRegistry.ownerOf(licenseId_); + } else { + Licensing.License storage license = $.licenses[ + licenseId_ + ]; + return ownerOf(license.tokenId); + } + } + + function getLicenseIdByTokenId( + uint256 tokenId_, + bool commercial_ + ) public view override returns (uint256) { + return + _getRightsManagerStorage().licensesForTokenId[ + keccak256(abi.encode(commercial_, tokenId_)) + ]; + } + + function isRootLicense( + uint256 licenseId_ + ) public view returns (bool) { + return _getRightsManagerStorage().licenses[licenseId_].parentLicenseId == _UNSET_LICENSE_ID && isLicenseSet(licenseId_); + } + + function isLicenseSet(uint256 licenseId_) public view returns (bool) { + return _getRightsManagerStorage().licenses[licenseId_].revoker != address(0); + } function _createLicense( - uint256 tokenId, - uint256 parentLicenseId, - address licenseHolder, - string memory uri, - address revoker, - bool commercial, - bool canSublicense, - TermsProcessorConfig memory _terms, - bool inLicenseRegistry + uint256 tokenId_, + uint256 parentLicenseId_, + address licenseHolder_, + string memory uri_, + address revoker_, + bool commercial_, + bool canSublicense_, + Licensing.TermsProcessorConfig memory terms_, + bool inLicenseRegistry_ ) internal returns (uint256) { // TODO: should revoker come from allowed revoker list? - if (revoker == address(0)) revert ZeroRevokerAddress(); + if (revoker_ == address(0)) revert Errors.RightsManager_ZeroRevokerAddress(); RightsManagerStorage storage $ = _getRightsManagerStorage(); // Only licenses minted to the FranchiseRegistry Owner as a root license should - // have tokenId = FRANCHISE_REGISTRY_OWNED_TOKEN_ID, otherwise the tokenId should be a minted NFT (IPAsset) + // have tokenId = FRANCHISE_REGISTRY_OWNED_TOKEN_ID, otherwise the tokenId should be a minted NFT (IPAsset.IPAssetType) // Checks for the FranchiseRegistry Owner should be done in the calling function - if (tokenId != FRANCHISE_REGISTRY_OWNED_TOKEN_ID) { - if (!_exists(tokenId)) { - revert NonExistentID(tokenId); + if (tokenId_ != FRANCHISE_REGISTRY_OWNED_TOKEN_ID) { + if (!_exists(tokenId_)) { + revert Errors.NonExistentID(tokenId_); } } // If this is not a LicenseRegsitry license, check that the tokenId doesn't already have a root license - if (!inLicenseRegistry) { - if ($.licensesForTokenId[keccak256(abi.encode(commercial, tokenId))] != _UNSET_LICENSE_ID) { - revert AlreadyHasRootLicense(); + if (!inLicenseRegistry_) { + if ($.licensesForTokenId[keccak256(abi.encode(commercial_, tokenId_))] != _UNSET_LICENSE_ID) { + revert Errors.RightsManager_AlreadyHasRootLicense(); } } else { - if($.licenseRegistry == ILicenseRegistry(address(0))) revert LicenseRegistryNotConfigured(); - if(tokenId != FRANCHISE_REGISTRY_OWNED_TOKEN_ID && parentLicenseId != _UNSET_LICENSE_ID) { + if($.licenseRegistry == ILicenseRegistry(address(0))) revert Errors.RightsManager_LicenseRegistryNotConfigured(); + if(tokenId_ != FRANCHISE_REGISTRY_OWNED_TOKEN_ID && parentLicenseId_ != _UNSET_LICENSE_ID) { // If this is a sublicense, check that this is a valid sublicense - License memory parentLicense = $.licenses[parentLicenseId]; - if (!parentLicense.active) revert InactiveParentLicense(); - if (!parentLicense.canSublicense) revert CannotSublicense(); - if (parentLicense.commercial != commercial) revert CommercialTermsMismatch(); - if (getLicenseHolder(parentLicenseId) != licenseHolder) revert NotOwnerOfParentLicense(); + Licensing.License memory parentLicense = $.licenses[parentLicenseId_]; + if (!parentLicense.active) revert Errors.RightsManager_InactiveParentLicense(); + if (!parentLicense.canSublicense) revert Errors.RightsManager_CannotSublicense(); + if (parentLicense.commercial != commercial_) revert Errors.RightsManager_CommercialTermsMismatch(); + if (getLicenseHolder(parentLicenseId_) != licenseHolder_) revert Errors.RightsManager_NotOwnerOfParentLicense(); } } // Check that the terms are valid - _verifyTerms(_terms); + _verifyTerms(terms_); // Create the license and increment the licenseCounter uint256 licenseId = ++$.licenseCounter; - $.licenses[licenseId] = License({ + $.licenses[licenseId] = Licensing.License({ active: true, - canSublicense: canSublicense, - commercial: commercial, - parentLicenseId: parentLicenseId, - tokenId: tokenId, - revoker: revoker, - uri: uri, - termsProcessor: _terms.processor, - termsData: _terms.data + canSublicense: canSublicense_, + commercial: commercial_, + parentLicenseId: parentLicenseId_, + tokenId: tokenId_, + revoker: revoker_, + uri: uri_, + termsProcessor: terms_.processor, + termsData: terms_.data }); - + // Mint the license in the LicenseRegistry if requested. Should not do this for IPAsset Rights, but // the checks on inLicenseRegistry should be done in the calling function - if (inLicenseRegistry) { - $.licenseRegistry.mint(licenseHolder, licenseId); + if (inLicenseRegistry_) { + $.licenseRegistry.mint(licenseHolder_, licenseId); } else { // Save tokenId => licenseId relationship IF this is a root license - $.licensesForTokenId[keccak256(abi.encode(commercial, tokenId))] = licenseId; + $.licensesForTokenId[keccak256(abi.encode(commercial_, tokenId_))] = licenseId; } // Emit events emit CreateLicense( licenseId, - tokenId, - parentLicenseId, - licenseHolder, - uri, - revoker + tokenId_, + parentLicenseId_, + licenseHolder_, + uri_, + revoker_ ); - emit TransferLicense(licenseId, licenseHolder); + emit TransferLicense(licenseId, licenseHolder_); return licenseId; } - - function revokeLicense(uint256 _licenseId) external override { - if (!isLicenseSet(_licenseId)) revert NonExistentID(_licenseId); - RightsManagerStorage storage $ = _getRightsManagerStorage(); - License storage license = $.licenses[_licenseId]; - if (msg.sender != license.revoker) revert SenderNotRevoker(); - license.active = false; - emit RevokeLicense(_licenseId); - // TODO: should we burn the license if it's from the LicenseRegistry? - // TODO: delete the rootLicenseForTokenId mapping for licenseId if root license - } - - /** - * If set, runs the TermsExecutor with the terms data stored in the license. - * If the terms execution returns different data, the license is updated with the new data. - * @param _licenseId The identifier for the queried license - */ - function executeTerms(uint256 _licenseId) external { - RightsManagerStorage storage $ = _getRightsManagerStorage(); - if (msg.sender != $.licenseRegistry.ownerOf(_licenseId)) revert Unauthorized(); - License storage license = $.licenses[_licenseId]; - if (license.termsProcessor != ITermsProcessor(address(0))) { - bytes memory newData = license.termsProcessor.executeTerms(license.termsData); - if (keccak256(license.termsData) != keccak256(newData)) { - license.termsData = newData; - emit TermsUpdated(_licenseId, address(license.termsProcessor), newData); - } - } - emit ExecuteTerms(_licenseId, license.termsData); - } - - /// returns true if the license is active (non revoked and terms returning true) and all its parent licenses are active, false otherwise - function isLicenseActive( - uint256 licenseId - ) public view virtual returns (bool) { - // TODO: limit to the tree depth - if (licenseId == 0) return false; - RightsManagerStorage storage $ = _getRightsManagerStorage(); - while (licenseId != 0) { - License memory license = $.licenses[licenseId]; - if (!_isActiveAndTermsOk(license)) return false; - licenseId = license.parentLicenseId; - } - return true; - } - - function _isActiveAndTermsOk(License memory license) view private returns (bool) { - if (address(license.termsProcessor) == address(0)) return license.active; - return license.active && license.termsProcessor.termsExecutedSuccessfully(license.termsData); - } - - function getLicense(uint256 licenseId) public view returns (License memory, address holder) { - return ( - _getRightsManagerStorage().licenses[licenseId], - getLicenseHolder(licenseId) - ); - } - function _beforeTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize + address from_, + address to_, + uint256 firstTokenId_, + uint256 batchSize_ ) internal virtual override { - if (from != address(0)) { - for (uint256 i = firstTokenId; i < batchSize;) { - _verifyRightsTransfer(from, to, i); + if (from_ != address(0)) { + for (uint256 i = firstTokenId_; i < batchSize_;) { + _verifyRightsTransfer(from_, to_, i); unchecked { i++; } } } - super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + super._beforeTokenTransfer(from_, to_, firstTokenId_, batchSize_); } - + function _verifyRightsTransfer( - address from, - address to, - uint256 tokenId + address from_, + address to_, + uint256 tokenId_ ) internal { // TODO: trigger rights transfer check, check granting terms, banned marketplaces, etc. RightsManagerStorage storage $ = _getRightsManagerStorage(); // NOTE: We are assuming a revoked Non Commercial License impedes the transfer of the NFT. // Should revoked commercial rights also impede the transfer? - uint256 licenseId = $.licensesForTokenId[keccak256(abi.encode(false, tokenId))]; - if (licenseId != _UNSET_LICENSE_ID) revert NFTHasNoAssociatedLicense(); // This should not happen, if fired there is a bug somewhere - if (isLicenseActive(licenseId)) revert InactiveLicense(); // NOTE: Should we freeze invalid licenses? burn them? - emit TransferLicense(licenseId, to); + uint256 licenseId = $.licensesForTokenId[keccak256(abi.encode(false, tokenId_))]; + if (licenseId != _UNSET_LICENSE_ID) revert Errors.RightsManager_NFTHasNoAssociatedLicense(); // This should not happen, if fired there is a bug somewhere + if (isLicenseActive(licenseId)) revert Errors.RightsManager_InactiveLicense(); // NOTE: Should we freeze invalid licenses? burn them? + emit TransferLicense(licenseId, to_); } - function _verifyTerms(TermsProcessorConfig memory _terms) private view { - if (address(_terms.processor) != address(0) && - !_terms.processor.supportsInterface(type(ITermsProcessor).interfaceId)) { - revert UnsupportedInterface("ITermsProcessor"); - } + function _isActiveAndTermsOk(Licensing.License memory license_) private view returns (bool) { + if (address(license_.termsProcessor) == address(0)) return license_.active; + return license_.active && license_.termsProcessor.termsExecutedSuccessfully(license_.termsData); } - function getLicenseTokenId( - uint256 _licenseId - ) external view override returns (uint256) { - return _getRightsManagerStorage().licenses[_licenseId].tokenId; - } - - function getParentLicenseId( - uint256 _licenseId - ) external view override returns (uint256) { - return _getRightsManagerStorage().licenses[_licenseId].parentLicenseId; - } - - - function getLicenseHolder( - uint256 _licenseId - ) public view override returns (address) { - RightsManagerStorage storage $ = _getRightsManagerStorage(); - if ($.licenseRegistry.exists(_licenseId)) { - return $.licenseRegistry.ownerOf(_licenseId); - } else { - License storage license = $.licenses[ - _licenseId - ]; - return ownerOf(license.tokenId); + function _verifyTerms(Licensing.TermsProcessorConfig memory terms_) private view { + if (address(terms_.processor) != address(0) && + !terms_.processor.supportsInterface(type(ITermsProcessor).interfaceId)) { + revert Errors.UnsupportedInterface("ITermsProcessor"); } } - function getLicenseURI( - uint256 _licenseId - ) external view override returns (string memory) { - return _getRightsManagerStorage().licenses[_licenseId].uri; - } - - function getLicenseRevoker( - uint256 _licenseId - ) external view override returns (address) { - return _getRightsManagerStorage().licenses[_licenseId].revoker; - } - - function getLicenseIdByTokenId( - uint256 _tokenId, - bool _commercial - ) public view override returns (uint256) { - return - _getRightsManagerStorage().licensesForTokenId[ - keccak256(abi.encode(_commercial, _tokenId)) - ]; - } - - function getLicenseRegistry() external view returns (ILicenseRegistry) { - return _getRightsManagerStorage().licenseRegistry; - } - - function isRootLicense( - uint256 licenseId - ) public view returns (bool) { - return _getRightsManagerStorage().licenses[licenseId].parentLicenseId == _UNSET_LICENSE_ID && isLicenseSet(licenseId); - } - - function isLicenseSet(uint256 licenseId) public view returns (bool) { - return _getRightsManagerStorage().licenses[licenseId].revoker != address(0); - } - - /** - * Since the LicenseRegistry tracks sublicense ownership, this method can only be called by the LicenseRegistry. - * @dev Throws if the license is not active. Basically exists to not break ERC-5218. - * @param licenseId the license to transfer - * @param licenseHolder the new license holder - */ - function transferSublicense( - uint256 licenseId, - address licenseHolder - ) public virtual override(IERC5218) { - RightsManagerStorage storage $ = _getRightsManagerStorage(); - if (msg.sender != address($.licenseRegistry)) revert Unauthorized(); - if (!isLicenseActive(licenseId)) revert InactiveLicense(); - emit TransferLicense(licenseId, licenseHolder); + function _getRightsManagerStorage() + private + pure + returns (RightsManagerStorage storage $) + { + assembly { + $.slot := _STORAGE_LOCATION + } } -} \ No newline at end of file +} diff --git a/contracts/modules/licensing/terms/BaseTermsProcessor.sol b/contracts/modules/licensing/terms/BaseTermsProcessor.sol index 5e2c655a..0d729ad7 100644 --- a/contracts/modules/licensing/terms/BaseTermsProcessor.sol +++ b/contracts/modules/licensing/terms/BaseTermsProcessor.sol @@ -1,51 +1,46 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { ITermsProcessor } from "./ITermsProcessor.sol"; -import { ZeroAddress, Unauthorized } from "contracts/errors/General.sol"; +import { ITermsProcessor } from "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; +import { Errors } from "contracts/lib/Errors.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import { ERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; - -/** - * @title BaseTermsProcessor - * @notice Base contract for licensing terms processors, which encode, decode and execute the terms set on an IERC5218 license parameters, - * in particular the TermsProcessorConfig struct for the terms parameter in createLicense(). - * TermsProcessors need to be deployed once per AUTHORIZED_EXECUTOR, which is usually each Franchise IPAssetRegistry. - * @dev TermsProcessor are intended to be reused accross the protocol, so they should be generic enough to be used by different modules. - * Most will be stateless, and if a terms processor needs to update something license specific, - * it should return the updated encoded data in executeTerms() so it is stored back on the license. - * There could be cases where other methods or state is needed for more complicated flows. - */ +/// @title BaseTermsProcessor +/// @notice Base contract for licensing terms processors, which encode, decode and execute the terms set on an IERC5218 license parameters, +/// in particular the TermsProcessorConfig struct for the terms parameter in createLicense(). +/// TermsProcessors need to be deployed once per AUTHORIZED_EXECUTOR, which is usually each Franchise IPAssetRegistry. +/// @dev TermsProcessor are intended to be reused accross the protocol, so they should be generic enough to be used by different modules. +/// Most will be stateless, and if a terms processor needs to update something license specific, +/// it should return the updated encoded data in executeTerms() so it is stored back on the license. +/// There could be cases where other methods or state is needed for more complicated flows. abstract contract BaseTermsProcessor is ITermsProcessor, ERC165 { address public immutable AUTHORIZED_EXECUTOR; - constructor(address authorizedExecutor) { - if (authorizedExecutor == address(0)) { - revert ZeroAddress(); + constructor(address authorizedExecutor_) { + if (authorizedExecutor_ == address(0)) { + revert Errors.ZeroAddress(); } - AUTHORIZED_EXECUTOR = authorizedExecutor; + AUTHORIZED_EXECUTOR = authorizedExecutor_; } modifier onlyAuthorizedExecutor() { - if(msg.sender != AUTHORIZED_EXECUTOR) revert Unauthorized(); + if(msg.sender != AUTHORIZED_EXECUTOR) revert Errors.Unauthorized(); _; } /// @inheritdoc ITermsProcessor - function executeTerms(bytes calldata data) onlyAuthorizedExecutor external returns(bytes memory newData) { - return _executeTerms(data); + function executeTerms(bytes calldata data_) onlyAuthorizedExecutor external returns(bytes memory newData) { + return _executeTerms(data_); } - /// method defining the actual execution of the terms, with no access control for caller, to be implemented by the child contract - function _executeTerms(bytes calldata data) internal virtual returns (bytes memory newData); - - function supportsInterface( - bytes4 interfaceId + bytes4 interfaceId_ ) public view virtual override(ERC165, IERC165) returns (bool) { - return interfaceId == type(ITermsProcessor).interfaceId || super.supportsInterface(interfaceId); + return interfaceId_ == type(ITermsProcessor).interfaceId || super.supportsInterface(interfaceId_); } -} \ No newline at end of file + /// method defining the actual execution of the terms, with no access control for caller, to be implemented by the child contract + function _executeTerms(bytes calldata data_) internal virtual returns (bytes memory newData); +} diff --git a/contracts/modules/licensing/terms/ITermsProcessor.sol b/contracts/modules/licensing/terms/ITermsProcessor.sol deleted file mode 100644 index 0ad4ab61..00000000 --- a/contracts/modules/licensing/terms/ITermsProcessor.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.19; -import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; - -/** - * @title ITermsProcessor - * @author Raul Martinez - * @notice Interface for licensing terms processors, which encode, decode and execute the terms set on an IERC5218 license parameters, - * in particular the TermsProcessorConfig struct for the terms parameter in createLicense() - */ -interface ITermsProcessor is IERC165 { - - /** - * @notice Executes the terms set on a license on creation. - * This should be called after decodeTerms() - * @return newData the new data to be set on the license - */ - function executeTerms(bytes calldata data) external returns(bytes memory newData); - - /// returns true if the terms have been executed successfully or they don't need to be executed, false otherwise - function termsExecutedSuccessfully(bytes calldata data) external view returns(bool); - -} \ No newline at end of file diff --git a/contracts/modules/licensing/terms/MultiTermsProcessor.sol b/contracts/modules/licensing/terms/MultiTermsProcessor.sol index 02eebf3a..facdaafa 100644 --- a/contracts/modules/licensing/terms/MultiTermsProcessor.sol +++ b/contracts/modules/licensing/terms/MultiTermsProcessor.sol @@ -1,19 +1,16 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { ITermsProcessor } from "./ITermsProcessor.sol"; +import { ITermsProcessor } from "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; import { BaseTermsProcessor } from "./BaseTermsProcessor.sol"; -import { EmptyArray, LengthMismatch } from "contracts/errors/General.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -/** - * NOTE: this contract is not tested yet, do not use. - * @title MultiTermsProcessor - * @author Raul Martinez - * @notice Contract that allow to compose multiple terms processors into one, to allow for complex license arrangements. - * Either all processors are executed successfully, or none are. - */ +/// NOTE: this contract is not tested yet, do not use. +/// @title MultiTermsProcessor +/// @author Raul Martinez +/// @notice Contract that allow to compose multiple terms processors into one, to allow for complex license arrangements. +/// Either all processors are executed successfully, or none are. contract MultiTermsProcessor is BaseTermsProcessor { - error TooManyTermsProcessors(); event ProcessorsSet(ITermsProcessor[] processors); @@ -22,70 +19,67 @@ contract MultiTermsProcessor is BaseTermsProcessor { /// arbitrary limit to avoid gas limit issues. If the processors are complex, gas DOS might be reached anyway. uint256 public constant MAX_PROCESSORS = 50; - constructor(address authorizedExecutor, ITermsProcessor[] memory _processors) BaseTermsProcessor(authorizedExecutor) { - _setProcessors(_processors); + constructor(address authorizedExecutor_, ITermsProcessor[] memory processors_) BaseTermsProcessor(authorizedExecutor_) { + _setProcessors(processors_); } - /// Sets the processors to be executed in order. - function _setProcessors(ITermsProcessor[] memory _processors) private { - if (_processors.length == 0) revert EmptyArray(); - if (_processors.length > MAX_PROCESSORS) - revert TooManyTermsProcessors(); - processors = _processors; - emit ProcessorsSet(_processors); - } - - /** - * Decode the data into an array of bytes with length == processors length, and execute each processor in order. - * Encode the results into a new array of bytes and return it. - * @param data must be decodable into an array of bytes with length == processors length. - * @return newData the encoded bytes array with the results of each processor execution. - */ - function _executeTerms(bytes calldata data) internal override returns (bytes memory newData) { + /// Checks if all the terms are executed, in order. If one fails, it returns false. + function termsExecutedSuccessfully(bytes calldata data_) external view override returns (bool) { uint256 length = processors.length; bytes[] memory encodedTerms = new bytes[](length); - encodedTerms = abi.decode(data, (bytes[])); - bytes[] memory newEncodedTerms = new bytes[](length); + encodedTerms = abi.decode(data_, (bytes[])); + bool result = true; for (uint256 i = 0; i < length;) { - newEncodedTerms[i] = processors[i].executeTerms(encodedTerms[i]); + result = result && processors[i].termsExecutedSuccessfully(encodedTerms[i]); unchecked { i++; } } - return abi.encode(newEncodedTerms); + return result; } /// ERC165 interface support, but for ITermsProcessor it only returns true if only all processors support the interface. function supportsInterface( - bytes4 interfaceId + bytes4 interfaceId_ ) public view override returns (bool) { bool supported = true; - if (interfaceId == type(ITermsProcessor).interfaceId) { + if (interfaceId_ == type(ITermsProcessor).interfaceId) { uint256 length = processors.length; for (uint256 i = 0; i < length;) { - supported && processors[i].supportsInterface(interfaceId); + supported && processors[i].supportsInterface(interfaceId_); unchecked { i++; } } return supported; } - return super.supportsInterface(interfaceId); + return super.supportsInterface(interfaceId_); } - /// Checks if all the terms are executed, in order. If one fails, it returns false. - function termsExecutedSuccessfully(bytes calldata data) external view override returns (bool) { + /// Decode the data into an array of bytes with length == processors length, and execute each processor in order. + /// Encode the results into a new array of bytes and return it. + /// @param data_ must be decodable into an array of bytes with length == processors length. + /// @return newData the encoded bytes array with the results of each processor execution. + function _executeTerms(bytes calldata data_) internal override returns (bytes memory newData) { uint256 length = processors.length; bytes[] memory encodedTerms = new bytes[](length); - encodedTerms = abi.decode(data, (bytes[])); - bool result = true; + encodedTerms = abi.decode(data_, (bytes[])); + bytes[] memory newEncodedTerms = new bytes[](length); for (uint256 i = 0; i < length;) { - result = result && processors[i].termsExecutedSuccessfully(encodedTerms[i]); + newEncodedTerms[i] = processors[i].executeTerms(encodedTerms[i]); unchecked { i++; } } - return result; + return abi.encode(newEncodedTerms); } -} \ No newline at end of file + /// Sets the processors to be executed in order. + function _setProcessors(ITermsProcessor[] memory processors_) private { + if (processors_.length == 0) revert Errors.EmptyArray(); + if (processors_.length > MAX_PROCESSORS) + revert Errors.MultiTermsProcessor_TooManyTermsProcessors(); + processors = processors_; + emit ProcessorsSet(processors_); + } +} diff --git a/contracts/modules/licensing/terms/TimeTermsProcessor.sol b/contracts/modules/licensing/terms/TimeTermsProcessor.sol index 8900b4f6..afd93b14 100644 --- a/contracts/modules/licensing/terms/TimeTermsProcessor.sol +++ b/contracts/modules/licensing/terms/TimeTermsProcessor.sol @@ -4,35 +4,33 @@ pragma solidity ^0.8.19; import { BaseTermsProcessor } from "./BaseTermsProcessor.sol"; import { LibDuration } from "../../timing/LibDuration.sol"; -/** - * @title TimeTermsProcessor - * @author Raul Martinez - * @notice Processor to set time limits to Licenses up to a Time To Live (TTL). It has 2 modes of operation: - * 1- Timer starts on a specific date set on License creation, and ends after a certain amount of time. - * To do this, set startTime to a timestemp when encoding the terms in createLicense(). - * 2- Timer starts on License execution, and ends after a certain amount of time. - * To do this, set startTime to LibDuration.START_TIME_NOT_SET (0) when encoding the terms in createLicense(). - * The processor will set the startTime to the block.timestamp when the terms are executed. - * Use case for this would be to indicate "this license is valid within 1 year after the first time it is used" - */ + +/// @title TimeTermsProcessor +/// @author Raul Martinez +/// @notice Processor to set time limits to Licenses up to a Time To Live (TTL). It has 2 modes of operation: +/// 1- Timer starts on a specific date set on License creation, and ends after a certain amount of time. +/// To do this, set startTime to a timestemp when encoding the terms in createLicense(). +/// 2- Timer starts on License execution, and ends after a certain amount of time. +/// To do this, set startTime to LibDuration.START_TIME_NOT_SET (0) when encoding the terms in createLicense(). +/// The processor will set the startTime to the block.timestamp when the terms are executed. +/// Use case for this would be to indicate "this license is valid within 1 year after the first time it is used" contract TimeTermsProcessor is BaseTermsProcessor { using LibDuration for LibDuration.TimeConfig; - constructor(address authorizedExecutor) BaseTermsProcessor(authorizedExecutor) {} + constructor(address authorizedExecutor_) BaseTermsProcessor(authorizedExecutor_) {} + + /// returns true if the current block.timestamp is within the start and start + ttl, false otherwise + function termsExecutedSuccessfully(bytes calldata data_) external view override returns (bool) { + LibDuration.TimeConfig memory config = abi.decode(data_, (LibDuration.TimeConfig)); + return config.isActive(); + } /// If startTime is not set, set it to block.timestamp and return the new encoded data. If startTime is set, return the same data. - function _executeTerms(bytes calldata data) internal virtual override returns (bytes memory newData) { - LibDuration.TimeConfig memory config = abi.decode(data, (LibDuration.TimeConfig)); + function _executeTerms(bytes calldata data_) internal virtual override returns (bytes memory newData) { + LibDuration.TimeConfig memory config = abi.decode(data_, (LibDuration.TimeConfig)); if (config.startTime == LibDuration.START_TIME_NOT_SET) { config.startTime = uint64(block.timestamp); } return abi.encode(config); } - - /// returns true if the current block.timestamp is within the start and start + ttl, false otherwise - function termsExecutedSuccessfully(bytes calldata data) external view override returns (bool) { - LibDuration.TimeConfig memory config = abi.decode(data, (LibDuration.TimeConfig)); - return config.isActive(); - } - -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/IRelationshipModule.sol b/contracts/modules/relationships/IRelationshipModule.sol deleted file mode 100644 index 0db19373..00000000 --- a/contracts/modules/relationships/IRelationshipModule.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.13; - -import { IRelationshipProcessor } from "./processors/IRelationshipProcessor.sol"; -import { IPAsset } from "contracts/IPAsset.sol"; - - -interface IRelationshipModule { - - event RelationSet( - address sourceContract, - uint256 sourceId, - address destContract, - uint256 destId, - bytes32 indexed relationshipId, - uint256 endTime - ); - event RelationUnset( - address sourceContract, - uint256 sourceId, - address destContract, - uint256 destId, - bytes32 indexed relationshipId - ); - event RelationPendingProcessor( - address sourceContract, - uint256 sourceId, - address destContract, - uint256 destId, - bytes32 indexed relationshipId - ); - - event RelationshipConfigSet( - string name, - bytes32 indexed relationshipId, - uint256 sourceIPAssetTypeMask, - uint256 destIPAssetTypeMask, - bool onlySameFranchise, - address processor, - uint256 maxTTL, - uint256 minTTL, - bool renewable - ); - - event RelationshipConfigUnset(bytes32 indexed relationshipId); - - error NonExistingRelationship(); - error IntentAlreadyRegistered(); - error UnsupportedRelationshipSrc(); - error UnsupportedRelationshipDst(); - error CannotRelateToOtherFranchise(); - error InvalidTTL(); - error InvalidEndTimestamp(); - - struct TimeConfig { - uint112 maxTTL; - uint112 minTTL; - bool renewable; - } - - struct RelationshipConfig { - uint256 sourceIPAssetTypeMask; - uint256 destIPAssetTypeMask; - bool onlySameFranchise; - IRelationshipProcessor processor; - address disputer; - TimeConfig timeConfig; - } - - struct SetRelationshipConfigParams { - IPAsset[] sourceIPAssets; - bool allowedExternalSource; - IPAsset[] destIPAssets; - bool allowedExternalDest; - bool onlySameFranchise; - address processor; - address disputer; - TimeConfig timeConfig; - } - - struct RelationshipParams { - address sourceContract; - uint256 sourceId; - address destContract; - uint256 destId; - bytes32 relationshipId; - uint256 ttl; - } - - function relate(RelationshipParams calldata params, bytes calldata data) external; - function unrelate(RelationshipParams calldata params) external; - function areTheyRelated(RelationshipParams calldata params) external view returns (bool); - function isRelationshipExpired(RelationshipParams calldata params) external view returns (bool); - function setRelationshipConfig(string calldata name, SetRelationshipConfigParams calldata params) external returns(bytes32 relationshipId); - function getRelationshipId(string calldata name) external view returns (bytes32); - function unsetRelationshipConfig(bytes32 relationshipId) external; - function getRelationshipConfig(bytes32 relationshipId) external view returns (RelationshipConfig memory); - function getRelationshipConfigDecoded(bytes32 relationshipId) external view returns (SetRelationshipConfigParams memory); -} \ No newline at end of file diff --git a/contracts/modules/relationships/LibIPAssetMask.sol b/contracts/modules/relationships/LibIPAssetMask.sol index 030ed897..13756db4 100644 --- a/contracts/modules/relationships/LibIPAssetMask.sol +++ b/contracts/modules/relationships/LibIPAssetMask.sol @@ -1,83 +1,75 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -import { IPAsset, EXTERNAL_ASSET } from "contracts/IPAsset.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { LibIPAssetId } from "contracts/ip-assets/LibIPAssetId.sol"; -import { IIPAssetRegistry } from "contracts/ip-assets/IIPAssetRegistry.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { IIPAssetRegistry } from "contracts/interfaces/ip-assets/IIPAssetRegistry.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -/** - * @title LibIPAssetMask - * @dev Gives tools to check if the "endpoints" of a relationship are valid, according to the allowed asset types set in the relationship config. - */ +/// @title LibIPAssetMask +/// @dev Gives tools to check if the "endpoints" of a relationship are valid, according to the allowed asset types set in the relationship config. library LibIPAssetMask { - error InvalidIPAssetArray(); - - /** - * @dev converts an array of IPAssets types and the allows external flag to a mask, by setting the bits corresponding - * to the uint8 equivalent of the IPAsset types to 1. - * @param ipAssets The array of IPAsset types - * @param allowsExternal Whether the relationship config allows external (non SP ERC721) assets - * @return mask The mask representing the IPAsset types and the allows external flag - */ - function _convertToMask(IPAsset[] calldata ipAssets, bool allowsExternal) internal pure returns (uint256) { - if (ipAssets.length == 0) revert InvalidIPAssetArray(); + /// @dev converts an array of IPAssets types and the allows external flag to a mask, by setting the bits corresponding + /// to the uint8 equivalent of the IPAsset types to 1. + /// @param ipAssets_ The array of IPAsset types + /// @param allowsExternal_ Whether the relationship config allows external (non SP ERC721) assets + /// @return mask The mask representing the IPAsset types and the allows external flag + function _convertToMask(IPAsset.IPAssetType[] calldata ipAssets_, bool allowsExternal_) internal pure returns (uint256) { + if (ipAssets_.length == 0) revert Errors.IPAsset_InvalidIPAssetArray(); uint256 mask = 0; - for (uint256 i = 0; i < ipAssets.length;) { - if (ipAssets[i] == IPAsset.UNDEFINED) revert InvalidIPAssetArray(); - mask |= 1 << (uint256(ipAssets[i]) & 0xff); + for (uint256 i = 0; i < ipAssets_.length;) { + if (ipAssets_[i] == IPAsset.IPAssetType.UNDEFINED) revert Errors.IPAsset_InvalidIPAssetArray(); + mask |= 1 << (uint256(ipAssets_[i]) & 0xff); unchecked { i++; } } - if (allowsExternal) { - mask |= uint256(EXTERNAL_ASSET) << 248; + if (allowsExternal_) { + mask |= uint256(IPAsset.EXTERNAL_ASSET) << 248; } return mask; } - /** - * @dev converts a mask to an array of IPAsset types and the allows external flag, by checking the bits corresponding - * to the uint8 equivalent of the IPAsset types. - * NOTE: Caller must ignore the array elements of value 0 - * @param mask The mask representing the IPAsset types and the allows external flag - * @return ipAssets The array of IPAsset types. NOTE: Ignore the array elements of value 0 - * @return allowsExternal Whether the relationship config allows external (non SP ERC721) assets - */ - function _convertFromMask(uint256 mask) internal pure returns (IPAsset[] memory ipAssets, bool allowsExternal) { - ipAssets = new IPAsset[](8); + + /// @dev converts a mask to an array of IPAsset types and the allows external flag, by checking the bits corresponding + /// to the uint8 equivalent of the IPAsset types. + /// NOTE: Caller must ignore the array elements of value 0 + /// @param mask_ The mask representing the IPAsset types and the allows external flag + /// @return ipAssets The array of IPAsset types. NOTE: Ignore the array elements of value 0 + /// @return allowsExternal Whether the relationship config allows external (non SP ERC721) assets + function _convertFromMask(uint256 mask_) internal pure returns (IPAsset.IPAssetType[] memory ipAssets, bool allowsExternal) { + ipAssets = new IPAsset.IPAssetType[](8); uint256 index = 0; for (uint256 i = 1; i < 8; i++) { - if (mask & (1 << i) != 0) { - ipAssets[index] = IPAsset(i); + if (mask_ & (1 << i) != 0) { + ipAssets[index] = IPAsset.IPAssetType(i); index++; } } - allowsExternal = mask & (1 << 248) != 0; + allowsExternal = mask_ & (1 << 248) != 0; return (ipAssets, allowsExternal); } /// returns true if the asset type is supported by the mask, false otherwise - function _supportsIPAssetType(uint256 mask, uint8 assetType) internal pure returns (bool) { - return mask & (1 << (uint256(assetType) & 0xff)) != 0; + function _supportsIPAssetType(uint256 mask_, uint8 assetType_) internal pure returns (bool) { + return mask_ & (1 << (uint256(assetType_) & 0xff)) != 0; } - /** - * @dev checks if the asset type of the asset is supported by the mask - * @param isAssetRegistry Whether the asset is an SP asset registry or an external asset - * @param assetId The asset id - * @param assetTypeMask The mask representing the IPAsset types and the allows external flag - * @return result true if mask test passes, false otherwise - */ - function _checkRelationshipNode(bool isAssetRegistry, uint256 assetId, uint256 assetTypeMask) internal pure returns (bool result) { - if (isAssetRegistry) { - result = LibIPAssetMask._supportsIPAssetType(assetTypeMask, uint8(LibIPAssetId._ipAssetTypeFor(assetId))); + + /// @dev checks if the asset type of the asset is supported by the mask + /// @param isAssetRegistry_ Whether the asset is an SP asset registry or an external asset + /// @param assetId_ The asset id + /// @param assetTypeMask_ The mask representing the IPAsset types and the allows external flag + /// @return result true if mask test passes, false otherwise + function _checkRelationshipNode(bool isAssetRegistry_, uint256 assetId_, uint256 assetTypeMask_) internal pure returns (bool result) { + if (isAssetRegistry_) { + result = LibIPAssetMask._supportsIPAssetType(assetTypeMask_, uint8(IPAsset._ipAssetTypeFor(assetId_))); } else { - result = LibIPAssetMask._supportsIPAssetType(assetTypeMask, EXTERNAL_ASSET); + result = LibIPAssetMask._supportsIPAssetType(assetTypeMask_, IPAsset.EXTERNAL_ASSET); } return result; } -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/ProtocolRelationshipModule.sol b/contracts/modules/relationships/ProtocolRelationshipModule.sol index 13b7a639..3e2d7e67 100644 --- a/contracts/modules/relationships/ProtocolRelationshipModule.sol +++ b/contracts/modules/relationships/ProtocolRelationshipModule.sol @@ -2,36 +2,35 @@ pragma solidity ^0.8.13; import { RelationshipModuleBase } from "./RelationshipModuleBase.sol"; -import { UPGRADER_ROLE, RELATIONSHIP_MANAGER_ROLE } from "contracts/access-control/ProtocolRoles.sol"; - -/** - * @title ProtocolRelationshipModule - * @dev Implementation of RelationshipModuleBase that allows relationship configs that will be used protocol wide. - * The meaning and parameters of the relationships are to be defined in Story Protocol Improvement Proposals. - * Example: https://github.com/storyprotocol/protocol-contracts/issues/33 - * The relationship configs are set by the RELATIONSHIP_MANAGER_ROLE. - * Upgrades are done by the UPGRADER_ROLE. - */ +import { AccessControl } from "contracts/lib/AccessControl.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; + +/// @title ProtocolRelationshipModule +/// @dev Implementation of RelationshipModuleBase that allows relationship configs that will be used protocol wide. +/// The meaning and parameters of the relationships are to be defined in Story Protocol Improvement Proposals. +/// Example: https://github.com/storyprotocol/protocol-contracts/issues/33 +/// The relationship configs are set by the RELATIONSHIP_MANAGER_ROLE. +/// Upgrades are done by the UPGRADER_ROLE. contract ProtocolRelationshipModule is RelationshipModuleBase { - constructor(address _franchiseRegistry) RelationshipModuleBase(_franchiseRegistry) {} + constructor(address franchiseRegistry_) RelationshipModuleBase(franchiseRegistry_) {} - function initialize(address accessControl) public initializer { - __RelationshipModuleBase_init(accessControl); + function initialize(address accessControl_) public initializer { + __RelationshipModuleBase_init(accessControl_); } /********* Setting Relationships *********/ - function setRelationshipConfig(string calldata name, SetRelationshipConfigParams calldata params) external onlyRole(RELATIONSHIP_MANAGER_ROLE) returns (bytes32 relationshipId) { - return _setRelationshipConfig(name, params); + function setRelationshipConfig(string calldata name_, Relationship.SetRelationshipConfigParams calldata params_) external onlyRole(AccessControl.RELATIONSHIP_MANAGER_ROLE) returns (bytes32 relationshipId) { + return _setRelationshipConfig(name_, params_); } - function unsetRelationshipConfig(bytes32 relationshipId) external onlyRole(RELATIONSHIP_MANAGER_ROLE) { - _unsetRelationshipConfig(relationshipId); + function unsetRelationshipConfig(bytes32 relationshipId_) external onlyRole(AccessControl.RELATIONSHIP_MANAGER_ROLE) { + _unsetRelationshipConfig(relationshipId_); } function _authorizeUpgrade( - address newImplementation - ) internal virtual override onlyRole(UPGRADER_ROLE) {} + address newImplementation_ + ) internal virtual override onlyRole(AccessControl.UPGRADER_ROLE) {} -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/RelationshipModuleBase.sol b/contracts/modules/relationships/RelationshipModuleBase.sol index 017dc750..7fcf8e50 100644 --- a/contracts/modules/relationships/RelationshipModuleBase.sol +++ b/contracts/modules/relationships/RelationshipModuleBase.sol @@ -7,30 +7,28 @@ import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol"; import { AccessControlledUpgradeable } from "contracts/access-control/AccessControlledUpgradeable.sol"; import { ZeroAddress, UnsupportedInterface, Unauthorized } from "contracts/errors/General.sol"; import { FranchiseRegistry } from "contracts/FranchiseRegistry.sol"; -import { IIPAssetRegistry } from "contracts/ip-assets/IIPAssetRegistry.sol"; -import { LibIPAssetId } from "contracts/ip-assets/LibIPAssetId.sol"; -import { IPAsset } from "contracts/IPAsset.sol"; +import { IIPAssetRegistry } from "contracts/interfaces/ip-assets/IIPAssetRegistry.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; import { LibIPAssetMask } from "./LibIPAssetMask.sol"; -import { IRelationshipModule } from "./IRelationshipModule.sol"; -import { IRelationshipProcessor } from "./processors/IRelationshipProcessor.sol"; +import { IRelationshipModule } from "contracts/interfaces/modules/relationships/IRelationshipModule.sol"; +import { IRelationshipProcessor } from "contracts/interfaces/modules/relationships/processors/IRelationshipProcessor.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; - -/** - * @title RelationshipModuleBase - * @author Raul Martinez - * @notice The relationship module is responsible for managing relationships between IP assets, and/or between them and external ERC721 contracts. - * Relationships are defined by a relationship ID, which is a bytes32 value that represents a relationship type, for example (APPEARS_IN, CONTINUES_STORY, etc). - * The meaning of each relationship may have different side effects in Story Protocol, which could other modules could react on, and even legal implications if - * especified by the IPAsset licenses. - * To be able to relate two elements, a RelationshipConfig must be set for the relationship ID, which defines the following: - * - The IPAsset types that can be related as source and destination. - * - The processor that will be called when a relationship is set, which can be used to perform additional checks or actions (checking ownership, asking for fees...). - * - The disputer, which is the address that can unset a relationship. - * - The time config, which defines the maximum and minimum TTL (time to live) for the relationship, and if it can be renewed. (maxTTL = 0 means no expiration) - * - If the relationship can only be set between IPAssets of the same franchise, or it could link to IPAssets of other franchises. - * - * It's up to subclasses to define which addresses can set relationship configs. - */ +/// @title RelationshipModuleBase +/// @author Raul Martinez +/// @notice The relationship module is responsible for managing relationships between IP assets, and/or between them and external ERC721 contracts. +/// Relationships are defined by a relationship ID, which is a bytes32 value that represents a relationship type, for example (APPEARS_IN, CONTINUES_STORY, etc). +/// The meaning of each relationship may have different side effects in Story Protocol, which could other modules could react on, and even legal implications if +/// especified by the IPAsset licenses. +/// To be able to relate two elements, a RelationshipConfig must be set for the relationship ID, which defines the following: +/// - The IPAsset types that can be related as source and destination. +/// - The processor that will be called when a relationship is set, which can be used to perform additional checks or actions (checking ownership, asking for fees...). +/// - The disputer, which is the address that can unset a relationship. +/// - The time config, which defines the maximum and minimum TTL (time to live) for the relationship, and if it can be renewed. (maxTtl = 0 means no expiration) +/// - If the relationship can only be set between IPAssets of the same franchise, or it could link to IPAssets of other franchises. +/// +/// It's up to subclasses to define which addresses can set relationship configs. abstract contract RelationshipModuleBase is IRelationshipModule, AccessControlledUpgradeable, Multicall { using ERC165CheckerUpgradeable for address; @@ -38,287 +36,259 @@ abstract contract RelationshipModuleBase is IRelationshipModule, AccessControlle struct RelationshipModuleStorage { mapping(bytes32 => bool) relationships; mapping(bytes32 => uint256) relationshipExpirations; - mapping(bytes32 => RelationshipConfig) relConfigs; + mapping(bytes32 => Relationship.RelationshipConfig) relConfigs; } // keccak256(bytes.concat(bytes32(uint256(keccak256("story-protocol.relationship-module.storage")) - 1))) bytes32 private constant _STORAGE_LOCATION = 0xd16687d5cf786234491b4cc484b2a64f24855aadee9b1b73824db1ed2840fd0b; FranchiseRegistry public immutable FRANCHISE_REGISTRY; - /** - * reverts if the TTL is not well configured for the relationship. - * @param params the relationship params - */ - modifier onlyValidTTL(RelationshipParams calldata params) { - RelationshipConfig storage relConfig = _getRelationshipModuleStorage().relConfigs[params.relationshipId]; - if (relConfig.timeConfig.maxTTL != 0 && params.ttl != 0) { - if (params.ttl > relConfig.timeConfig.maxTTL || params.ttl < relConfig.timeConfig.minTTL) revert InvalidEndTimestamp(); + + /// reverts if the TTL is not well configured for the relationship. + /// @param params_ the relationship params + modifier onlyValidTTL(Relationship.RelationshipParams calldata params_) { + Relationship.RelationshipConfig storage relConfig = _getRelationshipModuleStorage().relConfigs[params_.relationshipId]; + if (relConfig.timeConfig.maxTtl != 0 && params_.ttl != 0) { + if (params_.ttl > relConfig.timeConfig.maxTtl || params_.ttl < relConfig.timeConfig.minTtl) revert Errors.RelationshipModule_InvalidEndTimestamp(); } _; } - constructor(address _franchiseRegistry) { - if (_franchiseRegistry == address(0)) revert ZeroAddress(); - FRANCHISE_REGISTRY = FranchiseRegistry(_franchiseRegistry); + constructor(address franchiseRegistry_) { + if (franchiseRegistry_ == address(0)) revert Errors.ZeroAddress(); + FRANCHISE_REGISTRY = FranchiseRegistry(franchiseRegistry_); _disableInitializers(); } - function __RelationshipModuleBase_init(address accessControl) public initializer { - __AccessControlledUpgradeable_init(accessControl); - } - - function _getRelationshipModuleStorage() - private - pure - returns (RelationshipModuleStorage storage $) - { - assembly { - $.slot := _STORAGE_LOCATION - } - } - - /** - * @notice Relates two IPAssets or an IPAsset and an external ERC721 contract. - * To not revert, the params must be valid according to the relationship config, and the processor must not revert. - * Processor can be used to perform additional checks or actions (checking ownership, asking for fees...). - * Processors returning false imply that the relationship is pending (multi step process), and the relationship will not be set yet. - * @param params the relationship params - * @param data optional data that will be passed to the processor - */ - function relate(RelationshipParams calldata params, bytes calldata data) external onlyValidTTL(params) { + /// @notice Relates two IPAssets or an IPAsset and an external ERC721 contract. + /// To not revert, the params must be valid according to the relationship config, and the processor must not revert. + /// Processor can be used to perform additional checks or actions (checking ownership, asking for fees...). + /// Processors returning false imply that the relationship is pending (multi step process), and the relationship will not be set yet. + /// @param params_ the relationship params + /// @param data_ optional data that will be passed to the processor + function relate(Relationship.RelationshipParams calldata params_, bytes calldata data_) external onlyValidTTL(params_) { RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); - RelationshipConfig storage relConfig = $.relConfigs[params.relationshipId]; - _verifyRelationshipParams(params, relConfig); - - if (!relConfig.processor.processRelationship(params, data, msg.sender)) { - emit RelationPendingProcessor(params.sourceContract, params.sourceId, params.destContract, params.destId, params.relationshipId); + Relationship.RelationshipConfig storage relConfig = $.relConfigs[params_.relationshipId]; + _verifyRelationshipParams(params_, relConfig); + + if (!relConfig.processor.processRelationship(params_, data_, msg.sender)) { + emit RelationPendingProcessor(params_.sourceContract, params_.sourceId, params_.destContract, params_.destId, params_.relationshipId); } else { - bytes32 relKey = getRelationshipKey(params); + bytes32 relKey = getRelationshipKey(params_); $.relationships[relKey] = true; - uint256 endTime = _updateEndTime(relKey, relConfig.timeConfig, params.ttl); - emit RelationSet(params.sourceContract, params.sourceId, params.destContract, params.destId, params.relationshipId, endTime); + uint256 endTime = _updateEndTime(relKey, relConfig.timeConfig, params_.ttl); + emit RelationSet(params_.sourceContract, params_.sourceId, params_.destContract, params_.destId, params_.relationshipId, endTime); } } - /** - * @notice Updates the end time of a relationship, if TimeConfig allows it. - * @param relKey the relationship key, given by getRelationshipKey(params) - * @param timeConfig the relationship time config - * @param ttl the new ttl - * @return the new end time - */ - function _updateEndTime(bytes32 relKey, TimeConfig memory timeConfig, uint256 ttl) private returns (uint256) { + /// @notice Unrelates two IPAssets or an IPAsset and an external ERC721 contract. + /// Only callable by the disputer of the relationship, as defined in the relationship config. + /// @param params_ the relationship params + function unrelate(Relationship.RelationshipParams calldata params_) external { RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); - if (timeConfig.maxTTL != 0) { - uint256 endTime = $.relationshipExpirations[relKey]; - if (endTime == 0 || timeConfig.renewable) { - endTime = block.timestamp + ttl; - $.relationshipExpirations[relKey] = endTime; - return endTime; - } - } - return 0; + if ($.relConfigs[params_.relationshipId].disputer != msg.sender) revert Errors.Unauthorized(); + bytes32 key = getRelationshipKey(params_); + if (!$.relationships[key]) revert Errors.RelationshipModule_NonExistingRelationship(); + delete $.relationships[key]; + emit RelationUnset(params_.sourceContract, params_.sourceId, params_.destContract, params_.destId, params_.relationshipId); } - /** - * @notice Unrelates two IPAssets or an IPAsset and an external ERC721 contract. - * Only callable by the disputer of the relationship, as defined in the relationship config. - * @param params the relationship params - */ - function unrelate(RelationshipParams calldata params) external { + + /// @notice Checks if two IPAssets or an IPAsset and an external ERC721 contract are related. + /// @param params_ the relationship params + /// @return true if they are related and the relationship has not expired, false otherwise + function areTheyRelated(Relationship.RelationshipParams calldata params_) external view returns (bool) { RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); - if ($.relConfigs[params.relationshipId].disputer != msg.sender) revert Unauthorized(); - bytes32 key = getRelationshipKey(params); - if (!$.relationships[key]) revert NonExistingRelationship(); - delete $.relationships[key]; - emit RelationUnset(params.sourceContract, params.sourceId, params.destContract, params.destId, params.relationshipId); + return $.relationships[getRelationshipKey(params_)] && !isRelationshipExpired(params_); } - /** - * @notice Checks if two IPAssets or an IPAsset and an external ERC721 contract are related. - * @param params the relationship params - * @return true if they are related and the relationship has not expired, false otherwise - */ - function areTheyRelated(RelationshipParams calldata params) external view returns (bool) { - RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); - return $.relationships[getRelationshipKey(params)] && !isRelationshipExpired(params); + /// @dev convenience method to return a SetRelationshipConfigParams from a relationshipId, or an empty one if it doesn't exist + /// NOTE: Caller must ignore the array elements of value 0 in the IPAsset arrays + /// @param relationshipId_ the relationship ID + function getRelationshipConfigDecoded(bytes32 relationshipId_) external view returns(Relationship.SetRelationshipConfigParams memory) { + Relationship.RelationshipConfig memory relConfig = getRelationshipConfig(relationshipId_); + (IPAsset.IPAssetType[] memory sourceIpAssets, bool sourceSupportsExternal) = LibIPAssetMask._convertFromMask(relConfig.sourceIpAssetTypeMask); + (IPAsset.IPAssetType[] memory destIpAssets, bool destSupportsExternal) = LibIPAssetMask._convertFromMask(relConfig.destIpAssetTypeMask); + return Relationship.SetRelationshipConfigParams( + sourceIpAssets, + sourceSupportsExternal, + destIpAssets, + destSupportsExternal, + relConfig.onlySameFranchise, + address(relConfig.processor), + relConfig.disputer, + relConfig.timeConfig + ); + } + + /********* Mask Helpers *********/ + + /// @dev converts an array of IPAssets types and the allows external flag to a mask, by setting the bits corresponding + /// to the uint8 equivalent of the IPAsset types to 1. + /// @param ipAssets_ The array of IPAsset types + /// @param allowsExternal_ Whether the relationship config allows external (non SP ERC721) assets + /// @return mask The mask representing the IPAsset types and the allows external flag + function convertToMask(IPAsset.IPAssetType[] calldata ipAssets_, bool allowsExternal_) external pure returns (uint256) { + return LibIPAssetMask._convertToMask(ipAssets_, allowsExternal_); } - /** - * @notice Checks if a relationship has expired. - * @param params the relationship params - * @return true if the relationship has expired, false if not expired or if it has no expiration - */ - function isRelationshipExpired(RelationshipParams calldata params) public view returns (bool) { + /// @dev converts a mask to an array of IPAsset types and the allows external flag, by checking the bits corresponding + /// to the uint8 equivalent of the IPAsset types. + /// @param mask_ The mask representing the IPAsset types and the allows external flag + /// @return ipAssets The array of IPAsset types + /// @return allowsExternal Whether the relationship config allows external (non SP ERC721) assets + function convertFromMask(uint256 mask_) external pure returns (IPAsset.IPAssetType[] memory ipAssets, bool allowsExternal) { + return LibIPAssetMask._convertFromMask(mask_); + } + + /// returns true if the asset type is supported by the mask, false otherwise + function supportsIPAssetType(uint256 mask_, uint8 assetType_) external pure returns (bool) { + return LibIPAssetMask._supportsIPAssetType(mask_, assetType_); + } + + function __RelationshipModuleBase_init(address accessControl_) public initializer { + __AccessControlledUpgradeable_init(accessControl_); + } + + /// @notice Checks if a relationship has expired. + /// @param params_ the relationship params + /// @return true if the relationship has expired, false if not expired or if it has no expiration + function isRelationshipExpired(Relationship.RelationshipParams calldata params_) public view returns (bool) { RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); - uint256 endTime = $.relationshipExpirations[getRelationshipKey(params)]; + uint256 endTime = $.relationshipExpirations[getRelationshipKey(params_)]; return endTime != 0 && endTime < block.timestamp; } - /** - * @notice validates the relationship params according to the relationship config. - * @param params the relationship params - * @param relConfig the relationship config - */ - function _verifyRelationshipParams(RelationshipParams calldata params, RelationshipConfig memory relConfig) private view { - if (relConfig.sourceIPAssetTypeMask == 0) revert NonExistingRelationship(); - (bool sourceResult, bool sourceIsAssetRegistry) = _checkRelationshipNode(params.sourceContract, params.sourceId, relConfig.sourceIPAssetTypeMask); - if (!sourceResult) revert UnsupportedRelationshipSrc(); - (bool destResult, bool destIsAssetRegistry) = _checkRelationshipNode(params.destContract, params.destId, relConfig.destIPAssetTypeMask); - if (!destResult) revert UnsupportedRelationshipDst(); - if(sourceIsAssetRegistry && destIsAssetRegistry && params.sourceContract != params.destContract && relConfig.onlySameFranchise) revert CannotRelateToOtherFranchise(); + /// returns a RelationshipConfig for the given relationshipId, or an empty one if it doesn't exist + function getRelationshipConfig(bytes32 relationshipId_) public view returns (Relationship.RelationshipConfig memory) { + RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); + return $.relConfigs[relationshipId_]; } - - /** - * @dev Checks if the source or destination type of a relationship is allowed by the relationship config. - * @param collection The address of the collection of the relationship endpoint - * @param id The id of the relationship endpoint - * @param assetTypeMask The asset type mask of the relationship config, which contains the allowed asset types and the external asset flag - * @return result Whether the relationship endpoint is valid - * @return isAssetRegistry Whether the relationship endpoint is a Story Protocol IP Asset Registry - */ - function _checkRelationshipNode(address collection, uint256 id, uint256 assetTypeMask) private view returns (bool result, bool isAssetRegistry) { - if (IERC721(collection).ownerOf(id) == address(0)) return (false, false); - isAssetRegistry = FRANCHISE_REGISTRY.isIpAssetRegistry(collection); - return (LibIPAssetMask._checkRelationshipNode(isAssetRegistry, id, assetTypeMask), isAssetRegistry); + function getRelationshipId(string calldata name_) public pure returns (bytes32) { + return keccak256(abi.encode(name_)); } /// calculates the relationship key by keccak256 hashing srcContract, srcId, dstContract, dstId and relationshipId - function getRelationshipKey(RelationshipParams calldata params) public pure returns (bytes32) { + function getRelationshipKey(Relationship.RelationshipParams calldata params_) public pure returns (bytes32) { return keccak256( abi.encode( - params.sourceContract, - params.sourceId, - params.destContract, - params.destId, - params.relationshipId + params_.sourceContract, + params_.sourceId, + params_.destContract, + params_.destId, + params_.relationshipId ) ); } /********* Setting Relationships *********/ - /** - * @notice Sets a relationship config for a relationship ID. - * @param name the relationship name - * @param params the relationship config params - */ - function _setRelationshipConfig(string calldata name, SetRelationshipConfigParams calldata params) internal returns(bytes32 relationshipId) { - relationshipId = getRelationshipId(name); - RelationshipConfig memory relConfig = _convertRelParams(params); + + /// @notice Sets a relationship config for a relationship ID. + /// @param name_ the relationship name + /// @param params_ the relationship config params + function _setRelationshipConfig(string calldata name_, Relationship.SetRelationshipConfigParams calldata params_) internal returns(bytes32 relationshipId) { + relationshipId = getRelationshipId(name_); + Relationship.RelationshipConfig memory relConfig = _convertRelParams(params_); RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); $.relConfigs[relationshipId] = relConfig; emit RelationshipConfigSet( - name, + name_, relationshipId, - relConfig.sourceIPAssetTypeMask, - relConfig.destIPAssetTypeMask, + relConfig.sourceIpAssetTypeMask, + relConfig.destIpAssetTypeMask, relConfig.onlySameFranchise, - params.processor, - relConfig.timeConfig.maxTTL, - relConfig.timeConfig.minTTL, + params_.processor, + relConfig.timeConfig.maxTtl, + relConfig.timeConfig.minTtl, relConfig.timeConfig.renewable ); return relationshipId; } - /** - * @notice Unsets a relationship config for a relationship ID, reverts if it doesn't exist. - * @param relationshipId the relationship ID - */ - function _unsetRelationshipConfig(bytes32 relationshipId) internal { + /// @notice Unsets a relationship config for a relationship ID, reverts if it doesn't exist. + /// @param relationshipId_ the relationship ID + function _unsetRelationshipConfig(bytes32 relationshipId_) internal { RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); if ( - $.relConfigs[relationshipId].sourceIPAssetTypeMask == 0 - ) revert NonExistingRelationship(); - delete $.relConfigs[relationshipId]; - emit RelationshipConfigUnset(relationshipId); - } - - /** - * @notice Converts the SetRelationshipConfigParams to a RelationshipConfig after validating them. - * @dev reverts if - * - the processor doesn't support IRelationshipProcessor interface - * - the TTL is not well configured. - * - the disputer is the zero address - * - * @param params the SetRelationshipConfigParams - * @return the RelationshipConfig - */ - function _convertRelParams(SetRelationshipConfigParams calldata params) private view returns(RelationshipConfig memory) { - if (!params.processor.supportsInterface(type(IRelationshipProcessor).interfaceId)) revert UnsupportedInterface("IRelationshipProcessor"); - if (params.timeConfig.maxTTL < params.timeConfig.minTTL) revert InvalidTTL(); - if (params.disputer == address(0)) revert ZeroAddress(); - return RelationshipConfig( - LibIPAssetMask._convertToMask(params.sourceIPAssets, params.allowedExternalSource), - LibIPAssetMask._convertToMask(params.destIPAssets, params.allowedExternalDest), - params.onlySameFranchise, - IRelationshipProcessor(params.processor), - params.disputer, - params.timeConfig - ); + $.relConfigs[relationshipId_].sourceIpAssetTypeMask == 0 + ) revert Errors.RelationshipModule_NonExistingRelationship(); + delete $.relConfigs[relationshipId_]; + emit RelationshipConfigUnset(relationshipId_); } - /// returns a RelationshipConfig for the given relationshipId, or an empty one if it doesn't exist - function getRelationshipConfig(bytes32 relationshipId) public view returns (RelationshipConfig memory) { + /// @notice Updates the end time of a relationship, if TimeConfig allows it. + /// @param relKey_ the relationship key, given by getRelationshipKey(params) + /// @param timeConfig_ the relationship time config + /// @param ttl_ the new ttl + /// @return the new end time + function _updateEndTime(bytes32 relKey_, Relationship.TimeConfig memory timeConfig_, uint256 ttl_) private returns (uint256) { RelationshipModuleStorage storage $ = _getRelationshipModuleStorage(); - return $.relConfigs[relationshipId]; - } - - /** - * @dev convenience method to return a SetRelationshipConfigParams from a relationshipId, or an empty one if it doesn't exist - * NOTE: Caller must ignore the array elements of value 0 in the IPAsset arrays - * @param relationshipId the relationship ID - * @return params the SetRelationshipConfigParams - */ - function getRelationshipConfigDecoded(bytes32 relationshipId) external view returns(SetRelationshipConfigParams memory) { - RelationshipConfig memory relConfig = getRelationshipConfig(relationshipId); - (IPAsset[] memory sourceIPAssets, bool sourceSupportsExternal) = LibIPAssetMask._convertFromMask(relConfig.sourceIPAssetTypeMask); - (IPAsset[] memory destIPAssets, bool destSupportsExternal) = LibIPAssetMask._convertFromMask(relConfig.destIPAssetTypeMask); - return SetRelationshipConfigParams( - sourceIPAssets, - sourceSupportsExternal, - destIPAssets, - destSupportsExternal, - relConfig.onlySameFranchise, - address(relConfig.processor), - relConfig.disputer, - relConfig.timeConfig - ); + if (timeConfig_.maxTtl != 0) { + uint256 endTime = $.relationshipExpirations[relKey_]; + if (endTime == 0 || timeConfig_.renewable) { + endTime = block.timestamp + ttl_; + $.relationshipExpirations[relKey_] = endTime; + return endTime; + } + } + return 0; } - function getRelationshipId(string calldata name) public pure returns (bytes32) { - return keccak256(abi.encode(name)); + /// @notice validates the relationship params according to the relationship config. + /// @param params_ the relationship params + /// @param relConfig_ the relationship config + function _verifyRelationshipParams(Relationship.RelationshipParams calldata params_, Relationship.RelationshipConfig memory relConfig_) private view { + if (relConfig_.sourceIpAssetTypeMask == 0) revert Errors.RelationshipModule_NonExistingRelationship(); + (bool sourceResult, bool sourceIsAssetRegistry) = _checkRelationshipNode(params_.sourceContract, params_.sourceId, relConfig_.sourceIpAssetTypeMask); + if (!sourceResult) revert Errors.RelationshipModule_UnsupportedRelationshipSrc(); + (bool destResult, bool destIsAssetRegistry) = _checkRelationshipNode(params_.destContract, params_.destId, relConfig_.destIpAssetTypeMask); + if (!destResult) revert Errors.RelationshipModule_UnsupportedRelationshipDst(); + if(sourceIsAssetRegistry && destIsAssetRegistry && params_.sourceContract != params_.destContract && relConfig_.onlySameFranchise) revert Errors.RelationshipModule_CannotRelateToOtherFranchise(); } - - /********* Mask Helpers *********/ - /** - * @dev converts an array of IPAssets types and the allows external flag to a mask, by setting the bits corresponding - * to the uint8 equivalent of the IPAsset types to 1. - * @param ipAssets The array of IPAsset types - * @param allowsExternal Whether the relationship config allows external (non SP ERC721) assets - * @return mask The mask representing the IPAsset types and the allows external flag - */ - function convertToMask(IPAsset[] calldata ipAssets, bool allowsExternal) external pure returns (uint256) { - return LibIPAssetMask._convertToMask(ipAssets, allowsExternal); + /// @dev Checks if the source or destination type of a relationship is allowed by the relationship config. + /// @param collection_ The address of the collection of the relationship endpoint + /// @param id_ The id of the relationship endpoint + /// @param assetTypeMask_ The asset type mask of the relationship config, which contains the allowed asset types and the external asset flag + /// @return result Whether the relationship endpoint is valid + /// @return isAssetRegistry Whether the relationship endpoint is a Story Protocol IP Asset Registry + function _checkRelationshipNode(address collection_, uint256 id_, uint256 assetTypeMask_) private view returns (bool result, bool isAssetRegistry) { + if (IERC721(collection_).ownerOf(id_) == address(0)) return (false, false); + isAssetRegistry = FRANCHISE_REGISTRY.isIpAssetRegistry(collection_); + return (LibIPAssetMask._checkRelationshipNode(isAssetRegistry, id_, assetTypeMask_), isAssetRegistry); } - /** - * @dev converts a mask to an array of IPAsset types and the allows external flag, by checking the bits corresponding - * to the uint8 equivalent of the IPAsset types. - * @param mask The mask representing the IPAsset types and the allows external flag - * @return ipAssets The array of IPAsset types - * @return allowsExternal Whether the relationship config allows external (non SP ERC721) assets - */ - function convertFromMask(uint256 mask) external pure returns (IPAsset[] memory ipAssets, bool allowsExternal) { - return LibIPAssetMask._convertFromMask(mask); + /// @notice Converts the SetRelationshipConfigParams to a RelationshipConfig after validating them. + /// @dev reverts if + /// - the processor doesn't support IRelationshipProcessor interface + /// - the TTL is not well configured. + /// - the disputer is the zero address + /// + /// @param params_ the SetRelationshipConfigParams + /// @return the RelationshipConfig + function _convertRelParams(Relationship.SetRelationshipConfigParams calldata params_) private view returns(Relationship.RelationshipConfig memory) { + if (!params_.processor.supportsInterface(type(IRelationshipProcessor).interfaceId)) revert Errors.UnsupportedInterface("IRelationshipProcessor"); + if (params_.timeConfig.maxTtl < params_.timeConfig.minTtl) revert Errors.RelationshipModule_InvalidTTL(); + if (params_.disputer == address(0)) revert Errors.ZeroAddress(); + return Relationship.RelationshipConfig( + LibIPAssetMask._convertToMask(params_.sourceIpAssets, params_.allowedExternalSource), + LibIPAssetMask._convertToMask(params_.destIpAssets, params_.allowedExternalDest), + params_.onlySameFranchise, + IRelationshipProcessor(params_.processor), + params_.disputer, + params_.timeConfig + ); } - /// returns true if the asset type is supported by the mask, false otherwise - function supportsIPAssetType(uint256 mask, uint8 assetType) external pure returns (bool) { - return LibIPAssetMask._supportsIPAssetType(mask, assetType); + function _getRelationshipModuleStorage() + private + pure + returns (RelationshipModuleStorage storage $) + { + assembly { + $.slot := _STORAGE_LOCATION + } } - -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/processors/BaseRelationshipProcessor.sol b/contracts/modules/relationships/processors/BaseRelationshipProcessor.sol index 94f09e48..99935b7a 100644 --- a/contracts/modules/relationships/processors/BaseRelationshipProcessor.sol +++ b/contracts/modules/relationships/processors/BaseRelationshipProcessor.sol @@ -1,45 +1,42 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -import { IRelationshipProcessor } from "./IRelationshipProcessor.sol"; -import { ZeroAddress } from "contracts/errors/General.sol"; -import { IRelationshipModule } from "../IRelationshipModule.sol"; import { ERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; +import { IRelationshipProcessor } from "contracts/interfaces/modules/relationships/processors/IRelationshipProcessor.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; -/** - * @title BaseRelationshipProcessor - * @dev Base contract for relationship processors. - * Relationship processors are used to process relationships between IP Assets before they are set. - * They are set per relationship config in a IRelationshipModule - * This base contracts implements ERC165 and checks if the caller is the relationship module. - * All relationship processors must inherit from this contract. - */ + +/// @title BaseRelationshipProcessor +/// @dev Base contract for relationship processors. +/// Relationship processors are used to process relationships between IP Assets before they are set. +/// They are set per relationship config in a IRelationshipModule +/// This base contracts implements ERC165 and checks if the caller is the relationship module. +/// All relationship processors must inherit from this contract. abstract contract BaseRelationshipProcessor is IRelationshipProcessor, ERC165 { address internal immutable _RELATIONSHIP_MODULE; - error OnlyRelationshipModule(); - constructor(address _relationshipModule) { - if(_relationshipModule == address(0)) revert ZeroAddress(); - _RELATIONSHIP_MODULE = _relationshipModule; + constructor(address relationshipModule_) { + if(relationshipModule_ == address(0)) revert Errors.ZeroAddress(); + _RELATIONSHIP_MODULE = relationshipModule_; } - /** - * @inheritdoc IRelationshipProcessor - * @dev Checks if the caller is the relationship module and calls implementation. - */ - function processRelationship(IRelationshipModule.RelationshipParams memory params, bytes calldata data, address caller) external override returns(bool) { - if(msg.sender != _RELATIONSHIP_MODULE) revert OnlyRelationshipModule(); - return _processRelationship(params, data, caller); + + /// @inheritdoc IRelationshipProcessor + /// @dev Checks if the caller is the relationship module and calls implementation. + function processRelationship(Relationship.RelationshipParams memory params_, bytes calldata data_, address caller_) external override returns(bool) { + if(msg.sender != _RELATIONSHIP_MODULE) revert Errors.BaseRelationshipProcessor_OnlyRelationshipModule(); + return _processRelationship(params_, data_, caller_); } - function _processRelationship(IRelationshipModule.RelationshipParams memory params, bytes calldata data, address caller) internal virtual returns(bool); + function _processRelationship(Relationship.RelationshipParams memory params_, bytes calldata data_, address caller_) internal virtual returns(bool); function supportsInterface( - bytes4 interfaceId + bytes4 interfaceId_ ) public view override(ERC165) returns (bool) { - return super.supportsInterface(interfaceId) || interfaceId == type(IRelationshipProcessor).interfaceId; + return super.supportsInterface(interfaceId_) || interfaceId_ == type(IRelationshipProcessor).interfaceId; } -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/processors/DstOwnerRelationshipProcessor.sol b/contracts/modules/relationships/processors/DstOwnerRelationshipProcessor.sol index 66ba7c1e..068a388e 100644 --- a/contracts/modules/relationships/processors/DstOwnerRelationshipProcessor.sol +++ b/contracts/modules/relationships/processors/DstOwnerRelationshipProcessor.sol @@ -3,25 +3,23 @@ pragma solidity ^0.8.13; import { BaseRelationshipProcessor } from "./BaseRelationshipProcessor.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { Unauthorized } from "contracts/errors/General.sol"; -import { IRelationshipModule } from "../IRelationshipModule.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -/** - * @title DstOwnerRelationshipProcessor - * @dev Relationship processor that checks if the caller (relationship setter) is the owner of the destination IP Asset. - */ + +/// @title DstOwnerRelationshipProcessor +/// @dev Relationship processor that checks if the caller (relationship setter) is the owner of the destination IP Asset. contract DstOwnerRelationshipProcessor is BaseRelationshipProcessor { - constructor(address relationshipModule) BaseRelationshipProcessor(relationshipModule) {} + constructor(address relationshipModule_) BaseRelationshipProcessor(relationshipModule_) {} - /** - * Returns true if the caller is the owner of the destination IP Asset, reverts otherwise. - */ - function _processRelationship(IRelationshipModule.RelationshipParams memory params, bytes calldata, address caller) internal view virtual override returns(bool) { - if (IERC721(params.destContract).ownerOf(params.destId) != caller) { - revert Unauthorized(); + + /// Returns true if the caller is the owner of the destination IP Asset, reverts otherwise. + function _processRelationship(Relationship.RelationshipParams memory params_, bytes calldata, address caller_) internal view virtual override returns(bool) { + if (IERC721(params_.destContract).ownerOf(params_.destId) != caller_) { + revert Errors.Unauthorized(); } return true; } -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/processors/IRelationshipProcessor.sol b/contracts/modules/relationships/processors/IRelationshipProcessor.sol deleted file mode 100644 index 81375384..00000000 --- a/contracts/modules/relationships/processors/IRelationshipProcessor.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.13; - -import { IRelationshipModule } from "../IRelationshipModule.sol"; - -/** - * @title IRelationshipProcessor - * @dev Interface for relationship processors. - * Relationship processors are used to process relationships between IP Assets before they are set. - * They are set per relationship config in a IRelationshipModule - */ -interface IRelationshipProcessor { - - /** - * @dev Processes a relationship between two IP Assets before it is set. This can be use for validity checks, actions, etc. It must: - * - revert if the relationship is invalid - * - return true if the relationship is valid and the relationship should be set immediately in the relationship module. - * - return false if the relationship is valid but there is need for further processing. - * In this case, the relationship module will emit a RelationPendingProcessor event. - * This can be leveraged for multi-step relationship setting, e.g. for a relationship that requires approval from the destination IP Asset owner. - */ - function processRelationship(IRelationshipModule.RelationshipParams memory params, bytes calldata data, address caller) external returns(bool); -} \ No newline at end of file diff --git a/contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol b/contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol index 337c2c51..685a56b3 100644 --- a/contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol +++ b/contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol @@ -2,20 +2,18 @@ pragma solidity ^0.8.13; import { BaseRelationshipProcessor } from "./BaseRelationshipProcessor.sol"; -import { IRelationshipModule } from "../IRelationshipModule.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; -/** - * @title PermissionlessRelationshipProcessor - * @dev Relationship processor that always returns true. - */ + +/// @title PermissionlessRelationshipProcessor +/// @dev Relationship processor that always returns true. contract PermissionlessRelationshipProcessor is BaseRelationshipProcessor { - constructor(address relationshipModule) BaseRelationshipProcessor(relationshipModule) {} + constructor(address relationshipModule_) BaseRelationshipProcessor(relationshipModule_) {} - /** - * Returns true. - */ - function _processRelationship(IRelationshipModule.RelationshipParams memory, bytes calldata, address) internal virtual override returns(bool) { + + /// Returns true. + function _processRelationship(Relationship.RelationshipParams memory, bytes calldata, address) internal virtual override returns(bool) { return true; } -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/processors/SrcDstOwnerRelationshipProcessor.sol b/contracts/modules/relationships/processors/SrcDstOwnerRelationshipProcessor.sol index 54036556..9530ced5 100644 --- a/contracts/modules/relationships/processors/SrcDstOwnerRelationshipProcessor.sol +++ b/contracts/modules/relationships/processors/SrcDstOwnerRelationshipProcessor.sol @@ -3,27 +3,25 @@ pragma solidity ^0.8.13; import { BaseRelationshipProcessor } from "./BaseRelationshipProcessor.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { Unauthorized } from "contracts/errors/General.sol"; -import { IRelationshipModule } from "../IRelationshipModule.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -/** - * @title SrcDstOwnerRelationshipProcessor - * @dev Relationship processor that checks if the caller (relationship setter) is the owner of the source and destination IP Assets. - */ + +/// @title SrcDstOwnerRelationshipProcessor +/// @dev Relationship processor that checks if the caller (relationship setter) is the owner of the source and destination IP Assets. contract SrcDstOwnerRelationshipProcessor is BaseRelationshipProcessor { - constructor(address relationshipModule) BaseRelationshipProcessor(relationshipModule) {} + constructor(address relationshipModule_) BaseRelationshipProcessor(relationshipModule_) {} - /** - * Returns true if the caller is the owner of the source and destination IP Assets, reverts otherwise. - */ - function _processRelationship(IRelationshipModule.RelationshipParams memory params, bytes calldata, address caller) internal view virtual override returns(bool) { + + /// Returns true if the caller is the owner of the source and destination IP Assets, reverts otherwise. + function _processRelationship(Relationship.RelationshipParams memory params_, bytes calldata, address caller_) internal view virtual override returns(bool) { if ( - IERC721(params.sourceContract).ownerOf(params.sourceId) != caller || - IERC721(params.destContract).ownerOf(params.destId) != caller) { - revert Unauthorized(); + IERC721(params_.sourceContract).ownerOf(params_.sourceId) != caller_ || + IERC721(params_.destContract).ownerOf(params_.destId) != caller_) { + revert Errors.Unauthorized(); } return true; } -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/processors/SrcOwnerRelationshipProcessor.sol b/contracts/modules/relationships/processors/SrcOwnerRelationshipProcessor.sol index b03dd629..4cee77e2 100644 --- a/contracts/modules/relationships/processors/SrcOwnerRelationshipProcessor.sol +++ b/contracts/modules/relationships/processors/SrcOwnerRelationshipProcessor.sol @@ -3,25 +3,23 @@ pragma solidity ^0.8.13; import { BaseRelationshipProcessor } from "./BaseRelationshipProcessor.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { Unauthorized } from "contracts/errors/General.sol"; -import { IRelationshipModule } from "../IRelationshipModule.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -/** - * @title SrcOwnerRelationshipProcessor - * @dev Relationship processor that checks if the caller (relationship setter) is the owner of the source IP Asset. - */ + +/// @title SrcOwnerRelationshipProcessor +/// @dev Relationship processor that checks if the caller (relationship setter) is the owner of the source IP Asset. contract SrcOwnerRelationshipProcessor is BaseRelationshipProcessor { - constructor(address relationshipModule) BaseRelationshipProcessor(relationshipModule) {} + constructor(address relationshipModule_) BaseRelationshipProcessor(relationshipModule_) {} - /** - * Returns true if the caller is the owner of the source IP Asset, reverts otherwise. - */ - function _processRelationship(IRelationshipModule.RelationshipParams memory params, bytes calldata, address caller) internal view virtual override returns(bool) { - if (IERC721(params.sourceContract).ownerOf(params.sourceId) != caller) { - revert Unauthorized(); + + /// Returns true if the caller is the owner of the source IP Asset, reverts otherwise. + function _processRelationship(Relationship.RelationshipParams memory params_, bytes calldata, address caller_) internal view virtual override returns(bool) { + if (IERC721(params_.sourceContract).ownerOf(params_.sourceId) != caller_) { + revert Errors.Unauthorized(); } return true; } -} \ No newline at end of file +} diff --git a/contracts/modules/relationships/processors/SrcRequestOrDstOwnerRelationshipProcessor.sol b/contracts/modules/relationships/processors/SrcRequestOrDstOwnerRelationshipProcessor.sol index 4fc6f49c..0d75addd 100644 --- a/contracts/modules/relationships/processors/SrcRequestOrDstOwnerRelationshipProcessor.sol +++ b/contracts/modules/relationships/processors/SrcRequestOrDstOwnerRelationshipProcessor.sol @@ -2,27 +2,26 @@ pragma solidity ^0.8.13; import { BaseRelationshipProcessor } from "./BaseRelationshipProcessor.sol"; -import { IRelationshipModule } from "../IRelationshipModule.sol"; -import { Unauthorized } from "contracts/errors/General.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -/** - * @title SrcRequestOrDstOwnerRelationshipProcessor - * @dev Relationship processor that returns true if owner of destination, false if owner of source, reverts otherwise. - */ + +/// @title SrcRequestOrDstOwnerRelationshipProcessor +/// @dev Relationship processor that returns true if owner of destination, false if owner of source, reverts otherwise. contract SrcRequestOrDstOwnerRelationshipProcessor is BaseRelationshipProcessor { - constructor(address relationshipModule) BaseRelationshipProcessor(relationshipModule) {} + constructor(address relationshipModule_) BaseRelationshipProcessor(relationshipModule_) {} /// Returns true if destination owner, false if source owner (to signal a link request), reverts otherwise. - function _processRelationship(IRelationshipModule.RelationshipParams memory params, bytes calldata, address caller) internal virtual override returns(bool) { - if (IERC721(params.destContract).ownerOf(params.destId) == caller) { + function _processRelationship(Relationship.RelationshipParams memory params_, bytes calldata, address caller_) internal virtual override returns(bool) { + if (IERC721(params_.destContract).ownerOf(params_.destId) == caller_) { return true; - } else if (IERC721(params.sourceContract).ownerOf(params.sourceId) == caller) { + } else if (IERC721(params_.sourceContract).ownerOf(params_.sourceId) == caller_) { // Emits an event, which act as notification of pending relationship. return false; } else { - revert Unauthorized(); + revert Errors.Unauthorized(); } } -} \ No newline at end of file +} diff --git a/contracts/modules/royalties/RoyaltyDistributor.sol b/contracts/modules/royalties/RoyaltyDistributor.sol index 2375f35a..45ed7587 100644 --- a/contracts/modules/royalties/RoyaltyDistributor.sol +++ b/contracts/modules/royalties/RoyaltyDistributor.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { IRoyaltyDistributor } from "./IRoyaltyDistributor.sol"; +import { IRoyaltyDistributor } from "contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol"; import { Pausable } from "@openzeppelin/contracts/security/Pausable.sol"; import { AccessControlledUpgradeable } from "contracts/access-control/AccessControlledUpgradeable.sol"; -import { IIPAccountRegistry } from "contracts/ip-accounts/IIPAccountRegistry.sol"; -import { IRoyaltyPolicy } from "contracts/modules/royalties/policies/IRoyaltyPolicy.sol"; +import { IIPAccountRegistry } from "contracts/interfaces/ip-accounts/IIPAccountRegistry.sol"; +import { IRoyaltyPolicy } from "contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol"; import { RoyaltyNFT } from "contracts/modules/royalties/RoyaltyNFT.sol"; -import { UPGRADER_ROLE, PROTOCOL_ADMIN_ROLE } from "contracts/access-control/ProtocolRoles.sol"; +import { AccessControl } from "contracts/lib/AccessControl.sol"; contract RoyaltyDistributor is Pausable, IRoyaltyDistributor, AccessControlledUpgradeable { @@ -17,61 +17,60 @@ contract RoyaltyDistributor is Pausable, IRoyaltyDistributor, AccessControlledUp // ipAccount => royaltyPolicy mapping(address => address) private policies; - constructor(address _ipAccountRegistry, address _royaltyNft) { - ipAccountRegistry = IIPAccountRegistry(_ipAccountRegistry); - royaltyNFT = RoyaltyNFT(_royaltyNft); + constructor(address ipAccountRegistry_, address royaltyNft_) { + ipAccountRegistry = IIPAccountRegistry(ipAccountRegistry_); + royaltyNFT = RoyaltyNFT(royaltyNft_); } function setRoyaltyPolicy( - address nftContract, - uint256 tokenId, - address royaltyPolicy, - bytes calldata data + address nftContract_, + uint256 tokenId_, + address royaltyPolicy_, + bytes calldata data_ ) external { - address ipAccount = _ipAccount(nftContract, tokenId); - policies[ipAccount] = royaltyPolicy; - IRoyaltyPolicy(royaltyPolicy).initPolicy(ipAccount, data); - } - - function getRoyaltyPolicy( - address nftContract, - uint256 tokenId - ) external view returns (address) { - address ipAccount = _ipAccount(nftContract, tokenId); - return policies[ipAccount]; + address ipAccount = _ipAccount(nftContract_, tokenId_); + policies[ipAccount] = royaltyPolicy_; + IRoyaltyPolicy(royaltyPolicy_).initPolicy(ipAccount, data_); } function updateDistribution( - address nftContract, - uint256 tokenId, - bytes calldata data + address nftContract_, + uint256 tokenId_, + bytes calldata data_ ) external { - address ipAccount = ipAccountRegistry.createAccount(block.chainid, nftContract, tokenId, ""); - IRoyaltyPolicy(policies[ipAccount]).updateDistribution(ipAccount, data); + address ipAccount = ipAccountRegistry.createAccount(block.chainid, nftContract_, tokenId_, ""); + IRoyaltyPolicy(policies[ipAccount]).updateDistribution(ipAccount, data_); } - function distribute(address nftContract, uint256 tokenId, address token) external { - address ipAccount = _ipAccount(nftContract, tokenId); - IRoyaltyPolicy(policies[ipAccount]).distribute(ipAccount, token); + function distribute(address nftContract_, uint256 tokenId_, address token_) external { + address ipAccount = _ipAccount(nftContract_, tokenId_); + IRoyaltyPolicy(policies[ipAccount]).distribute(ipAccount, token_); } - function claim(address account, address token) external { - royaltyNFT.claim(account, token); + function claim(address account_, address token_) external { + royaltyNFT.claim(account_, token_); } - function pause() external onlyRole(PROTOCOL_ADMIN_ROLE) { + function pause() external onlyRole(AccessControl.PROTOCOL_ADMIN_ROLE) { _pause(); } - function unpause() external onlyRole(PROTOCOL_ADMIN_ROLE) { + function unpause() external onlyRole(AccessControl.PROTOCOL_ADMIN_ROLE) { _unpause(); } - function _ipAccount(address nftContract, uint256 tokenId) internal view returns(address) { - return ipAccountRegistry.account(block.chainid, nftContract, tokenId); + function getRoyaltyPolicy( + address nftContract_, + uint256 tokenId_ + ) external view returns (address) { + address ipAccount = _ipAccount(nftContract_, tokenId_); + return policies[ipAccount]; } function _authorizeUpgrade( - address newImplementation - ) internal virtual override onlyRole(UPGRADER_ROLE) {} + address newImplementation_ + ) internal virtual override onlyRole(AccessControl.UPGRADER_ROLE) {} -} \ No newline at end of file + function _ipAccount(address nftContract_, uint256 tokenId_) internal view returns(address) { + return ipAccountRegistry.account(block.chainid, nftContract_, tokenId_); + } +} diff --git a/contracts/modules/royalties/RoyaltyNFT.sol b/contracts/modules/royalties/RoyaltyNFT.sol index cf062c43..295a5778 100644 --- a/contracts/modules/royalties/RoyaltyNFT.sol +++ b/contracts/modules/royalties/RoyaltyNFT.sol @@ -1,22 +1,17 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { ERC1155Supply } from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol"; import { ERC1155 } from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { ERC20 } from "solmate/src/tokens/ERC20.sol"; -import { IIPAccount } from "contracts/ip-accounts/IIPAccount.sol"; -import { ISplitMain } from "./ISplitMain.sol"; +import { IIPAccount } from "contracts/interfaces/ip-accounts/IIPAccount.sol"; +import { ISplitMain } from "contracts/interfaces/modules/royalties/ISplitMain.sol"; +import { Errors } from "contracts/lib/Errors.sol"; -error AccountsAndAllocationsMismatch( - uint256 accountsLength, - uint256 allocationsLength -); - -error InvalidAllocationsSum(uint32 allocationsSum); contract RoyaltyNFT is ERC1155Supply { using SafeERC20 for IERC20; @@ -32,27 +27,27 @@ contract RoyaltyNFT is ERC1155Supply { mapping(uint256 => address) public splits; - constructor(address _splitMain) ERC1155("") { - splitMain = ISplitMain(_splitMain); + constructor(address splitMain_) ERC1155("") { + splitMain = ISplitMain(splitMain_); } - function distributeFunds(address sourceAccount, address token) external { - uint256 tokenId = toTokenId(sourceAccount); + function distributeFunds(address sourceAccount_, address token_) external { + uint256 tokenId = toTokenId(sourceAccount_); address[] memory accounts = owners[tokenId]; sort(accounts); uint256 numAccounts = accounts.length; uint32[] memory allocations = new uint32[](numAccounts); for (uint256 i; i < numAccounts;) { - allocations[i] = percentage(sourceAccount, accounts[i]); + allocations[i] = percentage(sourceAccount_, accounts[i]); unchecked { ++i; } } address split = splits[tokenId]; - IIPAccount(payable(sourceAccount)).sendRoyaltyForDistribution(split, token); + IIPAccount(payable(sourceAccount_)).sendRoyaltyForDistribution(split, token_); splitMain.updateAndDistributeERC20({ split: split, - token: ERC20(token), + token: ERC20(token_), accounts: accounts, percentAllocations: allocations, distributorFee: 0, @@ -60,29 +55,29 @@ contract RoyaltyNFT is ERC1155Supply { }); } - function claim(address account, address token) external { + function claim(address account_, address token_) external { ERC20[] memory tokens = new ERC20[](1); - tokens[0] = ERC20(token); - splitMain.withdraw(account, 0, tokens); + tokens[0] = ERC20(token_); + splitMain.withdraw(account_, 0, tokens); } - function mint(address sourceAccount, address[] calldata accounts, uint32[] calldata initAllocations) external { - uint256 tokenId = toTokenId(sourceAccount); + function mint(address sourceAccount_, address[] calldata accounts_, uint32[] calldata initAllocations_) external { + uint256 tokenId = toTokenId(sourceAccount_); - uint256 numAccs = accounts.length; + uint256 numAccs = accounts_.length; - if (accounts.length != initAllocations.length) - revert AccountsAndAllocationsMismatch( - accounts.length, - initAllocations.length + if (accounts_.length != initAllocations_.length) + revert Errors.RoyaltyNFT_AccountsAndAllocationsMismatch( + accounts_.length, + initAllocations_.length ); - if (_getSum(initAllocations) != TOTAL_SUPPLY) - revert InvalidAllocationsSum(_getSum(initAllocations)); + if (_getSum(initAllocations_) != TOTAL_SUPPLY) + revert Errors.RoyaltyNFT_InvalidAllocationsSum(_getSum(initAllocations_)); unchecked { for (uint256 i; i < numAccs; ++i) { - _mint(accounts[i], tokenId, initAllocations[i], ""); + _mint(accounts_[i], tokenId, initAllocations_[i], ""); } } @@ -103,28 +98,6 @@ contract RoyaltyNFT is ERC1155Supply { ); } - function _afterTokenTransfer( - address, - address from, - address to, - uint256[] memory ids, - uint256[] memory, - bytes memory - ) internal virtual override { - for (uint256 i = 0; i < ids.length; ++i) { - bytes32 indexTo = keccak256(abi.encode(ids[i], to)); - if (from == address(0) || balanceOf(from, ids[i]) != 0) { - ownerIndexes[indexTo] = owners[ids[i]].length; - owners[ids[i]].push(to); - } else { - bytes32 indexFrom = keccak256(abi.encode(ids[i], from)); - owners[ids[i]][ownerIndexes[indexFrom]] = to; - ownerIndexes[indexTo] = ownerIndexes[indexFrom]; - delete ownerIndexes[indexFrom]; - } - } - } - function uri(uint256) public view override returns (string memory) { return string.concat( "data:application/json;base64,", @@ -142,20 +115,42 @@ contract RoyaltyNFT is ERC1155Supply { ); } - function percentage(address sourceAccount, address account) public view returns (uint32) { + function percentage(address sourceAccount_, address account_) public view returns (uint32) { unchecked { - return uint32(balanceOf(account, toTokenId(sourceAccount))); + return uint32(balanceOf(account_, toTokenId(sourceAccount_))); } } - function toTokenId(address sourceAccount) public pure returns (uint256 tokenId) { - tokenId = uint256(uint160(sourceAccount)); + function toTokenId(address sourceAccount_) public pure returns (uint256 tokenId) { + tokenId = uint256(uint160(sourceAccount_)); + } + + function _afterTokenTransfer( + address, + address from_, + address to_, + uint256[] memory ids_, + uint256[] memory, + bytes memory + ) internal virtual override { + for (uint256 i = 0; i < ids_.length; ++i) { + bytes32 indexTo = keccak256(abi.encode(ids_[i], to_)); + if (from_ == address(0) || balanceOf(from_, ids_[i]) != 0) { + ownerIndexes[indexTo] = owners[ids_[i]].length; + owners[ids_[i]].push(to_); + } else { + bytes32 indexFrom = keccak256(abi.encode(ids_[i], from_)); + owners[ids_[i]][ownerIndexes[indexFrom]] = to_; + ownerIndexes[indexTo] = ownerIndexes[indexFrom]; + delete ownerIndexes[indexFrom]; + } + } } - function _getSum(uint32[] calldata numbers) internal pure returns (uint32 sum) { - uint256 numbersLength = numbers.length; + function _getSum(uint32[] calldata numbers_) internal pure returns (uint32 sum) { + uint256 numbersLength = numbers_.length; for (uint256 i; i < numbersLength;) { - sum += numbers[i]; + sum += numbers_[i]; unchecked { // overflow should be impossible in for-loop index ++i; @@ -163,16 +158,16 @@ contract RoyaltyNFT is ERC1155Supply { } } - function sort(address[] memory data) internal pure { - uint length = data.length; + function sort(address[] memory data_) internal pure { + uint length = data_.length; for (uint i = 1; i < length; i++) { - address key = data[i]; + address key = data_[i]; int j = int(i - 1); - while ((j >= 0) && (data[uint(j)] > key)) { - data[uint(j) + 1] = data[uint(j)]; + while ((j >= 0) && (data_[uint(j)] > key)) { + data_[uint(j) + 1] = data_[uint(j)]; j--; } - data[uint(j + 1)] = key; + data_[uint(j + 1)] = key; } } } diff --git a/contracts/modules/royalties/RoyaltyNFTFactory.sol b/contracts/modules/royalties/RoyaltyNFTFactory.sol index 873661f0..8d359e25 100644 --- a/contracts/modules/royalties/RoyaltyNFTFactory.sol +++ b/contracts/modules/royalties/RoyaltyNFTFactory.sol @@ -9,14 +9,14 @@ contract RoyaltyNFTFactory { address public immutable royaltyNft; - constructor(address _splitMain) { - royaltyNft = address(new RoyaltyNFT(_splitMain)); + constructor(address splitMain_) { + royaltyNft = address(new RoyaltyNFT(splitMain_)); } function createRoyaltyNft( - bytes32 salt + bytes32 salt_ ) external returns (RoyaltyNFT rn) { - rn = RoyaltyNFT(Clones.cloneDeterministic(royaltyNft, salt)); + rn = RoyaltyNFT(Clones.cloneDeterministic(royaltyNft, salt_)); emit CreateRoyaltyNFT(rn); } } diff --git a/contracts/modules/royalties/policies/IRoyaltyPolicy.sol b/contracts/modules/royalties/policies/IRoyaltyPolicy.sol deleted file mode 100644 index fb5a96ec..00000000 --- a/contracts/modules/royalties/policies/IRoyaltyPolicy.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.19; - -/// @title Royalty Policy Interface -/// @notice The Royalty policy perform concrete operations of distributing royalty. -interface IRoyaltyPolicy { - - /// @notice initialize the royalty policy for the specified IP Account - /// @param account IP Account associated with the policy. - /// @param data The initial data of the royalty distribution policy. - function initPolicy(address account, bytes calldata data) external; - - /// @notice update distribute plan for the specified IP Account - /// @param account IP Account associated with the policy. - /// @param data The distribution plan data. - function updateDistribution(address account, bytes calldata data) external; - - /// @notice Distribute royalty to each recipient according to royalty distribution plan for given IP Asset. - /// @param account IP Account associated with the policy. - /// @param token The ERC20 token for royalty. - function distribute(address account, address token) external; -} \ No newline at end of file diff --git a/contracts/modules/royalties/policies/IRoyaltyProportionPolicy.sol b/contracts/modules/royalties/policies/IRoyaltyProportionPolicy.sol deleted file mode 100644 index 2e177c13..00000000 --- a/contracts/modules/royalties/policies/IRoyaltyProportionPolicy.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.19; - -import "./IRoyaltyPolicy.sol"; - -/// @title Proportion Royalty Policy Interface -/// @notice The Proportion Royalty policy is split royalty by percentage. -interface IRoyaltyProportionPolicy is IRoyaltyPolicy { - /// @notice Percentage proportion - struct ProportionData { - address[] accounts; - uint32[] percentAllocations; - } -} \ No newline at end of file diff --git a/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol b/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol index d752c2ad..402105ce 100644 --- a/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol +++ b/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol @@ -1,28 +1,28 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import {IRoyaltyProportionPolicy} from "./IRoyaltyProportionPolicy.sol"; +import { IRoyaltyPolicy } from "contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol"; import { RoyaltyNFT } from "contracts/modules/royalties/RoyaltyNFT.sol"; +import { Royalties } from "contracts/lib/modules/Royalties.sol"; - -contract MutableRoyaltyProportionPolicy is IRoyaltyProportionPolicy { +contract MutableRoyaltyProportionPolicy is IRoyaltyPolicy { RoyaltyNFT public immutable royaltyNFT; - constructor(address _royaltyNft) { - royaltyNFT = RoyaltyNFT(_royaltyNft); + constructor(address royaltyNft_) { + royaltyNFT = RoyaltyNFT(royaltyNft_); } function initPolicy(address, bytes calldata) override external {} - function updateDistribution(address sourceAccount, bytes calldata data) override external { - ProportionData memory propData = abi.decode(data, (ProportionData)); - uint256 tokenId = royaltyNFT.toTokenId(sourceAccount); + function updateDistribution(address sourceAccount_, bytes calldata data_) override external { + Royalties.ProportionData memory propData = abi.decode(data_, (Royalties.ProportionData)); + uint256 tokenId = royaltyNFT.toTokenId(sourceAccount_); if (!royaltyNFT.exists(tokenId)) { - royaltyNFT.mint(sourceAccount, propData.accounts, propData.percentAllocations); + royaltyNFT.mint(sourceAccount_, propData.accounts, propData.percentAllocations); } else { for (uint256 i = 0; i < propData.accounts.length; ++i) { royaltyNFT.safeTransferFrom( - sourceAccount, + sourceAccount_, propData.accounts[i], tokenId, propData.percentAllocations[i], @@ -32,7 +32,7 @@ contract MutableRoyaltyProportionPolicy is IRoyaltyProportionPolicy { } } - function distribute(address account, address token) override external { - royaltyNFT.distributeFunds(account, token); + function distribute(address account_, address token_) override external { + royaltyNFT.distributeFunds(account_, token_); } } diff --git a/contracts/modules/timing/LibDuration.sol b/contracts/modules/timing/LibDuration.sol index dc3934d9..4746eac8 100644 --- a/contracts/modules/timing/LibDuration.sol +++ b/contracts/modules/timing/LibDuration.sol @@ -1,12 +1,9 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; -library LibDuration { +import { Errors } from "contracts/lib/Errors.sol"; - error NotRenewable(); - error CallerNotRenewer(); - error ZeroTTL(); - error InvalidStartTime(); +library LibDuration { struct TimeConfig { uint64 ttl; @@ -16,37 +13,37 @@ library LibDuration { uint64 public constant START_TIME_NOT_SET = uint64(0); - function isActive(TimeConfig memory self) internal view returns (bool) { - return self.startTime != START_TIME_NOT_SET && block.timestamp >= self.startTime && block.timestamp < self.startTime + self.ttl; + function isActive(TimeConfig memory self_) internal view returns (bool) { + return self_.startTime != START_TIME_NOT_SET && block.timestamp >= self_.startTime && block.timestamp < self_.startTime + self_.ttl; } - function isRenewable(TimeConfig memory self) internal pure returns (bool) { - return self.renewer != address(0); + function renew(TimeConfig memory self_, uint64 ttl_) view internal { + if (!isRenewable(self_)) revert Errors.LibDuration_NotRenewable(); + if (msg.sender != self_.renewer) revert Errors.LibDuration_CallerNotRenewer(); + if (ttl_ == 0) revert Errors.LibDuration_ZeroTTL(); + self_.ttl = ttl_; + self_.startTime = uint64(block.timestamp); } - function renew(TimeConfig memory self, uint64 ttl) view internal { - if (!isRenewable(self)) revert NotRenewable(); - if (msg.sender != self.renewer) revert CallerNotRenewer(); - if (ttl == 0) revert ZeroTTL(); - self.ttl = ttl; - self.startTime = uint64(block.timestamp); - } - - function createRunningTimeConfig(uint64 ttl, address renewer) internal view returns (TimeConfig memory) { - if (ttl == 0) revert ZeroTTL(); + function createRunningTimeConfig(uint64 ttl_, address renewer_) internal view returns (TimeConfig memory) { + if (ttl_ == 0) revert Errors.LibDuration_ZeroTTL(); return TimeConfig({ - ttl: ttl, + ttl: ttl_, startTime: uint64(block.timestamp), - renewer: renewer + renewer: renewer_ }); } - function createStoppedTimeConfig(uint64 ttl, address renewer) internal pure returns (TimeConfig memory) { - if (ttl == 0) revert ZeroTTL(); + function isRenewable(TimeConfig memory self_) internal pure returns (bool) { + return self_.renewer != address(0); + } + + function createStoppedTimeConfig(uint64 ttl_, address renewer_) internal pure returns (TimeConfig memory) { + if (ttl_ == 0) revert Errors.LibDuration_ZeroTTL(); return TimeConfig({ - ttl: ttl, + ttl: ttl_, startTime: 0, - renewer: renewer + renewer: renewer_ }); } -} \ No newline at end of file +} diff --git a/contracts/utils/RevertingIPAssetRegistry.sol b/contracts/utils/RevertingIPAssetRegistry.sol index adbf282e..d9443eeb 100644 --- a/contracts/utils/RevertingIPAssetRegistry.sol +++ b/contracts/utils/RevertingIPAssetRegistry.sol @@ -2,12 +2,14 @@ pragma solidity ^0.8.13; -/** - * @title RevertingIPAssetRegistry - * @author Raul Martinez - * @notice Only used to initialize the beacon in IPAssetRegistryFactor, - * breaking a circular dependency on creation and keeping the beacon immutable - */ +/// @title RevertingIPAssetRegistry +/// @author Raul Martinez +/// @notice Only used to initialize the beacon in IPAssetRegistryFactor, +/// breaking a circular dependency on creation and keeping the beacon immutable contract RevertingIPAssetRegistry { + error DontUseThisContract(); -} \ No newline at end of file + function initialize() external pure { + revert DontUseThisContract(); + } +} diff --git a/deployment-5.json b/deployment-5.json index 9b35ffaf..eb3e8280 100644 --- a/deployment-5.json +++ b/deployment-5.json @@ -2,7 +2,7 @@ "main": { "AccessControlSingleton-Impl": "0xC773AB2D53A351d5Bb38Ea9DceDc0317C2532557", "AccessControlSingleton-Proxy": "0x3b698f6Ea479672d5fF21D6bc352a2de477a6c64", - "CollectModule-Impl": "0x2675F71863456609022c825946db1Ad9695f9aA8", + "CollectModule-Impl": "0x6c88f438cbfd9866dcd067ffe18b951f19b968da", "CollectModule-Proxy": "0x195c7612eB2ae51EcB8A012E0E0C6c0904Db5519", "CollectNFT": "0xCbda4bFa9c1574E60d64947870b4c931DCfEa88a", "CommonIPAssetEventEmitter": "0xA2Da90bB860DdD42d7a64E5C33cbA32eD30d4AaD", @@ -21,10 +21,10 @@ "RoyaltyNFT": "0x3b2b13A69f2552E1ECfe8f8efb47C802AF1B35EB" }, "relationship-processors": { - "DstOwnerRelationshipProcessor": "0x2890a4263BA12c6d6241CfC5c8D762B828041b86", - "PermissionlessRelationshipProcessor": "0xA5ee53c74f75bB4A149c55d8A24E5dF563897B0f", - "SrcDstOwnerRelationshipProcessor": "0xc6e3e7844E103116E3CA06aae3a02fde908F7c1a", - "SrcOwnerRelationshipProcessor": "0x5183ac89c1C9DeAADF856eED897fCd138C3083e2", - "SrcRequestOrDstOwnerRelationshipProcessor": "0x5C10cC663aE967877dE42572a5FD9B823321F0F4" + "DstOwnerRelationshipProcessor": "0x6F1364fcA44fCf2d96ECD8b2303E6B27d9f279B6", + "PermissionlessRelationshipProcessor": "0x379694d591cD310C3610EDb3D8D5CD625cA013a2", + "SrcDstOwnerRelationshipProcessor": "0x825Cb59b351e2cB35885e27d5C0F846F6ec09335", + "SrcOwnerRelationshipProcessor": "0x976E1CbC6EE716c16dB8fBA48026b40fc0052C0c", + "SrcRequestOrDstOwnerRelationshipProcessor": "0xfC367bb4047D7621B998C536E54Fa88838A6ACA9" } -} \ No newline at end of file +} diff --git a/hardhat.config.js b/hardhat.config.js index aa148f7b..6c6f3bd6 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -10,6 +10,7 @@ require("@nomiclabs/hardhat-etherscan"); require('@openzeppelin/hardhat-upgrades'); const createFranchise = require("./script/hardhat/createFranchise.js"); +const configureFranchiseLicensing = require("./script/hardhat/configureFranchiseLicensing.js"); const createIPAsset = require("./script/hardhat/createIPAsset.js"); const getIPAssetRegistryAddress = require("./script/hardhat/getIPAssetRegistryAddress.js"); const getIPAsset = require("./script/hardhat/getIPAsset.js"); @@ -36,6 +37,19 @@ task('sp:create-franchise') .setDescription('Mint Franchise NFT and create IPAssetsRegistry contract') .setAction(createFranchise); +task('sp:configure-franchise-licensing') + .addPositionalParam('franchiseId', 'Id of the Franchise to configure licensing for, as given by FranchiseRegistry contract') + .addPositionalParam('nonCommercialCanSublicense', 'If false, ipAssets cannot have children IPAsset') + .addPositionalParam('nonCommercialRootLicenseId', 'If set, root IPAsset licenses will have this as their non commercial parentLicenseId') + .addPositionalParam('commercialCanSublicense', 'If false, this IPAsset cannot be parentLicenseId of any other commercial IPAsset') + .addPositionalParam('commercialRootLicenseId', 'If set, root IPAsset licenses will have this as their non commercial parentLicenseId') + .addPositionalParam('rootIpAssetHasCommercialRights', 'If true, root IPAsset licenses will have commercial rights') + .addPositionalParam('revoker', 'Address that can revoke licenses') + .addPositionalParam('commercialLicenseUri', 'URI for commercial license terms') + .addOptionalParam('events', 'Show events in the tx receipt', false, types.boolean) + .setDescription('Configure licensing for a Franchise') + .setAction(configureFranchiseLicensing); + task('sp:get-ip-asset-registry-address') .addPositionalParam('franchiseId', 'Id of the Franchise to create the IP Asset in, as given by FranchiseRegistry contract') .setDescription('Get the address of the IPAssetsRegistry contract for the given Franchise') diff --git a/lcov.info b/lcov.info index aeb965f6..55cb93fd 100644 --- a/lcov.info +++ b/lcov.info @@ -1,29 +1,1215 @@ TN: -SF:contracts/Counter.sol -FN:7,Counter.setNumber -FNDA:256,Counter.setNumber -DA:8,256 -FN:11,Counter.increment -FNDA:1,Counter.increment -DA:12,1 +SF:contracts/FranchiseRegistry.sol +FN:60,FranchiseRegistry.initialize +FN:66,FranchiseRegistry._getFranchiseStorage +FN:72,FranchiseRegistry.version +FN:76,FranchiseRegistry.registerFranchise +FN:95,FranchiseRegistry.ipAssetRegistryForId +FN:108,FranchiseRegistry.isIpAssetRegistry +FN:117,FranchiseRegistry.tokenURI +FN:123,FranchiseRegistry._authorizeUpgrade +FNDA:3,FranchiseRegistry.registerFranchise +FNDA:7466,FranchiseRegistry._getFranchiseStorage +FNDA:2,FranchiseRegistry.tokenURI +FNDA:1,FranchiseRegistry.version +FNDA:0,FranchiseRegistry.initialize +FNDA:0,FranchiseRegistry._authorizeUpgrade +FNDA:13,FranchiseRegistry.isIpAssetRegistry +FNDA:7451,FranchiseRegistry.ipAssetRegistryForId +FNF:8 +FNH:6 +DA:61,0 +DA:62,0 +DA:63,0 +DA:68,7466 +DA:73,1 +DA:77,3 +DA:78,3 +DA:79,3 +DA:85,3 +DA:86,3 +DA:87,3 +DA:90,3 +DA:92,3 +DA:98,7462 +DA:99,7462 +DA:109,13 +DA:118,2 +DA:119,1 +DA:120,1 +LF:19 +LH:16 +end_of_record +TN: +SF:contracts/access-control/AccessControlSingleton.sol +FN:22,AccessControlSingleton.initialize +FN:34,AccessControlSingleton.setRoleAdmin +FN:42,AccessControlSingleton._authorizeUpgrade +FNDA:256,AccessControlSingleton.setRoleAdmin +FNDA:257,AccessControlSingleton.initialize +FNDA:0,AccessControlSingleton._authorizeUpgrade +FNF:3 +FNH:2 +DA:23,257 +DA:24,257 +DA:25,257 +DA:26,257 +DA:35,256 +LF:5 +LH:5 +end_of_record +TN: +SF:contracts/access-control/AccessControlled.sol +FN:42,AccessControlled.hasRole +FN:50,AccessControlled.setAccessControl +FNDA:0,AccessControlled.hasRole +FNDA:0,AccessControlled.setAccessControl +FNF:2 +FNH:0 +DA:43,0 +DA:51,0 +DA:52,0 +DA:53,0 +LF:4 +LH:0 +end_of_record +TN: +SF:contracts/access-control/AccessControlledUpgradeable.sol +FN:41,AccessControlledUpgradeable.__AccessControlledUpgradeable_init +FN:48,AccessControlledUpgradeable._getAccessControlledUpgradeable +FN:60,AccessControlledUpgradeable.hasRole +FN:69,AccessControlledUpgradeable.setAccessControl +FN:76,AccessControlledUpgradeable.getAccessControl +FNDA:0,AccessControlledUpgradeable.getAccessControl +FNDA:4,AccessControlledUpgradeable._getAccessControlledUpgradeable +FNDA:4,AccessControlledUpgradeable.hasRole +FNDA:0,AccessControlledUpgradeable.setAccessControl +FNDA:0,AccessControlledUpgradeable.__AccessControlledUpgradeable_init +FNF:5 +FNH:2 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:50,4 +DA:61,4 +DA:62,4 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:77,0 +DA:78,0 +LF:13 +LH:3 +end_of_record +TN: +SF:contracts/ip-accounts/IPAccountImpl.sol +FN:34,IPAccountImpl.supportsInterface +FN:44,IPAccountImpl.token +FN:71,IPAccountImpl.isValidSignature +FN:87,IPAccountImpl.isValidSigner +FN:95,IPAccountImpl.owner +FN:101,IPAccountImpl._isValidSigner +FN:108,IPAccountImpl.safeTransferFrom +FN:115,IPAccountImpl.sendRoyaltyForDistribution +FN:122,IPAccountImpl.onERC721Received +FN:131,IPAccountImpl.onERC1155Received +FN:141,IPAccountImpl.onERC1155BatchReceived +FNDA:2,IPAccountImpl.safeTransferFrom +FNDA:2,IPAccountImpl.sendRoyaltyForDistribution +FNDA:0,IPAccountImpl.owner +FNDA:6,IPAccountImpl.onERC1155Received +FNDA:4,IPAccountImpl._isValidSigner +FNDA:0,IPAccountImpl.supportsInterface +FNDA:2,IPAccountImpl.isValidSigner +FNDA:0,IPAccountImpl.isValidSignature +FNDA:2,IPAccountImpl.onERC721Received +FNDA:0,IPAccountImpl.onERC1155BatchReceived +FNDA:2,IPAccountImpl.token +FNF:11 +FNH:7 +DA:35,0 +DA:54,6 +DA:68,6 +DA:76,0 +DA:77,0 +DA:78,0 +DA:81,0 +DA:88,2 +DA:89,2 +DA:92,0 +DA:96,4 +DA:97,4 +DA:98,4 +DA:102,4 +DA:109,2 +DA:110,1 +DA:111,1 +DA:116,2 +DA:128,2 +DA:138,6 +DA:148,0 +LF:21 +LH:14 +end_of_record +TN: +SF:contracts/ip-accounts/IPAccountRegistry.sol +FN:17,IPAccountRegistry.createAccount +FN:47,IPAccountRegistry.account +FN:66,IPAccountRegistry.getIPAccountImpl +FN:70,IPAccountRegistry._getCreationCode +FNDA:26,IPAccountRegistry.account +FNDA:41,IPAccountRegistry._getCreationCode +FNDA:0,IPAccountRegistry.getIPAccountImpl +FNDA:15,IPAccountRegistry.createAccount +FNF:4 +FNH:3 +DA:23,15 +DA:31,15 +DA:33,15 +DA:35,12 +DA:37,12 +DA:39,12 +DA:40,2 +DA:41,2 +DA:44,11 +DA:52,26 +DA:62,26 +DA:67,0 +DA:77,41 +DA:103,41 +LF:14 +LH:13 +end_of_record +TN: +SF:contracts/ip-assets/IPAssetRegistry.sol +FN:55,IPAssetRegistry.initialize +FN:69,IPAssetRegistry._getIPAssetRegistryStorage +FN:79,IPAssetRegistry.version +FN:96,IPAssetRegistry.createIPAsset +FN:145,IPAssetRegistry._setNonCommercialRights +FN:170,IPAssetRegistry._setCommercialRights +FN:190,IPAssetRegistry._mintBlock +FN:199,IPAssetRegistry.currentIdFor +FN:209,IPAssetRegistry.description +FN:214,IPAssetRegistry.franchiseId +FN:219,IPAssetRegistry.tokenURI +FN:226,IPAssetRegistry.supportsInterface +FNDA:4,IPAssetRegistry.supportsInterface +FNDA:2,IPAssetRegistry._setCommercialRights +FNDA:4,IPAssetRegistry.initialize +FNDA:1,IPAssetRegistry.tokenURI +FNDA:11,IPAssetRegistry.franchiseId +FNDA:15,IPAssetRegistry.currentIdFor +FNDA:1,IPAssetRegistry.description +FNDA:2850,IPAssetRegistry._mintBlock +FNDA:2850,IPAssetRegistry._setNonCommercialRights +FNDA:4,IPAssetRegistry.version +FNDA:8581,IPAssetRegistry._getIPAssetRegistryStorage +FNDA:2851,IPAssetRegistry.createIPAsset +FNF:12 +FNH:12 +DA:61,4 +DA:62,4 +DA:63,4 +DA:64,4 +DA:65,4 +DA:66,4 +DA:75,8581 +DA:80,4 +DA:107,2851 +DA:108,2850 +DA:109,2850 +DA:110,2850 +DA:111,2850 +DA:112,2850 +DA:115,2850 +DA:116,2850 +DA:118,2850 +DA:121,2850 +DA:123,2 +DA:126,2850 +DA:132,2850 +DA:146,2850 +DA:147,2850 +DA:171,2 +DA:172,2 +DA:191,2850 +DA:192,2850 +DA:193,2850 +DA:194,2850 +DA:195,2850 +DA:196,2850 +DA:200,2865 +DA:201,2865 +DA:202,2865 +DA:203,2843 +DA:205,22 +DA:210,1 +DA:211,1 +DA:215,11 +DA:216,11 +DA:223,1 +DA:235,4 +DA:236,4 +DA:237,3 +LF:44 +LH:44 +end_of_record +TN: +SF:contracts/ip-assets/IPAssetRegistryFactory.sol +FN:30,IPAssetRegistryFactory.createFranchiseIPAssets +FN:51,IPAssetRegistryFactory.upgradeFranchises +FNDA:4,IPAssetRegistryFactory.createFranchiseIPAssets +FNDA:2,IPAssetRegistryFactory.upgradeFranchises FNF:2 FNH:2 +DA:36,4 +DA:43,4 +DA:44,4 +DA:45,4 +DA:47,4 +DA:48,4 +DA:52,1 +DA:53,1 +DA:54,1 +LF:9 +LH:9 +end_of_record +TN: +SF:contracts/ip-assets/LibIPAssetId.sol +FN:12,LibIPAssetId._zeroId +FN:17,LibIPAssetId._lastId +FN:22,LibIPAssetId._ipAssetTypeFor +FNDA:2843,LibIPAssetId._zeroId +FNDA:2850,LibIPAssetId._lastId +FNDA:2850,LibIPAssetId._ipAssetTypeFor +FNF:3 +FNH:3 +DA:13,2843 +DA:14,2843 +DA:18,2850 +DA:19,2850 +DA:25,2850 +DA:26,2850 +LF:6 +LH:6 +end_of_record +TN: +SF:contracts/ip-assets/events/CommonIPAssetEventEmitter.sol +FN:18,CommonIPAssetEventEmitter.emitIPAssetCreation +FNDA:2828,CommonIPAssetEventEmitter.emitIPAssetCreation +FNF:1 +FNH:1 +DA:19,2828 +DA:20,2828 LF:2 LH:2 -BRF:0 -BRH:0 end_of_record TN: -SF:script/Counter.s.sol -FN:7,CounterScript.setUp -FNDA:0,CounterScript.setUp -FN:9,CounterScript.run -FNDA:0,CounterScript.run -DA:10,0 +SF:contracts/ip-assets/storage/IPAssetDataManager.sol +FN:22,IPAssetDataManager.__IPAssetData_init +FN:24,IPAssetDataManager._getIPAssetDataStorage +FN:30,IPAssetDataManager._writeIPAsset +FN:48,IPAssetDataManager.readIPAsset +FNDA:0,IPAssetDataManager.__IPAssetData_init +FNDA:2850,IPAssetDataManager._writeIPAsset +FNDA:2853,IPAssetDataManager._getIPAssetDataStorage +FNDA:2,IPAssetDataManager.readIPAsset +FNF:4 +FNH:3 +DA:26,2853 +DA:36,2850 +DA:37,2850 +DA:38,2850 +DA:39,2850 +DA:41,2850 +DA:42,2850 +DA:43,2850 +DA:44,2850 +DA:45,2850 +DA:49,3 +DA:50,3 +LF:12 +LH:12 +end_of_record +TN: +SF:contracts/modules/collect/CollectModuleBase.sol +FN:55,CollectModuleBase.getCollectNFT +FN:65,CollectModuleBase.initCollect +FN:101,CollectModuleBase.collect +FN:137,CollectModuleBase._initCollect +FN:142,CollectModuleBase._collect +FN:153,CollectModuleBase._getCollectNFT +FN:183,CollectModuleBase._getCollectModuleStorage +FNDA:512,CollectModuleBase._collect +FNDA:1536,CollectModuleBase.collect +FNDA:3362,CollectModuleBase.initCollect +FNDA:768,CollectModuleBase._getCollectNFT +FNDA:2850,CollectModuleBase._initCollect +FNDA:5154,CollectModuleBase._getCollectModuleStorage +FNDA:1280,CollectModuleBase.getCollectNFT +FNF:7 +FNH:7 +DA:56,1280 +DA:57,1280 +DA:68,3362 +DA:69,3362 +DA:72,3362 +DA:74,3362 +DA:75,256 +DA:79,3106 +DA:80,3106 +DA:81,256 +DA:85,2850 +DA:86,0 +DA:88,2850 +DA:91,2850 +DA:104,1536 +DA:105,1536 +DA:108,1536 +DA:109,256 +DA:113,1280 +DA:114,1280 +DA:115,256 +DA:117,1024 +DA:123,768 +DA:126,512 +DA:129,512 +DA:131,512 +DA:156,768 +DA:157,768 +DA:158,768 +DA:159,256 +DA:161,512 +DA:164,512 +DA:165,512 +DA:169,512 +DA:172,512 +DA:177,512 +DA:179,512 +DA:185,5154 +LF:38 +LH:37 +end_of_record +TN: +SF:contracts/modules/collect/SimpleCollectModule.sol +FN:19,MockCollectModule.initialize +FN:25,MockCollectModule._isCollectAuthorized +FN:31,MockCollectModule._authorizeUpgrade +FNDA:0,MockCollectModule._isCollectAuthorized +FNDA:0,MockCollectModule.initialize +FNDA:0,MockCollectModule._authorizeUpgrade +FNF:3 +FNH:0 +DA:20,0 +DA:21,0 +DA:26,0 +DA:27,0 +LF:4 +LH:0 +end_of_record +TN: +SF:contracts/modules/collect/nft/CollectNFTBase.sol +FN:47,CollectNFTBase.totalSupply +FN:54,CollectNFTBase.initialize +FN:80,CollectNFTBase.collect +FN:88,CollectNFTBase._initialize +FN:92,CollectNFTBase._collect +FNDA:1280,CollectNFTBase._collect +FNDA:1538,CollectNFTBase.initialize +FNDA:1536,CollectNFTBase.collect +FNDA:1280,CollectNFTBase._initialize +FNDA:512,CollectNFTBase.totalSupply +FNF:5 +FNH:5 +DA:48,512 +DA:57,1538 +DA:58,257 +DA:61,1281 +DA:62,1281 +DA:63,1281 +DA:64,1281 +DA:67,1281 +DA:73,1280 +DA:81,1280 +DA:82,1280 +DA:83,1280 +LF:12 +LH:12 +end_of_record +TN: +SF:contracts/modules/collect/nft/ERC721.sol +FN:43,ERC721.setApprovalForAll +FN:51,ERC721.approve +FN:93,ERC721.safeTransferFrom +FN:116,ERC721.transferFrom +FN:151,ERC721.supportsInterface +FN:159,ERC721._mint +FN:179,ERC721._burn +FNDA:1536,ERC721.transferFrom +FNDA:5120,ERC721.safeTransferFrom +FNDA:6400,ERC721._mint +FNDA:1280,ERC721._burn +FNDA:1024,ERC721.setApprovalForAll +FNDA:1792,ERC721.approve +FNDA:2,ERC721.supportsInterface +FNF:7 +FNH:7 +DA:44,1024 +DA:45,1024 +DA:52,1792 +DA:55,1792 +DA:56,256 +DA:59,1536 +DA:60,1536 +DA:76,2560 +DA:78,1792 +DA:79,1024 +DA:83,256 +DA:98,2560 +DA:100,1792 +DA:101,1024 +DA:105,256 +DA:121,6656 +DA:122,768 +DA:126,5888 +DA:127,2304 +DA:128,1536 +DA:130,768 +DA:133,5120 +DA:134,768 +DA:137,4352 +DA:140,4352 +DA:141,4352 +DA:144,4352 +DA:145,4352 +DA:152,2 +DA:153,1 +DA:160,6400 +DA:161,256 +DA:164,6144 +DA:165,256 +DA:169,5888 +DA:170,5888 +DA:173,5888 +DA:174,5888 +DA:180,1280 +DA:182,1280 +DA:183,512 +DA:187,768 +DA:188,768 +DA:191,768 +DA:192,768 +DA:193,768 +LF:46 +LH:46 +end_of_record +TN: +SF:contracts/modules/licensing/LicenseRegistry.sol +FN:34,LicenseRegistry.mint +FN:38,LicenseRegistry.exists +FN:42,LicenseRegistry._beforeTokenTransfer +FN:55,LicenseRegistry.getRightsManager +FN:59,LicenseRegistry.name +FN:63,LicenseRegistry.symbol +FNDA:10,LicenseRegistry.mint +FNDA:11,LicenseRegistry._beforeTokenTransfer +FNDA:2,LicenseRegistry.getRightsManager +FNDA:2,LicenseRegistry.name +FNDA:26,LicenseRegistry.exists +FNDA:2,LicenseRegistry.symbol +FNF:6 +FNH:6 +DA:35,9 +DA:39,26 +DA:49,11 +DA:50,2 +DA:52,10 +DA:56,2 +DA:60,2 +DA:64,2 +LF:8 +LH:8 +end_of_record +TN: +SF:contracts/modules/licensing/LicensingModule.sol +FN:46,LicensingModule.initialize +FN:51,LicensingModule._getLicensingModuleStorage +FN:58,LicensingModule.getNonCommercialLicenseURI +FN:66,LicensingModule.setNonCommercialLicenseURI +FN:78,LicensingModule.configureFranchiseLicensing +FN:92,LicensingModule._verifyRootLicense +FN:106,LicensingModule.getFranchiseConfig +FN:110,LicensingModule._authorizeUpgrade +FNDA:5663,LicensingModule._getLicensingModuleStorage +FNDA:2830,LicensingModule.getFranchiseConfig +FNDA:12,LicensingModule._verifyRootLicense +FNDA:0,LicensingModule.initialize +FNDA:0,LicensingModule._authorizeUpgrade +FNDA:2829,LicensingModule.getNonCommercialLicenseURI +FNDA:0,LicensingModule.setNonCommercialLicenseURI +FNDA:8,LicensingModule.configureFranchiseLicensing +FNF:8 +FNH:5 +DA:47,0 +DA:48,0 +DA:52,5663 +DA:54,5663 +DA:59,2829 +DA:67,0 +DA:68,0 +DA:79,8 +DA:80,1 +DA:82,6 +DA:83,6 +DA:84,5 +DA:85,1 +DA:87,4 +DA:88,4 +DA:89,4 +DA:93,12 +DA:94,2 +DA:95,2 +DA:98,0 +DA:100,2 +DA:101,1 +DA:107,2830 +LF:23 +LH:18 +end_of_record +TN: +SF:contracts/modules/licensing/RightsManager.sol +FN:79,RightsManager.__RightsManager_init +FN:87,RightsManager.setLicenseRegistry +FN:94,RightsManager._getRightsManagerStorage +FN:117,RightsManager.createLicense +FN:156,RightsManager.createFranchiseRootLicense +FN:180,RightsManager._createLicense +FN:258,RightsManager.revokeLicense +FN:274,RightsManager.executeTerms +FN:289,RightsManager.isLicenseActive +FN:303,RightsManager._isActiveAndTermsOk +FN:308,RightsManager.getLicense +FN:315,RightsManager._beforeTokenTransfer +FN:332,RightsManager._verifyRightsTransfer +FN:347,RightsManager._verifyTerms +FN:354,RightsManager.getLicenseTokenId +FN:360,RightsManager.getParentLicenseId +FN:367,RightsManager.getLicenseHolder +FN:381,RightsManager.getLicenseURI +FN:387,RightsManager.getLicenseRevoker +FN:393,RightsManager.getLicenseIdByTokenId +FN:403,RightsManager.getLicenseRegistry +FN:407,RightsManager.isRootLicense +FN:413,RightsManager.isLicenseSet +FN:423,RightsManager.transferSublicense +FNDA:8,RightsManager.createLicense +FNDA:13,RightsManager.getLicenseIdByTokenId +FNDA:2989,RightsManager._getRightsManagerStorage +FNDA:0,RightsManager.__RightsManager_init +FNDA:4,RightsManager.setLicenseRegistry +FNDA:2872,RightsManager._verifyTerms +FNDA:0,RightsManager.getLicenseHolder +FNDA:4,RightsManager.getLicenseRegistry +FNDA:13,RightsManager.getLicense +FNDA:2,RightsManager.revokeLicense +FNDA:0,RightsManager.isRootLicense +FNDA:2863,RightsManager._beforeTokenTransfer +FNDA:16,RightsManager.isLicenseActive +FNDA:0,RightsManager.getLicenseRevoker +FNDA:2,RightsManager.executeTerms +FNDA:9,RightsManager.getLicenseTokenId +FNDA:24,RightsManager._isActiveAndTermsOk +FNDA:4,RightsManager.createFranchiseRootLicense +FNDA:0,RightsManager.isLicenseSet +FNDA:4,RightsManager.getLicenseURI +FNDA:4,RightsManager.getParentLicenseId +FNDA:0,RightsManager._verifyRightsTransfer +FNDA:3,RightsManager.transferSublicense +FNDA:2881,RightsManager._createLicense +FNF:24 +FNH:18 +DA:83,4 +DA:89,4 +DA:90,4 +DA:91,4 +DA:100,2989 +DA:127,8 +DA:128,2 +DA:130,6 +DA:131,5 +DA:165,4 +DA:166,3 +DA:192,2881 +DA:193,2880 +DA:197,2880 +DA:198,2877 +DA:199,1 +DA:203,2879 +DA:204,2864 +DA:205,1 +DA:208,15 +DA:209,15 +DA:211,11 +DA:212,11 +DA:213,10 +DA:214,9 +DA:215,6 +DA:219,2872 +DA:222,2871 +DA:223,2871 +DA:237,2871 +DA:238,9 +DA:241,2862 +DA:245,2871 +DA:253,2871 +DA:254,2871 +DA:259,2 +DA:260,2 +DA:261,2 +DA:262,2 +DA:263,2 +DA:264,2 +DA:275,2 +DA:276,2 +DA:277,2 +DA:278,2 +DA:279,2 +DA:280,2 +DA:281,1 +DA:282,1 +DA:285,2 +DA:293,18 +DA:294,18 +DA:295,33 +DA:296,24 +DA:297,24 +DA:298,15 +DA:300,9 +DA:304,24 +DA:305,24 +DA:309,13 +DA:321,2863 +DA:322,0 +DA:323,0 +DA:325,0 +DA:329,2863 +DA:338,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:348,2872 +DA:349,2849 +DA:350,1 +DA:357,9 +DA:363,4 +DA:370,25 +DA:371,25 +DA:372,4 +DA:374,21 +DA:377,21 +DA:384,4 +DA:390,0 +DA:397,15 +DA:404,4 +DA:410,0 +DA:414,2 +DA:427,3 +DA:428,3 +DA:429,2 +DA:430,1 +LF:90 +LH:80 +end_of_record +TN: +SF:contracts/modules/licensing/terms/BaseTermsProcessor.sol +FN:37,BaseTermsProcessor.executeTerms +FN:45,BaseTermsProcessor.supportsInterface +FNDA:3,BaseTermsProcessor.supportsInterface +FNDA:4,BaseTermsProcessor.executeTerms FNF:2 +FNH:2 +DA:38,2 +DA:48,3 +LF:2 +LH:2 +end_of_record +TN: +SF:contracts/modules/licensing/terms/MultiTermsProcessor.sol +FN:30,MultiTermsProcessor._setProcessors +FN:44,MultiTermsProcessor._executeTerms +FN:59,MultiTermsProcessor.supportsInterface +FN:77,MultiTermsProcessor.termsExecutedSuccessfully +FNDA:0,MultiTermsProcessor.supportsInterface +FNDA:0,MultiTermsProcessor._setProcessors +FNDA:0,MultiTermsProcessor._executeTerms +FNDA:0,MultiTermsProcessor.termsExecutedSuccessfully +FNF:4 FNH:0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:52,0 +DA:55,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:68,0 +DA:71,0 +DA:73,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:85,0 +DA:88,0 +LF:29 +LH:0 +end_of_record +TN: +SF:contracts/modules/licensing/terms/TimeTermsProcessor.sol +FN:24,TimeTermsProcessor._executeTerms +FN:33,TimeTermsProcessor.termsExecutedSuccessfully +FNDA:2,TimeTermsProcessor._executeTerms +FNDA:19,TimeTermsProcessor.termsExecutedSuccessfully +FNF:2 +FNH:2 +DA:25,2 +DA:26,2 +DA:27,1 +DA:29,2 +DA:34,19 +DA:35,19 +LF:6 +LH:6 +end_of_record +TN: +SF:contracts/modules/relationships/LibIPAssetMask.sol +FN:24,LibIPAssetMask._convertToMask +FN:48,LibIPAssetMask._convertFromMask +FN:63,LibIPAssetMask._supportsIPAssetType +FN:74,LibIPAssetMask._checkRelationshipNode +FNDA:9,LibIPAssetMask._convertFromMask +FNDA:14,LibIPAssetMask._checkRelationshipNode +FNDA:21,LibIPAssetMask._convertToMask +FNDA:28,LibIPAssetMask._supportsIPAssetType +FNF:4 +FNH:4 +DA:25,21 +DA:26,20 +DA:27,20 +DA:28,53 +DA:29,51 +DA:31,51 +DA:34,18 +DA:35,9 +DA:37,18 +DA:49,9 +DA:50,9 +DA:51,9 +DA:52,63 +DA:53,30 +DA:54,30 +DA:57,9 +DA:58,9 +DA:64,28 +DA:75,14 +DA:76,12 +DA:78,2 +DA:80,0 +LF:22 +LH:21 +end_of_record +TN: +SF:contracts/modules/relationships/ProtocolRelationshipModule.sol +FN:19,ProtocolRelationshipModule.initialize +FN:24,ProtocolRelationshipModule.setRelationshipConfig +FN:28,ProtocolRelationshipModule.unsetRelationshipConfig +FN:33,ProtocolRelationshipModule._authorizeUpgrade +FNDA:0,ProtocolRelationshipModule.initialize +FNDA:0,ProtocolRelationshipModule._authorizeUpgrade +FNDA:2,ProtocolRelationshipModule.setRelationshipConfig +FNDA:2,ProtocolRelationshipModule.unsetRelationshipConfig +FNF:4 +FNH:2 +DA:20,0 +DA:25,1 +DA:29,1 +LF:3 +LH:2 +end_of_record +TN: +SF:contracts/modules/relationships/RelationshipModuleBase.sol +FN:66,RelationshipModuleBase.__RelationshipModuleBase_init +FN:70,RelationshipModuleBase._getRelationshipModuleStorage +FN:88,RelationshipModuleBase.relate +FN:110,RelationshipModuleBase._updateEndTime +FN:128,RelationshipModuleBase.unrelate +FN:142,RelationshipModuleBase.areTheyRelated +FN:152,RelationshipModuleBase.isRelationshipExpired +FN:163,RelationshipModuleBase._verifyRelationshipParams +FN:181,RelationshipModuleBase._checkRelationshipNode +FN:188,RelationshipModuleBase.getRelationshipKey +FN:207,RelationshipModuleBase._setRelationshipConfig +FN:230,RelationshipModuleBase._unsetRelationshipConfig +FN:249,RelationshipModuleBase._convertRelParams +FN:264,RelationshipModuleBase.getRelationshipConfig +FN:275,RelationshipModuleBase.getRelationshipConfigDecoded +FN:291,RelationshipModuleBase.getRelationshipId +FN:304,RelationshipModuleBase.convertToMask +FN:315,RelationshipModuleBase.convertFromMask +FN:320,RelationshipModuleBase.supportsIPAssetType +FNDA:40,RelationshipModuleBase._getRelationshipModuleStorage +FNDA:5,RelationshipModuleBase.areTheyRelated +FNDA:1,RelationshipModuleBase.getRelationshipConfigDecoded +FNDA:9,RelationshipModuleBase._verifyRelationshipParams +FNDA:4,RelationshipModuleBase.getRelationshipConfig +FNDA:0,RelationshipModuleBase.isRelationshipExpired +FNDA:1,RelationshipModuleBase.getRelationshipId +FNDA:0,RelationshipModuleBase.convertFromMask +FNDA:3,RelationshipModuleBase._unsetRelationshipConfig +FNDA:4,RelationshipModuleBase._setRelationshipConfig +FNDA:4,RelationshipModuleBase._convertRelParams +FNDA:0,RelationshipModuleBase.__RelationshipModuleBase_init +FNDA:0,RelationshipModuleBase.getRelationshipKey +FNDA:0,RelationshipModuleBase.unrelate +FNDA:0,RelationshipModuleBase.supportsIPAssetType +FNDA:13,RelationshipModuleBase._checkRelationshipNode +FNDA:9,RelationshipModuleBase.relate +FNDA:0,RelationshipModuleBase.convertToMask +FNDA:3,RelationshipModuleBase._updateEndTime +FNF:19 +FNH:12 +DA:67,0 +DA:76,40 +DA:89,9 +DA:90,9 +DA:91,9 +DA:93,3 +DA:94,0 +DA:96,3 +DA:97,3 +DA:98,3 +DA:99,3 +DA:111,3 +DA:112,3 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:120,3 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:143,5 +DA:144,5 +DA:153,3 +DA:154,3 +DA:155,3 +DA:164,9 +DA:165,8 +DA:166,6 +DA:167,5 +DA:168,5 +DA:169,4 +DA:182,13 +DA:183,11 +DA:184,11 +DA:189,11 +DA:208,4 +DA:209,4 +DA:210,3 +DA:211,3 +DA:212,3 +DA:223,3 +DA:231,3 +DA:233,3 +DA:234,1 +DA:235,2 +DA:236,2 +DA:250,4 +DA:251,4 +DA:252,4 +DA:253,4 +DA:265,5 +DA:266,5 +DA:276,1 +DA:277,1 +DA:278,1 +DA:279,1 +DA:292,5 +DA:305,0 +DA:316,0 +DA:321,0 +LF:65 +LH:49 +end_of_record +TN: +SF:contracts/modules/relationships/processors/BaseRelationshipProcessor.sol +FN:31,BaseRelationshipProcessor.processRelationship +FN:39,BaseRelationshipProcessor.supportsInterface +FNDA:12,BaseRelationshipProcessor.supportsInterface +FNDA:3,BaseRelationshipProcessor.processRelationship +FNF:2 +FNH:2 +DA:32,3 +DA:33,3 +DA:42,12 +LF:3 +LH:3 +end_of_record +TN: +SF:contracts/modules/relationships/processors/DstOwnerRelationshipProcessor.sol +FN:20,DstOwnerRelationshipProcessor._processRelationship +FNDA:0,DstOwnerRelationshipProcessor._processRelationship +FNF:1 +FNH:0 +DA:21,0 +DA:22,0 +DA:24,0 +LF:3 +LH:0 +end_of_record +TN: +SF:contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol +FN:18,PermissionlessRelationshipProcessor._processRelationship +FNDA:3,PermissionlessRelationshipProcessor._processRelationship +FNF:1 +FNH:1 +DA:19,3 LF:1 +LH:1 +end_of_record +TN: +SF:contracts/modules/relationships/processors/SrcDstOwnerRelationshipProcessor.sol +FN:20,SrcDstOwnerRelationshipProcessor._processRelationship +FNDA:0,SrcDstOwnerRelationshipProcessor._processRelationship +FNF:1 +FNH:0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:26,0 +LF:4 +LH:0 +end_of_record +TN: +SF:contracts/modules/relationships/processors/SrcOwnerRelationshipProcessor.sol +FN:20,SrcOwnerRelationshipProcessor._processRelationship +FNDA:0,SrcOwnerRelationshipProcessor._processRelationship +FNF:1 +FNH:0 +DA:21,0 +DA:22,0 +DA:24,0 +LF:3 +LH:0 +end_of_record +TN: +SF:contracts/modules/relationships/processors/SrcRequestOrDstOwnerRelationshipProcessor.sol +FN:18,SrcRequestOrDstOwnerRelationshipProcessor._processRelationship +FNDA:0,SrcRequestOrDstOwnerRelationshipProcessor._processRelationship +FNF:1 +FNH:0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:23,0 +DA:25,0 +LF:5 +LH:0 +end_of_record +TN: +SF:contracts/modules/royalties/RoyaltyDistributor.sol +FN:25,RoyaltyDistributor.setRoyaltyPolicy +FN:36,RoyaltyDistributor.getRoyaltyPolicy +FN:44,RoyaltyDistributor.updateDistribution +FN:53,RoyaltyDistributor.distribute +FN:58,RoyaltyDistributor.claim +FN:62,RoyaltyDistributor.pause +FN:65,RoyaltyDistributor.unpause +FN:69,RoyaltyDistributor._ipAccount +FN:73,RoyaltyDistributor._authorizeUpgrade +FNDA:8,RoyaltyDistributor.updateDistribution +FNDA:0,RoyaltyDistributor._authorizeUpgrade +FNDA:2,RoyaltyDistributor.distribute +FNDA:0,RoyaltyDistributor.pause +FNDA:2,RoyaltyDistributor.claim +FNDA:0,RoyaltyDistributor.unpause +FNDA:8,RoyaltyDistributor.getRoyaltyPolicy +FNDA:18,RoyaltyDistributor._ipAccount +FNDA:8,RoyaltyDistributor.setRoyaltyPolicy +FNF:9 +FNH:6 +DA:31,8 +DA:32,8 +DA:33,8 +DA:40,8 +DA:41,8 +DA:49,8 +DA:50,8 +DA:54,2 +DA:55,2 +DA:59,2 +DA:63,0 +DA:66,0 +DA:70,18 +LF:13 +LH:11 +end_of_record +TN: +SF:contracts/modules/royalties/RoyaltyNFT.sol +FN:39,RoyaltyNFT.distributeFunds +FN:63,RoyaltyNFT.claim +FN:69,RoyaltyNFT.mint +FN:106,RoyaltyNFT._afterTokenTransfer +FN:128,RoyaltyNFT.uri +FN:145,RoyaltyNFT.percentage +FN:151,RoyaltyNFT.toTokenId +FN:155,RoyaltyNFT._getSum +FN:166,RoyaltyNFT.sort +FNDA:0,RoyaltyNFT.uri +FNDA:2,RoyaltyNFT.distributeFunds +FNDA:18,RoyaltyNFT._afterTokenTransfer +FNDA:6,RoyaltyNFT._getSum +FNDA:6,RoyaltyNFT.mint +FNDA:2,RoyaltyNFT.sort +FNDA:0,RoyaltyNFT.percentage +FNDA:14,RoyaltyNFT.toTokenId +FNDA:2,RoyaltyNFT.claim +FNF:9 +FNH:7 +DA:40,2 +DA:41,2 +DA:42,2 +DA:43,2 +DA:44,2 +DA:45,2 +DA:46,6 +DA:48,6 +DA:51,2 +DA:52,2 +DA:53,2 +DA:64,2 +DA:65,2 +DA:66,2 +DA:70,6 +DA:72,6 +DA:74,6 +DA:75,0 +DA:80,6 +DA:81,0 +DA:84,6 +DA:85,16 +DA:89,6 +DA:90,6 +DA:91,6 +DA:92,6 +DA:93,6 +DA:94,6 +DA:96,6 +DA:114,18 +DA:115,18 +DA:116,18 +DA:117,18 +DA:118,18 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:129,0 +DA:147,6 +DA:152,28 +DA:156,6 +DA:157,6 +DA:158,16 +DA:161,16 +DA:167,2 +DA:168,2 +DA:169,4 +DA:170,4 +DA:171,8 +DA:172,4 +DA:173,4 +DA:175,4 +LF:53 +LH:46 +end_of_record +TN: +SF:contracts/modules/royalties/RoyaltyNFTFactory.sol +FN:16,RoyaltyNFTFactory.createRoyaltyNft +FNDA:0,RoyaltyNFTFactory.createRoyaltyNft +FNF:1 +FNH:0 +DA:19,0 +DA:20,0 +LF:2 +LH:0 +end_of_record +TN: +SF:contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol +FN:15,MutableRoyaltyProportionPolicy.initPolicy +FN:17,MutableRoyaltyProportionPolicy.updateDistribution +FN:35,MutableRoyaltyProportionPolicy.distribute +FNDA:8,MutableRoyaltyProportionPolicy.updateDistribution +FNDA:8,MutableRoyaltyProportionPolicy.initPolicy +FNDA:2,MutableRoyaltyProportionPolicy.distribute +FNF:3 +FNH:3 +DA:18,8 +DA:19,8 +DA:20,8 +DA:21,6 +DA:23,2 +DA:24,2 +DA:36,2 +LF:7 +LH:7 +end_of_record +TN: +SF:contracts/modules/timing/LibDuration.sol +FN:19,LibDuration.isActive +FN:23,LibDuration.isRenewable +FN:27,LibDuration.renew +FN:35,LibDuration.createRunningTimeConfig +FN:44,LibDuration.createStoppedTimeConfig +FNDA:0,LibDuration.renew +FNDA:0,LibDuration.isRenewable +FNDA:0,LibDuration.createRunningTimeConfig +FNDA:0,LibDuration.createStoppedTimeConfig +FNDA:0,LibDuration.isActive +FNF:5 +FNH:0 +DA:20,0 +DA:24,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:36,0 +DA:37,0 +DA:45,0 +DA:46,0 +LF:11 LH:0 -BRF:0 -BRH:0 end_of_record diff --git a/package-lock.json b/package-lock.json index cdbd5a9f..eb38a978 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "@story-protocol/contracts", "version": "0.1.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -183,48 +183,6 @@ "semver": "^7.5.3" } }, - "node_modules/@changesets/apply-release-plan/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@changesets/assemble-release-plan": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.4.tgz", @@ -239,39 +197,6 @@ "semver": "^7.5.3" } }, - "node_modules/@changesets/assemble-release-plan/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/assemble-release-plan/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/assemble-release-plan/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@changesets/changelog-git": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz", @@ -325,72 +250,6 @@ "changeset": "bin.js" } }, - "node_modules/@changesets/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@changesets/cli/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@changesets/cli/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@changesets/cli/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@changesets/config": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.1.tgz", @@ -428,39 +287,6 @@ "semver": "^7.5.3" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/get-dependents-graph/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/get-dependents-graph/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@changesets/get-release-plan": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.17.tgz", @@ -516,41 +342,6 @@ "js-yaml": "^3.13.1" } }, - "node_modules/@changesets/parse/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@changesets/parse/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/parse/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@changesets/pre": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz", @@ -646,12 +437,16 @@ "wrap-ansi": "^2.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/@ensdomains/ens/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dev": true, "peer": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, "engines": { "node": ">=0.10.0" } @@ -700,56 +495,123 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/@ensdomains/ens/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dev": true, "peer": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ensdomains/ens/node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "node_modules/@ensdomains/ens/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dev": true, "peer": true, "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, - "bin": { - "solcjs": "solcjs" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ensdomains/ens/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "node_modules/@ensdomains/ens/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "peer": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/@ensdomains/ens/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/@ensdomains/ens/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, "peer": true, "dependencies": { - "ansi-regex": "^2.0.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "peer": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@ensdomains/ens/node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "dev": true, + "peer": true, + "dependencies": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + }, + "bin": { + "solcjs": "solcjs" + } + }, + "node_modules/@ensdomains/ens/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "peer": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" @@ -1832,25 +1694,6 @@ "fs-extra": "^8.1.0" } }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@manypkg/find-root/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@manypkg/find-root/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -1865,63 +1708,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@manypkg/find-root/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@manypkg/find-root/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@manypkg/find-root/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@manypkg/find-root/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@manypkg/find-root/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@manypkg/get-packages": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", @@ -1956,26 +1742,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@manypkg/get-packages/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@metamask/eth-sig-util": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", @@ -2529,6 +2295,15 @@ "hardhat": "^2.0.4" } }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@nomiclabs/hardhat-waffle": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.5.tgz", @@ -2977,7 +2752,6 @@ "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", "dev": true, "hasInstallScript": true, - "optional": true, "dependencies": { "node-gyp-build": "4.3.0" }, @@ -3054,21 +2828,6 @@ "ci-info": "^3.1.0" } }, - "node_modules/@types/is-ci/node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, "node_modules/@types/level-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", @@ -3114,9 +2873,9 @@ } }, "node_modules/@types/node": { - "version": "20.1.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.3.tgz", - "integrity": "sha512-NP2yfZpgmf2eDRPmgGq+fjGjSwFgYbihA8/gK+ey23qT9RkxsgNTZvGOEpXgzIGqesTYkElELLgtKoMQTys5vA==", + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "node_modules/@types/node-fetch": { @@ -3461,10 +3220,13 @@ } }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/array-back": { "version": "3.1.0", @@ -3993,15 +3755,12 @@ } }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/camelcase-keys": { @@ -4021,15 +3780,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/case": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", @@ -4150,10 +3900,19 @@ } }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/cipher-base": { "version": "1.0.4", @@ -4460,6 +4219,24 @@ "url": "https://github.com/sponsors/d-fischer" } }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -4604,15 +4381,12 @@ } }, "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { @@ -4631,15 +4405,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize-keys/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -4692,6 +4457,7 @@ "version": "1.43.0", "resolved": "https://registry.npmjs.org/defender-admin-client/-/defender-admin-client-1.43.0.tgz", "integrity": "sha512-EAB4dUkpcKjbLSHSTTw9KVmTrs8A36x+eVNt85Qr47ypilILtyNgjdqgvroda8syRicQBy28VBdUUWPJtVYAPA==", + "deprecated": "defender-admin-client is deprecated, please install @openzeppelin/defender-admin-client", "dev": true, "dependencies": { "axios": "^0.21.2", @@ -4705,6 +4471,7 @@ "version": "1.43.0", "resolved": "https://registry.npmjs.org/defender-base-client/-/defender-base-client-1.43.0.tgz", "integrity": "sha512-PFQPDZ08SznSlsKiHcvf1TzvKtnd/fv2/P5s2Y8jYPIb7OtANHw94oDFOOvRpg54o8EQItIb9v7H4g4kp/7fng==", + "deprecated": "defender-base-client is deprecated, please install @openzeppelin/defender-base-client", "dev": true, "dependencies": { "amazon-cognito-identity-js": "^6.0.1", @@ -5043,24 +4810,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", @@ -5147,7 +4896,7 @@ "source-map": "~0.2.0" } }, - "node_modules/esprima": { + "node_modules/escodegen/node_modules/esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", @@ -5160,6 +4909,19 @@ "node": ">=0.10.0" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", @@ -5245,30 +5007,12 @@ "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/eth-gas-reporter/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/eth-gas-reporter/node_modules/chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", @@ -5311,15 +5055,6 @@ "ms": "^2.1.1" } }, - "node_modules/eth-gas-reporter/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eth-gas-reporter/node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -5335,19 +5070,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", @@ -5560,19 +5282,19 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/eth-gas-reporter/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, "node_modules/eth-gas-reporter/node_modules/p-locate": { @@ -5587,13 +5309,13 @@ "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/eth-gas-reporter/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/eth-gas-reporter/node_modules/readdirp": { @@ -6075,15 +5797,16 @@ } }, "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/find-yarn-workspace-root2": { @@ -6941,22 +6664,23 @@ } }, "node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "@types/glob": "^7.1.1", "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { @@ -7295,6 +7019,12 @@ "hardhat": "^2.0.2" } }, + "node_modules/hardhat/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, "node_modules/hardhat/node_modules/commander": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", @@ -7313,6 +7043,18 @@ "@scure/bip39": "1.1.1" } }, + "node_modules/hardhat/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/hardhat/node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -7337,6 +7079,61 @@ "node": ">=10.0.0" } }, + "node_modules/hardhat/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/hardhat/node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -7346,6 +7143,15 @@ "node": ">=0.10.0" } }, + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/hardhat/node_modules/solc": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", @@ -7888,21 +7694,6 @@ "is-ci": "bin.js" } }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -7995,12 +7786,12 @@ } }, "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/is-regex": { @@ -8201,12 +7992,13 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -8599,6 +8391,19 @@ "node": ">=0.10.0" } }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "peer": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/load-yaml-file": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", @@ -8614,61 +8419,16 @@ "node": ">=6" } }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/load-yaml-file/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/load-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/lodash": { @@ -8985,144 +8745,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/meow/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/meow/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/meow/node_modules/type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", @@ -9135,19 +8757,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9280,15 +8889,6 @@ "node": ">= 6" } }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mixme": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.9.tgz", @@ -9368,6 +8968,12 @@ "node": ">=6" } }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/mocha/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -9414,6 +9020,18 @@ "node": ">=8" } }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -9477,15 +9095,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -9501,6 +9110,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/module-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", @@ -9734,18 +9352,21 @@ } }, "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.getownpropertydescriptors": { @@ -9849,27 +9470,30 @@ } }, "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/p-map": { @@ -9888,12 +9512,12 @@ } }, "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/parent-module": { @@ -9939,12 +9563,12 @@ "dev": true }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { @@ -10058,80 +9682,11 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/platform-deploy-client": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/platform-deploy-client/-/platform-deploy-client-0.3.3.tgz", "integrity": "sha512-CO7P0h8OHSa19QjA7hWbpmLPE0TPacDgdwA8Vwu9NnUdlYvXfF+q4f0FwaeS0vb1ruWtpkTfeIxy7Sc+TxgcNQ==", + "deprecated": "platform-deploy-client is deprecated, please install @openzeppelin/platform-deploy-client", "dev": true, "dependencies": { "@ethersproject/abi": "^5.6.3", @@ -10226,15 +9781,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/preferred-pm/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -10297,39 +9843,6 @@ "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/prettier-plugin-solidity/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10471,84 +9984,53 @@ } }, "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "peer": true, "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "peer": true, "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "peer": true, - "dependencies": { - "pinkie-promise": "^2.0.0" + "node": ">=8" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/read-yaml-file": { @@ -10566,50 +10048,6 @@ "node": ">=6" } }, - "node_modules/read-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/read-yaml-file/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/read-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -10729,6 +10167,15 @@ "node": ">=4" } }, + "node_modules/req-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -10866,12 +10313,12 @@ } }, "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/retry": { @@ -11074,21 +10521,25 @@ "istanbul": "lib/cli.js" } }, - "node_modules/sc-istanbul/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/sc-istanbul/node_modules/async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true }, + "node_modules/sc-istanbul/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -11114,32 +10565,6 @@ "node": ">=0.10.0" } }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -11195,14 +10620,38 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -11417,15 +10866,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/smartwrap/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/smartwrap/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -11455,28 +10895,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/smartwrap/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/smartwrap/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/smartwrap/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -11486,63 +10904,6 @@ "node": ">=8" } }, - "node_modules/smartwrap/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smartwrap/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/smartwrap/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smartwrap/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/smartwrap/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/smartwrap/node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -11611,19 +10972,6 @@ "node": ">=8" } }, - "node_modules/smartwrap/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/solc": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", @@ -11722,6 +11070,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/solhint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/solhint/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -11802,6 +11156,18 @@ "node": ">=8" } }, + "node_modules/solhint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/solhint/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -11814,6 +11180,15 @@ "node": ">=10" } }, + "node_modules/solhint/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/solhint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11890,24 +11265,6 @@ "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/solidity-coverage/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/solidity-coverage/node_modules/chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", @@ -11950,15 +11307,6 @@ "ms": "^2.1.1" } }, - "node_modules/solidity-coverage/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/solidity-coverage/node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -11974,19 +11322,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "node_modules/solidity-coverage/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/solidity-coverage/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -12057,6 +11392,25 @@ "node": "*" } }, + "node_modules/solidity-coverage/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/solidity-coverage/node_modules/js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -12095,22 +11449,10 @@ "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -12180,19 +11522,19 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/solidity-coverage/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, "node_modules/solidity-coverage/node_modules/p-locate": { @@ -12207,13 +11549,13 @@ "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/solidity-coverage/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/solidity-coverage/node_modules/readdirp": { @@ -12234,21 +11576,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/solidity-coverage/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/solidity-coverage/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -12322,12 +11649,6 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, - "node_modules/solidity-coverage/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/solidity-coverage/node_modules/yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -12650,16 +11971,12 @@ } }, "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "peer": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/strip-hex-prefix": { @@ -13422,9 +12739,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "peer": true, "bin": { @@ -13432,7 +12749,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/typical": { @@ -13669,15 +12986,6 @@ "node": ">=8.15" } }, - "node_modules/which-pm/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -13914,12 +13222,16 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, "engines": { - "node": ">=10" + "node": ">=6" } }, "node_modules/yargs-unparser": { @@ -13937,6 +13249,39 @@ "node": ">=10" } }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -13960,6 +13305,15 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -13981,5 +13335,10254 @@ "ethers": "^5.7.0" } } + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", + "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", + "dev": true, + "requires": { + "@aws-crypto/util": "^1.2.2", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/util": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", + "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", + "dev": true, + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-sdk/types": { + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.329.0.tgz", + "integrity": "sha512-wFBW4yciDfzQBSFmWNaEvHShnSGLMxSu9Lls6EUf6xDMavxSB36bsrVRX6CyAo/W0NeIIyEOW1LclGPgJV1okg==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/runtime": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", + "dev": true + }, + "@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "dev": true, + "requires": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "dev": true, + "requires": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" + } + }, + "@changesets/apply-release-plan": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.4.tgz", + "integrity": "sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/config": "^2.3.1", + "@changesets/get-version-range-type": "^0.3.2", + "@changesets/git": "^2.0.0", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "@changesets/assemble-release-plan": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.4.tgz", + "integrity": "sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.6", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "@changesets/changelog-git": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz", + "integrity": "sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==", + "dev": true, + "requires": { + "@changesets/types": "^5.2.1" + } + }, + "@changesets/cli": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.2.tgz", + "integrity": "sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^6.1.4", + "@changesets/assemble-release-plan": "^5.2.4", + "@changesets/changelog-git": "^0.1.14", + "@changesets/config": "^2.3.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.6", + "@changesets/get-release-plan": "^3.0.17", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@changesets/write": "^0.2.3", + "@manypkg/get-packages": "^1.1.3", + "@types/is-ci": "^3.0.0", + "@types/semver": "^7.5.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "is-ci": "^3.0.1", + "meow": "^6.0.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0", + "tty-table": "^4.1.5" + } + }, + "@changesets/config": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.1.tgz", + "integrity": "sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==", + "dev": true, + "requires": { + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.6", + "@changesets/logger": "^0.0.5", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.2" + } + }, + "@changesets/errors": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz", + "integrity": "sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==", + "dev": true, + "requires": { + "extendable-error": "^0.1.5" + } + }, + "@changesets/get-dependents-graph": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.6.tgz", + "integrity": "sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==", + "dev": true, + "requires": { + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "semver": "^7.5.3" + } + }, + "@changesets/get-release-plan": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.17.tgz", + "integrity": "sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/assemble-release-plan": "^5.2.4", + "@changesets/config": "^2.3.1", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3" + } + }, + "@changesets/get-version-range-type": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz", + "integrity": "sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==", + "dev": true + }, + "@changesets/git": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-2.0.0.tgz", + "integrity": "sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.2", + "spawndamnit": "^2.0.0" + } + }, + "@changesets/logger": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz", + "integrity": "sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==", + "dev": true, + "requires": { + "chalk": "^2.1.0" + } + }, + "@changesets/parse": { + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz", + "integrity": "sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==", + "dev": true, + "requires": { + "@changesets/types": "^5.2.1", + "js-yaml": "^3.13.1" + } + }, + "@changesets/pre": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz", + "integrity": "sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "@changesets/read": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz", + "integrity": "sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/parse": "^0.3.16", + "@changesets/types": "^5.2.1", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0" + } + }, + "@changesets/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz", + "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==", + "dev": true + }, + "@changesets/write": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.2.3.tgz", + "integrity": "sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/types": "^5.2.1", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" + } + }, + "@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "dev": true, + "peer": true, + "requires": { + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "peer": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "peer": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "peer": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "peer": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true, + "peer": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "peer": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "peer": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "peer": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "peer": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "peer": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "peer": true + }, + "solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "dev": true, + "peer": true, + "requires": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "peer": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "peer": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "peer": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true, + "peer": true + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "dev": true, + "peer": true, + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "peer": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } + } + }, + "@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "dev": true, + "peer": true + }, + "@ethereum-waffle/chai": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz", + "integrity": "sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==", + "dev": true, + "requires": { + "@ethereum-waffle/provider": "4.0.5", + "debug": "^4.3.4", + "json-bigint": "^1.0.0" + } + }, + "@ethereum-waffle/compiler": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz", + "integrity": "sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==", + "dev": true, + "requires": { + "@resolver-engine/imports": "^0.3.3", + "@resolver-engine/imports-fs": "^0.3.3", + "@typechain/ethers-v5": "^10.0.0", + "@types/mkdirp": "^0.5.2", + "@types/node-fetch": "^2.6.1", + "mkdirp": "^0.5.1", + "node-fetch": "^2.6.7" + } + }, + "@ethereum-waffle/ens": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", + "integrity": "sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==", + "dev": true, + "requires": {} + }, + "@ethereum-waffle/mock-contract": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz", + "integrity": "sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==", + "dev": true, + "requires": {} + }, + "@ethereum-waffle/provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz", + "integrity": "sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==", + "dev": true, + "requires": { + "@ethereum-waffle/ens": "4.0.3", + "@ganache/ethereum-options": "0.1.4", + "debug": "^4.3.4", + "ganache": "7.4.3" + } + }, + "@ethereumjs/block": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", + "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.6.5", + "@ethereumjs/tx": "^3.5.2", + "ethereumjs-util": "^7.1.5", + "merkle-patricia-tree": "^4.2.4" + }, + "dependencies": { + "@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" + } + } + } + }, + "@ethereumjs/blockchain": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", + "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.6.2", + "@ethereumjs/common": "^2.6.4", + "@ethereumjs/ethash": "^1.1.0", + "debug": "^4.3.3", + "ethereumjs-util": "^7.1.5", + "level-mem": "^5.0.1", + "lru-cache": "^5.1.1", + "semaphore-async-await": "^1.5.1" + }, + "dependencies": { + "@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + } + } + }, + "@ethereumjs/common": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", + "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.3" + } + }, + "@ethereumjs/ethash": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", + "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.5.0", + "@types/levelup": "^4.3.0", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.1.1", + "miller-rabin": "^4.0.0" + } + }, + "@ethereumjs/tx": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", + "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.6.0", + "ethereumjs-util": "^7.1.3" + } + }, + "@ethereumjs/vm": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz", + "integrity": "sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.6.0", + "@ethereumjs/blockchain": "^5.5.0", + "@ethereumjs/common": "^2.6.0", + "@ethereumjs/tx": "^3.4.0", + "async-eventemitter": "^0.2.4", + "core-js-pure": "^3.0.1", + "debug": "^2.2.0", + "ethereumjs-util": "^7.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "merkle-patricia-tree": "^4.2.2", + "rustbn.js": "~0.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "dev": true + }, + "@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "dev": true, + "requires": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ganache/ethereum-address": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", + "integrity": "sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==", + "dev": true, + "requires": { + "@ganache/utils": "0.1.4" + } + }, + "@ganache/ethereum-options": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz", + "integrity": "sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==", + "dev": true, + "requires": { + "@ganache/ethereum-address": "0.1.4", + "@ganache/ethereum-utils": "0.1.4", + "@ganache/options": "0.1.4", + "@ganache/utils": "0.1.4", + "bip39": "3.0.4", + "seedrandom": "3.0.5" + } + }, + "@ganache/ethereum-utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz", + "integrity": "sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==", + "dev": true, + "requires": { + "@ethereumjs/common": "2.6.0", + "@ethereumjs/tx": "3.4.0", + "@ethereumjs/vm": "5.6.0", + "@ganache/ethereum-address": "0.1.4", + "@ganache/rlp": "0.1.4", + "@ganache/utils": "0.1.4", + "emittery": "0.10.0", + "ethereumjs-abi": "0.6.8", + "ethereumjs-util": "7.1.3" + }, + "dependencies": { + "ethereumjs-util": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", + "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + } + } + }, + "@ganache/options": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz", + "integrity": "sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==", + "dev": true, + "requires": { + "@ganache/utils": "0.1.4", + "bip39": "3.0.4", + "seedrandom": "3.0.5" + } + }, + "@ganache/rlp": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz", + "integrity": "sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==", + "dev": true, + "requires": { + "@ganache/utils": "0.1.4", + "rlp": "2.2.6" + } + }, + "@ganache/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==", + "dev": true, + "requires": { + "@trufflesuite/bigint-buffer": "1.1.9", + "emittery": "0.10.0", + "keccak": "3.0.1", + "seedrandom": "3.0.5" + } + }, + "@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + }, + "dependencies": { + "@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dev": true, + "requires": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "dependencies": { + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "@morgan-stanley/ts-mocking-bird": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz", + "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==", + "dev": true, + "requires": { + "lodash": "^4.17.16", + "uuid": "^7.0.3" + }, + "dependencies": { + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + } + } + }, + "@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true + }, + "@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nomicfoundation/ethereumjs-block": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", + "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" + } + }, + "@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", + "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-ethash": "3.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + } + }, + "@nomicfoundation/ethereumjs-common": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", + "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-util": "9.0.1", + "crc-32": "^1.2.0" + } + }, + "@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", + "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-evm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", + "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "dev": true, + "requires": { + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", + "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", + "dev": true + }, + "@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", + "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" + } + }, + "@nomicfoundation/ethereumjs-trie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", + "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + } + }, + "@nomicfoundation/ethereumjs-tx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", + "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "dev": true, + "requires": { + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-util": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", + "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "dev": true, + "requires": { + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "ethereum-cryptography": "0.1.3" + }, + "dependencies": { + "@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "dev": true, + "requires": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "dev": true, + "requires": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" + } + } + } + }, + "@nomicfoundation/ethereumjs-vm": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", + "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "dev": true, + "requires": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "dev": true, + "optional": true + }, + "@nomiclabs/hardhat-ethers": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", + "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", + "dev": true, + "requires": {} + }, + "@nomiclabs/hardhat-etherscan": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", + "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@nomiclabs/hardhat-waffle": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.5.tgz", + "integrity": "sha512-U1RH9OQ1mWYQfb+moX5aTgGjpVVlOcpiFI47wwnaGG4kLhcTy90cNiapoqZenxcRAITVbr0/+QSduINL5EsUIQ==", + "dev": true, + "requires": {} + }, + "@openzeppelin/contracts": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.3.tgz", + "integrity": "sha512-bQHV8R9Me8IaJoJ2vPG4rXcL7seB7YVuskr4f+f5RyOStSZetwzkWtoqDMl5erkBJy0lDRUnIR2WIkPiC0GJlg==" + }, + "@openzeppelin/contracts-upgradeable": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.3.tgz", + "integrity": "sha512-SXDRl7HKpl2WDoJpn7CK/M9U4Z8gNXDHHChAKh0Iz+Wew3wu6CmFYBeie3je8V0GSXZAIYYwUktSrnW/kwVPtg==" + }, + "@openzeppelin/hardhat-upgrades": { + "version": "1.25.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.25.3.tgz", + "integrity": "sha512-hVgKKWq8ZcWXUwgR3jwPxzB5judoaSHCFnYhVZWcmomyWgBzYv0f3bl3dYjrm5yuIJflxk8YwSPCtGu3C7pLfw==", + "dev": true, + "requires": { + "@openzeppelin/upgrades-core": "^1.26.2", + "chalk": "^4.1.0", + "debug": "^4.1.1", + "defender-admin-client": "^1.39.0", + "platform-deploy-client": "^0.3.2", + "proper-lockfile": "^4.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@openzeppelin/upgrades-core": { + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.26.2.tgz", + "integrity": "sha512-TJORrgyun5qflPos/47P3j61gDw+7W+tEirSBOYRxfVL1WGjX1n8iaLrijPIqzyeS1MKguN1nckAMspQ4SKrxw==", + "dev": true, + "requires": { + "cbor": "^8.0.0", + "chalk": "^4.1.0", + "compare-versions": "^5.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.15" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@resolver-engine/core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", + "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "is-url": "^1.2.4", + "request": "^2.85.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@resolver-engine/fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", + "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", + "dev": true, + "requires": { + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@resolver-engine/imports": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", + "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", + "dev": true, + "requires": { + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0", + "hosted-git-info": "^2.6.0", + "path-browserify": "^1.0.0", + "url": "^0.11.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@resolver-engine/imports-fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", + "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", + "dev": true, + "requires": { + "@resolver-engine/fs": "^0.3.3", + "@resolver-engine/imports": "^0.3.3", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "dev": true + }, + "@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "requires": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "requires": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "requires": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + } + }, + "@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true + }, + "@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "@trufflesuite/bigint-buffer": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", + "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", + "dev": true, + "requires": { + "node-gyp-build": "4.3.0" + } + }, + "@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + } + }, + "@types/abstract-leveldown": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz", + "integrity": "sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ==", + "dev": true + }, + "@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==", + "dev": true, + "requires": { + "ci-info": "^3.1.0" + } + }, + "@types/level-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", + "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", + "dev": true + }, + "@types/levelup": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", + "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", + "dev": true, + "requires": { + "@types/abstract-leveldown": "*", + "@types/level-errors": "*", + "@types/node": "*" + } + }, + "@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "@types/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "dev": true, + "requires": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, + "abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dev": true, + "requires": { + "xtend": "^4.0.2" + } + } + } + }, + "address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amazon-cognito-identity-js": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.2.0.tgz", + "integrity": "sha512-9Fxrp9+MtLdsJvqOwSaE3ll+pneICeuE3pwj2yDkiyGNWuHx97b8bVLR2bOgfDmDJnY0Hq8QoeXtwdM4aaXJjg==", + "dev": true, + "requires": { + "@aws-crypto/sha256-js": "1.2.2", + "buffer": "4.9.2", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "antlr4": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.12.0.tgz", + "integrity": "sha512-23iB5IzXJZRZeK9TigzUyrNc9pSmNqAerJRBcNq1ETrmttMWRgaYZzC561IgEO3ygKsDJTYDTozABXa4b/fTQQ==", + "dev": true + }, + "antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "ast-parents": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", + "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dev": true, + "requires": { + "async": "^2.4.0" + } + }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "requires": { + "retry": "0.13.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64-sol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.1.0.tgz", + "integrity": "sha512-mksLxtFyBcXd3LYK5UxyMj29YR//zoaeXpJaKRbnLQC0E99oCJl7VpKaJDXWAuTvnhxBU9XNYzhxSL8umsrxWg==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + } + } + }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true + }, + "better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "requires": { + "is-windows": "^1.0.0" + } + }, + "bigint-crypto-utils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", + "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", + "dev": true + }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dev": true, + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", + "dev": true + } + } + }, + "blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "peer": true + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "breakword": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.6.tgz", + "integrity": "sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + } + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "requires": { + "streamsearch": "^1.1.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true + }, + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "requires": { + "nofilter": "^3.1.0" + } + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "classic-level": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "peer": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, + "command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "requires": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + } + }, + "command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "requires": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "dependencies": { + "array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true + }, + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true + } + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "compare-versions": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", + "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "core-js-pure": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", + "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true + }, + "csv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", + "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", + "dev": true, + "requires": { + "csv-generate": "^3.4.3", + "csv-parse": "^4.16.3", + "csv-stringify": "^5.6.5", + "stream-transform": "^2.1.3" + } + }, + "csv-generate": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", + "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", + "dev": true + }, + "csv-parse": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", + "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "dev": true + }, + "csv-stringify": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", + "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defender-admin-client": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/defender-admin-client/-/defender-admin-client-1.43.0.tgz", + "integrity": "sha512-EAB4dUkpcKjbLSHSTTw9KVmTrs8A36x+eVNt85Qr47ypilILtyNgjdqgvroda8syRicQBy28VBdUUWPJtVYAPA==", + "dev": true, + "requires": { + "axios": "^0.21.2", + "defender-base-client": "1.43.0", + "ethers": "^5.7.2", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "defender-base-client": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/defender-base-client/-/defender-base-client-1.43.0.tgz", + "integrity": "sha512-PFQPDZ08SznSlsKiHcvf1TzvKtnd/fv2/P5s2Y8jYPIb7OtANHw94oDFOOvRpg54o8EQItIb9v7H4g4kp/7fng==", + "dev": true, + "requires": { + "amazon-cognito-identity-js": "^6.0.1", + "async-retry": "^1.3.3", + "axios": "^0.21.2", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "dev": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dev": true, + "requires": { + "xtend": "^4.0.2" + } + } + } + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "4" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "requires": { + "heap": ">= 0.2.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true + }, + "encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "dev": true, + "requires": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "dev": true, + "peer": true, + "requires": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "peer": true + } + } + }, + "eth-gas-reporter": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.14.0", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "requires": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "dev": true + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } + }, + "ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "dev": true, + "requires": { + "js-sha3": "^0.8.0" + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereum-waffle": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", + "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", + "dev": true, + "requires": { + "@ethereum-waffle/chai": "4.0.10", + "@ethereum-waffle/compiler": "4.0.3", + "@ethereum-waffle/mock-contract": "4.0.4", + "@ethereum-waffle/provider": "4.0.5", + "solc": "0.8.15", + "typechain": "^8.0.0" + } + }, + "ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "dependencies": { + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + }, + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "requires": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "requires": { + "array-back": "^3.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dev": true, + "requires": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "dev": true, + "requires": { + "imul": "^1.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "ganache": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", + "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", + "dev": true, + "requires": { + "@trufflesuite/bigint-buffer": "1.1.10", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "5.1.1", + "@types/seedrandom": "3.0.1", + "bufferutil": "4.0.5", + "emittery": "0.10.0", + "keccak": "3.0.2", + "leveldown": "6.1.0", + "secp256k1": "4.0.3", + "utf-8-validate": "5.0.7" + }, + "dependencies": { + "@trufflesuite/bigint-buffer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", + "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", + "bundled": true, + "dev": true, + "requires": { + "node-gyp-build": "4.4.0" + }, + "dependencies": { + "node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "bundled": true, + "dev": true + } + } + }, + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "bundled": true, + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "bundled": true, + "dev": true + }, + "@types/node": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "bundled": true, + "dev": true + }, + "@types/seedrandom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", + "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", + "bundled": true, + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "bundled": true, + "dev": true + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "bundled": true, + "dev": true + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "bundled": true, + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "dev": true, + "optional": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "catering": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", + "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", + "bundled": true, + "dev": true, + "requires": { + "queue-tick": "^1.0.0" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "bundled": true, + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "bundled": true, + "dev": true + } + } + }, + "emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "bundled": true, + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "bundled": true, + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "bundled": true, + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "bundled": true, + "dev": true + }, + "keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "bundled": true, + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + } + }, + "leveldown": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", + "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", + "bundled": true, + "dev": true, + "requires": { + "abstract-leveldown": "^7.2.0", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", + "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", + "bundled": true, + "dev": true, + "requires": { + "buffer": "^6.0.3", + "catering": "^2.0.0", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" + } + }, + "level-concat-iterator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", + "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", + "bundled": true, + "dev": true, + "requires": { + "catering": "^2.1.0" + } + }, + "level-supports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", + "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", + "bundled": true, + "dev": true + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "bundled": true, + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "bundled": true, + "dev": true + }, + "napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "bundled": true, + "dev": true + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "bundled": true, + "dev": true + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "bundled": true, + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "bundled": true, + "dev": true + }, + "queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "bundled": true, + "dev": true + }, + "secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "bundled": true, + "dev": true, + "requires": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "utf-8-validate": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", + "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "dev": true, + "optional": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "hardhat": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", + "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "requires": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dev": true, + "requires": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + } + } + }, + "hardhat-deploy": { + "version": "0.11.28", + "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.28.tgz", + "integrity": "sha512-Bzg+QFtp7bKYfoF7KJwFQTWcUm28MGmgDT/+VH5r3USKfzWhezQXlxpLvcBJPdV7UFHa3mGGnr8tVbNqxsllLw==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/providers": "^5.7.2", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wallet": "^5.7.0", + "@types/qs": "^6.9.7", + "axios": "^0.21.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "ethers": "^5.5.3", + "form-data": "^4.0.0", + "fs-extra": "^10.0.0", + "match-all": "^1.2.6", + "murmur-128": "^0.2.1", + "qs": "^6.9.4", + "zksync-web3": "^0.14.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "dev": true, + "requires": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-id": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", + "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dev": true, + "peer": true, + "requires": { + "punycode": "2.1.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true, + "peer": true + }, + "io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "requires": { + "fp-ts": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "requires": { + "better-path-resolve": "1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "peer": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "dev": true, + "requires": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "dev": true + }, + "js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "peer": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "dev": true, + "requires": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + } + }, + "level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "dev": true, + "requires": { + "buffer": "^5.6.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "dev": true + }, + "level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + } + }, + "level-mem": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", + "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "dev": true, + "requires": { + "level-packager": "^5.0.3", + "memdown": "^5.0.0" + } + }, + "level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "dev": true, + "requires": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + } + }, + "level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "dev": true + }, + "level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, + "level-ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", + "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0", + "xtend": "^4.0.1" + } + }, + "levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dev": true, + "requires": { + "xtend": "^4.0.2" + } + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "peer": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "peer": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "peer": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true, + "peer": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true + }, + "match-all": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", + "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", + "dev": true + }, + "mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "dev": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", + "dev": true + }, + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dev": true, + "requires": { + "xtend": "^4.0.2" + } + } + } + }, + "memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "dev": true, + "requires": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true + }, + "meow": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + } + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "merkle-patricia-tree": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", + "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", + "dev": true, + "requires": { + "@types/levelup": "^4.3.0", + "ethereumjs-util": "^7.1.4", + "level-mem": "^5.0.1", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", + "semaphore-async-await": "^1.5.1" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "mixme": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.9.tgz", + "integrity": "sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dev": true, + "requires": { + "obliterator": "^2.0.0" + } + }, + "mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "murmur-128": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", + "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", + "dev": true, + "requires": { + "encode-utf8": "^1.0.2", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, + "napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "dev": true + }, + "nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "peer": true + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dev": true, + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "dev": true, + "requires": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + } + }, + "obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "peer": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true + }, + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "peer": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "peer": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "platform-deploy-client": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/platform-deploy-client/-/platform-deploy-client-0.3.3.tgz", + "integrity": "sha512-CO7P0h8OHSa19QjA7hWbpmLPE0TPacDgdwA8Vwu9NnUdlYvXfF+q4f0FwaeS0vb1ruWtpkTfeIxy7Sc+TxgcNQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.6.3", + "axios": "^0.21.2", + "defender-base-client": "^1.40.0", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "preferred-pm": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", + "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", + "dev": true, + "requires": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "prettier-plugin-solidity": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", + "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.16.0", + "semver": "^7.3.8", + "solidity-comments-extractor": "^0.0.7" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", + "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "requires": { + "asap": "~2.0.6" + } + }, + "proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + } + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "dev": true + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "requires": { + "minimatch": "^3.0.5" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "requires": { + "req-from": "^2.0.0" + } + }, + "req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + } + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "dev": true, + "peer": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true, + "peer": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dev": true, + "requires": { + "bn.js": "^4.11.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "dev": true, + "requires": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true + }, + "semaphore-async-await": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", + "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "requires": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + } + }, + "smartwrap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", + "integrity": "sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.3", + "breakword": "^1.0.5", + "grapheme-splitter": "^1.0.4", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1", + "yargs": "^15.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "solc": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", + "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", + "dev": true, + "requires": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "solhint": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.4.1.tgz", + "integrity": "sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.16.0", + "ajv": "^6.12.6", + "antlr4": "^4.11.0", + "ast-parents": "^0.0.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cosmiconfig": "^8.0.0", + "fast-diff": "^1.2.0", + "glob": "^8.0.3", + "ignore": "^5.2.4", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "prettier": "^2.8.3", + "semver": "^6.3.0", + "strip-ansi": "^6.0.1", + "table": "^6.8.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", + "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "solhint-plugin-prettier": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz", + "integrity": "sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "solidity-ast": { + "version": "0.4.49", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.49.tgz", + "integrity": "sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ==", + "dev": true + }, + "solidity-comments-extractor": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", + "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", + "dev": true + }, + "solidity-coverage": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.14.1", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "7.1.2", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } + }, + "solmate": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/solmate/-/solmate-6.2.0.tgz", + "integrity": "sha512-AM38ioQ2P8zRsA42zenb9or6OybRjOLXIu3lhIT8rhddUuduCt76pUEuLxOIg9GByGojGz+EbpFdCB6B+QZVVA==" + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spawndamnit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", + "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", + "dev": true, + "requires": { + "cross-spawn": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + } + } + }, + "stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "requires": { + "type-fest": "^0.7.1" + }, + "dependencies": { + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true + }, + "stream-transform": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", + "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", + "dev": true, + "requires": { + "mixme": "^0.5.1" + } + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "requires": { + "get-port": "^3.1.0" + } + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "requires": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "dependencies": { + "array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true + }, + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true + } + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true + }, + "testrpc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "dev": true, + "peer": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "ts-command-line-args": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.0.tgz", + "integrity": "sha512-Ff7Xt04WWCjj/cmPO9eWTJX3qpBZWuPWyQYG1vnxJao+alWWYjwJBc5aYz3h5p5dE08A6AnpkgiCtP/0KXXBYw==", + "dev": true, + "requires": { + "@morgan-stanley/ts-mocking-bird": "^0.6.2", + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "requires": {} + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "dev": true + }, + "tty-table": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tty-table/-/tty-table-4.2.1.tgz", + "integrity": "sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "csv": "^5.5.3", + "kleur": "^4.1.5", + "smartwrap": "^2.0.2", + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.1", + "yargs": "^17.7.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typechain": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz", + "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==", + "dev": true, + "requires": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "peer": true + }, + "typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "dev": true, + "requires": { + "busboy": "^1.6.0" + } + }, + "unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "dev": true, + "requires": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true, + "peer": true + }, + "which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dev": true, + "requires": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + } + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "dev": true, + "peer": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "requires": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "dependencies": { + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true + } + } + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "requires": {} + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zksync-web3": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.3.tgz", + "integrity": "sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==", + "dev": true, + "requires": {} + } } } diff --git a/package.json b/package.json index 132f0641..c91a165d 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "mocha": "^10.2.0", "prettier": "2.8.7", "prettier-plugin-solidity": "^1.1.3", - "solhint": "^3.4.1", + "solhint": "^3.6.2", "solhint-plugin-prettier": "^0.0.5", "solidity-coverage": "^0.8.2" }, diff --git a/script/foundry/access-control/GrantRole.s.sol b/script/foundry/access-control/GrantRole.s.sol new file mode 100644 index 00000000..4924c9eb --- /dev/null +++ b/script/foundry/access-control/GrantRole.s.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "forge-std/Script.sol"; +import "script/foundry/utils/StringUtil.sol"; +import "script/foundry/utils/JsonDeploymentHandler.s.sol"; +import "script/foundry/utils/BroadcastManager.s.sol"; +import "contracts/IPAsset.sol"; +import "contracts/access-control/AccessControlSingleton.sol"; +import { RELATIONSHIP_MANAGER_ROLE } from "contracts/access-control/ProtocolRoles.sol"; + +contract GrantRole is Script, BroadcastManager, JsonDeploymentHandler { + + using StringUtil for uint256; + using stdJson for string; + + bytes32 constant ROLE = RELATIONSHIP_MANAGER_ROLE; + address constant GRANTEE = 0xB6288e57bf7406B35ab4F70Fd1135E907107e386; + + constructor() JsonDeploymentHandler("") {} + + function run() public { + _readDeployment(); + _beginBroadcast(); + address moduleAddress = _readAddress(".main.AccessControlSingleton-Proxy"); + if (moduleAddress == address(0)) { + revert("AccessControlSingleton-Proxy not found"); + } + AccessControlSingleton access = AccessControlSingleton(moduleAddress); + access.grantRole(ROLE, GRANTEE); + } + +} diff --git a/script/foundry/deployment/Main.s.sol b/script/foundry/deployment/Main.s.sol index 5e9839ce..05c10d68 100644 --- a/script/foundry/deployment/Main.s.sol +++ b/script/foundry/deployment/Main.s.sol @@ -12,7 +12,6 @@ import "contracts/ip-assets/events/CommonIPAssetEventEmitter.sol"; import "contracts/FranchiseRegistry.sol"; import "contracts/access-control/AccessControlSingleton.sol"; import "contracts/modules/relationships/ProtocolRelationshipModule.sol"; -import "contracts/access-control/ProtocolRoles.sol"; import "contracts/modules/licensing/LicensingModule.sol"; import "test/foundry/mocks/MockCollectNFT.sol"; import "test/foundry/mocks/MockCollectModule.sol"; @@ -21,6 +20,7 @@ import "contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol" import "contracts/modules/royalties/RoyaltyNFT.sol"; import "contracts/ip-accounts/IPAccountImpl.sol"; import "contracts/ip-accounts/IPAccountRegistry.sol"; +import { AccessControl } from "contracts/lib/AccessControl.sol"; contract Main is Script, BroadcastManager, JsonDeploymentHandler, ProxyHelper { @@ -250,8 +250,8 @@ contract Main is Script, BroadcastManager, JsonDeploymentHandler, ProxyHelper { /// GRANT ROLEs AccessControlSingleton accessControlSingleton = AccessControlSingleton(accessControl); - accessControlSingleton.grantRole(UPGRADER_ROLE, admin); - accessControlSingleton.grantRole(RELATIONSHIP_MANAGER_ROLE, admin); + accessControlSingleton.grantRole(AccessControl.UPGRADER_ROLE, admin); + accessControlSingleton.grantRole(AccessControl.RELATIONSHIP_MANAGER_ROLE, admin); _writeDeployment(); _endBroadcast(); diff --git a/script/foundry/relationship-setters/SetAppearsInRelationship.s.sol b/script/foundry/relationship-setters/SetAppearsInRelationship.s.sol index 75356eb0..3af5e3f0 100644 --- a/script/foundry/relationship-setters/SetAppearsInRelationship.s.sol +++ b/script/foundry/relationship-setters/SetAppearsInRelationship.s.sol @@ -5,9 +5,9 @@ import "forge-std/Script.sol"; import "script/foundry/utils/StringUtil.sol"; import "script/foundry/utils/JsonDeploymentHandler.s.sol"; import "script/foundry/utils/BroadcastManager.s.sol"; -import "contracts/IPAsset.sol"; +import "contracts/lib/IPAsset.sol"; import "contracts/modules/relationships/ProtocolRelationshipModule.sol"; -import "contracts/modules/relationships/IRelationshipModule.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; contract SetAppearsInRelationship is Script, BroadcastManager, JsonDeploymentHandler { @@ -27,31 +27,31 @@ contract SetAppearsInRelationship is Script, BroadcastManager, JsonDeploymentHan } protocolRelationshipModule = ProtocolRelationshipModule(relModule); - IPAsset[] memory sourceIPAssets = new IPAsset[](4); - sourceIPAssets[0] = IPAsset.CHARACTER; - sourceIPAssets[1] = IPAsset.GROUP; - sourceIPAssets[2] = IPAsset.LOCATION; - sourceIPAssets[3] = IPAsset.ITEM; + IPAsset.IPAssetType[] memory sourceIPAssets = new IPAsset.IPAssetType[](4); + sourceIPAssets[0] = IPAsset.IPAssetType.CHARACTER; + sourceIPAssets[1] = IPAsset.IPAssetType.GROUP; + sourceIPAssets[2] = IPAsset.IPAssetType.LOCATION; + sourceIPAssets[3] = IPAsset.IPAssetType.ITEM; - IPAsset[] memory destIPAssets = new IPAsset[](1); - destIPAssets[0] = IPAsset.STORY; + IPAsset.IPAssetType[] memory destIPAssets = new IPAsset.IPAssetType[](1); + destIPAssets[0] = IPAsset.IPAssetType.STORY; address processor = _readAddress(".relationship-processors.SrcRequestOrDstOwnerRelationshipProcessor"); if (processor == address(0)) { revert("SrcRequestOrDstOwnerRelationshipProcessor not found"); } - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIPAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIPAssets, allowedExternalDest: false, onlySameFranchise: true, processor: processor, disputer: admin, - timeConfig: IRelationshipModule.TimeConfig({ - maxTTL: 0, - minTTL: 0, + timeConfig: Relationship.TimeConfig({ + maxTtl: 0, + minTtl: 0, renewable: false }) }); diff --git a/script/foundry/relationship-setters/SetTestRelationship.s.sol b/script/foundry/relationship-setters/SetTestRelationship.s.sol index 1e3b1f67..46f658a8 100644 --- a/script/foundry/relationship-setters/SetTestRelationship.s.sol +++ b/script/foundry/relationship-setters/SetTestRelationship.s.sol @@ -5,9 +5,9 @@ import "forge-std/Script.sol"; import "script/foundry/utils/StringUtil.sol"; import "script/foundry/utils/JsonDeploymentHandler.s.sol"; import "script/foundry/utils/BroadcastManager.s.sol"; -import "contracts/IPAsset.sol"; +import "contracts/lib/IPAsset.sol"; import "contracts/modules/relationships/ProtocolRelationshipModule.sol"; -import "contracts/modules/relationships/IRelationshipModule.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; contract SetTestRelationship is Script, BroadcastManager, JsonDeploymentHandler { @@ -27,9 +27,9 @@ contract SetTestRelationship is Script, BroadcastManager, JsonDeploymentHandler } protocolRelationshipModule = ProtocolRelationshipModule(relModule); - IPAsset[] memory allIPAssets = new IPAsset[](6); + IPAsset.IPAssetType[] memory allIpAssets = new IPAsset.IPAssetType[](6); for (uint8 i = 0; i < 6; i++) { - allIPAssets[i] = IPAsset(i + 1); + allIpAssets[i] = IPAsset.IPAssetType(i + 1); } address processor = _readAddress(".relationship-processors.PermissionlessRelationshipProcessor"); @@ -37,17 +37,17 @@ contract SetTestRelationship is Script, BroadcastManager, JsonDeploymentHandler revert("PermissionlessRelationshipProcessor"); } - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: allIPAssets, + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: allIpAssets, allowedExternalSource: true, - destIPAssets: allIPAssets, + destIpAssets: allIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: processor, disputer: admin, - timeConfig: IRelationshipModule.TimeConfig({ - maxTTL: 0, - minTTL: 0, + timeConfig: Relationship.TimeConfig({ + maxTtl: 0, + minTtl: 0, renewable: false }) }); diff --git a/script/foundry/setups/SetupFranchiseLicensing.s.sol b/script/foundry/setups/SetupFranchiseLicensing.s.sol new file mode 100644 index 00000000..c59d2622 --- /dev/null +++ b/script/foundry/setups/SetupFranchiseLicensing.s.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "forge-std/Script.sol"; +import "script/foundry/utils/StringUtil.sol"; +import "script/foundry/utils/JsonDeploymentHandler.s.sol"; +import "script/foundry/utils/BroadcastManager.s.sol"; +import "contracts/modules/licensing/LicensingModule.sol"; + +contract SetupFranchiseLicensing is Script, BroadcastManager, JsonDeploymentHandler { + + using StringUtil for uint256; + using stdJson for string; + + LicensingModule licensingModule; + + // ********* EDIT THESE FOR CONFIG ********* + uint constant FRANCHISE_ID = 67; + + address constant REVOKER_ADDRESS = address(0x1); + bool constant ROOT_IP_ASSET_HAS_COMMERCIAL_RIGHTS = false; + + bool constant NON_COMMERCIAL_SUBLICENSING = true; + uint constant NON_COMMERCIAL_ROOT_LICENSE_ID = 0; // Leave as 0 for now + ITermsProcessor constant NON_COMMERCIAL_TERMS_PROCESSOR = ITermsProcessor(address(0)); // Leave as 0 for now + bytes constant NON_COMMERCIAL_TERMS_DATA = abi.encode(''); // Leave as empty for now + + bool constant COMMERCIAL_SUBLICENSING = true; + uint constant COMMERCIAL_ROOT_LICENSE_ID = 0; // Leave as 0 for now + ITermsProcessor constant COMMERCIAL_TERMS_PROCESSOR = ITermsProcessor(address(0)); // Leave as empty for now + bytes constant COMMERCIAL_TERMS_DATA = abi.encode(''); // Leave as empty for now + string constant COMMERCIAL_LICENSE_URI = "https://commercial.license"; + + + constructor() JsonDeploymentHandler("") {} + + function run() public { + _readDeployment(); + _beginBroadcast(); + address licensingAddress = _readAddress(".main.LicensingModule-Proxy"); + if (licensingAddress == address(0)) { + revert("LicensingModule-Proxy not found"); + } + + ILicensingModule.FranchiseConfig memory config = _getLicensingConfig(); + licensingModule = LicensingModule(licensingAddress); + licensingModule.configureFranchiseLicensing(FRANCHISE_ID, config); + } + + function _getLicensingConfig() pure internal returns (ILicensingModule.FranchiseConfig memory) { + return ILicensingModule.FranchiseConfig({ + nonCommercialConfig: ILicensingModule.IpAssetConfig({ + canSublicense: NON_COMMERCIAL_SUBLICENSING, + franchiseRootLicenseId: NON_COMMERCIAL_ROOT_LICENSE_ID + }), + nonCommercialTerms: IERC5218.TermsProcessorConfig({ + processor: NON_COMMERCIAL_TERMS_PROCESSOR, + data: NON_COMMERCIAL_TERMS_DATA + }), + commercialConfig: ILicensingModule.IpAssetConfig({ + canSublicense: COMMERCIAL_SUBLICENSING, + franchiseRootLicenseId: COMMERCIAL_ROOT_LICENSE_ID + }), + commercialTerms: IERC5218.TermsProcessorConfig({ + processor: COMMERCIAL_TERMS_PROCESSOR, + data: COMMERCIAL_TERMS_DATA + }), + rootIpAssetHasCommercialRights: ROOT_IP_ASSET_HAS_COMMERCIAL_RIGHTS, + revoker: REVOKER_ADDRESS, + commercialLicenseUri: COMMERCIAL_LICENSE_URI + }); + } + +} diff --git a/script/foundry/upgrades/DevUpgrades.s.sol b/script/foundry/upgrades/DevUpgrades.s.sol index 52258049..a318370a 100644 --- a/script/foundry/upgrades/DevUpgrades.s.sol +++ b/script/foundry/upgrades/DevUpgrades.s.sol @@ -9,7 +9,6 @@ import "contracts/modules/relationships/ProtocolRelationshipModule.sol"; import "contracts/modules/relationships/RelationshipModuleBase.sol"; import "contracts/FranchiseRegistry.sol"; import "contracts/access-control/AccessControlSingleton.sol"; -import "contracts/access-control/ProtocolRoles.sol"; import "contracts/ip-assets/events/CommonIPAssetEventEmitter.sol"; import "contracts/ip-assets/IPAssetRegistry.sol"; @@ -106,4 +105,4 @@ contract UpgradeIPAssetRegistry is Script, BroadcastManager, JsonDeploymentHandl } } -*/ \ No newline at end of file +*/ diff --git a/script/hardhat/configureFranchiseLicensing.js b/script/hardhat/configureFranchiseLicensing.js new file mode 100644 index 00000000..5d5e8d6b --- /dev/null +++ b/script/hardhat/configureFranchiseLicensing.js @@ -0,0 +1,85 @@ +const loadDeployment = require('./loadDeployment.js'); +const { getContractAddress } = require('@ethersproject/address'); + +function findId(events) { + const event = events.find((e) => e.event === "FranchiseConfigSet"); + return { + id: event.args.id.toString(), + }; +} + +async function main(args, hre) { + const { ethers } = hre; + const { chainId, contracts } = await loadDeployment(hre); + const { + franchiseId, + nonCommercialCanSublicense, + nonCommercialRootLicenseId, + commercialCanSublicense, + commercialRootLicenseId, + rootIpAssetHasCommercialRights, + revoker, + commercialLicenseUri, + events, + } = args; + console.log("Configuring licensing for franchise: ", franchiseId); + + /** + struct IpAssetConfig { + bool canSublicense; // If false, this IPAsset cannot be parentLicenseId of any other IPAsset + uint256 franchiseRootLicenseId; // If set, root IPAsset licenses will have this as their parentLicenseId + // TODO: allowed license terms? processors? + // TODO: limit medium of sublicenses? As in, you can only license prose to prose? something like LibIPAssetMask? + // TODO: limit who you can sublicense to? + } + + struct FranchiseConfig { + IpAssetConfig nonCommercialConfig; + IERC5218.TermsProcessorConfig nonCommercialTerms; + IpAssetConfig commercialConfig; + IERC5218.TermsProcessorConfig commercialTerms; + bool rootIpAssetHasCommercialRights; + address revoker; + string commercialLicenseUri; + + }*/ + const params = { + nonCommercialConfig: { + canSublicense: nonCommercialCanSublicense == 'true', + franchiseRootLicenseId: nonCommercialRootLicenseId, + }, + nonCommercialTerms: { + processor: ethers.constants.AddressZero, + processorData: [], + }, + commercialConfig: { + canSublicense: commercialCanSublicense == 'true', + franchiseRootLicenseId: commercialRootLicenseId + }, + commercialTerms: { + processor: ethers.constants.AddressZero, + processorData: [], + }, + rootIpAssetHasCommercialRights: rootIpAssetHasCommercialRights == 'true', + revoker: revoker, + commercialLicenseUri: commercialLicenseUri, + }; + console.log(params) + const tx = await contracts.licensingModule.configureFranchiseLicensing( + franchiseId, + params + ); + console.log("Franchise created in tx: ", tx.hash); + console.log("Waiting for tx to be mined..."); + const receipt = await tx.wait(); + if (events) { + console.log("Events: "); + console.log(receipt.events); + } + console.log("FranchiseConfigSet"); + const { id } = findId(receipt.events); + console.log("id: ", id); + return { id }; +} + +module.exports = main; diff --git a/script/hardhat/loadDeployment.js b/script/hardhat/loadDeployment.js index 59a0ed64..1d741600 100644 --- a/script/hardhat/loadDeployment.js +++ b/script/hardhat/loadDeployment.js @@ -20,6 +20,8 @@ async function main(hre) { contracts.IPAssetsRegistry = await ethers.getContractFactory("IPAssetRegistry"); contracts.ProtocolRelationshipModule = await ethers.getContractFactory("ProtocolRelationshipModule"); contracts.protocolRelationshipModule = await contracts.ProtocolRelationshipModule.attach(deployment.main["ProtocolRelationshipModule-Proxy"]); + contracts.LicensingModule = await ethers.getContractFactory("LicensingModule"); + contracts.licensingModule = await contracts.LicensingModule.attach(deployment.main["LicensingModule-Proxy"]); return { chainId, contracts, deployment }; } diff --git a/test/foundry/FranchiseRegistry.t.sol b/test/foundry/FranchiseRegistry.t.sol index dfcf3db8..4996019e 100644 --- a/test/foundry/FranchiseRegistry.t.sol +++ b/test/foundry/FranchiseRegistry.t.sol @@ -31,7 +31,7 @@ contract FranchiseRegistryTest is BaseTest { vm.startPrank(franchiseOwner); vm.expectCall(address(factory), abi.encodeCall( - factory.createFranchiseIPAssets, + factory.createFranchiseIpAssets, ( 2, "name2", diff --git a/test/foundry/IPAccount.t.sol b/test/foundry/IPAccount.t.sol index 697113ce..62dcab4c 100644 --- a/test/foundry/IPAccount.t.sol +++ b/test/foundry/IPAccount.t.sol @@ -5,8 +5,9 @@ import "forge-std/Test.sol"; import "contracts/ip-accounts/IPAccountRegistry.sol"; import "contracts/ip-accounts/IPAccountImpl.sol"; -import "contracts/ip-accounts/IIPAccount.sol"; -import "contracts/ip-accounts/IERC6551Account.sol"; +import "contracts/interfaces/ip-accounts/IIPAccount.sol"; +import "contracts/interfaces/ip-accounts/IERC6551Account.sol"; +import { Errors } from "contracts/lib/Errors.sol"; import "test/foundry/mocks/MockERC721.sol"; contract IPAccountTest is Test { @@ -109,7 +110,7 @@ contract IPAccountTest is Test { address otherOwner = vm.addr(2); vm.prank(vm.addr(3)); - vm.expectRevert("Caller is not owner"); + vm.expectRevert(Errors.IPAccountImpl_CallerNotOwner.selector); ipAccount.safeTransferFrom(address(nft), account, otherOwner, subTokenId); vm.prank(owner); diff --git a/test/foundry/IPAccountRegistry.t.sol b/test/foundry/IPAccountRegistry.t.sol index bb9f8a62..c773693a 100644 --- a/test/foundry/IPAccountRegistry.t.sol +++ b/test/foundry/IPAccountRegistry.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; +import { Errors } from "contracts/lib/Errors.sol"; import "contracts/ip-accounts/IPAccountRegistry.sol"; import "test/foundry/mocks/MockIPAccount.sol"; @@ -48,7 +49,7 @@ contract RegistryTest is Test { } function test_revert_createAccount_ifInitFailed() public { - vm.expectRevert(IpAccountInitializationFailed.selector); + vm.expectRevert(Errors.IPAccountRegistry_InitializationFailed.selector); registry.createAccount( chainId, tokenAddress, diff --git a/test/foundry/IPAssetsRegistry.t.sol b/test/foundry/IPAssetsRegistry.t.sol index b2e232de..dfefb40b 100644 --- a/test/foundry/IPAssetsRegistry.t.sol +++ b/test/foundry/IPAssetsRegistry.t.sol @@ -1,10 +1,11 @@ // SPDX-License-Identifier: BUSDL-1.1 pragma solidity ^0.8.13; +import { Errors } from "contracts/lib/Errors.sol"; import { IPAssetRegistry } from "../../contracts/ip-assets/IPAssetRegistry.sol"; import { IPAssetRegistryFactory } from "../../contracts/ip-assets/IPAssetRegistryFactory.sol"; -import { IPAsset } from "../../contracts/IPAsset.sol"; -import { LibIPAssetId } from "../../contracts/ip-assets/LibIPAssetId.sol"; +import { IPAsset } from "../../contracts/lib/IPAsset.sol"; +import { IPAsset } from "../../contracts/lib/IPAsset.sol"; import { UpgradeableBeacon } from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import { IERC1967 } from "@openzeppelin/contracts/interfaces/IERC1967.sol"; import { MockIPAssetEventEmitter } from "./mocks/MockIPAssetEventEmitter.sol"; @@ -49,7 +50,7 @@ contract IPAssetRegistryTest is Test { address mockCollectModule = address(new MockCollectModule(address(mockFranchiseRegistry), address(new MockCollectNFT()))); factory.upgradeFranchises(address(new IPAssetRegistry(mockEventEmitter, mockLicenseModule, address(mockFranchiseRegistry), mockCollectModule))); - ipAssetRegistry = IPAssetRegistry(factory.createFranchiseIPAssets(1, "name", "symbol", "description")); + ipAssetRegistry = IPAssetRegistry(factory.createFranchiseIpAssets(1, "name", "symbol", "description")); mockFranchiseRegistry.setIpAssetRegistryAddress(address(ipAssetRegistry)); } @@ -61,37 +62,37 @@ contract IPAssetRegistryTest is Test { } function test_mintIdAssignment() public { - uint8 firstIPAssetType = uint8(IPAsset.STORY); - uint8 lastIPAssetTypeId = uint8(IPAsset.ITEM); + uint8 firstIPAssetType = uint8(IPAsset.IPAssetType.STORY); + uint8 lastIPAssetTypeId = uint8(IPAsset.IPAssetType.ITEM); for(uint8 i = firstIPAssetType; i < lastIPAssetTypeId; i++) { - IPAsset sb = IPAsset(i); - uint256 zero = LibIPAssetId._zeroId(sb); - assertEq(ipAssetRegistry.currentIdFor(sb), zero, "starts with zero"); + IPAsset.IPAssetType ipAsset = IPAsset.IPAssetType(i); + uint256 zero = IPAsset._zeroId(ipAsset); + assertEq(ipAssetRegistry.currentIdFor(ipAsset), zero, "starts with zero"); vm.prank(address(mockFranchiseRegistry)); - uint256 blockId1 = ipAssetRegistry.createIPAsset(sb, "name", "description", "mediaUrl", mintee, 0); + uint256 blockId1 = ipAssetRegistry.createIpAsset(ipAsset, "name", "description", "mediaUrl", mintee, 0, ""); assertEq(blockId1, zero + 1, "returned blockId is incremented by one"); - assertEq(ipAssetRegistry.currentIdFor(sb), zero + 1, "mint increments currentIdFor by one"); + assertEq(ipAssetRegistry.currentIdFor(ipAsset), zero + 1, "mint increments currentIdFor by one"); vm.prank(address(mockFranchiseRegistry)); - uint256 blockId2 = ipAssetRegistry.createIPAsset(sb, "name2", "description2", "mediaUrl2", mintee, 0); + uint256 blockId2 = ipAssetRegistry.createIpAsset(ipAsset, "name2", "description2", "mediaUrl2", mintee, 0, ""); assertEq(blockId2, zero + 2, "returned blockId is incremented by one again"); - assertEq(ipAssetRegistry.currentIdFor(sb), zero + 2, "2 mint increments currentIdFor by one again"); + assertEq(ipAssetRegistry.currentIdFor(ipAsset), zero + 2, "2 mint increments currentIdFor by one again"); } } function test_mintStoryOwnership() public { - uint8 firstIPAssetType = uint8(IPAsset.STORY); - uint8 lastIPAssetTypeId = uint8(IPAsset.ITEM); + uint8 firstIPAssetType = uint8(IPAsset.IPAssetType.STORY); + uint8 lastIPAssetTypeId = uint8(IPAsset.IPAssetType.ITEM); for(uint8 i = firstIPAssetType; i < lastIPAssetTypeId; i++) { - IPAsset sb = IPAsset(i); + IPAsset.IPAssetType ipAsset = IPAsset.IPAssetType(i); uint256 loopBalance = ipAssetRegistry.balanceOf(mintee); assertEq(loopBalance, (i - 1) * 2, "balance is zero for block type"); vm.prank(address(mockFranchiseRegistry)); - uint256 blockId1 = ipAssetRegistry.createIPAsset(sb, "name", "description", "mediaUrl", mintee, 0); + uint256 blockId1 = ipAssetRegistry.createIpAsset(ipAsset, "name", "description", "mediaUrl", mintee, 0, ""); assertEq(ipAssetRegistry.balanceOf(mintee), loopBalance + 1, "balance is incremented by one"); assertEq(ipAssetRegistry.ownerOf(blockId1), mintee); vm.prank(address(mockFranchiseRegistry)); - uint256 blockId2 = ipAssetRegistry.createIPAsset(sb, "name", "description", "mediaUrl", mintee, 0); + uint256 blockId2 = ipAssetRegistry.createIpAsset(ipAsset, "name", "description", "mediaUrl", mintee, 0, ""); assertEq(ipAssetRegistry.balanceOf(mintee), loopBalance + 2, "balance is incremented by one again"); assertEq(ipAssetRegistry.ownerOf(blockId2), mintee); } @@ -99,15 +100,17 @@ contract IPAssetRegistryTest is Test { function test_revertMintUnknownIPAsset() public { vm.prank(address(mockFranchiseRegistry)); - vm.expectRevert(InvalidBlockType.selector); - ipAssetRegistry.createIPAsset(IPAsset.UNDEFINED, "name", "description", "mediaUrl", mintee, 0); + vm.expectRevert( + abi.encodeWithSelector(Errors.IPAsset_InvalidType.selector, IPAsset.IPAssetType.UNDEFINED) + ); + ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.UNDEFINED, "name", "description", "mediaUrl", mintee, 0, ""); } function test_IPAssetCreationData() public { vm.prank(address(mockFranchiseRegistry)); - uint256 blockId = ipAssetRegistry.createIPAsset(IPAsset.STORY, "name", "description", "mediaUrl", mintee, 0); + uint256 blockId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.STORY, "name", "description", "mediaUrl", mintee, 0, ""); IPAssetRegistry.IPAssetData memory data = ipAssetRegistry.readIPAsset(blockId); - assertEq(uint8(data.blockType), uint8(IPAsset.STORY)); + assertEq(uint8(data.blockType), uint8(IPAsset.IPAssetType.STORY)); assertEq(data.name, "name"); assertEq(data.description, "description"); assertEq(data.mediaUrl, "mediaUrl"); @@ -115,7 +118,7 @@ contract IPAssetRegistryTest is Test { function test_emptyIPAssetRead() public { IPAssetRegistry.IPAssetData memory data = ipAssetRegistry.readIPAsset(12312313); - assertEq(uint8(data.blockType), uint8(IPAsset.UNDEFINED)); + assertEq(uint8(data.blockType), uint8(IPAsset.IPAssetType.UNDEFINED)); assertEq(data.name, ""); assertEq(data.description, ""); assertEq(data.mediaUrl, ""); @@ -123,7 +126,7 @@ contract IPAssetRegistryTest is Test { function test_tokenUriReturnsMediaURL() public { vm.prank(address(mockFranchiseRegistry)); - uint256 blockId = ipAssetRegistry.createIPAsset(IPAsset.STORY, "name", "description", "https://mediaUrl.xyz", mintee, 0); + uint256 blockId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.STORY, "name", "description", "https://mediaUrl.xyz", mintee, 0, ""); assertEq(ipAssetRegistry.tokenURI(blockId), "https://mediaUrl.xyz"); } diff --git a/test/foundry/IPAssetsRegistryFactory.t.sol b/test/foundry/IPAssetsRegistryFactory.t.sol index ebba6f4f..23573173 100644 --- a/test/foundry/IPAssetsRegistryFactory.t.sol +++ b/test/foundry/IPAssetsRegistryFactory.t.sol @@ -53,7 +53,7 @@ contract IPAssetRegistryFactoryTest is Test { // TODO: figure why this is not matching correctly, the event is emitted according to traces // vm.expectEmit(); // emit BeaconUpgraded(address(0x123)); - address collection = factory.createFranchiseIPAssets(1, "name", "symbol", "description"); + address collection = factory.createFranchiseIpAssets(1, "name", "symbol", "description"); assertTrue(collection != address(0)); assertEq(IPAssetRegistry(collection).name(), "name"); assertEq(IPAssetRegistry(collection).symbol(), "symbol"); diff --git a/test/foundry/LibStoryBlockId.t.sol b/test/foundry/LibStoryBlockId.t.sol index 2e5d8533..571ad96c 100644 --- a/test/foundry/LibStoryBlockId.t.sol +++ b/test/foundry/LibStoryBlockId.t.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; -import "contracts/ip-assets/LibIPAssetId.sol"; -import "contracts/IPAsset.sol"; +import "contracts/lib/IPAsset.sol"; +import "contracts/lib/IPAsset.sol"; contract FranchiseRegistryTest is Test { @@ -19,55 +19,55 @@ contract FranchiseRegistryTest is Test { function test_zeroIds() public { - assertEq(LibIPAssetId._zeroId(IPAsset.STORY), _ZERO_ID_STORY); - assertEq(LibIPAssetId._zeroId(IPAsset.CHARACTER), _ZERO_ID_CHARACTER); - assertEq(LibIPAssetId._zeroId(IPAsset.ART), _ZERO_ID_ART); - assertEq(LibIPAssetId._zeroId(IPAsset.GROUP), _ZERO_ID_GROUP); - assertEq(LibIPAssetId._zeroId(IPAsset.LOCATION), _ZERO_ID_LOCATION); - assertEq(LibIPAssetId._zeroId(IPAsset.ITEM), _ZERO_ID_ITEM); + assertEq(IPAsset._zeroId(IPAsset.IPAssetType.STORY), _ZERO_ID_STORY); + assertEq(IPAsset._zeroId(IPAsset.IPAssetType.CHARACTER), _ZERO_ID_CHARACTER); + assertEq(IPAsset._zeroId(IPAsset.IPAssetType.ART), _ZERO_ID_ART); + assertEq(IPAsset._zeroId(IPAsset.IPAssetType.GROUP), _ZERO_ID_GROUP); + assertEq(IPAsset._zeroId(IPAsset.IPAssetType.LOCATION), _ZERO_ID_LOCATION); + assertEq(IPAsset._zeroId(IPAsset.IPAssetType.ITEM), _ZERO_ID_ITEM); } function test_lastIds() public { - assertEq(LibIPAssetId._lastId(IPAsset.STORY), _ZERO_ID_CHARACTER - 1); - assertEq(LibIPAssetId._lastId(IPAsset.CHARACTER), _ZERO_ID_ART - 1); - assertEq(LibIPAssetId._lastId(IPAsset.ART), _ZERO_ID_GROUP - 1); - assertEq(LibIPAssetId._lastId(IPAsset.GROUP), _ZERO_ID_LOCATION - 1); - assertEq(LibIPAssetId._lastId(IPAsset.LOCATION), _ZERO_ID_ITEM - 1); - assertEq(LibIPAssetId._lastId(IPAsset.ITEM), _LAST_ID_ITEM); + assertEq(IPAsset._lastId(IPAsset.IPAssetType.STORY), _ZERO_ID_CHARACTER - 1); + assertEq(IPAsset._lastId(IPAsset.IPAssetType.CHARACTER), _ZERO_ID_ART - 1); + assertEq(IPAsset._lastId(IPAsset.IPAssetType.ART), _ZERO_ID_GROUP - 1); + assertEq(IPAsset._lastId(IPAsset.IPAssetType.GROUP), _ZERO_ID_LOCATION - 1); + assertEq(IPAsset._lastId(IPAsset.IPAssetType.LOCATION), _ZERO_ID_ITEM - 1); + assertEq(IPAsset._lastId(IPAsset.IPAssetType.ITEM), _LAST_ID_ITEM); } function test_IPAssetTypes() public { - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_STORY)), uint8(IPAsset.UNDEFINED)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_STORY)), uint8(IPAsset.IPAssetType.UNDEFINED)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_STORY + 1)), uint8(IPAsset.STORY)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_STORY + _HALF_ID_RANGE)), uint8(IPAsset.STORY)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_CHARACTER - 1)), uint8(IPAsset.STORY)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_STORY + 1)), uint8(IPAsset.IPAssetType.STORY)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_STORY + _HALF_ID_RANGE)), uint8(IPAsset.IPAssetType.STORY)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_CHARACTER - 1)), uint8(IPAsset.IPAssetType.STORY)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_CHARACTER)), uint8(IPAsset.UNDEFINED)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_CHARACTER + 1)), uint8(IPAsset.CHARACTER)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_CHARACTER + _HALF_ID_RANGE)), uint8(IPAsset.CHARACTER)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ART - 1)), uint8(IPAsset.CHARACTER)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_CHARACTER)), uint8(IPAsset.IPAssetType.UNDEFINED)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_CHARACTER + 1)), uint8(IPAsset.IPAssetType.CHARACTER)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_CHARACTER + _HALF_ID_RANGE)), uint8(IPAsset.IPAssetType.CHARACTER)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ART - 1)), uint8(IPAsset.IPAssetType.CHARACTER)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ART)), uint8(IPAsset.UNDEFINED)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ART + 1)), uint8(IPAsset.ART)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ART + _HALF_ID_RANGE)), uint8(IPAsset.ART)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_GROUP - 1)), uint8(IPAsset.ART)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ART)), uint8(IPAsset.IPAssetType.UNDEFINED)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ART + 1)), uint8(IPAsset.IPAssetType.ART)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ART + _HALF_ID_RANGE)), uint8(IPAsset.IPAssetType.ART)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_GROUP - 1)), uint8(IPAsset.IPAssetType.ART)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_GROUP)), uint8(IPAsset.UNDEFINED)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_GROUP + 1)), uint8(IPAsset.GROUP)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_GROUP + _HALF_ID_RANGE)), uint8(IPAsset.GROUP)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_LOCATION - 1)), uint8(IPAsset.GROUP)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_GROUP)), uint8(IPAsset.IPAssetType.UNDEFINED)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_GROUP + 1)), uint8(IPAsset.IPAssetType.GROUP)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_GROUP + _HALF_ID_RANGE)), uint8(IPAsset.IPAssetType.GROUP)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_LOCATION - 1)), uint8(IPAsset.IPAssetType.GROUP)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_LOCATION)), uint8(IPAsset.UNDEFINED)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_LOCATION + 1)), uint8(IPAsset.LOCATION)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_LOCATION + _HALF_ID_RANGE)), uint8(IPAsset.LOCATION)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ITEM - 1)), uint8(IPAsset.LOCATION)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_LOCATION)), uint8(IPAsset.IPAssetType.UNDEFINED)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_LOCATION + 1)), uint8(IPAsset.IPAssetType.LOCATION)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_LOCATION + _HALF_ID_RANGE)), uint8(IPAsset.IPAssetType.LOCATION)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ITEM - 1)), uint8(IPAsset.IPAssetType.LOCATION)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ITEM)), uint8(IPAsset.UNDEFINED)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ITEM + 1)), uint8(IPAsset.ITEM)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_ZERO_ID_ITEM + _HALF_ID_RANGE)), uint8(IPAsset.ITEM)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_LAST_ID_ITEM)), uint8(IPAsset.ITEM)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ITEM)), uint8(IPAsset.IPAssetType.UNDEFINED)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ITEM + 1)), uint8(IPAsset.IPAssetType.ITEM)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_ZERO_ID_ITEM + _HALF_ID_RANGE)), uint8(IPAsset.IPAssetType.ITEM)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_LAST_ID_ITEM)), uint8(IPAsset.IPAssetType.ITEM)); - assertEq(uint8(LibIPAssetId._ipAssetTypeFor(_LAST_ID_ITEM + 1)), uint8(IPAsset.UNDEFINED)); + assertEq(uint8(IPAsset._ipAssetTypeFor(_LAST_ID_ITEM + 1)), uint8(IPAsset.IPAssetType.UNDEFINED)); } } diff --git a/test/foundry/RoyaltyDistributor.t.sol b/test/foundry/RoyaltyDistributor.t.sol index 5bbc508c..d69170dc 100644 --- a/test/foundry/RoyaltyDistributor.t.sol +++ b/test/foundry/RoyaltyDistributor.t.sol @@ -7,16 +7,18 @@ import "contracts/ip-accounts/IPAccountRegistry.sol"; import "test/foundry/mocks/MockIPAccount.sol"; import "contracts/modules/royalties/RoyaltyDistributor.sol"; import "contracts/modules/royalties/RoyaltyNFT.sol"; -import "contracts/modules/royalties/ISplitMain.sol"; +import "contracts/interfaces/modules/royalties/ISplitMain.sol"; import "./mocks/MockSplitMain.sol"; import "./mocks/MockERC20.sol"; import "test/foundry/mocks/MockSplitMain.sol"; import "contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol"; +import "contracts/modules/royalties/RoyaltyNFTFactory.sol"; contract RoyaltyDistributorTest is Test { RoyaltyDistributor public royaltyDistributor; IPAccountRegistry public registry; MockIPAccount public implementation; + RoyaltyNFTFactory public royaltyNFTFactory; RoyaltyNFT public royaltyNft; ISplitMain public splitMain; MutableRoyaltyProportionPolicy public mutablePolicy; @@ -39,7 +41,9 @@ contract RoyaltyDistributorTest is Test { tokenAddress = address(200); tokenId = 300; splitMain = _getSplitMain(); - royaltyNft = new RoyaltyNFT(address(splitMain)); + royaltyNFTFactory = new RoyaltyNFTFactory(address(splitMain)); + royaltyNft = royaltyNFTFactory.createRoyaltyNft(bytes32(0)); + royaltyNft = royaltyNFTFactory.createRoyaltyNft(bytes32("1")); implementation = new MockIPAccount(); registry = new IPAccountRegistry(address(implementation)); royaltyDistributor = new RoyaltyDistributor(address(registry), address(royaltyNft)); @@ -88,6 +92,52 @@ contract RoyaltyDistributorTest is Test { assertEq(royaltyNft.balanceOf(tokenAccount, royaltyNft.toTokenId(tokenAccount)), 500000); } + function test_updateDistributionTwice() public { + royaltyDistributor.setRoyaltyPolicy(tokenAddress, tokenId, address(mutablePolicy), ""); + address configuredPolicy = royaltyDistributor.getRoyaltyPolicy(tokenAddress, tokenId); + assertEq(address(mutablePolicy), configuredPolicy); + address tokenAccount = registry.account( + block.chainid, + tokenAddress, + tokenId + ); + uint32 tokenAlloc = 750000; + address acc1 = address(300); + uint32 alloc1 = 250000; + + address[] memory accounts = new address[](2); + uint32[] memory percentAllocations = new uint32[](2); + + accounts[0] = tokenAccount; + percentAllocations[0] = tokenAlloc; + accounts[1] = acc1; + percentAllocations[1] = alloc1; + + ProportionData memory data = ProportionData({ + accounts: accounts, + percentAllocations: percentAllocations + }); + royaltyDistributor.updateDistribution(tokenAddress, tokenId, abi.encode(data)); + vm.startPrank(tokenAccount); + royaltyNft.setApprovalForAll(address(mutablePolicy), true); + vm.stopPrank(); + address acc3 = address(500); + uint32 alloc3 = 250000; + accounts = new address[](1); + percentAllocations = new uint32[](1); + accounts[0] = acc3; + percentAllocations[0] = alloc3; + + data = ProportionData({ + accounts: accounts, + percentAllocations: percentAllocations + }); + + royaltyDistributor.updateDistribution(tokenAddress, tokenId, abi.encode(data)); + + assertEq(royaltyNft.balanceOf(tokenAccount, royaltyNft.toTokenId(tokenAccount)), 500000); + } + function test_distribute() public { // setup distribution royaltyDistributor.setRoyaltyPolicy(tokenAddress, tokenId, address(mutablePolicy), ""); diff --git a/contracts/interfaces/IERC721Events.sol b/test/foundry/interfaces/IERC721Events.sol similarity index 71% rename from contracts/interfaces/IERC721Events.sol rename to test/foundry/interfaces/IERC721Events.sol index 8be367d0..bb581866 100644 --- a/contracts/interfaces/IERC721Events.sol +++ b/test/foundry/interfaces/IERC721Events.sol @@ -3,23 +3,33 @@ pragma solidity ^0.8.18; /// @title ERC-721 Events Interface interface IERC721Events { - /// @notice Emits when `tokenId` is transferred from address `from` to `to`. /// @param from The address of the original NFT owner. /// @param to The address of the new NFT owner. /// @param tokenId The id of the NFT being transferred. - event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); + event Transfer( + address indexed from, + address indexed to, + uint256 indexed tokenId + ); /// @notice Emits when `owner` approves `approved` to operate on `tokenId`. /// @param owner The address of the current NFT owner. /// @param approved The address approved to operate on `tokenId`. /// @param tokenId The id of the NFT being approved. - event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); + event Approval( + address indexed owner, + address indexed approved, + uint256 indexed tokenId + ); /// @notice Emits when `owner` approves `operator` to operate on their NFTs. /// @param owner The address of the current NFT owner. /// @param operator The address of the new NFT operator. /// @param approved Whether operator can operate on NFTs of owner. - event ApprovalForAll(address indexed owner, address indexed operator, bool approved); - + event ApprovalForAll( + address indexed owner, + address indexed operator, + bool approved + ); } diff --git a/test/foundry/licensing/LicenseRegistry.t.sol b/test/foundry/licensing/LicenseRegistry.t.sol index eda994eb..d67d4df3 100644 --- a/test/foundry/licensing/LicenseRegistry.t.sol +++ b/test/foundry/licensing/LicenseRegistry.t.sol @@ -8,6 +8,7 @@ import '../mocks/MockTermsProcessor.sol'; import '../mocks/RightsManagerHarness.sol'; import "../mocks/MockERC721.sol"; import "contracts/errors/General.sol"; +import { Errors } from "contracts/lib/Errors.sol"; contract LicenseRegistryTest is BaseTest { @@ -19,9 +20,9 @@ contract LicenseRegistryTest is BaseTest { deployProcessors = false; super.setUp(); vm.prank(licenseHolder); - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", licenseHolder, 0); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", licenseHolder, 0, ""); uint256 parentLicenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, false); - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); vm.prank(licenseHolder); licenseId = ipAssetRegistry.createLicense( ipAssetId, @@ -45,7 +46,7 @@ contract LicenseRegistryTest is BaseTest { } function test_revert_mint_non_rights_manager() public { - vm.expectRevert(Unauthorized.selector); + vm.expectRevert(Errors.Unauthorized.selector); licenseRegistry.mint(licenseHolder, 1); } @@ -60,9 +61,10 @@ contract LicenseRegistryTest is BaseTest { vm.prank(revoker); ipAssetRegistry.revokeLicense(licenseId); - vm.expectRevert(RightsManager.InactiveLicense.selector); + vm.expectRevert(Errors.RightsManager_InactiveLicense.selector); vm.prank(licenseHolder); licenseRegistry.transferFrom(licenseHolder, receiver, licenseId); } } +*/ \ No newline at end of file diff --git a/test/foundry/licensing/LicensingModule.t.sol b/test/foundry/licensing/LicensingModule.t.sol index 6d044e75..d7591398 100644 --- a/test/foundry/licensing/LicensingModule.t.sol +++ b/test/foundry/licensing/LicensingModule.t.sol @@ -5,7 +5,8 @@ import "forge-std/Test.sol"; import '../utils/BaseTest.sol'; import '../mocks/MockLicensingModule.sol'; import '../mocks/MockTermsProcessor.sol'; -import "contracts/errors/General.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; contract LicensingModuleTest is BaseTest { @@ -20,7 +21,7 @@ contract LicensingModuleTest is BaseTest { function test_configFranchise() public { vm.startPrank(franchiseOwner); - IERC5218.TermsProcessorConfig memory termsConfig = IERC5218.TermsProcessorConfig({ + Licensing.TermsProcessorConfig memory termsConfig = Licensing.TermsProcessorConfig({ processor: commercialTermsProcessor, data: abi.encode("root") }); @@ -29,14 +30,14 @@ contract LicensingModuleTest is BaseTest { assertEq(licenseRegistry.ownerOf(rootLicenseId), franchiseOwner); assertEq(rootLicenseId, 1); - ILicensingModule.FranchiseConfig memory config = _getLicensingConfig(); + Licensing.FranchiseConfig memory config = _getLicensingConfig(); config.revoker = address(0x5656565); config.commercialConfig.franchiseRootLicenseId = rootLicenseId; config.commercialTerms.data = abi.encode("bye"); config.nonCommercialTerms.data = abi.encode("hi"); licensingModule.configureFranchiseLicensing(1, config); - ILicensingModule.FranchiseConfig memory configResult = licensingModule.getFranchiseConfig(1); + Licensing.FranchiseConfig memory configResult = licensingModule.getFranchiseConfig(1); assertEq(configResult.nonCommercialConfig.canSublicense, true); assertEq(configResult.nonCommercialConfig.franchiseRootLicenseId, 0); assertEq(address(configResult.nonCommercialTerms.processor), address(nonCommercialTermsProcessor)); @@ -51,7 +52,7 @@ contract LicensingModuleTest is BaseTest { } function test_revert_nonAuthorizedConfigSetter() public { - vm.expectRevert(Unauthorized.selector); + vm.expectRevert(Errors.Unauthorized.selector); licensingModule.configureFranchiseLicensing(1, LibMockFranchiseConfig.getMockFranchiseConfig()); } @@ -62,16 +63,16 @@ contract LicensingModuleTest is BaseTest { function test_revert_zeroRevokerAddress() public { vm.startPrank(franchiseOwner); - ILicensingModule.FranchiseConfig memory config = LibMockFranchiseConfig.getMockFranchiseConfig(); + Licensing.FranchiseConfig memory config = LibMockFranchiseConfig.getMockFranchiseConfig(); config.revoker = address(0); - vm.expectRevert(LicensingModule.ZeroRevokerAddress.selector); + vm.expectRevert(Errors.LicensingModule_ZeroRevokerAddress.selector); licensingModule.configureFranchiseLicensing(1, config); vm.stopPrank(); } function test_revert_rootLicenseNotActiveCommercial() public { - IERC5218.TermsProcessorConfig memory termsConfig = IERC5218.TermsProcessorConfig({ + Licensing.TermsProcessorConfig memory termsConfig = Licensing.TermsProcessorConfig({ processor: commercialTermsProcessor, data: abi.encode("root") }); @@ -81,10 +82,10 @@ contract LicensingModuleTest is BaseTest { commercialTermsProcessor.setSuccess(false); - ILicensingModule.FranchiseConfig memory config = _getLicensingConfig(); + Licensing.FranchiseConfig memory config = _getLicensingConfig(); config.commercialConfig.franchiseRootLicenseId = rootLicenseId; vm.startPrank(franchiseOwner); - vm.expectRevert(abi.encodeWithSignature("RootLicenseNotActive(uint256)", 1)); + vm.expectRevert(abi.encodeWithSignature("LicensingModule_RootLicenseNotActive(uint256)", 1)); licensingModule.configureFranchiseLicensing(1, config); vm.stopPrank(); diff --git a/test/foundry/licensing/RightsManager.IPAsset.t.sol b/test/foundry/licensing/RightsManager.IPAsset.t.sol index b554eca0..da0ff44c 100644 --- a/test/foundry/licensing/RightsManager.IPAsset.t.sol +++ b/test/foundry/licensing/RightsManager.IPAsset.t.sol @@ -7,7 +7,8 @@ import '../mocks/MockLicensingModule.sol'; import '../mocks/MockTermsProcessor.sol'; import '../mocks/RightsManagerHarness.sol'; import "../mocks/MockERC721.sol"; -import "contracts/errors/General.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; contract RightsManagerIPAssetRightsTest is BaseTest { @@ -25,7 +26,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { assertEq(address(licenseRegistry.getRightsManager()), address(ipAssetRegistry)); // Default licensing is root non-commercial with sublicense on, no commercial rights - ILicensingModule.FranchiseConfig memory configResult = licensingModule.getFranchiseConfig(1); + Licensing.FranchiseConfig memory configResult = licensingModule.getFranchiseConfig(1); assertEq(configResult.nonCommercialConfig.canSublicense, true, "nonCommercialConfig.canSublicense"); assertEq(configResult.nonCommercialConfig.franchiseRootLicenseId, 0, "nonCommercialConfig.franchiseRootLicenseId"); assertEq(address(configResult.nonCommercialTerms.processor), address(nonCommercialTermsProcessor), "nonCommercialTerms.processor"); @@ -40,12 +41,12 @@ contract RightsManagerIPAssetRightsTest is BaseTest { } function test_create_ip_asset_root_noncommercial() public { - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", ipAssetCreator, 0); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", ipAssetCreator, 0, ""); bool commercial = false; uint256 licenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, commercial); assertEq(licenseId, 1); assertEq(ipAssetRegistry.getLicenseTokenId(licenseId), ipAssetId); - (RightsManager.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); + (Licensing.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); assertEq(owner, ipAssetCreator); assertEq(license.active, true); assertEq(license.canSublicense, true); @@ -66,12 +67,12 @@ contract RightsManagerIPAssetRightsTest is BaseTest { function test_create_ip_asset_noncommercial_and_commercial() public { _configFranchise(true, true, true); - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", ipAssetCreator, 0); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", ipAssetCreator, 0, ""); bool commercial = false; uint256 licenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, commercial); assertEq(licenseId, 1); assertEq(ipAssetRegistry.getLicenseTokenId(licenseId), ipAssetId); - (RightsManager.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); + (Licensing.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); assertEq(owner, ipAssetCreator); assertEq(license.active, true); assertEq(license.canSublicense, true); @@ -107,8 +108,8 @@ contract RightsManagerIPAssetRightsTest is BaseTest { } function test_create_derivative_ip_asset_from_non_commercial() public { - uint256 rootIpAsset = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", ipAssetCreator, 0); - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name derv", "description deriv", "mediaUrl deriv", ipAssetCreator, rootIpAsset); + uint256 rootIpAsset = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", ipAssetCreator, 0, ""); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name derv", "description deriv", "mediaUrl deriv", ipAssetCreator, rootIpAsset, ""); bool commercial = false; uint256 licenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, commercial); @@ -117,7 +118,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { licenseRegistry.ownerOf(licenseId); assertEq(licenseId, 2); assertEq(ipAssetRegistry.getLicenseTokenId(licenseId), ipAssetId); - (RightsManager.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); + (Licensing.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); assertEq(owner, ipAssetCreator); assertEq(license.active, true); assertEq(license.canSublicense, true); @@ -136,8 +137,8 @@ contract RightsManagerIPAssetRightsTest is BaseTest { function test_create_derivative_ip_asset_from_commercial() public { _configFranchise(true, true, true); - uint256 rootIpAsset = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", ipAssetCreator, 0); - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name derv", "description deriv", "mediaUrl deriv", ipAssetCreator, rootIpAsset); + uint256 rootIpAsset = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", ipAssetCreator, 0, ""); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name derv", "description deriv", "mediaUrl deriv", ipAssetCreator, rootIpAsset, ""); bool commercial = false; uint256 licenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, commercial); @@ -147,7 +148,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { assertEq(licenseId, 3); assertEq(ipAssetRegistry.getLicenseTokenId(licenseId), ipAssetId); - (RightsManager.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); + (Licensing.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); assertEq(owner, ipAssetCreator); assertEq(license.active, true); assertEq(license.canSublicense, true); @@ -166,7 +167,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { } function test_create_license() public { - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", licenseHolder, 0); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", licenseHolder, 0, ""); uint256 parentLicenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, false); bool commercial = false; vm.prank(licenseHolder); @@ -178,12 +179,12 @@ contract RightsManagerIPAssetRightsTest is BaseTest { revoker, false, false, - IERC5218.TermsProcessorConfig({ + Licensing.TermsProcessorConfig({ processor: nonCommercialTermsProcessor, data: abi.encode("terms") }) ); - (RightsManager.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); + (Licensing.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); assertEq(owner, licenseHolder); assertEq(license.active, true); assertEq(license.canSublicense, false); @@ -199,10 +200,10 @@ contract RightsManagerIPAssetRightsTest is BaseTest { } function test_revert_create_license_unauthorized() public { - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", ipAssetCreator, 0); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", ipAssetCreator, 0, ""); uint256 parentLicenseId = 1; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); - vm.expectRevert(Unauthorized.selector); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + vm.expectRevert(Errors.Unauthorized.selector); ipAssetRegistry.createLicense( ipAssetId, parentLicenseId, @@ -218,9 +219,9 @@ contract RightsManagerIPAssetRightsTest is BaseTest { function test_revert_create_license_franchise_owned_tokenId() public { uint256 tokenId = ipAssetRegistry.FRANCHISE_REGISTRY_OWNED_TOKEN_ID(); uint256 parentLicenseId = 1; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); vm.startPrank(franchiseOwner); - vm.expectRevert(RightsManager.UseCreateFranchiseRootLicenseInstead.selector); + vm.expectRevert(Errors.RightsManager_UseCreateFranchiseRootLicenseInstead.selector); ipAssetRegistry.createLicense( tokenId, parentLicenseId, @@ -237,9 +238,9 @@ contract RightsManagerIPAssetRightsTest is BaseTest { function test_revert_create_license_unset_parent() public { uint256 tokenId = 1; uint256 parentLicenseId = 0; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); vm.startPrank(franchiseOwner); - vm.expectRevert(RightsManager.UseCreateFranchiseRootLicenseInstead.selector); + vm.expectRevert(Errors.RightsManager_UseCreateFranchiseRootLicenseInstead.selector); ipAssetRegistry.createLicense( tokenId, parentLicenseId, @@ -254,10 +255,10 @@ contract RightsManagerIPAssetRightsTest is BaseTest { } function test_revert_create_license_terms_mismatch() public { - uint256 ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", ipAssetCreator, 0); + uint256 ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", ipAssetCreator, 0, ""); uint256 parentLicenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, false); bool commercial = true; - vm.expectRevert(RightsManager.CommercialTermsMismatch.selector); + vm.expectRevert(Errors.RightsManager_CommercialTermsMismatch.selector); vm.prank(ipAssetCreator); ipAssetRegistry.createLicense( ipAssetId, @@ -267,7 +268,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { revoker, commercial, false, - IERC5218.TermsProcessorConfig({ + Licensing.TermsProcessorConfig({ processor: nonCommercialTermsProcessor, data: abi.encode("terms") }) @@ -276,7 +277,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { // This one we can just call the internal method function test_create_root_license() public { - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); vm.prank(franchiseOwner); uint256 licenseId = ipAssetRegistry.createFranchiseRootLicense( 1, @@ -287,7 +288,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { true, terms ); - (RightsManager.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); + (Licensing.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); assertEq(owner, franchiseOwner); assertEq(license.active, true); assertEq(license.canSublicense, true); @@ -301,8 +302,8 @@ contract RightsManagerIPAssetRightsTest is BaseTest { } function test_revert_create_root_license_unauthorized() public { - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); - vm.expectRevert(Unauthorized.selector); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + vm.expectRevert(Errors.Unauthorized.selector); ipAssetRegistry.createFranchiseRootLicense( 1, franchiseOwner, @@ -321,7 +322,7 @@ contract RightsManagerIPAssetRightsTest is BaseTest { assertEq(ipAssetRegistry.getParentLicenseId(licenseId), 0); assertTrue(ipAssetRegistry.isLicenseActive(licenseId)); assertEq(ipAssetRegistry.getLicenseURI(licenseId), "licenseUri"); - (RightsManager.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); + (Licensing.License memory license, address owner) = ipAssetRegistry.getLicense(licenseId); assertEq(owner, licenseHolder, "internal method will not create ipasset, but we mockMinted in RightsManagerHarness"); assertEq(license.active, true, "license active"); assertEq(license.canSublicense, true, "license canSublicense"); @@ -336,20 +337,20 @@ contract RightsManagerIPAssetRightsTest is BaseTest { } function _configFranchise(bool sublicenseCommercial, bool sublicenseNonCommercial, bool rootIpAssetHasCommercialRights) private { - ILicensingModule.FranchiseConfig memory config = ILicensingModule.FranchiseConfig({ - nonCommercialConfig: ILicensingModule.IpAssetConfig({ + Licensing.FranchiseConfig memory config = Licensing.FranchiseConfig({ + nonCommercialConfig: Licensing.IpAssetConfig({ canSublicense: sublicenseNonCommercial, franchiseRootLicenseId: 0 }), - nonCommercialTerms: IERC5218.TermsProcessorConfig({ + nonCommercialTerms: Licensing.TermsProcessorConfig({ processor: nonCommercialTermsProcessor, data: abi.encode("nonCommercial") }), - commercialConfig: ILicensingModule.IpAssetConfig({ + commercialConfig: Licensing.IpAssetConfig({ canSublicense: sublicenseCommercial, franchiseRootLicenseId: 0 }), - commercialTerms: IERC5218.TermsProcessorConfig({ + commercialTerms: Licensing.TermsProcessorConfig({ processor: commercialTermsProcessor, data: abi.encode("commercial") }), diff --git a/test/foundry/licensing/RightsManager.Internal.t.sol b/test/foundry/licensing/RightsManager.Internal.t.sol index 163feb7e..1183f0e8 100644 --- a/test/foundry/licensing/RightsManager.Internal.t.sol +++ b/test/foundry/licensing/RightsManager.Internal.t.sol @@ -7,8 +7,8 @@ import '../mocks/MockLicensingModule.sol'; import '../mocks/MockTermsProcessor.sol'; import '../mocks/RightsManagerHarness.sol'; import "../mocks/MockERC721.sol"; -import "contracts/errors/General.sol"; - +import { Errors } from "contracts/lib/Errors.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; contract RightsManagerInternalTest is Test, ProxyHelper { @@ -50,7 +50,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { } function test_revert_transfer_sublicense() public { - vm.expectRevert(Unauthorized.selector); + vm.expectRevert(Errors.Unauthorized.selector); rightsManager.transferSublicense(1, address(0x123456)); } @@ -58,7 +58,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 0; - (IERC5218.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); // TODO test events uint256 licenseId = rightsManager.createLicense_exposed( tokenId, @@ -83,7 +83,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 0; - (IERC5218.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); // TODO test events uint256 licenseId = rightsManager.createLicense_exposed( tokenId, @@ -106,7 +106,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { function test_internal_create_license_nonRootLicense_notmockMinting() public { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); - (IERC5218.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root uint256 parentLicenseId = rightsManager.createLicense_exposed( tokenId, @@ -145,7 +145,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { function test_internal_create_license_nonRootLicense_mockMinting() public { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); - (IERC5218.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root uint256 parentLicenseId = rightsManager.createLicense_exposed( tokenId, @@ -179,8 +179,8 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 0; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); - vm.expectRevert(RightsManager.ZeroRevokerAddress.selector); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + vm.expectRevert(Errors.RightsManager_ZeroRevokerAddress.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -197,7 +197,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { function test_revert_internal_createLicense_nonExistentId() public { uint256 tokenId = 1; uint256 parentLicenseId = 0; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); vm.expectRevert(abi.encodeWithSignature("NonExistentID(uint256)", 1)); rightsManager.createLicense_exposed( tokenId, @@ -216,7 +216,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 0; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root rightsManager.createLicense_exposed( tokenId, @@ -230,7 +230,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { false ); // mockMint root again - vm.expectRevert(RightsManager.AlreadyHasRootLicense.selector); + vm.expectRevert(Errors.RightsManager_AlreadyHasRootLicense.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -248,7 +248,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 1; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root rightsManager.createLicense_exposed( tokenId, @@ -262,7 +262,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { false ); // mockMint sublicense - vm.expectRevert(RightsManager.NotOwnerOfParentLicense.selector); + vm.expectRevert(Errors.RightsManager_NotOwnerOfParentLicense.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -280,7 +280,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 1; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root rightsManager.createLicense_exposed( tokenId, @@ -298,7 +298,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { rightsManager.revokeLicense(parentLicenseId); // mockMint sublicense - vm.expectRevert(RightsManager.InactiveParentLicense.selector); + vm.expectRevert(Errors.RightsManager_InactiveParentLicense.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -316,7 +316,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 1; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root rightsManager.createLicense_exposed( tokenId, @@ -330,7 +330,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { false ); // mockMint sublicense - vm.expectRevert(RightsManager.CannotSublicense.selector); + vm.expectRevert(Errors.RightsManager_CannotSublicense.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -348,7 +348,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 1; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root rightsManager.createLicense_exposed( tokenId, @@ -362,7 +362,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { false ); // mockMint sublicense - vm.expectRevert(RightsManager.CommercialTermsMismatch.selector); + vm.expectRevert(Errors.RightsManager_CommercialTermsMismatch.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -380,7 +380,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { uint256 tokenId = 1; rightsManager.mockMint(licenseHolder, tokenId); uint256 parentLicenseId = 1; - (IERC5218.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); + (Licensing.TermsProcessorConfig memory terms,) = LibMockFranchiseConfig.getTermsProcessorConfig(); // mockMint root rightsManager.createLicense_exposed( tokenId, @@ -394,7 +394,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { false ); // mockMint sublicense - vm.expectRevert(RightsManager.CommercialTermsMismatch.selector); + vm.expectRevert(Errors.RightsManager_CommercialTermsMismatch.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -408,7 +408,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { ); // Uncomment this if we ever allow commercial sublicenses attached to children tokenIds /* - vm.expectRevert(RightsManager.CommercialTermsMismatch.selector); + vm.expectRevert(Errors.RightsManager_CommercialTermsMismatch.selector); rightsManager.createLicense_exposed( tokenId, parentLicenseId, @@ -436,7 +436,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { revoker, false, true, - IERC5218.TermsProcessorConfig({ + Licensing.TermsProcessorConfig({ processor: ITermsProcessor(address(rightsManager)), data: abi.encode("terms") }), @@ -456,7 +456,7 @@ contract RightsManagerInternalTest is Test, ProxyHelper { assertEq(rightsManager.getParentLicenseId(licenseId), parentLicenseId, "license parentLicenseId"); assertTrue(rightsManager.isLicenseActive(licenseId), "license active"); assertEq(rightsManager.getLicenseURI(licenseId), "licenseUri"); - (RightsManager.License memory license, address owner) = rightsManager.getLicense(licenseId); + (Licensing.License memory license, address owner) = rightsManager.getLicense(licenseId); assertEq(owner, licenseHolder, "internal method will not create ipasset, but we mockMinted in RightsManagerHarness"); assertEq(license.active, true, "license active"); assertEq(license.canSublicense, canSublicense, "license canSublicense"); diff --git a/test/foundry/licensing/terms/TimeTermsProcessor.t.sol b/test/foundry/licensing/terms/TimeTermsProcessor.t.sol index 4e659c6f..c70fd6e0 100644 --- a/test/foundry/licensing/terms/TimeTermsProcessor.t.sol +++ b/test/foundry/licensing/terms/TimeTermsProcessor.t.sol @@ -4,13 +4,14 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; import 'test/foundry/utils/BaseTest.sol'; import "contracts/errors/General.sol"; +import "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; import "contracts/modules/licensing/terms/TimeTermsProcessor.sol"; import "contracts/modules/timing/LibDuration.sol"; contract LicenseRegistryTest is BaseTest { address licenseHolder = address(0x888888); - TimeTermsProcessor processor; + ITermsProcessor processor; uint256 licenseId; uint256 ipAssetId; uint256 parentLicenseId; @@ -18,18 +19,18 @@ contract LicenseRegistryTest is BaseTest { function setUp() virtual override public { deployProcessors = false; super.setUp(); - ipAssetId = ipAssetRegistry.createIPAsset(IPAsset(1), "name", "description", "mediaUrl", licenseHolder, 0); + ipAssetId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(1), "name", "description", "mediaUrl", licenseHolder, 0, ""); parentLicenseId = ipAssetRegistry.getLicenseIdByTokenId(ipAssetId, false); - processor = new TimeTermsProcessor(address(ipAssetRegistry)); + processor = getTermsProcessor(); } function test_revert_execute_terms_unauthorized() public { - bytes memory data = abi.encode(1); + bytes memory data = getTermsData(abi.encode(1)); vm.expectRevert(Unauthorized.selector); processor.executeTerms(data); } - function test_execute_terms_start_on_license_creation() public { + function test_execute_terms_start_on_license_creation() public virtual { uint64 ttl = 1000; uint64 startTime = uint64(block.timestamp) + 100; address renewer = address(0); @@ -39,12 +40,14 @@ contract LicenseRegistryTest is BaseTest { startTime, renewer ); - IERC5218.TermsProcessorConfig memory termsConfig = IERC5218.TermsProcessorConfig({ + bytes memory encodedConfig = getTermsConfig(abi.encode(config)); + + Licensing.TermsProcessorConfig memory termsConfig = Licensing.TermsProcessorConfig({ processor: processor, - data: abi.encode(config) + data: encodedConfig }); - - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config)), "terms should be inactive before start time"); + + assertFalse(processor.termsExecutedSuccessfully(encodedConfig), "terms should be inactive before start time"); vm.prank(licenseHolder); licenseId = ipAssetRegistry.createLicense( @@ -60,17 +63,17 @@ contract LicenseRegistryTest is BaseTest { vm.prank(licenseHolder); ipAssetRegistry.executeTerms(licenseId); assertFalse(ipAssetRegistry.isLicenseActive(licenseId), "execution is a noop if start time set"); - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config)), "execution is a noop if start time set"); + assertFalse(processor.termsExecutedSuccessfully(encodedConfig), "execution is a noop if start time set"); vm.warp(startTime + 100); assertTrue(ipAssetRegistry.isLicenseActive(licenseId), "license should be active after start time"); - assertTrue(processor.termsExecutedSuccessfully(abi.encode(config)), "terms should be active after start time"); + assertTrue(processor.termsExecutedSuccessfully(encodedConfig), "terms should be active after start time"); vm.warp(startTime + ttl + 1); - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config)), "terms should be inactive after ttl"); + assertFalse(processor.termsExecutedSuccessfully(encodedConfig), "terms should be inactive after ttl"); assertFalse(ipAssetRegistry.isLicenseActive(licenseId), "license should be inactive after ttl"); - + } - function test_terms_always_false_if_not_started() public { + function test_terms_always_false_if_not_started() public virtual { uint64 ttl = 1000; uint64 startTime = 0; // unset so it fills with block.timestamp in terms execution address renewer = address(0); @@ -80,12 +83,13 @@ contract LicenseRegistryTest is BaseTest { startTime, renewer ); - IERC5218.TermsProcessorConfig memory termsConfig = IERC5218.TermsProcessorConfig({ + bytes memory encodedConfig = getTermsConfig(abi.encode(config)); + Licensing.TermsProcessorConfig memory termsConfig = Licensing.TermsProcessorConfig({ processor: processor, - data: abi.encode(config) + data: encodedConfig }); - - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config))); + + assertFalse(processor.termsExecutedSuccessfully(encodedConfig)); vm.prank(licenseHolder); licenseId = ipAssetRegistry.createLicense( @@ -99,17 +103,17 @@ contract LicenseRegistryTest is BaseTest { termsConfig ); assertFalse(ipAssetRegistry.isLicenseActive(licenseId)); - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config))); + assertFalse(processor.termsExecutedSuccessfully(encodedConfig)); vm.warp(block.timestamp + 100); assertFalse(ipAssetRegistry.isLicenseActive(licenseId)); - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config))); + assertFalse(processor.termsExecutedSuccessfully(encodedConfig)); vm.warp(block.timestamp + ttl + 1); - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config))); + assertFalse(processor.termsExecutedSuccessfully(encodedConfig)); assertFalse(ipAssetRegistry.isLicenseActive(licenseId)); - + } - function test_execute_terms_start_license_countdown() public { + function test_execute_terms_start_license_countdown() public virtual { uint64 ttl = 1000; uint64 startTime = 0; // unset so it fills with block.timestamp in terms execution address renewer = address(0); @@ -119,12 +123,13 @@ contract LicenseRegistryTest is BaseTest { startTime, renewer ); - IERC5218.TermsProcessorConfig memory termsConfig = IERC5218.TermsProcessorConfig({ + bytes memory encodedConfig = getTermsConfig(abi.encode(config)); + Licensing.TermsProcessorConfig memory termsConfig = Licensing.TermsProcessorConfig({ processor: processor, - data: abi.encode(config) + data: encodedConfig }); - - assertFalse(processor.termsExecutedSuccessfully(abi.encode(config)), "terms should be inactive before start time"); + + assertFalse(processor.termsExecutedSuccessfully(encodedConfig), "terms should be inactive before start time"); vm.prank(licenseHolder); licenseId = ipAssetRegistry.createLicense( @@ -145,8 +150,18 @@ contract LicenseRegistryTest is BaseTest { assertTrue(ipAssetRegistry.isLicenseActive(licenseId), "license should be active after start time"); vm.warp(block.timestamp + ttl + 1); assertFalse(ipAssetRegistry.isLicenseActive(licenseId), "license should be inactive after ttl"); - + + } + + function getTermsProcessor() internal virtual returns (ITermsProcessor) { + return new TimeTermsProcessor(address(ipAssetRegistry)); } - + function getTermsData(bytes memory data) internal virtual returns (bytes memory) { + return data; + } + + function getTermsConfig(bytes memory config) internal virtual returns (bytes memory) { + return config; + } } diff --git a/test/foundry/mocks/MockCollectModule.sol b/test/foundry/mocks/MockCollectModule.sol index 12b11de0..6aca5dea 100644 --- a/test/foundry/mocks/MockCollectModule.sol +++ b/test/foundry/mocks/MockCollectModule.sol @@ -3,30 +3,25 @@ pragma solidity ^0.8.18; import { CollectModuleBase } from "contracts/modules/collect/CollectModuleBase.sol"; -// Mock constants to be used for identifying unauthorized franchises. -contract MockCollectModuleConstants { - uint256 public constant UNAUTHORIZED_FRANCHISE_ID = 99; -} - /// @title Mock Collect Module /// @notice This mock contract is used for testing the base collect module. -contract MockCollectModule is CollectModuleBase, MockCollectModuleConstants { +contract MockCollectModule is CollectModuleBase { // Whether the collect module is enabled for a specific IP asset. mapping(uint256 => mapping(uint256 => bool)) collectEnabled; /// @notice Initializes a mock collect module. /// @param franchiseRegistry The protocol-wide franchise registry address. - /// @param defaultCollectNFTImpl The default collect NFT impl address. - constructor(address franchiseRegistry, address defaultCollectNFTImpl) CollectModuleBase(franchiseRegistry, defaultCollectNFTImpl) {} + /// @param defaultCollectNftImpl The default collect NFT impl address. + constructor(address franchiseRegistry, address defaultCollectNftImpl) CollectModuleBase(franchiseRegistry, defaultCollectNftImpl) {} /// @notice Initializes the collect module via UUPS proxying. /// @param accessControl The address utilized for contract access control. function initialize(address accessControl) public initializer {} /// @dev Checks whether the collect action is authorized for an IP asset. - function _isCollectAuthorized(uint256 franchiseId, uint256) internal pure override returns (bool) { - return franchiseId != UNAUTHORIZED_FRANCHISE_ID; + function _isCollectAuthorized(uint256, uint256) internal pure virtual override returns (bool) { + return true; } /// @dev Additional authorization necessitated by UUPS module upgrades. diff --git a/test/foundry/mocks/MockCollectModuleERC721.sol b/test/foundry/mocks/MockCollectModuleERC721.sol index 631910c5..d3068275 100644 --- a/test/foundry/mocks/MockCollectModuleERC721.sol +++ b/test/foundry/mocks/MockCollectModuleERC721.sol @@ -7,12 +7,6 @@ import { ERC721 } from "contracts/modules/collect/nft/ERC721.sol"; /// @notice This mock ERC-721 is used for testing the minimal collect ERC-721. contract MockCollectModuleERC721 is ERC721 { - /// @notice Returns the total supply of the NFT collection. - /// @return The total number of NFTs in the collection. - function totalSupply() external view returns (uint256) { - return _totalSupply; - } - /// @notice Mints NFT `tokenId` to address `to`. /// @param to The address of the newly minted NFT owner. /// @param tokenId The id of the NFT being minted. @@ -25,4 +19,10 @@ contract MockCollectModuleERC721 is ERC721 { function burn(uint256 tokenId) external { _burn(tokenId); } + + /// @notice Returns the total supply of the NFT collection. + /// @return The total number of NFTs in the collection. + function totalSupply() external view returns (uint256) { + return _totalSupply; + } } diff --git a/test/foundry/mocks/MockCollectPaymentModule.sol b/test/foundry/mocks/MockCollectPaymentModule.sol new file mode 100644 index 00000000..9705e73a --- /dev/null +++ b/test/foundry/mocks/MockCollectPaymentModule.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +import { CollectPaymentModuleBase } from "contracts/modules/collect/CollectPaymentModuleBase.sol"; + +/// @title Mock Payment Collect Module +/// @notice Mock contract used for testing the base payment collect module. +contract MockCollectPaymentModule is CollectPaymentModuleBase { + + // Whether the collect module is enabled for a specific IP asset. + mapping(uint256 => mapping(uint256 => bool)) collectEnabled; + + /// @notice Initializes a mock collect payment module. + /// @param franchiseRegistry The protocol-wide franchise registry address. + /// @param defaultCollectNftImpl The default collect NFT impl address. + constructor(address franchiseRegistry, address defaultCollectNftImpl) CollectPaymentModuleBase(franchiseRegistry, defaultCollectNftImpl) {} + + /// @notice Initializes the collect module via UUPS proxying. + /// @param accessControl The address utilized for contract access control. + function initialize(address accessControl) public initializer {} + + /// @dev Checks whether the collect action is authorized for an IP asset. + function _isCollectAuthorized(uint256, uint256) internal pure override returns (bool) { + return true; + } + + /// @dev Additional authorization necessitated by UUPS module upgrades. + function _authorizeUpgrade(address newImplementation) internal override {} +} diff --git a/test/foundry/mocks/MockERC721Receiver.sol b/test/foundry/mocks/MockERC721Receiver.sol index 8d89d1c6..a8b0eeae 100644 --- a/test/foundry/mocks/MockERC721Receiver.sol +++ b/test/foundry/mocks/MockERC721Receiver.sol @@ -3,12 +3,12 @@ pragma solidity ^0.8.18; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; -import { IERC721Events } from "contracts/interfaces/IERC721Events.sol"; -import { IERC721Errors } from "contracts/interfaces/IERC721Errors.sol"; +import { IERC721Events } from "../interfaces/IERC721Events.sol"; +import { Errors } from "contracts/lib/Errors.sol"; /// @title Mock ERC-721 Receiver /// @notice This contract is used to test ERC-721 safe transfers. -contract MockERC721Receiver is IERC721Receiver, IERC721Errors, IERC721Events { +contract MockERC721Receiver is IERC721Receiver, IERC721Events { /// @notice Custom event used to vet whether a receive was successful. event ERC721Received(address operator, address from, uint256 tokenId, bytes data); @@ -39,7 +39,7 @@ contract MockERC721Receiver is IERC721Receiver, IERC721Errors, IERC721Events { bytes memory data ) public override returns (bytes4) { if (_throws) { - revert ERC721SafeTransferUnsupported(); + revert Errors.ERC721_SafeTransferUnsupported(); } emit ERC721Received(operator, from, tokenId, data); return _retval; diff --git a/test/foundry/mocks/MockIPAssetEventEmitter.sol b/test/foundry/mocks/MockIPAssetEventEmitter.sol index cca3572b..1c8206b0 100644 --- a/test/foundry/mocks/MockIPAssetEventEmitter.sol +++ b/test/foundry/mocks/MockIPAssetEventEmitter.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; -import { IIPAssetEventEmitter } from "contracts/ip-assets/events/IIPAssetEventEmitter.sol"; +import { IIPAssetEventEmitter } from "contracts/interfaces/ip-assets/events/IIPAssetEventEmitter.sol"; contract MockIPAssetEventEmitter is IIPAssetEventEmitter { - function emitIPAssetCreation(uint256, uint256) override external { + function emitIpAssetCreation(uint256, uint256) override external { // no-op } diff --git a/test/foundry/mocks/MockLicensingModule.sol b/test/foundry/mocks/MockLicensingModule.sol index e2cdf8d3..6eb0d2e4 100644 --- a/test/foundry/mocks/MockLicensingModule.sol +++ b/test/foundry/mocks/MockLicensingModule.sol @@ -1,31 +1,31 @@ pragma solidity ^0.8.19; -import { ILicensingModule } from "contracts/modules/licensing/ILicensingModule.sol"; -import { IERC5218 } from "contracts/modules/licensing/IERC5218.sol"; -import { ITermsProcessor } from "contracts/modules/licensing/terms/ITermsProcessor.sol"; +import { ILicensingModule } from "contracts/interfaces/modules/licensing/ILicensingModule.sol"; +import { ITermsProcessor } from "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; import { MockTermsProcessor } from "./MockTermsProcessor.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; library LibMockFranchiseConfig { function getMockFranchiseConfig() internal pure - returns (ILicensingModule.FranchiseConfig memory) + returns (Licensing.FranchiseConfig memory) { return - ILicensingModule.FranchiseConfig({ - nonCommercialConfig: ILicensingModule.IpAssetConfig({ + Licensing.FranchiseConfig({ + nonCommercialConfig: Licensing.IpAssetConfig({ canSublicense: false, franchiseRootLicenseId: 0 }), - nonCommercialTerms: IERC5218.TermsProcessorConfig({ + nonCommercialTerms: Licensing.TermsProcessorConfig({ processor: ITermsProcessor(address(0)), data: "" }), - commercialConfig: ILicensingModule.IpAssetConfig({ + commercialConfig: Licensing.IpAssetConfig({ canSublicense: false, franchiseRootLicenseId: 0 }), - commercialTerms: IERC5218.TermsProcessorConfig({ + commercialTerms: Licensing.TermsProcessorConfig({ processor: ITermsProcessor(address(0)), data: "" }), @@ -35,9 +35,9 @@ library LibMockFranchiseConfig { }); } - function getTermsProcessorConfig() public returns(IERC5218.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor){ + function getTermsProcessorConfig() public returns(Licensing.TermsProcessorConfig memory terms, MockTermsProcessor termsProcessor){ termsProcessor = new MockTermsProcessor(); - terms = IERC5218.TermsProcessorConfig({ + terms = Licensing.TermsProcessorConfig({ processor: termsProcessor, data: abi.encode("terms") }); @@ -47,14 +47,14 @@ library LibMockFranchiseConfig { contract MockLicensingModule is ILicensingModule { function configureFranchiseLicensing( uint256 franchiseId, - FranchiseConfig memory config + Licensing.FranchiseConfig memory config ) external override { // No-op } function getFranchiseConfig( uint256 - ) external pure override returns (FranchiseConfig memory) { + ) external pure override returns (Licensing.FranchiseConfig memory) { return LibMockFranchiseConfig.getMockFranchiseConfig(); } diff --git a/test/foundry/mocks/MockNativeTokenNonReceiver.sol b/test/foundry/mocks/MockNativeTokenNonReceiver.sol new file mode 100644 index 00000000..453a461f --- /dev/null +++ b/test/foundry/mocks/MockNativeTokenNonReceiver.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +error Revert(); + +contract MockNativeTokenNonReceiver { + + receive() external payable { + revert Revert(); + } +} + diff --git a/test/foundry/mocks/MockSplit.sol b/test/foundry/mocks/MockSplit.sol index 92876ffa..cf785b85 100644 --- a/test/foundry/mocks/MockSplit.sol +++ b/test/foundry/mocks/MockSplit.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSDL-1.1 pragma solidity ^0.8.13; -import "contracts/modules/royalties/ISplitMain.sol"; +import "contracts/interfaces/modules/royalties/ISplitMain.sol"; import {ERC20} from "solmate/src/tokens/ERC20.sol"; contract MockSplit { diff --git a/test/foundry/mocks/MockSplitMain.sol b/test/foundry/mocks/MockSplitMain.sol index 4235a24a..01c0024a 100644 --- a/test/foundry/mocks/MockSplitMain.sol +++ b/test/foundry/mocks/MockSplitMain.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSDL-1.1 pragma solidity ^0.8.13; -import "contracts/modules/royalties/ISplitMain.sol"; +import "contracts/interfaces/modules/royalties/ISplitMain.sol"; import "test/foundry/mocks/MockSplit.sol"; import "test/foundry/mocks/MockERC20.sol"; diff --git a/test/foundry/mocks/MockTermsProcessor.sol b/test/foundry/mocks/MockTermsProcessor.sol index 77ea7cbf..3f57aa41 100644 --- a/test/foundry/mocks/MockTermsProcessor.sol +++ b/test/foundry/mocks/MockTermsProcessor.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSDL-1.1 pragma solidity ^0.8.13; -import "contracts/modules/licensing/terms/ITermsProcessor.sol"; +import "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; diff --git a/test/foundry/mocks/MockThrowingERC20.sol b/test/foundry/mocks/MockThrowingERC20.sol new file mode 100644 index 00000000..71a7e974 --- /dev/null +++ b/test/foundry/mocks/MockThrowingERC20.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: BUSDL-1.1 +pragma solidity ^0.8.13; +import {ERC20} from "solmate/src/tokens/ERC20.sol"; + +contract MockThrowingERC20 is ERC20 { + + enum TransferBehavior { + Fail, + ReturnInvalidABI, + ReturnFalse + } + + TransferBehavior public behavior; + + constructor(string memory name, string memory symbol, uint8 decimals, TransferBehavior behavior_) ERC20(name, symbol, decimals) { + behavior = behavior_; + } + + function mint(uint256 amount) external { + _mint(msg.sender, amount); + } + + function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { + if (behavior == TransferBehavior.Fail) { + revert(); + } + + if (behavior == TransferBehavior.ReturnInvalidABI) { + assembly { + mstore(0x0, 0x1) + return(0x0, 1) + } + } + + if (behavior == TransferBehavior.ReturnFalse) { + return false; + } + + return super.transferFrom(sender, recipient, amount); + } + +} diff --git a/test/foundry/mocks/MockWETH.sol b/test/foundry/mocks/MockWETH.sol new file mode 100644 index 00000000..0926df0c --- /dev/null +++ b/test/foundry/mocks/MockWETH.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: BUSDL-1.1 +pragma solidity ^0.8.18; + +import {WETH} from "solmate/src/tokens/WETH.sol"; + +contract MockWETH is WETH { + + function mint(uint256 amount) external { + _mint(msg.sender, amount); + } +} diff --git a/test/foundry/mocks/RelationshipModuleHarness.sol b/test/foundry/mocks/RelationshipModuleHarness.sol index 58d23b27..6283ce6e 100644 --- a/test/foundry/mocks/RelationshipModuleHarness.sol +++ b/test/foundry/mocks/RelationshipModuleHarness.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.13; import { RelationshipModuleBase } from "contracts/modules/relationships/RelationshipModuleBase.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; contract RelationshipModuleHarness is RelationshipModuleBase { @@ -11,7 +12,7 @@ contract RelationshipModuleHarness is RelationshipModuleBase { __RelationshipModuleBase_init(accessControl); } - function setRelationshipConfig(string calldata name, SetRelationshipConfigParams calldata params) external returns(bytes32 relationshipId) { + function setRelationshipConfig(string calldata name, Relationship.SetRelationshipConfigParams calldata params) external returns(bytes32 relationshipId) { return _setRelationshipConfig(name, params); } @@ -23,4 +24,4 @@ contract RelationshipModuleHarness is RelationshipModuleBase { address newImplementation ) internal virtual override {} -} \ No newline at end of file +} diff --git a/test/foundry/mocks/RightsManagerHarness.sol b/test/foundry/mocks/RightsManagerHarness.sol index d986133f..49ff632e 100644 --- a/test/foundry/mocks/RightsManagerHarness.sol +++ b/test/foundry/mocks/RightsManagerHarness.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.13; import { IPAssetRegistry } from "contracts/ip-assets/IPAssetRegistry.sol"; -import { IPAsset } from "contracts/IPAsset.sol"; -import { ILicensingModule } from "contracts/modules/licensing/ILicensingModule.sol"; -import { IERC5218 } from "contracts/modules/licensing/IERC5218.sol"; -import { ITermsProcessor } from "contracts/modules/licensing/terms/ITermsProcessor.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { ILicensingModule } from "contracts/interfaces/modules/licensing/ILicensingModule.sol"; +import { ITermsProcessor } from "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; contract RightsManagerHarness is IPAssetRegistry { @@ -21,10 +21,10 @@ contract RightsManagerHarness is IPAssetRegistry { function mockMintWithRights(address to, uint256 tokenId, address revoker) external { _mint(to, tokenId); - _setNonCommercialRights(tokenId, 0, to, revoker, ILicensingModule.IpAssetConfig({ + _setNonCommercialRights(tokenId, 0, to, revoker, Licensing.IpAssetConfig({ canSublicense: true, franchiseRootLicenseId: 0 - }), IERC5218.TermsProcessorConfig({ + }), Licensing.TermsProcessorConfig({ processor: ITermsProcessor(address(0)), data: "" })); @@ -38,7 +38,7 @@ contract RightsManagerHarness is IPAssetRegistry { address revoker, bool commercial, bool canSublicense, - TermsProcessorConfig memory _terms, + Licensing.TermsProcessorConfig memory _terms, bool inLicenseRegistry ) external returns(uint256 licenseId) { return _createLicense( diff --git a/test/foundry/modules/collect/BaseCollectModuleTest.sol b/test/foundry/modules/collect/BaseCollectModuleTest.sol new file mode 100644 index 00000000..9e68af98 --- /dev/null +++ b/test/foundry/modules/collect/BaseCollectModuleTest.sol @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +import { ICollectModule } from "contracts/interfaces/modules/collect/ICollectModule.sol"; +import { ICollectNFT } from "contracts/interfaces/modules/collect/ICollectNFT.sol"; + +import { BaseTestUtils } from "test/foundry/utils/BaseTestUtils.sol"; +import { BaseTest } from "test/foundry/utils/BaseTest.sol"; +import { CollectNFTBaseTest } from "./nft/CollectNFTBase.t.sol"; +import { MockCollectModule } from "test/foundry/mocks/MockCollectModule.sol"; +import { MockCollectNFT } from "test/foundry/mocks/MockCollectNFT.sol"; + +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; + +/// @title Collect Module Base ERC-721 Testing Utility Contract +/// @notice Provides a set of reusable tests for ERC-721 implementations. +contract BaseCollectModuleTest is BaseTest { + + // TODO: Currently, when compiling with 0.8.21, there is a known ICE bug that prevents us from emitting from the interface directly e.g. via ICollectModule.Collected - these two should be refactored in favor of emitting through the interface once we officially migrate to 0.8.22. + // See: https://github.com/ethereum/solidity/issues/14430 + event Collected( + uint256 indexed franchiseid_, + uint256 indexed ipAssetId_, + address indexed collector_, + address collectNft_, + uint256 collectNftId_, + bytes collectData_, + bytes collectNftData_ + ); + + // TODO: Refactor once we migrate to compiling via 0.8.22 as explained above. + event NewCollectNFT( + uint256 indexed franchiseId_, + uint256 indexed ipAssetId_, + address collectNFT_ + ); + + // In the base collect module, an IP asset configured with a zero address + // collect NFT impl means that the module-wide default should be used. + address public constant DEFAULT_COLLECT_NFT_IMPL_CONFIG = address(0); + + // Id of IP asset which may differ per test based on testing constraints. + uint256 ipAssetId; + address payable collector; + + /// @notice Modifier that creates an IP asset for testing. + /// @param ipAssetOwner The owner address for the new IP asset. + /// @param ipAssetType The type of the IP asset being created. + modifier createIpAsset(address ipAssetOwner, uint8 ipAssetType) virtual { + ipAssetId = _createIpAsset(ipAssetOwner, ipAssetType, ""); + _; + } + + /// @notice Sets up the base collect module for running tests. + function setUp() public virtual override(BaseTest) { + super.setUp(); + collector = cal; + } + + /// @notice Tests whether unitialized modules revert on invoking collect. + function test_CollectModuleCollectUninitializedReverts(uint8 ipAssetType) createIpAsset(collector, ipAssetType) public { + ICollectModule uninitializedCollectModule = ICollectModule(_deployCollectModule(defaultCollectNftImpl)); + + vm.expectRevert(Errors.CollectModule_CollectNotYetInitialized.selector); + vm.prank(collector); + uninitializedCollectModule.collect(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collector: collector, + collectData: "", + collectNftInitData: "", + collectNftData: "" + })); + } + + /// @notice Tests whether collect reverts if the registry of the IP asset being collected does not exist. + function test_CollectModuleCollectNonExistentIPAssetRegistryReverts(uint256 nonExistentFranchiseId, uint8 ipAssetType) createIpAsset(collector, ipAssetType) public virtual { + vm.assume(nonExistentFranchiseId != franchiseId); + vm.expectRevert(Errors.CollectModule_IPAssetRegistryNonExistent.selector); + _collect(nonExistentFranchiseId, ipAssetId); + } + + /// @notice Tests whether collect reverts if the IP asset being collected from does not exist. + function test_CollectModuleCollectNonExistentIPAssetReverts(uint256 nonExistentipAssetId, uint8 ipAssetType) createIpAsset(collector, ipAssetType) public virtual { + vm.assume(nonExistentipAssetId != ipAssetId); + vm.expectRevert(Errors.CollectModule_IPAssetNonExistent.selector); + _collect(franchiseId, nonExistentipAssetId); + } + + /// @notice Tests that collects with the module-default collect NFT succeed. + function test_CollectModuleCollectDefaultCollectNFT(uint8 ipAssetType) createIpAsset(collector, ipAssetType) public { + assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), address(0)); + vm.expectEmit(true, true, false, false, address(collectModule)); + emit NewCollectNFT( + franchiseId, + ipAssetId, + defaultCollectNftImpl + ); + vm.expectEmit(true, true, true, false, address(collectModule)); + emit Collected( + franchiseId, + ipAssetId, + collector, + defaultCollectNftImpl, + 0, + "", + "" + ); + (address collectNft, uint256 collectNftId) = _collect(franchiseId, ipAssetId); + assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), collectNft); + assertTrue(ICollectNFT(collectNft).ownerOf(collectNftId) == cal); + assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), collectNft); + } + + /// @notice Tests that collects with customized collect NFTs succeed. + function test_CollectModuleCollectCustomCollectNFT(uint8 ipAssetType) public createIpAsset(collector, ipAssetType) { + assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), address(0)); + vm.expectEmit(true, true, false, false, address(collectModule)); + emit NewCollectNFT( + franchiseId, + ipAssetId, + defaultCollectNftImpl + ); + vm.expectEmit(true, true, true, false, address(collectModule)); + emit Collected( + franchiseId, + ipAssetId, + collector, + defaultCollectNftImpl, + 0, + "", + "" + ); + (address collectNft, uint256 collectNftId) = _collect(franchiseId, ipAssetId); + assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), collectNft); + assertTrue(ICollectNFT(collectNft).ownerOf(collectNftId) == cal); + } + + /// @notice Tests expected behavior of the collect module constructor. + function test_CollectModuleConstructor() public { + MockCollectModule mockCollectModule = new MockCollectModule(address(franchiseRegistry), defaultCollectNftImpl); + assertEq(address(mockCollectModule.FRANCHISE_REGISTRY()), address(franchiseRegistry)); + } + + /// @notice Tests expected behavior of collect module initialization. + function test_CollectModuleInit() public { + assertEq(address(0), collectModule.getCollectNFT(franchiseId, ipAssetId)); + } + + /// @notice Tests collect module reverts on unauthorized calls. + function test_CollectModuleInitCollectInvalidCallerReverts(uint256 nonExistentFranchiseId, uint8 ipAssetType) public createIpAsset(collector, ipAssetType) { + vm.assume(nonExistentFranchiseId != franchiseId); + vm.expectRevert(Errors.CollectModule_CallerUnauthorized.selector); + vm.prank(address(this)); + collectModule.initCollect(Collect.InitCollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collectNftImpl: defaultCollectNftImpl, + data: "" + })); + } + + /// @notice Tests collect module reverts on duplicate initialization. + function test_CollectModuleDuplicateInitReverts(uint8 ipAssetType) createIpAsset(collector, ipAssetType) public { + vm.expectRevert(Errors.CollectModule_IPAssetAlreadyInitialized.selector); + vm.prank(address(ipAssetRegistry)); + _initCollectModule(franchiseId, defaultCollectNftImpl); + } + + /// @dev Helper function that initializes a collect module. + /// @param franchiseId The id of the franchise associated with the module. + /// @param collectNftImpl Collect NFT impl address used for collecting. + function _initCollectModule(uint256 franchiseId, address collectNftImpl) internal virtual { + collectModule.initCollect(Collect.InitCollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collectNftImpl: collectNftImpl, + data: "" + })); + } + + /// @dev Helper function that performs collect module collection. + /// @param franchiseId The id of the franchise of the IP asset. + /// @param ipAssetId_ The id of the IP asset being collected. + function _collect(uint256 franchiseId, uint256 ipAssetId_) internal virtual returns (address, uint256) { + vm.prank(collector); + return collectModule.collect(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId_, + collector: collector, + collectData: "", + collectNftInitData: "", + collectNftData: "" + })); + } + +} diff --git a/test/foundry/modules/collect/CollectModuleBase.t.sol b/test/foundry/modules/collect/CollectModuleBase.t.sol deleted file mode 100644 index 564b04f4..00000000 --- a/test/foundry/modules/collect/CollectModuleBase.t.sol +++ /dev/null @@ -1,195 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -import { ICollectModuleEventsAndErrors } from "contracts/interfaces/ICollectModuleEventsAndErrors.sol"; -import { ICollectModule } from "contracts/interfaces/ICollectModule.sol"; -import { ICollectNFT } from "contracts/interfaces/ICollectNFT.sol"; - -import { BaseTestUtils } from "test/foundry/utils/BaseTestUtils.sol"; -import { BaseTest } from "test/foundry/utils/BaseTest.sol"; -import { CollectNFTBaseTest } from "./nft/CollectNFTBase.t.sol"; -import { MockCollectModule, MockCollectModuleConstants } from "test/foundry/mocks/MockCollectModule.sol"; -import { MockCollectNFT } from "test/foundry/mocks/MockCollectNFT.sol"; - -import { IPAsset } from "contracts/IPAsset.sol"; -import { InitCollectParams, CollectParams } from "contracts/lib/CollectModuleStructs.sol"; -import { InitCollectNFTParams } from "contracts/lib/CollectNFTStructs.sol"; - -/// @title Collect Module Base Testing Contract -/// @notice Tests all functionality provided by the base collect module. -contract CollectModuleBaseTest is BaseTest, ICollectModuleEventsAndErrors, MockCollectModuleConstants { - - // In the base collect module, an IP asset configured with a zero address - // collect NFT impl means that the module-wide default should be used. - address public constant DEFAULT_COLLECT_NFT_IMPL_CONFIG = address(0); - - function setUp() public virtual override(BaseTest) { - super.setUp(); - } - - // Id of IP asset which may differ per test based on testing constraints. - uint256 ipAssetId; - - /// @notice Modifier that creates an IP asset for tsting. - /// @param ipAssetOwner The owner address for the new IP asset. - /// @param ipAssetType The type of the IP asset being created. - modifier createIPAsset(address ipAssetOwner, uint8 ipAssetType) { - ipAssetId = _createIPAsset(ipAssetOwner, ipAssetType); - _; - } - - /// @notice Tests whether an unauthorized collect reverts. - function test_CollectModuleCollectUnauthorizedCallReverts(address collector, uint8 ipAssetType) createIPAsset(alice, ipAssetType) public { - vm.expectRevert(CollectModuleCollectUnauthorized.selector); - collectModule.collect(CollectParams({ - franchiseId: UNAUTHORIZED_FRANCHISE_ID, - ipAssetId: ipAssetId, - collector: collector, - collectData: "", - collectNFTInitData: "", - collectNFTData: "" - })); - } - - /// @notice Tests whether unitialized modules revert on invoking collect. - function test_CollectModuleCollectUninitializedReverts(address collector, uint8 ipAssetType) createIPAsset(alice, ipAssetType) public { - address uninitializedCollectModuleImpl = address(new MockCollectModule(address(franchiseRegistry), address(new MockCollectNFT()))); - ICollectModule uninitializedCollectModule = ICollectModule( - _deployUUPSProxy( - collectModuleImpl, - abi.encodeWithSelector( - bytes4(keccak256(bytes("initialize(address)"))), address(accessControl) - ) - ) - ); - vm.assume(franchiseId != UNAUTHORIZED_FRANCHISE_ID); - vm.expectRevert(CollectModuleCollectNotYetInitialized.selector); - uninitializedCollectModule.collect(CollectParams({ - franchiseId: franchiseId, - ipAssetId: ipAssetId, - collector: collector, - collectData: "", - collectNFTInitData: "", - collectNFTData: "" - })); - } - - /// @notice Tests whether collect reverts if the registry of the IP asset being collected does not exist. - function test_CollectModuleCollectNonExistentIPAssetRegistryReverts(uint256 nonExistentFranchiseId, uint8 ipAssetType) createIPAsset(alice, ipAssetType) public { - vm.assume(nonExistentFranchiseId != franchiseId); - vm.expectRevert(CollectModuleIPAssetRegistryNonExistent.selector); - _collect(nonExistentFranchiseId, ipAssetId, cal); - } - - /// @notice Tests whether collect reverts if the IP asset being collected from does not exist. - function test_CollectModuleCollectNonExistentIPAssetReverts(uint256 nonExistentIPAssetId, uint8 ipAssetType) createIPAsset(alice, ipAssetType) public { - vm.assume(nonExistentIPAssetId != ipAssetId); - vm.assume(nonExistentIPAssetId != UNAUTHORIZED_FRANCHISE_ID); - vm.expectRevert(CollectModuleIPAssetNonExistent.selector); - collectModule.collect(CollectParams({ - franchiseId: franchiseId, - ipAssetId: nonExistentIPAssetId, - collector: cal, - collectData: "", - collectNFTInitData: "", - collectNFTData: "" - })); - } - - /// @notice Tests that collects with the module-default collect NFT succeed. - function test_CollectModuleCollectDefaultCollectNFT(uint8 ipAssetType) createIPAsset(alice, ipAssetType) public { - assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), address(0)); - (address collectNFT, uint256 collectNFTId) = collectModule.collect(CollectParams({ - franchiseId: franchiseId, - ipAssetId: ipAssetId, - collector: cal, - collectData: "", - collectNFTInitData: "", - collectNFTData: "" - })); - assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), collectNFT); - assertTrue(ICollectNFT(collectNFT).ownerOf(collectNFTId) == cal); - } - - /// @notice Tests that collects with customized collect NFTs succeed. - function test_CollectModuleCollectCustomCollectNFT(uint8 ipAssetType) public createIPAsset(alice, ipAssetType) { - assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), address(0)); - (address collectNFT, uint256 collectNFTId) = collectModule.collect(CollectParams({ - franchiseId: franchiseId, - ipAssetId: ipAssetId, - collector: alice, - collectData: "", - collectNFTInitData: "", - collectNFTData: "" - })); - assertEq(collectModule.getCollectNFT(franchiseId, ipAssetId), collectNFT); - assertTrue(ICollectNFT(collectNFT).ownerOf(collectNFTId) == alice); - } - - /// @notice Tests expected behavior of the collect module constructor. - function test_CollectModuleConstructor() public { - MockCollectModule mockCollectModule = new MockCollectModule(address(franchiseRegistry), defaultCollectNFTImpl); - assertEq(address(mockCollectModule.FRANCHISE_REGISTRY()), address(franchiseRegistry)); - } - - /// @notice Tests expected behavior of collect module initialization. - function test_CollectModuleInit(uint8 ipAssetType) public { - assertEq(address(0), collectModule.getCollectNFT(franchiseId, ipAssetId)); - } - - /// @notice Tests collect module reverts on unauthorized calls. - function test_CollectModuleInitCollectInvalidCallerReverts(uint256 nonExistentFranchiseId, uint8 ipAssetType) public createIPAsset(alice, ipAssetType) { - vm.assume(nonExistentFranchiseId != franchiseId); - vm.expectRevert(CollectModuleCallerUnauthorized.selector); - vm.prank(address(this)); - collectModule.initCollect(InitCollectParams({ - franchiseId: franchiseId, - ipAssetId: ipAssetId, - collectNFTImpl: defaultCollectNFTImpl, - data: "" - })); - } - - /// @notice Tests collect module reverts on duplicate initialization. - function test_CollectModuleDuplicateInitReverts(uint8 ipAssetType) createIPAsset(alice, ipAssetType) public { - vm.prank(address(ipAssetRegistry)); - vm.expectRevert(CollectModuleIPAssetAlreadyInitialized.selector); - collectModule.initCollect(InitCollectParams({ - franchiseId: franchiseId, - ipAssetId: ipAssetId, - collectNFTImpl: DEFAULT_COLLECT_NFT_IMPL_CONFIG, - data: "" - })); - } - - /// @dev Helper function that initializes a collect module. - /// @param franchiseId The id of the franchise associated with the module. - /// @param ipAssetOwner Owner address of the module configured IP asset. - /// @param ipAssetType IP asset type of the module configured IP asset. - /// @param collectNFTImpl Collect NFT impl address used for collecting. - function _initCollectModule(uint256 franchiseId, address ipAssetOwner, uint8 ipAssetType, address collectNFTImpl) internal createIPAsset(ipAssetOwner, ipAssetType) { - vm.prank(address(ipAssetRegistry)); - collectModule.initCollect(InitCollectParams({ - franchiseId: franchiseId, - ipAssetId: ipAssetId, - collectNFTImpl: collectNFTImpl, - data: "" - })); - } - - /// @dev Helper function that performs collect module collection. - /// @param franchiseId The id of the franchise of the IP asset. - /// @param ipAssetId_ The id of the IP asset being collected. - /// @param collector Address designated for the IP asset collection. - function _collect(uint256 franchiseId, uint256 ipAssetId_, address collector) internal { - vm.assume(franchiseId != UNAUTHORIZED_FRANCHISE_ID); - collectModule.collect(CollectParams({ - franchiseId: franchiseId, - ipAssetId: ipAssetId_, - collector: collector, - collectData: "", - collectNFTInitData: "", - collectNFTData: "" - })); - } -} diff --git a/test/foundry/modules/collect/CollectPaymentModuleBase.t.sol b/test/foundry/modules/collect/CollectPaymentModuleBase.t.sol new file mode 100644 index 00000000..8affa75c --- /dev/null +++ b/test/foundry/modules/collect/CollectPaymentModuleBase.t.sol @@ -0,0 +1,440 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import { ICollectModule } from "contracts/interfaces/modules/collect/ICollectModule.sol"; +import { ICollectPaymentModule } from "contracts/interfaces/modules/collect/ICollectPaymentModule.sol"; +import { ICollectNFT } from "contracts/interfaces/modules/collect/ICollectNFT.sol"; + +import { BaseCollectModuleTest } from "./BaseCollectModuleTest.sol"; +import { BaseTest } from "test/foundry/utils/BaseTest.sol"; +import { MockCollectPaymentModule } from "test/foundry/mocks/MockCollectPaymentModule.sol"; +import { MockNativeTokenNonReceiver } from "test/foundry/mocks/MockNativeTokenNonReceiver.sol"; +import { MockThrowingERC20 } from "test/foundry/mocks/MockThrowingERC20.sol"; +import { MockCollectNFT } from "test/foundry/mocks/MockCollectNFT.sol"; +import { MockERC20 } from "test/foundry/mocks/MockERC20.sol"; +import { MockWETH } from "test/foundry/mocks/MockWETH.sol"; + +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; + +/// @title Collect Payment Module Base Testing Contract +/// @notice Tests all functionality provided by the base payment collect module. +contract CollectPaymentModuleBaseTest is BaseCollectModuleTest { + + ICollectPaymentModule collectPaymentModule; + + MockERC20 public erc20; + MockWETH public weth; + + address paymentToken; + Collect.PaymentType paymentType; + uint256 paymentAmount; + address payable paymentRecipient; + Collect.CollectPaymentInfo paymentInfo; + Collect.CollectPaymentParams paymentParams; + + // Used for mocking suites of tests involving payment infos and params. + CollectPaymentSet[] paymentSets; + + struct CollectPaymentSet { + Collect.CollectPaymentInfo info; + Collect.CollectPaymentParams params; + } + + /// @notice Parameterizes payment inputs and outputs for multiple test runs. + modifier parameterizePaymentInfo(CollectPaymentSet[] memory paymentInfoSuite) { + uint256 length = paymentInfoSuite.length; + for (uint256 i = 0; i < length; ) { + paymentInfo = paymentInfoSuite[i].info; + paymentParams = paymentInfoSuite[i].params; + ipAssetId = _createIpAsset(alice, 1, abi.encode(paymentInfo)); + _; + i += 1; + } + } + + /// @notice Modifier that creates an IP asset for normal collect testing, + /// using the latest generated payment struct for collect encoding. + /// @param ipAssetOwner The owner address for the new IP asset. + /// @param ipAssetType The type of the IP asset being created. + modifier createIpAsset(address ipAssetOwner, uint8 ipAssetType) override { + ipAssetId = _createIpAsset(ipAssetOwner, ipAssetType, abi.encode(paymentInfo)); + _; + } + + /// @notice Sets up testing for the base collect payment module. + function setUp() public virtual override(BaseCollectModuleTest) { + super.setUp(); + paymentToken = address(0); + paymentType = Collect.PaymentType.NATIVE; + paymentAmount = 1 ether; + paymentRecipient = alice; + collector = cal; + vm.deal(collector, 999 ether); + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: paymentToken, + paymentType: paymentType, + paymentAmount: paymentAmount, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: paymentToken, + paymentType: paymentType, + paymentAmount: paymentAmount + }); + erc20 = new MockERC20("Story Protocol Mock Token", "SP", 18); + vm.startPrank(collector); + erc20.mint(999999); + erc20.approve(address(collectPaymentModule), type(uint256).max); + weth = new MockWETH(); + weth.mint(999999); + weth.approve(address(collectPaymentModule), type(uint256).max); + vm.stopPrank(); + } + + /// @notice Tests that the collect payment module is correctly initialized. + function test_CollectPaymentModuleInit() public parameterizePaymentInfo(paymentSuite()) { + Collect.CollectPaymentInfo memory p = collectPaymentModule.getPaymentInfo(franchiseId, ipAssetId); + assertEq(p.paymentToken, paymentInfo.paymentToken); + assertEq(uint8(p.paymentType), uint8(paymentInfo.paymentType)); + assertEq(p.paymentAmount, paymentInfo.paymentAmount); + assertEq(p.paymentRecipient, paymentInfo.paymentRecipient); + } + + /// @notice Tests that native payments with no sent funds revert. + function test_CollectPaymentModuleZeroPaymentReverts() public { + vm.prank(address(ipAssetRegistry)); + paymentInfo = Collect.CollectPaymentInfo(address(0), Collect.PaymentType.NATIVE, 0 ether, alice); + vm.expectRevert(Errors.CollectPaymentModule_AmountInvalid.selector); + _initCollectModule(franchiseId, defaultCollectNftImpl); + } + + /// @notice Tests that payments with invalid settings revert. + function test_CollectPaymentModuleInvalidSettingsReverts() public { + vm.prank(address(ipAssetRegistry)); + paymentInfo = Collect.CollectPaymentInfo(address(erc20), Collect.PaymentType.NATIVE, 1 ether, alice); + vm.expectRevert(Errors.CollectPaymentModule_InvalidSettings.selector); + _initCollectModule(franchiseId, defaultCollectNftImpl); + } + + /// @notice Tests that payments with invalid tokens revert. + function test_CollectPaymentModuleInvalidTokenReverts() public { + + vm.prank(address(ipAssetRegistry)); + paymentInfo = Collect.CollectPaymentInfo(bob, Collect.PaymentType.ERC20, 1 ether, alice); + vm.expectRevert(Errors.CollectPaymentModule_TokenInvalid.selector); + _initCollectModule(franchiseId, defaultCollectNftImpl); + } + + /// @notice Tests that native payments work as expected. + function test_CollectPaymentModuleNativeCollect() public parameterizePaymentInfo(paymentSuiteNative()) { + uint256 recipientStartingBalance = paymentRecipient.balance; + uint256 collectorStartingBalance = collector.balance; + paymentAmount = paymentParams.paymentAmount; + _collect(franchiseId, ipAssetId); + assertEq(collector.balance, collectorStartingBalance - paymentAmount); + assertEq(paymentRecipient.balance, recipientStartingBalance + paymentAmount); + } + + /// @notice Tests that native payments that fail revert. + function test_CollectPaymentModuleNativeTransferFailReverts() public { + address payable throwingReceiver = payable(address(new MockNativeTokenNonReceiver())); + + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(0), + paymentType: Collect.PaymentType.NATIVE, + paymentAmount: 10, + paymentRecipient: throwingReceiver + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(0), + paymentType: Collect.PaymentType.NATIVE, + paymentAmount: 10 + }); + ipAssetId = _createIpAsset(collector, 1, abi.encode(paymentInfo)); + + vm.prank(collector); + vm.expectRevert(Errors.CollectPaymentModule_NativeTransferFailed.selector); + collectModule.collect{value: 10}(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collector: collector, + collectData: abi.encode(paymentParams), + collectNftInitData: "", + collectNftData: "" + })); + } + + /// @notice Tests that payments with invalid parameters revert. + function test_CollectPaymentModuleInvalidPaymentParamsReverts() public { + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(erc20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(erc20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 1 + }); + ipAssetId = _createIpAsset(collector, 1, abi.encode(paymentInfo)); + vm.expectRevert(Errors.CollectPaymentModule_PaymentParamsInvalid.selector); + _collect(franchiseId, ipAssetId); + } + + /// @notice Tests that ERC20 payments with failing transfers revert. + function test_CollectPaymentModuleERC20TransferFailReverts() public { + MockThrowingERC20 throwingERC20 = new MockThrowingERC20("Story Protocol Mock Token", "SP", 18, MockThrowingERC20.TransferBehavior.Fail); + vm.prank(collector); + throwingERC20.mint(999999); + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(throwingERC20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(throwingERC20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10 + }); + ipAssetId = _createIpAsset(collector, 1, abi.encode(paymentInfo)); + vm.expectRevert(Errors.CollectPaymentModule_ERC20TransferFailed.selector); + _collect(franchiseId, ipAssetId); + } + + /// @notice Tests that ERC20 payments with invalid payments revert. + function test_CollectPaymentModuleERC20InvalidPaymentReverts() public { + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(erc20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(erc20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10 + }); + ipAssetId = _createIpAsset(collector, 1, abi.encode(paymentInfo)); + vm.expectRevert(Errors.CollectPaymentModule_NativeTokenNotAllowed.selector); + collectModule.collect{value: 10}(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collector: collector, + collectData: abi.encode(paymentParams), + collectNftInitData: "", + collectNftData: "" + })); + } + + /// @notice Tests that ERC20 payments with insufficient funds revert. + function test_CollectPaymentModuleERC20InsufficientFundsReverts() public { + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(erc20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 9999999, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(erc20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 9999999 + }); + ipAssetId = _createIpAsset(collector, 1, abi.encode(paymentInfo)); + vm.expectRevert(Errors.CollectPaymentModule_PaymentInsufficient.selector); + _collect(franchiseId, ipAssetId); + + } + + /// @notice Tests that ERC20 payments with invalid ABI encoding revert. + function test_CollectPaymentModuleERC20TransferInvalidABIReverts() public { + MockThrowingERC20 throwingERC20 = new MockThrowingERC20("Story Protocol Mock Token", "SP", 18, MockThrowingERC20.TransferBehavior.ReturnInvalidABI); + vm.prank(collector); + throwingERC20.mint(999999); + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(throwingERC20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(throwingERC20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10 + }); + ipAssetId = _createIpAsset(collector, 1, abi.encode(paymentInfo)); + vm.expectRevert(Errors.CollectPaymentModule_ERC20TransferInvalidABIEncoding.selector); + _collect(franchiseId, ipAssetId); + } + + /// @notice Tests that ERC20 payments with invalid return values revert. + function test_CollectPaymentModuleERC20TransferInvalidReturnReverts() public { + MockThrowingERC20 throwingERC20 = new MockThrowingERC20("Story Protocol Mock Token", "SP", 18, MockThrowingERC20.TransferBehavior.ReturnFalse); + vm.prank(collector); + throwingERC20.mint(999999); + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(throwingERC20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(throwingERC20), + paymentType: Collect.PaymentType.ERC20, + paymentAmount: 10 + }); + ipAssetId = _createIpAsset(collector, 1, abi.encode(paymentInfo)); + vm.expectRevert(Errors.CollectPaymentModule_ERC20TransferInvalidReturnValue.selector); + _collect(franchiseId, ipAssetId); + } + + /// @notice Tests that ERC20 payments work as expected. + function test_CollectPaymentModuleERC20Collect() public parameterizePaymentInfo(paymentSuiteERC20()) { + uint256 recipientStartingBalance = erc20.balanceOf(paymentRecipient); + uint256 collectorStartingBalance = erc20.balanceOf(collector); + paymentAmount = paymentParams.paymentAmount; + _collect(franchiseId, ipAssetId); + assertEq(erc20.balanceOf(paymentRecipient), recipientStartingBalance + paymentAmount); + assertEq(erc20.balanceOf(collector), collectorStartingBalance - paymentAmount); + } + + /// @notice Tests that payments without sufficient funds revert. + function test_CollectPaymentModuleInsufficientFunds() public { + paymentInfo = Collect.CollectPaymentInfo({ + paymentToken: address(0), + paymentType: Collect.PaymentType.NATIVE, + paymentAmount: 10, + paymentRecipient: paymentRecipient + }); + paymentParams = Collect.CollectPaymentParams({ + paymentToken: address(0), + paymentType: Collect.PaymentType.NATIVE, + paymentAmount: 10 + }); + ipAssetId = _createIpAsset(alice, 1, abi.encode(paymentInfo)); + + vm.prank(collector); + vm.expectRevert(Errors.CollectPaymentModule_PaymentInsufficient.selector); + collectModule.collect{value: 0}(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collector: collector, + collectData: abi.encode(paymentParams), + collectNftInitData: "", + collectNftData: "" + })); + } + + /// @notice Returns a list of parameterized payment test cases. + function paymentSuite() internal returns (CollectPaymentSet[] memory) { + delete paymentSets; + paymentSets.push( + CollectPaymentSet( + Collect.CollectPaymentInfo(address(0), Collect.PaymentType.NATIVE, 1 ether, alice), + Collect.CollectPaymentParams(address(0), Collect.PaymentType.NATIVE, 1 ether) + ) + ); + paymentSets.push( + CollectPaymentSet( + Collect.CollectPaymentInfo(address(erc20), Collect.PaymentType.ERC20, 10000, alice), + Collect.CollectPaymentParams(address(erc20), Collect.PaymentType.ERC20, 10000) + ) + ); + paymentSets.push( + CollectPaymentSet( + Collect.CollectPaymentInfo(address(weth), Collect.PaymentType.ERC20, 99, alice), + Collect.CollectPaymentParams(address(weth), Collect.PaymentType.ERC20, 99) + ) + ); + return paymentSets; + } + + /// @notice Returns a list of parameterized native payment test cases. + function paymentSuiteNative() internal returns (CollectPaymentSet[] memory) { + delete paymentSets; + paymentSets.push( + CollectPaymentSet( + Collect.CollectPaymentInfo(address(0), Collect.PaymentType.NATIVE, 1 ether, alice), + Collect.CollectPaymentParams(address(0), Collect.PaymentType.NATIVE, 1 ether) + ) + ); + paymentSets.push( + CollectPaymentSet( + Collect.CollectPaymentInfo(address(0), Collect.PaymentType.NATIVE, 99 ether, alice), + Collect.CollectPaymentParams(address(0), Collect.PaymentType.NATIVE, 99 ether) + ) + ); + return paymentSets; + } + + /// @notice Returns a list of parameterized ERC20 payment test cases. + function paymentSuiteERC20() internal returns (CollectPaymentSet[] memory) { + delete paymentSets; + paymentSets.push( + CollectPaymentSet( + Collect.CollectPaymentInfo(address(erc20), Collect.PaymentType.ERC20, 999, alice), + Collect.CollectPaymentParams(address(erc20), Collect.PaymentType.ERC20, 999) + ) + ); + return paymentSets; + } + + /// @dev Helper function that initializes a collect module. + /// @param franchiseId The id of the franchise associated with the module. + /// @param collectNftImpl Collect NFT impl address used for collecting. + function _initCollectModule(uint256 franchiseId, address collectNftImpl) internal virtual override { + collectModule.initCollect(Collect.InitCollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collectNftImpl: collectNftImpl, + data: abi.encode(paymentInfo) + })); + } + + /// @dev Helper function that performs collect module collection. + /// @param franchiseId The id of the franchise of the IP asset. + /// @param ipAssetId_ The id of the IP asset being collected. + function _collect(uint256 franchiseId, uint256 ipAssetId_) internal virtual override returns (address, uint256) { + vm.prank(collector); + if (paymentParams.paymentType == Collect.PaymentType.NATIVE) { + return collectModule.collect{value: paymentParams.paymentAmount}(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId_, + collector: collector, + collectData: abi.encode(paymentParams), + collectNftInitData: "", + collectNftData: "" + })); + } + return collectModule.collect(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId_, + collector: collector, + collectData: abi.encode(paymentParams), + collectNftInitData: "", + collectNftData: "" + })); + } + + /// @notice Changes the base testing collect module deployment to deploy the + /// mock payment collect module instead. + function _deployCollectModule(address collectNftImpl) internal virtual override returns (address) { + collectModuleImpl = address(new MockCollectPaymentModule(address(franchiseRegistry), collectNftImpl)); + + collectPaymentModule = ICollectPaymentModule( + _deployUUPSProxy( + collectModuleImpl, + abi.encodeWithSelector( + bytes4(keccak256(bytes("initialize(address)"))), address(accessControl) + ) + ) + ); + + return address(collectPaymentModule); + } + +} diff --git a/test/foundry/modules/collect/SimpleCollectModule.t.sol b/test/foundry/modules/collect/SimpleCollectModule.t.sol new file mode 100644 index 00000000..9a3af497 --- /dev/null +++ b/test/foundry/modules/collect/SimpleCollectModule.t.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.18; + +import { SimpleCollectModule } from "contracts/modules/collect/SimpleCollectModule.sol"; +import { BaseCollectModuleTest } from "./BaseCollectModuleTest.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; + +/// @title Simple Collect Module Testing Contract +contract SimpleCollectModuleTest is BaseCollectModuleTest { + + function setUp() public virtual override(BaseCollectModuleTest) { + super.setUp(); + } + + /// @notice Tests that unauthorized collects revert. + function test_CollectModuleCollectUnauthorizedReverts(uint8 ipAssetType) createIpAsset(collector, ipAssetType) public { + vm.prank(alice); + vm.expectRevert(Errors.CollectModule_CollectUnauthorized.selector); + collectModule.collect(Collect.CollectParams({ + franchiseId: franchiseId, + ipAssetId: ipAssetId, + collector: collector, + collectData: "", + collectNftInitData: "", + collectNftData: "" + })); + } + + /// @notice Tests that upgrades work as expected. + function test_CollectModuleUpgrade() public { + address newCollectModuleImpl = address(new SimpleCollectModule(address(franchiseRegistry), defaultCollectNftImpl)); + vm.prank(upgrader); + + bytes memory data = abi.encodeWithSelector( + bytes4(keccak256(bytes("DEFAULT_COLLECT_NFT_IMPL()"))) + ); + (bool success, ) = address(collectModule).call( + abi.encodeWithSignature( + "upgradeToAndCall(address,bytes)", + newCollectModuleImpl, + data + ) + ); + assertTrue(success); + } + + /// @notice Tests whether collect reverts if the registry of the IP asset being collected does not exist. + function test_CollectModuleCollectNonExistentIPAssetRegistryReverts(uint256 nonExistentFranchiseId, uint8 ipAssetType) createIpAsset(collector, ipAssetType) public virtual override { + vm.assume(nonExistentFranchiseId != franchiseId); + vm.expectRevert(); + _collect(nonExistentFranchiseId, ipAssetId); + } + + + /// @notice Tests whether collect reverts if the IP asset being collected from does not exist. + function test_CollectModuleCollectNonExistentIPAssetReverts(uint256 nonExistentipAssetId, uint8 ipAssetType) createIpAsset(collector, ipAssetType) public virtual override { + vm.assume(nonExistentipAssetId != ipAssetId); + vm.expectRevert(); + _collect(franchiseId, nonExistentipAssetId); + } + + /// @notice Changes the base testing collect module deployment to deploy the mock payment collect module instead. + function _deployCollectModule(address collectNftImpl) internal virtual override returns (address) { + collectModuleImpl = address(new SimpleCollectModule(address(franchiseRegistry), collectNftImpl)); + + return _deployUUPSProxy( + collectModuleImpl, + abi.encodeWithSelector( + bytes4(keccak256(bytes("initialize(address)"))), address(accessControl) + ) + ); + + } + +} diff --git a/test/foundry/modules/collect/nft/BaseERC721Test.sol b/test/foundry/modules/collect/nft/BaseERC721Test.sol index a15744d9..05cfa2ea 100644 --- a/test/foundry/modules/collect/nft/BaseERC721Test.sol +++ b/test/foundry/modules/collect/nft/BaseERC721Test.sol @@ -4,17 +4,17 @@ pragma solidity ^0.8.18; import "forge-std/Test.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { IERC721Events } from "contracts/interfaces/IERC721Events.sol"; -import { IERC721Errors } from "contracts/interfaces/IERC721Errors.sol"; +import { IERC721Events } from "../../../interfaces/IERC721Events.sol"; import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import { MockCollectModuleERC721 } from "test/foundry/mocks/MockCollectModuleERC721.sol"; import { BaseTestUtils } from "test/foundry/utils/BaseTestUtils.sol"; import { MockERC721Receiver } from "test/foundry/mocks/MockERC721Receiver.sol"; +import { Errors } from "contracts/lib/Errors.sol"; /// @title Collect Module Base ERC-721 Testing Utility Contract /// @notice Provides a set of reusable tests for ERC-721 implementations. -contract BaseERC721Test is IERC721Errors, IERC721Events, BaseTestUtils { +contract BaseERC721Test is IERC721Events, BaseTestUtils { // Custom event used to vet whether a receive was successful. event ERC721Received(address operator, address from, uint256 tokenId, bytes data); @@ -79,7 +79,7 @@ contract BaseERC721Test is IERC721Errors, IERC721Events, BaseTestUtils { ) internal stateless { vm.assume(operator != owner); vm.prank(operator); - vm.expectRevert(ERC721SenderUnauthorized.selector); + vm.expectRevert(Errors.ERC721_SenderUnauthorized.selector); erc721.approve(approved, tokenId); } @@ -137,7 +137,7 @@ contract BaseERC721Test is IERC721Errors, IERC721Events, BaseTestUtils { address, TransferType transferType ) internal stateless { - vm.expectRevert(ERC721ReceiverInvalid.selector); + vm.expectRevert(Errors.ERC721_ReceiverInvalid.selector); _transfer(transferType, erc721, owner, owner, address(0), tokenId); } @@ -151,7 +151,7 @@ contract BaseERC721Test is IERC721Errors, IERC721Events, BaseTestUtils { TransferType transferType ) internal stateless { vm.assume(owner != sender); - vm.expectRevert(ERC721OwnerInvalid.selector); + vm.expectRevert(Errors.ERC721_OwnerInvalid.selector); _transfer(transferType, erc721, sender, sender, receiver, tokenId); } @@ -166,7 +166,7 @@ contract BaseERC721Test is IERC721Errors, IERC721Events, BaseTestUtils { ) internal stateless { vm.assume(sender != owner); vm.assume(sender != address(0)); - vm.expectRevert(ERC721SenderUnauthorized.selector); + vm.expectRevert(Errors.ERC721_SenderUnauthorized.selector); _transfer(transferType, erc721, sender, owner, receiver, tokenId); } @@ -179,7 +179,7 @@ contract BaseERC721Test is IERC721Errors, IERC721Events, BaseTestUtils { TransferType transferType ) internal stateless { MockERC721Receiver invalidReceiver = new MockERC721Receiver(0xDEADBEEF, false); - vm.expectRevert(ERC721SafeTransferUnsupported.selector); + vm.expectRevert(Errors.ERC721_SafeTransferUnsupported.selector); _transfer(transferType, erc721, owner, owner, address(invalidReceiver), tokenId); } @@ -192,7 +192,7 @@ contract BaseERC721Test is IERC721Errors, IERC721Events, BaseTestUtils { TransferType transferType ) internal stateless { MockERC721Receiver invalidReceiver = new MockERC721Receiver(ERC721_RECEIVER_MAGIC_VALUE, true); - vm.expectRevert(ERC721SafeTransferUnsupported.selector); + vm.expectRevert(Errors.ERC721_SafeTransferUnsupported.selector); _transfer(transferType, erc721, owner, owner, address(invalidReceiver), tokenId); } diff --git a/test/foundry/modules/collect/nft/CollectNFTBase.t.sol b/test/foundry/modules/collect/nft/CollectNFTBase.t.sol index f25ca279..2829a2c2 100644 --- a/test/foundry/modules/collect/nft/CollectNFTBase.t.sol +++ b/test/foundry/modules/collect/nft/CollectNFTBase.t.sol @@ -3,35 +3,35 @@ pragma solidity ^0.8.18; import { Clones } from '@openzeppelin/contracts/proxy/Clones.sol'; -import { ICollectNFT } from "contracts/interfaces/ICollectNFT.sol"; -import { ICollectNFTEventsAndErrors } from "contracts/interfaces/ICollectNFTEventsAndErrors.sol"; +import { ICollectNFT } from "contracts/interfaces/modules/collect/ICollectNFT.sol"; import { BaseTest } from "test/foundry/utils/BaseTest.sol"; import { BaseERC721Test } from "./BaseERC721Test.sol"; import { MockCollectNFT } from "test/foundry/mocks/MockCollectNFT.sol"; import { ERC721Test } from "./ERC721.t.sol"; -import { IPAsset } from "contracts/IPAsset.sol"; -import { InitCollectNFTParams } from "contracts/lib/CollectNFTStructs.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; +import { Collect } from "contracts/lib/modules/Collect.sol"; +import { Errors } from "contracts/lib/Errors.sol"; /// @title Collect NFT Base Testing Contract /// @notice Tests all functionality provided by the base collect NFT. -contract CollectNFTBaseTest is BaseERC721Test, BaseTest, ICollectNFTEventsAndErrors { +contract CollectNFTBaseTest is BaseERC721Test, BaseTest { // Id of IP asset which may differ per test based on testing constraints. uint256 ipAssetId; // Collect NFT which may differ per test based on testing constraints. - ICollectNFT collectNFT; + ICollectNFT collectNft; /// @notice Modifier that creates a collect NFT for testing. /// @param ipAssetOwner The owner address for the new IP asset. /// @param ipAssetType The type of the IP asset being created. modifier createCollectNFT(address ipAssetOwner, uint8 ipAssetType) { - ipAssetId = _createIPAsset(ipAssetOwner, ipAssetType); - collectNFT = ICollectNFT(Clones.clone(defaultCollectNFTImpl)); + ipAssetId = _createIpAsset(ipAssetOwner, ipAssetType, ""); + collectNft = ICollectNFT(Clones.clone(defaultCollectNftImpl)); vm.prank(address(collectModule)); - collectNFT.initialize(InitCollectNFTParams({ + collectNft.initialize(Collect.InitCollectNFTParams({ ipAssetRegistry: address(ipAssetRegistry), ipAssetId: ipAssetId, data: "" @@ -45,23 +45,23 @@ contract CollectNFTBaseTest is BaseERC721Test, BaseTest, ICollectNFTEventsAndErr /// @notice Tests whether collect module collection is successful. function test_CollectNFTCollect(uint8 ipAssetType) public createCollectNFT(cal, ipAssetType) { - uint256 aliceBalance = collectNFT.balanceOf(alice); - uint256 bobBalance = collectNFT.balanceOf(bob); - uint256 totalSupply = collectNFT.totalSupply(); + uint256 aliceBalance = collectNft.balanceOf(alice); + uint256 bobBalance = collectNft.balanceOf(bob); + uint256 totalSupply = collectNft.totalSupply(); vm.startPrank(address(collectModule)); - collectNFT.collect(alice, ""); - collectNFT.collect(alice, ""); - collectNFT.collect(bob, ""); - assertEq(collectNFT.totalSupply(), totalSupply + 3); - assertEq(collectNFT.balanceOf(alice), aliceBalance + 2); - assertEq(collectNFT.balanceOf(bob), bobBalance + 1); + collectNft.collect(alice, ""); + collectNft.collect(alice, ""); + collectNft.collect(bob, ""); + assertEq(collectNft.totalSupply(), totalSupply + 3); + assertEq(collectNft.balanceOf(alice), aliceBalance + 2); + assertEq(collectNft.balanceOf(bob), bobBalance + 1); } /// @notice Tests whether collect on non-existent IP assets revert. function test_CollectNFTNonExistentIPAssetReverts() public { - collectNFT = ICollectNFT(Clones.clone(defaultCollectNFTImpl)); - vm.expectRevert(CollectNFTIPAssetNonExistent.selector); - collectNFT.initialize(InitCollectNFTParams({ + collectNft = ICollectNFT(Clones.clone(defaultCollectNftImpl)); + vm.expectRevert(Errors.CollectNFT_IPAssetNonExistent.selector); + collectNft.initialize(Collect.InitCollectNFTParams({ ipAssetRegistry: address(ipAssetRegistry), ipAssetId: ipAssetId, data: "" @@ -70,9 +70,9 @@ contract CollectNFTBaseTest is BaseERC721Test, BaseTest, ICollectNFTEventsAndErr /// @notice Tests whether initialization on a deployed collect NFT reverts. function test_CollectNFTConstructorInitializeReverts() public { - collectNFT = new MockCollectNFT(); - vm.expectRevert(CollectNFTAlreadyInitialized.selector); - collectNFT.initialize(InitCollectNFTParams({ + collectNft = new MockCollectNFT(); + vm.expectRevert(Errors.CollectNFT_AlreadyInitialized.selector); + collectNft.initialize(Collect.InitCollectNFTParams({ ipAssetRegistry: address(ipAssetRegistry), ipAssetId: ipAssetId, data: "" @@ -81,14 +81,14 @@ contract CollectNFTBaseTest is BaseERC721Test, BaseTest, ICollectNFTEventsAndErr /// @notice Tests whether collect calls not made by the collect module revert. function test_CollectNFTNonCollectModuleCallerReverts(uint8 ipAssetType) public createCollectNFT(cal, ipAssetType) { - vm.expectRevert(CollectNFTCallerUnauthorized.selector); - collectNFT.collect(address(this), ""); + vm.expectRevert(Errors.CollectNFT_CallerUnauthorized.selector); + collectNft.collect(address(this), ""); } /// @notice Tests whether re-initialization of collect module settings revert. function test_CollectNFTInitializeTwiceReverts(uint8 ipAssetType) public createCollectNFT(cal, ipAssetType) { - vm.expectRevert(CollectNFTAlreadyInitialized.selector); - collectNFT.initialize(InitCollectNFTParams({ + vm.expectRevert(Errors.CollectNFT_AlreadyInitialized.selector); + collectNft.initialize(Collect.InitCollectNFTParams({ ipAssetRegistry: address(ipAssetRegistry), ipAssetId: ipAssetId, data: "" diff --git a/test/foundry/modules/collect/nft/ERC721.t.sol b/test/foundry/modules/collect/nft/ERC721.t.sol index 51051760..ba13d9b9 100644 --- a/test/foundry/modules/collect/nft/ERC721.t.sol +++ b/test/foundry/modules/collect/nft/ERC721.t.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.18; -import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import { BaseERC721Test } from "./BaseERC721Test.sol"; import { MockCollectModuleERC721 } from "test/foundry/mocks/MockCollectModuleERC721.sol"; +import { Errors } from "contracts/lib/Errors.sol"; /// @title ERC-721 Testing Contract /// @notice Tests all ERC-721 functionality. @@ -183,7 +184,7 @@ contract ERC721Test is BaseERC721Test { /// @notice Tests that mints to the zero address throw. function test_ERC721MintZeroAddressReverts(uint256 tokenId) public { - vm.expectRevert(ERC721ReceiverInvalid.selector); + vm.expectRevert(Errors.ERC721_ReceiverInvalid.selector); erc721.mint(address(0), tokenId); } @@ -191,7 +192,7 @@ contract ERC721Test is BaseERC721Test { function test_ERC721MintDuplicateReverts(uint256 tokenId, address owner) public { vm.assume(owner != address(0)); erc721.mint(owner, tokenId); - vm.expectRevert(ERC721TokenAlreadyMinted.selector); + vm.expectRevert(Errors.ERC721_TokenAlreadyMinted.selector); erc721.mint(owner, tokenId); } @@ -223,13 +224,13 @@ contract ERC721Test is BaseERC721Test { /// @notice Tests that duplicate burns revert. function test_ERC721BurnDuplicateReverts(uint256 tokenId, address owner) public mintTokenForOwner(owner, tokenId) { erc721.burn(tokenId); - vm.expectRevert(ERC721TokenNonExistent.selector); + vm.expectRevert(Errors.ERC721_TokenNonExistent.selector); erc721.burn(tokenId); } /// @notice Tests that burns of non-existent tokens revert. function test_ERC721BurnNonexistentTokenReverts(uint256 tokenId) public { - vm.expectRevert(ERC721TokenNonExistent.selector); + vm.expectRevert(Errors.ERC721_TokenNonExistent.selector); erc721.burn(tokenId); } diff --git a/test/foundry/relationships/LibIPAssetMask.t.sol b/test/foundry/relationships/LibIPAssetMask.t.sol index 629820ff..5ea12a9f 100644 --- a/test/foundry/relationships/LibIPAssetMask.t.sol +++ b/test/foundry/relationships/LibIPAssetMask.t.sol @@ -4,20 +4,20 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; import { IPAssetRegistryFactory } from "contracts/ip-assets/IPAssetRegistryFactory.sol"; +import { Errors } from "contracts/lib/Errors.sol"; import { LibIPAssetMask } from "contracts/modules/relationships/LibIPAssetMask.sol"; -import { IPAsset, EXTERNAL_ASSET } from "contracts/IPAsset.sol"; +import { IPAsset } from "contracts/lib/IPAsset.sol"; import { FranchiseRegistry } from "contracts/FranchiseRegistry.sol"; import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import { LibIPAssetId } from "contracts/ip-assets/LibIPAssetId.sol"; import { MockERC721 } from "../mocks/MockERC721.sol"; contract LibIPAssetMaskHarness { - function convertToMask(IPAsset[] calldata ipAssets, bool allowsExternal) pure external returns (uint256) { + function convertToMask(IPAsset.IPAssetType[] calldata ipAssets, bool allowsExternal) pure external returns (uint256) { return LibIPAssetMask._convertToMask(ipAssets, allowsExternal); } - function convertFromMask(uint256 mask) pure external returns (IPAsset[] memory, bool) { + function convertFromMask(uint256 mask) pure external returns (IPAsset.IPAssetType[] memory, bool) { return LibIPAssetMask._convertFromMask(mask); } @@ -41,12 +41,12 @@ contract LibIPAssetMaskHarnessTest is Test { } function test_convertToMaskWithoutExternal() public { - for (uint8 i = 1; i <= uint8(IPAsset.ITEM); i++) { - IPAsset[] memory ipAssets = new IPAsset[](i); + for (uint8 i = 1; i <= uint8(IPAsset.IPAssetType.ITEM); i++) { + IPAsset.IPAssetType[] memory ipAssets = new IPAsset.IPAssetType[](i); uint256 resultMask; for (uint8 j = 1; j <= i; j++) { - ipAssets[j-1] = IPAsset(j); - resultMask |= 1 << (uint256(IPAsset(j)) & 0xff); + ipAssets[j-1] = IPAsset.IPAssetType(j); + resultMask |= 1 << (uint256(IPAsset.IPAssetType(j)) & 0xff); } uint256 mask = checker.convertToMask(ipAssets, false); assertEq(mask, resultMask); @@ -54,29 +54,29 @@ contract LibIPAssetMaskHarnessTest is Test { } function test_convertToMaskWithExternal() public { - for (uint8 i = 1; i <= uint8(IPAsset.ITEM); i++) { - IPAsset[] memory ipAssets = new IPAsset[](i); + for (uint8 i = 1; i <= uint8(IPAsset.IPAssetType.ITEM); i++) { + IPAsset.IPAssetType[] memory ipAssets = new IPAsset.IPAssetType[](i); uint256 resultMask; for (uint8 j = 1; j <= i; j++) { - ipAssets[j-1] = IPAsset(j); - resultMask |= 1 << (uint256(IPAsset(j)) & 0xff); + ipAssets[j-1] = IPAsset.IPAssetType(j); + resultMask |= 1 << (uint256(IPAsset.IPAssetType(j)) & 0xff); } - resultMask |= uint256(EXTERNAL_ASSET) << 248; + resultMask |= uint256(IPAsset.EXTERNAL_ASSET) << 248; uint256 mask = checker.convertToMask(ipAssets, true); assertEq(mask, resultMask); } } function test_revert_convertToMaskWithExternal_ifEmptyArray() public { - IPAsset[] memory ipAssets = new IPAsset[](0); - vm.expectRevert(InvalidIPAssetArray.selector); + IPAsset.IPAssetType[] memory ipAssets = new IPAsset.IPAssetType[](0); + vm.expectRevert(Errors.IPAsset_InvalidIPAssetArray.selector); checker.convertToMask(ipAssets, false); } function test_revert_convertToMaskWithExterna_ifZeroRow() public { - IPAsset[] memory ipAssets = new IPAsset[](1); - ipAssets[0] = IPAsset(0); - vm.expectRevert(InvalidIPAssetArray.selector); + IPAsset.IPAssetType[] memory ipAssets = new IPAsset.IPAssetType[](1); + ipAssets[0] = IPAsset.IPAssetType(0); + vm.expectRevert(Errors.IPAsset_InvalidIPAssetArray.selector); checker.convertToMask(ipAssets, false); } @@ -87,26 +87,26 @@ contract LibIPAssetMaskConvertFromMaskTest is Test { LibIPAssetMaskHarness public checker; error InvalidIPAssetArray(); - IPAsset[] assets; + IPAsset.IPAssetType[] assets; function setUp() public { checker = new LibIPAssetMaskHarness(); } function test_convertFromMask() public { - IPAsset[] memory result; + IPAsset.IPAssetType[] memory result; bool supportsExternal; uint256 mask = 0; - for (uint8 i = 1; i <= uint8(IPAsset.ITEM); i++) { - mask |= 1 << (uint256(IPAsset(i)) & 0xff); - assets.push(IPAsset(i)); + for (uint8 i = 1; i <= uint8(IPAsset.IPAssetType.ITEM); i++) { + mask |= 1 << (uint256(IPAsset.IPAssetType(i)) & 0xff); + assets.push(IPAsset.IPAssetType(i)); (result, supportsExternal) = checker.convertFromMask(mask); assertFalse(supportsExternal); for (uint8 j = 0; j < assets.length; j++) { assertEq(uint8(result[j]), uint8(assets[j])); } } - mask |= uint256(EXTERNAL_ASSET) << 248; + mask |= uint256(IPAsset.EXTERNAL_ASSET) << 248; (result, supportsExternal) = checker.convertFromMask(mask); assertTrue(supportsExternal); for (uint8 j = 0; j < assets.length; j++) { @@ -128,11 +128,11 @@ contract LibIPAssetMaskSupportsAssetTypeTest is Test { function test_supportsIPAssetType_true() public { uint256 mask = 0; - for (uint8 i = 1; i <= uint8(IPAsset.ITEM); i++) { - mask |= 1 << (uint256(IPAsset(i)) & 0xff); + for (uint8 i = 1; i <= uint8(IPAsset.IPAssetType.ITEM); i++) { + mask |= 1 << (uint256(IPAsset.IPAssetType(i)) & 0xff); } - mask |= uint256(EXTERNAL_ASSET) << 248; - for (uint8 i = 1; i <= uint8(IPAsset.ITEM); i++) { + mask |= uint256(IPAsset.EXTERNAL_ASSET) << 248; + for (uint8 i = 1; i <= uint8(IPAsset.IPAssetType.ITEM); i++) { assertTrue(checker.supportsIPAssetType(mask, i)); } assertTrue(checker.supportsIPAssetType(mask, type(uint8).max)); @@ -140,7 +140,7 @@ contract LibIPAssetMaskSupportsAssetTypeTest is Test { function test_supportIPAssetType_false() public { uint256 zeroMask; - for (uint8 i = 1; i <= uint8(IPAsset.ITEM); i++) { + for (uint8 i = 1; i <= uint8(IPAsset.IPAssetType.ITEM); i++) { assertFalse(checker.supportsIPAssetType(zeroMask, i)); } assertFalse(checker.supportsIPAssetType(zeroMask, type(uint8).max)); @@ -164,25 +164,25 @@ contract LibIPAssetMaskNodesTest is Test { } function test_checkRelationshipNode_ipAsset_true() public { - uint256 tokenId = LibIPAssetId._zeroId(IPAsset(1)) + 1; + uint256 tokenId = IPAsset._zeroId(IPAsset.IPAssetType(1)) + 1; collection.mint(owner, tokenId); - uint256 mask = 1 << (uint256(IPAsset(1)) & 0xff); + uint256 mask = 1 << (uint256(IPAsset.IPAssetType(1)) & 0xff); bool result = checker.checkRelationshipNode(true, tokenId, mask); assertTrue(result); } function test_checkRelationshipNode_ipAsset_false() public { - uint256 tokenId = LibIPAssetId._zeroId(IPAsset(1)) + 1; + uint256 tokenId = IPAsset._zeroId(IPAsset.IPAssetType(1)) + 1; collection.mint(owner, tokenId); - uint256 mask = 1 << (uint256(IPAsset(2)) & 0xff); + uint256 mask = 1 << (uint256(IPAsset.IPAssetType(2)) & 0xff); bool result = checker.checkRelationshipNode(true, tokenId, mask); assertFalse(result); } function test_checkRelationshipNode_external_true() public { - uint256 tokenId = LibIPAssetId._zeroId(IPAsset(1)) + 1; + uint256 tokenId = IPAsset._zeroId(IPAsset.IPAssetType(1)) + 1; collection.mint(owner, tokenId); - uint256 mask = 1 << (uint256(EXTERNAL_ASSET) & 0xff); + uint256 mask = 1 << (uint256(IPAsset.EXTERNAL_ASSET) & 0xff); bool result = checker.checkRelationshipNode(false, tokenId, mask); assertTrue(result); } diff --git a/test/foundry/relationships/ProtocolRelationshipModule.Config.t.sol b/test/foundry/relationships/ProtocolRelationshipModule.Config.t.sol index 8ac363f6..ffc1d638 100644 --- a/test/foundry/relationships/ProtocolRelationshipModule.Config.t.sol +++ b/test/foundry/relationships/ProtocolRelationshipModule.Config.t.sol @@ -5,9 +5,10 @@ import "forge-std/Test.sol"; import '../utils/BaseTest.sol'; import "contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol"; import "contracts/modules/relationships/ProtocolRelationshipModule.sol"; -import "contracts/access-control/ProtocolRoles.sol"; import "contracts/ip-assets/events/CommonIPAssetEventEmitter.sol"; import "contracts/ip-assets/IPAssetRegistry.sol"; +import { AccessControl } from "contracts/lib/AccessControl.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; contract ProtocolRelationshipModuleSetupRelationshipsTest is BaseTest { @@ -31,59 +32,59 @@ contract ProtocolRelationshipModuleSetupRelationshipsTest is BaseTest { ) ); vm.prank(admin); - accessControl.grantRole(RELATIONSHIP_MANAGER_ROLE, relationshipManager); + accessControl.grantRole(AccessControl.RELATIONSHIP_MANAGER_ROLE, relationshipManager); } function test_setProtocolLevelRelationship() public { - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.STORY; - IPAsset[] memory destIPAssets = new IPAsset[](2); - destIPAssets[0] = IPAsset.CHARACTER; - destIPAssets[1] = IPAsset.ART; + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.STORY; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](2); + destIpAssets[0] = IPAsset.IPAssetType.CHARACTER; + destIpAssets[1] = IPAsset.IPAssetType.ART; - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig({ - minTTL: 0, - maxTTL: 0, + timeConfig: Relationship.TimeConfig({ + minTtl: 0, + maxTtl: 0, renewable: false }) }); vm.prank(relationshipManager); bytes32 relId = relationshipModule.setRelationshipConfig("RELATIONSHIP", params); - IRelationshipModule.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relId); - assertEq(config.sourceIPAssetTypeMask, 1 << (uint256(IPAsset.STORY) & 0xff)); - assertEq(config.destIPAssetTypeMask, 1 << (uint256(IPAsset.CHARACTER) & 0xff) | 1 << (uint256(IPAsset.ART) & 0xff) | (uint256(EXTERNAL_ASSET) << 248)); + Relationship.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relId); + assertEq(config.sourceIpAssetTypeMask, 1 << (uint256(IPAsset.IPAssetType.STORY) & 0xff)); + assertEq(config.destIpAssetTypeMask, 1 << (uint256(IPAsset.IPAssetType.CHARACTER) & 0xff) | 1 << (uint256(IPAsset.IPAssetType.ART) & 0xff) | (uint256(IPAsset.EXTERNAL_ASSET) << 248)); assertTrue(config.onlySameFranchise); // TODO: test for event } function test_revert_IfSettingProtocolLevelRelationshipUnauthorized() public { - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.STORY; - IPAsset[] memory destIPAssets = new IPAsset[](2); - destIPAssets[0] = IPAsset.CHARACTER; - destIPAssets[1] = IPAsset.ART; - - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.STORY; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](2); + destIpAssets[0] = IPAsset.IPAssetType.CHARACTER; + destIpAssets[1] = IPAsset.IPAssetType.ART; + + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig({ - minTTL: 0, - maxTTL: 0, + timeConfig: Relationship.TimeConfig({ + minTtl: 0, + maxTtl: 0, renewable: false }) }); @@ -111,23 +112,23 @@ contract ProtocolRelationshipModuleUnsetRelationshipsTest is BaseTest { ) ); vm.prank(admin); - accessControl.grantRole(RELATIONSHIP_MANAGER_ROLE, relationshipManager); - - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.STORY; - IPAsset[] memory destIPAssets = new IPAsset[](1); - destIPAssets[0] = IPAsset.CHARACTER; - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + accessControl.grantRole(AccessControl.RELATIONSHIP_MANAGER_ROLE, relationshipManager); + + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.STORY; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](1); + destIpAssets[0] = IPAsset.IPAssetType.CHARACTER; + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig({ - minTTL: 0, - maxTTL: 0, + timeConfig: Relationship.TimeConfig({ + minTtl: 0, + maxTtl: 0, renewable: false }) }); @@ -140,9 +141,9 @@ contract ProtocolRelationshipModuleUnsetRelationshipsTest is BaseTest { vm.prank(relationshipManager); relationshipModule.unsetRelationshipConfig(relId); - IRelationshipModule.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relId); - assertEq(config.sourceIPAssetTypeMask, 0); - assertEq(config.destIPAssetTypeMask, 0); + Relationship.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relId); + assertEq(config.sourceIpAssetTypeMask, 0); + assertEq(config.destIpAssetTypeMask, 0); assertFalse(config.onlySameFranchise); // TODO: test for event } diff --git a/test/foundry/relationships/RelationshipModule.Config.t.sol b/test/foundry/relationships/RelationshipModule.Config.t.sol index 534abcac..8af0b651 100644 --- a/test/foundry/relationships/RelationshipModule.Config.t.sol +++ b/test/foundry/relationships/RelationshipModule.Config.t.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.13; import '../utils/BaseTest.sol'; +import { Errors } from "contracts/lib/Errors.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; contract RelationshipModuleSetupRelationshipsTest is BaseTest { @@ -11,23 +13,23 @@ contract RelationshipModuleSetupRelationshipsTest is BaseTest { } function test_setRelationship() public { - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.STORY; - IPAsset[] memory destIPAssets = new IPAsset[](2); - destIPAssets[0] = IPAsset.CHARACTER; - destIPAssets[1] = IPAsset.ART; + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.STORY; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](2); + destIpAssets[0] = IPAsset.IPAssetType.CHARACTER; + destIpAssets[1] = IPAsset.IPAssetType.ART; - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig({ - minTTL: 0, - maxTTL: 0, + timeConfig: Relationship.TimeConfig({ + minTtl: 0, + maxTtl: 0, renewable: false }) }); @@ -35,30 +37,30 @@ contract RelationshipModuleSetupRelationshipsTest is BaseTest { bytes32 relId = relationshipModule.setRelationshipConfig("RELATIONSHIP", params); assertEq(relId, keccak256(abi.encode("RELATIONSHIP"))); - IRelationshipModule.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relId); - assertEq(config.sourceIPAssetTypeMask, 1 << (uint256(IPAsset.STORY) & 0xff)); - assertEq(config.destIPAssetTypeMask, 1 << (uint256(IPAsset.CHARACTER) & 0xff) | 1 << (uint256(IPAsset.ART) & 0xff) | (uint256(EXTERNAL_ASSET) << 248)); + Relationship.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relId); + assertEq(config.sourceIpAssetTypeMask, 1 << (uint256(IPAsset.IPAssetType.STORY) & 0xff)); + assertEq(config.destIpAssetTypeMask, 1 << (uint256(IPAsset.IPAssetType.CHARACTER) & 0xff) | 1 << (uint256(IPAsset.IPAssetType.ART) & 0xff) | (uint256(IPAsset.EXTERNAL_ASSET) << 248)); assertTrue(config.onlySameFranchise); // TODO: test for event } function test_revert_IfMasksNotConfigured() public { - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.UNDEFINED; - IPAsset[] memory destIPAssets = new IPAsset[](2); + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.UNDEFINED; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](2); - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig({ - minTTL: 0, - maxTTL: 0, + timeConfig: Relationship.TimeConfig({ + minTtl: 0, + maxTtl: 0, renewable: false }) }); @@ -68,44 +70,44 @@ contract RelationshipModuleSetupRelationshipsTest is BaseTest { } function test_relationshipConfigDecoded() public { - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.STORY; - IPAsset[] memory destIPAssets = new IPAsset[](2); - destIPAssets[0] = IPAsset.CHARACTER; - destIPAssets[1] = IPAsset.ART; + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.STORY; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](2); + destIpAssets[0] = IPAsset.IPAssetType.CHARACTER; + destIpAssets[1] = IPAsset.IPAssetType.ART; - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig({ - minTTL: 0, - maxTTL: 0, + timeConfig: Relationship.TimeConfig({ + minTtl: 0, + maxTtl: 0, renewable: false }) }); bytes32 relId = relationshipModule.setRelationshipConfig("RELATIONSHIP", params); - IRelationshipModule.SetRelationshipConfigParams memory result = relationshipModule.getRelationshipConfigDecoded(relId); + Relationship.SetRelationshipConfigParams memory result = relationshipModule.getRelationshipConfigDecoded(relId); - _assertEqIPAssetArray(result.sourceIPAssets, params.sourceIPAssets); - _assertEqIPAssetArray(result.destIPAssets, params.destIPAssets); + _assertEqIPAssetArray(result.sourceIpAssets, params.sourceIpAssets); + _assertEqIPAssetArray(result.destIpAssets, params.destIpAssets); assertEq(result.allowedExternalSource, params.allowedExternalSource); assertEq(result.allowedExternalDest, params.allowedExternalDest); assertEq(result.onlySameFranchise, params.onlySameFranchise); assertEq(result.processor, params.processor); assertEq(result.disputer, params.disputer); - assertEq(result.timeConfig.minTTL, params.timeConfig.minTTL); - assertEq(result.timeConfig.maxTTL, params.timeConfig.maxTTL); + assertEq(result.timeConfig.minTtl, params.timeConfig.minTtl); + assertEq(result.timeConfig.maxTtl, params.timeConfig.maxTtl); assertEq(result.timeConfig.renewable, params.timeConfig.renewable); } - function _assertEqIPAssetArray(IPAsset[] memory result, IPAsset[] memory expected) internal { + function _assertEqIPAssetArray(IPAsset.IPAssetType[] memory result, IPAsset.IPAssetType[] memory expected) internal { for (uint256 i = 0; i < result.length; i++) { if (i < expected.length) { assertEq(uint256(result[i]), uint256(expected[i])); @@ -125,21 +127,21 @@ contract RelationshipModuleUnsetRelationshipsTest is BaseTest { function setUp() virtual override public { deployProcessors = true; super.setUp(); - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.STORY; - IPAsset[] memory destIPAssets = new IPAsset[](1); - destIPAssets[0] = IPAsset.CHARACTER; - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.STORY; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](1); + destIpAssets[0] = IPAsset.IPAssetType.CHARACTER; + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig({ - minTTL: 0, - maxTTL: 0, + timeConfig: Relationship.TimeConfig({ + minTtl: 0, + maxTtl: 0, renewable: false }) }); @@ -149,16 +151,16 @@ contract RelationshipModuleUnsetRelationshipsTest is BaseTest { function test_unsetRelationshipConfig() public { relationshipModule.unsetRelationshipConfig(relationshipId); - IRelationshipModule.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relationshipId); - assertEq(config.sourceIPAssetTypeMask, 0); - assertEq(config.destIPAssetTypeMask, 0); + Relationship.RelationshipConfig memory config = relationshipModule.getRelationshipConfig(relationshipId); + assertEq(config.sourceIpAssetTypeMask, 0); + assertEq(config.destIpAssetTypeMask, 0); assertFalse(config.onlySameFranchise); // TODO: test for event } function test_revert_unsetRelationshipConfigNonExistingRelationship() public { bytes32 id = relationshipModule.getRelationshipId("UNDEFINED_Relationship"); - vm.expectRevert(IRelationshipModule.NonExistingRelationship.selector); + vm.expectRevert(Errors.RelationshipModule_NonExistingRelationship.selector); relationshipModule.unsetRelationshipConfig(id); } diff --git a/test/foundry/relationships/RelationshipModule.Relating.t.sol b/test/foundry/relationships/RelationshipModule.Relating.t.sol index 4ba00552..4a21bc7c 100644 --- a/test/foundry/relationships/RelationshipModule.Relating.t.sol +++ b/test/foundry/relationships/RelationshipModule.Relating.t.sol @@ -5,11 +5,12 @@ import "forge-std/Test.sol"; import '../utils/ProxyHelper.sol'; import '../utils/BaseTest.sol'; import "../mocks/MockLicensingModule.sol"; -import "contracts/IPAsset.sol"; -import "contracts/errors/General.sol"; +import "contracts/lib/IPAsset.sol"; import "contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "contracts/ip-assets/IPAssetRegistry.sol"; +import { Errors } from "contracts/lib/Errors.sol"; +import { Relationship } from "contracts/lib/modules/Relationship.sol"; contract MockExternalAsset is ERC721 { constructor() ERC721("MockExternalAsset", "MEA") {} @@ -32,76 +33,76 @@ contract RelationshipModuleRelationshipTest is BaseTest { deployProcessors = true; super.setUp(); - IPAsset[] memory sourceIPAssets = new IPAsset[](1); - sourceIPAssets[0] = IPAsset.STORY; - IPAsset[] memory destIPAssets = new IPAsset[](2); - destIPAssets[0] = IPAsset.CHARACTER; - destIPAssets[1] = IPAsset.ART; - - IRelationshipModule.SetRelationshipConfigParams memory params = IRelationshipModule.SetRelationshipConfigParams({ - sourceIPAssets: sourceIPAssets, + IPAsset.IPAssetType[] memory sourceIpAssets = new IPAsset.IPAssetType[](1); + sourceIpAssets[0] = IPAsset.IPAssetType.STORY; + IPAsset.IPAssetType[] memory destIpAssets = new IPAsset.IPAssetType[](2); + destIpAssets[0] = IPAsset.IPAssetType.CHARACTER; + destIpAssets[1] = IPAsset.IPAssetType.ART; + + Relationship.SetRelationshipConfigParams memory params = Relationship.SetRelationshipConfigParams({ + sourceIpAssets: sourceIpAssets, allowedExternalSource: false, - destIPAssets: destIPAssets, + destIpAssets: destIpAssets, allowedExternalDest: true, onlySameFranchise: true, processor: address(relationshipProcessor), disputer: address(this), - timeConfig: IRelationshipModule.TimeConfig(0, 0, false) + timeConfig: Relationship.TimeConfig(0, 0, false) }); relationshipId = relationshipModule.setRelationshipConfig("RELATIONSHIP_ID", params); vm.startPrank(address(franchiseRegistry)); - ipAssetIds[uint8(IPAsset.STORY)] = ipAssetRegistry.createIPAsset(IPAsset.STORY, "name", "description", "mediaUrl", ipAssetOwner, 0); - ipAssetIds[uint8(IPAsset.CHARACTER)] = ipAssetRegistry.createIPAsset(IPAsset.CHARACTER, "name", "description", "mediaUrl", ipAssetOwner, 0); - ipAssetIds[uint8(IPAsset.ART)] = ipAssetRegistry.createIPAsset(IPAsset.ART, "name", "description", "mediaUrl", ipAssetOwner, 0); + ipAssetIds[uint8(IPAsset.IPAssetType.STORY)] = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.STORY, "name", "description", "mediaUrl", ipAssetOwner, 0, ""); + ipAssetIds[uint8(IPAsset.IPAssetType.CHARACTER)] = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.CHARACTER, "name", "description", "mediaUrl", ipAssetOwner, 0, ""); + ipAssetIds[uint8(IPAsset.IPAssetType.ART)] = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.ART, "name", "description", "mediaUrl", ipAssetOwner, 0, ""); vm.stopPrank(); vm.startPrank(ipAssetOwner); externalAsset = new MockExternalAsset(); - ipAssetIds[EXTERNAL_ASSET] = 333; + ipAssetIds[IPAsset.EXTERNAL_ASSET] = 333; externalAsset.mint(ipAssetOwner, 333); vm.stopPrank(); } function test_relate() public { relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.CHARACTER)], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.CHARACTER)], relationshipId, 0 ), "" ); assertTrue( relationshipModule.areTheyRelated( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.CHARACTER)], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.CHARACTER)], relationshipId, 0 ) ) ); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.ART)], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.ART)], relationshipId, 0 ), "" ); assertTrue( relationshipModule.areTheyRelated( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.ART)], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.ART)], relationshipId, 0 ) ) ); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(externalAsset), ipAssetIds[EXTERNAL_ASSET], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(externalAsset), ipAssetIds[IPAsset.EXTERNAL_ASSET], relationshipId, 0 ), "" ); assertTrue( relationshipModule.areTheyRelated( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(externalAsset), ipAssetIds[EXTERNAL_ASSET], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(externalAsset), ipAssetIds[IPAsset.EXTERNAL_ASSET], relationshipId, 0 ) ) ); @@ -112,23 +113,23 @@ contract RelationshipModuleRelationshipTest is BaseTest { function test_not_related() public { assertFalse( relationshipModule.areTheyRelated( - IRelationshipModule.RelationshipParams(address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(1), 2, relationshipId, 0) + Relationship.RelationshipParams(address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(1), 2, relationshipId, 0) ) ); assertFalse( relationshipModule.areTheyRelated( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(externalAsset), ipAssetIds[EXTERNAL_ASSET], keccak256("WRONG"), 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(externalAsset), ipAssetIds[IPAsset.EXTERNAL_ASSET], keccak256("WRONG"), 0 ) ) ); } function test_revert_unknown_relationship() public { - vm.expectRevert(IRelationshipModule.NonExistingRelationship.selector); + vm.expectRevert(Errors.RelationshipModule_NonExistingRelationship.selector); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.CHARACTER)], keccak256("WRONG"), 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.CHARACTER)], keccak256("WRONG"), 0 ), "" ); @@ -142,11 +143,11 @@ contract RelationshipModuleRelationshipTest is BaseTest { vm.stopPrank(); IPAssetRegistry otherIPAssetRegistry = IPAssetRegistry(otherIPAssets); vm.prank(address(franchiseRegistry)); - uint256 otherId = otherIPAssetRegistry.createIPAsset(IPAsset.CHARACTER, "name", "description", "mediaUrl", ipAssetOwner, 0); - vm.expectRevert(IRelationshipModule.CannotRelateToOtherFranchise.selector); + uint256 otherId = otherIPAssetRegistry.createIpAsset(IPAsset.IPAssetType.CHARACTER, "name", "description", "mediaUrl", ipAssetOwner, 0, ""); + vm.expectRevert(Errors.RelationshipModule_CannotRelateToOtherFranchise.selector); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], otherIPAssets, otherId, relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], otherIPAssets, otherId, relationshipId, 0 ), "" ); @@ -154,11 +155,11 @@ contract RelationshipModuleRelationshipTest is BaseTest { function test_revert_relateUnsupportedSource() public { vm.prank(address(franchiseRegistry)); - uint256 wrongId = ipAssetRegistry.createIPAsset(IPAsset.GROUP, "name", "description", "mediaUrl", ipAssetOwner, 0); - vm.expectRevert(IRelationshipModule.UnsupportedRelationshipSrc.selector); + uint256 wrongId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.GROUP, "name", "description", "mediaUrl", ipAssetOwner, 0, ""); + vm.expectRevert(Errors.RelationshipModule_UnsupportedRelationshipSrc.selector); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), wrongId, address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.CHARACTER)], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), wrongId, address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.CHARACTER)], relationshipId, 0 ), "" ); @@ -166,11 +167,11 @@ contract RelationshipModuleRelationshipTest is BaseTest { function test_revert_relateUnsupportedDestination() public { vm.prank(address(franchiseRegistry)); - uint256 wrongId = ipAssetRegistry.createIPAsset(IPAsset.GROUP, "name", "description", "mediaUrl", ipAssetOwner, 0); - vm.expectRevert(IRelationshipModule.UnsupportedRelationshipDst.selector); + uint256 wrongId = ipAssetRegistry.createIpAsset(IPAsset.IPAssetType.GROUP, "name", "description", "mediaUrl", ipAssetOwner, 0, ""); + vm.expectRevert(Errors.RelationshipModule_UnsupportedRelationshipDst.selector); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.STORY)], address(ipAssetRegistry), wrongId, relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.STORY)], address(ipAssetRegistry), wrongId, relationshipId, 0 ), "" ); @@ -179,8 +180,8 @@ contract RelationshipModuleRelationshipTest is BaseTest { function test_revert_nonExistingToken() public { vm.expectRevert("ERC721: invalid token ID"); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(ipAssetRegistry), 420, address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.CHARACTER)], relationshipId, 0 + Relationship.RelationshipParams( + address(ipAssetRegistry), 420, address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.CHARACTER)], relationshipId, 0 ), "" ); @@ -189,8 +190,8 @@ contract RelationshipModuleRelationshipTest is BaseTest { function test_revert_notERC721() public { vm.expectRevert(); relationshipModule.relate( - IRelationshipModule.RelationshipParams( - address(0x999), 420, address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.CHARACTER)], relationshipId, 0 + Relationship.RelationshipParams( + address(0x999), 420, address(ipAssetRegistry), ipAssetIds[uint8(IPAsset.IPAssetType.CHARACTER)], relationshipId, 0 ), "" ); diff --git a/test/foundry/utils/BaseTest.sol b/test/foundry/utils/BaseTest.sol index fed537f2..3f24c482 100644 --- a/test/foundry/utils/BaseTest.sol +++ b/test/foundry/utils/BaseTest.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BUSDL-1.1 pragma solidity ^0.8.19; -import "forge-std/Test.sol"; import 'test/foundry/utils/ProxyHelper.sol'; import 'test/foundry/utils/BaseTestUtils.sol'; import "test/foundry/mocks/RelationshipModuleHarness.sol"; @@ -9,22 +8,24 @@ import "test/foundry/mocks/MockCollectNFT.sol"; import "test/foundry/mocks/MockCollectModule.sol"; import "contracts/FranchiseRegistry.sol"; import "contracts/access-control/AccessControlSingleton.sol"; -import "contracts/access-control/ProtocolRoles.sol"; import "contracts/ip-assets/IPAssetRegistryFactory.sol"; import "contracts/ip-assets/events/CommonIPAssetEventEmitter.sol"; import "contracts/ip-assets/IPAssetRegistry.sol"; -import "contracts/IPAsset.sol"; +import "contracts/lib/IPAsset.sol"; import "contracts/errors/General.sol"; import "contracts/modules/relationships/processors/PermissionlessRelationshipProcessor.sol"; +import "contracts/modules/relationships/processors/DstOwnerRelationshipProcessor.sol"; import "contracts/modules/relationships/RelationshipModuleBase.sol"; import "contracts/modules/relationships/ProtocolRelationshipModule.sol"; import "contracts/modules/licensing/LicensingModule.sol"; -import "contracts/modules/licensing/terms/ITermsProcessor.sol"; +import "contracts/interfaces/modules/licensing/terms/ITermsProcessor.sol"; import "contracts/modules/licensing/LicenseRegistry.sol"; -import "contracts/interfaces/ICollectModule.sol"; - +import "contracts/interfaces/modules/collect/ICollectModule.sol"; import '../mocks/MockTermsProcessor.sol'; +import { AccessControl } from "contracts/lib/AccessControl.sol"; +import { Licensing } from "contracts/lib/modules/Licensing.sol"; + contract BaseTest is BaseTestUtils, ProxyHelper { IPAssetRegistryFactory public factory; @@ -35,6 +36,7 @@ contract BaseTest is BaseTestUtils, ProxyHelper { RelationshipModuleBase public relationshipModule; AccessControlSingleton accessControl; PermissionlessRelationshipProcessor public relationshipProcessor; + DstOwnerRelationshipProcessor public dstOwnerRelationshipProcessor; LicensingModule public licensingModule; ILicenseRegistry public licenseRegistry; MockTermsProcessor public nonCommercialTermsProcessor; @@ -43,13 +45,14 @@ contract BaseTest is BaseTestUtils, ProxyHelper { RelationshipModuleHarness public relationshipModuleHarness; address eventEmitter; address public franchiseRegistryImpl; - address public defaultCollectNFTImpl; + address public defaultCollectNftImpl; address public collectModuleImpl; address public accessControlSingletonImpl; bool public deployProcessors = false; address constant admin = address(123); + address constant upgrader = address(6969); address constant franchiseOwner = address(456); address constant revoker = address(789); string constant NON_COMMERCIAL_LICENSE_URI = "https://noncommercial.license"; @@ -71,6 +74,8 @@ contract BaseTest is BaseTestUtils, ProxyHelper { ) ) ); + vm.prank(admin); + accessControl.grantRole(AccessControl.UPGRADER_ROLE, upgrader); // Create Franchise Registry franchiseRegistryImpl = address(new FranchiseRegistry(address(factory))); @@ -97,19 +102,8 @@ contract BaseTest is BaseTestUtils, ProxyHelper { ) ); - // Deploy collect module and collect NFT impl - defaultCollectNFTImpl = address(new MockCollectNFT()); - collectModuleImpl = address(new MockCollectModule(address(franchiseRegistry), defaultCollectNFTImpl)); - - collectModule = ICollectModule( - _deployUUPSProxy( - collectModuleImpl, - abi.encodeWithSelector( - bytes4(keccak256(bytes("initialize(address)"))), address(accessControl) - ) - ) - ); - + defaultCollectNftImpl = _deployCollectNFTImpl(); + collectModule = ICollectModule(_deployCollectModule(defaultCollectNftImpl)); // upgrade factory to use new event emitter ipAssetRegistryImpl = address(new IPAssetRegistry(eventEmitter, address(licensingModule), address(franchiseRegistry), address(collectModule))); @@ -144,24 +138,25 @@ contract BaseTest is BaseTestUtils, ProxyHelper { if (deployProcessors) { relationshipProcessor = new PermissionlessRelationshipProcessor(address(relationshipModule)); + dstOwnerRelationshipProcessor = new DstOwnerRelationshipProcessor(address(relationshipModule)); } } - function _getLicensingConfig() view internal returns (ILicensingModule.FranchiseConfig memory) { - return ILicensingModule.FranchiseConfig({ - nonCommercialConfig: ILicensingModule.IpAssetConfig({ + function _getLicensingConfig() view internal returns (Licensing.FranchiseConfig memory) { + return Licensing.FranchiseConfig({ + nonCommercialConfig: Licensing.IpAssetConfig({ canSublicense: true, franchiseRootLicenseId: 0 }), - nonCommercialTerms: IERC5218.TermsProcessorConfig({ + nonCommercialTerms: Licensing.TermsProcessorConfig({ processor: nonCommercialTermsProcessor, data: abi.encode("nonCommercial") }), - commercialConfig: ILicensingModule.IpAssetConfig({ + commercialConfig: Licensing.IpAssetConfig({ canSublicense: false, franchiseRootLicenseId: 0 }), - commercialTerms: IERC5218.TermsProcessorConfig({ + commercialTerms: Licensing.TermsProcessorConfig({ processor: commercialTermsProcessor, data: abi.encode("commercial") }), @@ -171,16 +166,30 @@ contract BaseTest is BaseTestUtils, ProxyHelper { }); } + function _deployCollectNFTImpl() internal virtual returns (address) { + return address(new MockCollectNFT()); + } + + function _deployCollectModule(address collectNftImpl) internal virtual returns (address) { + collectModuleImpl = address(new MockCollectModule(address(franchiseRegistry), collectNftImpl)); + return _deployUUPSProxy( + collectModuleImpl, + abi.encodeWithSelector( + bytes4(keccak256(bytes("initialize(address)"))), address(accessControl) + ) + ); + } /// @dev Helper function for creating an IP asset for an owner and IP type. /// TO-DO: Replace this with a simpler set of default owners that get /// tested against. The reason this is currently added is that during /// fuzz testing, foundry may plug existing contracts as potential /// owners for IP asset creation. - function _createIPAsset(address ipAssetOwner, uint8 ipAssetType) internal isValidReceiver(ipAssetOwner) returns (uint256) { - vm.assume(ipAssetType > uint8(type(IPAsset).min)); - vm.assume(ipAssetType < uint8(type(IPAsset).max)); + function _createIpAsset(address ipAssetOwner, uint8 ipAssetType, bytes memory collectData) internal isValidReceiver(ipAssetOwner) returns (uint256) { + vm.assume(ipAssetType > uint8(type(IPAsset.IPAssetType).min)); + vm.assume(ipAssetType < uint8(type(IPAsset.IPAssetType).max)); vm.prank(ipAssetOwner); - return ipAssetRegistry.createIPAsset(IPAsset(ipAssetType), "name", "description", "mediaUrl", ipAssetOwner, 0); + return ipAssetRegistry.createIpAsset(IPAsset.IPAssetType(ipAssetType), "name", "description", "mediaUrl", ipAssetOwner, 0, collectData); } + } diff --git a/test/foundry/utils/ProxyHelper.sol b/test/foundry/utils/ProxyHelper.sol index d9da19e8..067ca4c6 100644 --- a/test/foundry/utils/ProxyHelper.sol +++ b/test/foundry/utils/ProxyHelper.sol @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: BUSDL-1.1 -pragma solidity ^0.8.19; import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; @@ -9,4 +7,4 @@ contract ProxyHelper { ERC1967Proxy proxy = new ERC1967Proxy(_logic, _data); return address(proxy); } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 757fb65b..4cfd7f2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -298,22 +298,6 @@ human-id "^1.0.2" prettier "^2.7.1" -"@ensdomains/ens@^0.4.4": - version "0.4.5" - resolved "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/resolver@^0.2.4": - version "0.2.4" - resolved "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - "@ethereum-waffle/chai@4.0.10": version "4.0.10" resolved "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz" @@ -380,7 +364,7 @@ lru-cache "^5.1.1" semaphore-async-await "^1.5.1" -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@2.6.0": +"@ethereumjs/common@2.6.0", "@ethereumjs/common@^2.6.0": version "2.6.0" resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz" integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== @@ -407,7 +391,7 @@ ethereumjs-util "^7.1.1" miller-rabin "^4.0.0" -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@3.4.0": +"@ethereumjs/tx@3.4.0", "@ethereumjs/tx@^3.4.0": version "3.4.0" resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz" integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== @@ -441,7 +425,7 @@ merkle-patricia-tree "^4.2.2" rustbn.js "~0.2.0" -"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -456,7 +440,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -469,7 +453,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -480,7 +464,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -491,14 +475,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -506,7 +490,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -515,21 +499,21 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@^5.7.0", "@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -545,7 +529,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -560,7 +544,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== @@ -578,7 +562,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== @@ -597,7 +581,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -605,19 +589,19 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== @@ -625,14 +609,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2", "@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -658,7 +642,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -666,7 +650,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -674,7 +658,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -683,7 +667,7 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -695,7 +679,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@^5.7.0", "@ethersproject/solidity@5.7.0": +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -707,7 +691,7 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -716,7 +700,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -740,7 +724,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@^5.7.0", "@ethersproject/wallet@5.7.0": +"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -761,7 +745,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -772,7 +756,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== @@ -886,12 +870,12 @@ lodash "^4.17.16" uuid "^7.0.3" -"@noble/hashes@~1.2.0", "@noble/hashes@1.2.0": +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== @@ -904,7 +888,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1053,9 +1037,54 @@ "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": version "0.1.1" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.1" resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz" @@ -1072,12 +1101,12 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" -"@nomiclabs/hardhat-ethers@^2.0.0", "@nomiclabs/hardhat-ethers@^2.2.3": +"@nomiclabs/hardhat-ethers@^2.2.3": version "2.2.3" resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== -"@nomiclabs/hardhat-etherscan@^3.1.0", "@nomiclabs/hardhat-etherscan@^3.1.7": +"@nomiclabs/hardhat-etherscan@^3.1.7": version "3.1.7" resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz" integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== @@ -1358,12 +1387,7 @@ "@types/level-errors" "*" "@types/node" "*" -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/lru-cache@5.1.1": +"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== @@ -1393,31 +1417,26 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*": - version "20.1.3" - resolved "https://registry.npmjs.org/@types/node/-/node-20.1.3.tgz" - integrity sha512-NP2yfZpgmf2eDRPmgGq+fjGjSwFgYbihA8/gK+ey23qT9RkxsgNTZvGOEpXgzIGqesTYkElELLgtKoMQTys5vA== +"@types/node@*", "@types/node@^12.7.1": + version "12.20.55" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.7.1": - version "12.20.55" - resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - "@types/node@^8.0.0": version "8.10.66" resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== -"@types/node@11.11.6": - version "11.11.6" - resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" - integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== - "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" @@ -1590,11 +1609,6 @@ amdefine@>=0.0.4: resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== -ansi-colors@^4.1.1, ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" @@ -1605,6 +1619,11 @@ ansi-colors@4.1.1: resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" @@ -1612,11 +1631,6 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" @@ -1639,14 +1653,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -1688,12 +1695,7 @@ array-back@^3.0.1, array-back@^3.1.0: resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" - integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== - -array-back@^4.0.2: +array-back@^4.0.1, array-back@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== @@ -1767,7 +1769,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-plus@^1.0.0, assert-plus@1.0.0: +assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -1801,6 +1803,11 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" +async@1.x: + version "1.5.2" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + async@^2.4.0: version "2.6.4" resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" @@ -1808,11 +1815,6 @@ async@^2.4.0: dependencies: lodash "^4.17.14" -async@1.x: - version "1.5.2" - resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" @@ -1911,27 +1913,12 @@ blakejs@^1.1.0: resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bluebird@^3.5.2: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^4.11.0, bn.js@^4.11.8: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^4.11.1: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== -bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -1941,11 +1928,6 @@ bn.js@^5.1.2, bn.js@^5.2.1: resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2040,15 +2022,16 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" -buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2064,15 +2047,6 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - bufferutil@4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz" @@ -2114,17 +2088,7 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -2185,15 +2149,7 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.2: +chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2216,21 +2172,6 @@ check-error@^1.0.2: resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -chokidar@^3.4.0, chokidar@^3.5.2, chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - chokidar@3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" @@ -2246,17 +2187,27 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" +chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.1.0: - version "3.8.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -ci-info@^3.2.0: +ci-info@^3.1.0, ci-info@^3.2.0: version "3.8.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== @@ -2295,15 +2246,6 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" @@ -2345,11 +2287,6 @@ clone@^1.0.2: resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -2364,17 +2301,17 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -colors@^1.1.2, colors@1.4.0: +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -2411,6 +2348,11 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" +commander@3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + commander@^10.0.0: version "10.0.1" resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" @@ -2421,11 +2363,6 @@ commander@^8.1.0: resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - compare-versions@^5.0.0: version "5.0.3" resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz" @@ -2456,7 +2393,7 @@ core-js-pure@^3.0.1: resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz" integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg== -core-util-is@~1.0.0, core-util-is@1.0.2: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== @@ -2550,6 +2487,20 @@ death@^1.1.0: resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== +debug@3.2.6: + version "3.2.6" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -2564,20 +2515,6 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4, debug@4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" @@ -2586,17 +2523,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -2641,7 +2568,7 @@ defender-admin-client@^1.39.0: lodash "^4.17.19" node-fetch "^2.6.0" -defender-base-client@^1.40.0, defender-base-client@1.43.0: +defender-base-client@1.43.0, defender-base-client@^1.40.0: version "1.43.0" resolved "https://registry.npmjs.org/defender-base-client/-/defender-base-client-1.43.0.tgz" integrity sha512-PFQPDZ08SznSlsKiHcvf1TzvKtnd/fv2/P5s2Y8jYPIb7OtANHw94oDFOOvRpg54o8EQItIb9v7H4g4kp/7fng== @@ -2728,7 +2655,7 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -elliptic@^6.5.2, elliptic@^6.5.4, elliptic@6.5.4: +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -2790,7 +2717,7 @@ errno@~0.1.1: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -2877,7 +2804,7 @@ escalade@^3.1.1: resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@^1.0.5, escape-string-regexp@1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -2899,7 +2826,7 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -esprima@^2.7.1, esprima@2.7.x: +esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== @@ -2919,14 +2846,6 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eth-ens-namehash@^2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz" - integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - eth-gas-reporter@^0.2.25: version "0.2.25" resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" @@ -2955,7 +2874,7 @@ ethereum-bloom-filters@^1.0.6: dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@^0.1.3, ethereum-cryptography@0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -2986,7 +2905,7 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereum-waffle@*, ethereum-waffle@^4.0.10: +ethereum-waffle@^4.0.10: version "4.0.10" resolved "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz" integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== @@ -2998,7 +2917,7 @@ ethereum-waffle@*, ethereum-waffle@^4.0.10: solc "0.8.15" typechain "^8.0.0" -ethereumjs-abi@^0.6.8, ethereumjs-abi@0.6.8: +ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== @@ -3006,20 +2925,18 @@ ethereumjs-abi@^0.6.8, ethereumjs-abi@0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-util@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== +ethereumjs-util@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" create-hash "^1.1.2" - elliptic "^6.5.2" ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" + rlp "^2.2.4" -ethereumjs-util@^6.2.1: +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -3043,24 +2960,28 @@ ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethereumjs-util@7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethers@*, ethers@^5.0.0, ethers@^5.0.5, ethers@^5.1.3, ethers@^5.5.3, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: - version "5.7.2" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== +ethers@^4.0.40: + version "4.0.49" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" + aes-js "3.0.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + +ethers@^5.5.3, ethers@^5.7.1, ethers@^5.7.2: + version "5.7.2" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" "@ethersproject/abstract-signer" "5.7.0" "@ethersproject/address" "5.7.0" "@ethersproject/base64" "5.7.0" @@ -3090,21 +3011,6 @@ ethers@*, ethers@^5.0.0, ethers@^5.0.5, ethers@^5.1.3, ethers@^5.5.3, ethers@^5. "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^4.0.40: - version "4.0.49" - resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== - dependencies: - aes-js "3.0.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" @@ -3113,7 +3019,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@^0.1.6, ethjs-util@0.1.6: +ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -3153,7 +3059,7 @@ external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -extsprintf@^1.2.0, extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== @@ -3215,45 +3121,14 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0, find-up@3.0.0: +find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -3261,12 +3136,19 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: - locate-path "^6.0.0" + locate-path "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" path-exists "^4.0.0" find-yarn-workspace-root2@1.2.16: @@ -3349,7 +3231,7 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fp-ts@^1.0.0, fp-ts@1.19.3: +fp-ts@1.19.3, fp-ts@^1.0.0: version "1.19.3" resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== @@ -3454,11 +3336,6 @@ ganache@7.4.3: bufferutil "4.0.5" utf-8-validate "5.0.7" -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" @@ -3514,21 +3391,22 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== +glob@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3537,40 +3415,39 @@ glob@^7.0.0, glob@^7.1.3, glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@7.2.0, glob@^7.0.0, glob@^7.1.3: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^5.0.1" + minimatch "^3.0.4" once "^1.3.0" + path-is-absolute "^1.0.0" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.7: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^5.0.1" once "^1.3.0" - path-is-absolute "^1.0.0" global-modules@^2.0.0: version "2.0.0" @@ -3712,7 +3589,7 @@ hardhat-gas-reporter@^1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.0.0, hardhat@^2.0.2, hardhat@^2.0.4, hardhat@^2.11.0, hardhat@^2.13.0: +hardhat@^2.13.0: version "2.14.0" resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz" integrity sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ== @@ -3828,14 +3705,6 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7, hash.js@1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - hash.js@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" @@ -3844,6 +3713,14 @@ hash.js@1.1.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + he@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" @@ -3918,20 +3795,13 @@ human-id@^1.0.2: resolved "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz" integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== -iconv-lite@^0.4.24, iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" @@ -3983,7 +3853,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4007,11 +3877,6 @@ interpret@^1.0.0: resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== - io-ts@1.10.4: version "1.10.4" resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" @@ -4084,13 +3949,6 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" @@ -4202,11 +4060,6 @@ is-url@^1.2.4: resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" @@ -4257,43 +4110,30 @@ js-sdsl@^4.1.4: resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz" integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== -js-sha3@^0.5.7: +js-sha3@0.5.7: version "0.5.7" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== -js-sha3@^0.8.0, js-sha3@0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-sha3@0.5.7: - version "0.5.7" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.0: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.6.1: +js-yaml@3.x, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -4301,29 +4141,13 @@ js-yaml@^3.6.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0, js-yaml@4.1.0: +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@3.x: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" @@ -4399,7 +4223,7 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -keccak@^3.0.0, keccak@3.0.1: +keccak@3.0.1, keccak@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== @@ -4407,19 +4231,19 @@ keccak@^3.0.0, keccak@3.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== +keccak@3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" readable-stream "^3.6.0" -keccak@3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== +keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -4442,13 +4266,6 @@ kleur@^4.1.5: resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - level-codec@^9.0.0: version "9.0.2" resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" @@ -4575,17 +4392,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-yaml-file@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz" @@ -4626,11 +4432,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" - integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" @@ -4673,11 +4474,6 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" @@ -4700,6 +4496,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + ltgt@~2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" @@ -4842,20 +4643,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.4, minimatch@^3.0.5, "minimatch@2 || 3": +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - minimatch@3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" @@ -4870,6 +4664,13 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@^4.0.2: version "4.1.0" resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" @@ -4889,7 +4690,14 @@ mixme@^0.5.1: resolved "https://registry.npmjs.org/mixme/-/mixme-0.5.9.tgz" integrity sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw== -mkdirp@^0.5.1, mkdirp@0.5.x: +mkdirp@0.5.5: + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@0.5.x, mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -4901,13 +4709,6 @@ mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" @@ -4915,39 +4716,12 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@^10.0.0, mocha@^10.2.0: - version "10.2.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" + ansi-colors "3.2.3" browser-stdout "1.3.1" chokidar "3.3.0" debug "3.2.6" @@ -4972,10 +4746,37 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== +mocha@^10.0.0, mocha@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +mocha@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" @@ -5007,11 +4808,6 @@ module-error@^1.0.1, module-error@^1.0.2: resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== -ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -5022,6 +4818,11 @@ ms@2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -5083,7 +4884,7 @@ node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0, node-gyp-build@4.3.0: +node-gyp-build@4.3.0, node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== @@ -5105,7 +4906,7 @@ nopt@3.x: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -5120,11 +4921,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" @@ -5153,16 +4949,6 @@ object-keys@^1.0.11, object-keys@^1.1.1: resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - object.assign@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" @@ -5173,6 +4959,16 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.getownpropertydescriptors@^2.0.3: version "2.1.6" resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz" @@ -5189,7 +4985,7 @@ obliterator@^2.0.0: resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -once@^1.3.0, once@1.x: +once@1.x, once@^1.3.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -5208,13 +5004,6 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== - dependencies: - lcid "^1.0.0" - os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" @@ -5239,14 +5028,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -5322,13 +5104,6 @@ parse-cache-control@^1.0.1: resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - parse-json@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" @@ -5344,13 +5119,6 @@ path-browserify@^1.0.0: resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" @@ -5371,15 +5139,6 @@ path-parse@^1.0.6: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -5411,28 +5170,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - pify@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" @@ -5478,7 +5220,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier-plugin-solidity@^1.0.0-alpha.14, prettier-plugin-solidity@^1.1.3: +prettier-plugin-solidity@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz" integrity sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg== @@ -5487,7 +5229,7 @@ prettier-plugin-solidity@^1.0.0-alpha.14, prettier-plugin-solidity@^1.1.3: semver "^7.3.8" solidity-comments-extractor "^0.0.7" -"prettier@^1.15.0 || ^2.0.0", prettier@^2.3.1, prettier@^2.7.1, prettier@^2.8.3, "prettier@>=2.3.0 || >=3.0.0-alpha.0", prettier@2.8.7: +prettier@2.8.7, prettier@^2.3.1, prettier@^2.7.1, prettier@^2.8.3: version "2.8.7" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz" integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== @@ -5528,7 +5270,12 @@ psl@^1.1.28: resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -punycode@^2.1.0, punycode@2.1.0: +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +punycode@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz" integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== @@ -5538,11 +5285,6 @@ punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: version "6.11.1" resolved "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz" @@ -5592,14 +5334,6 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" @@ -5609,15 +5343,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" @@ -5745,7 +5470,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.34, request@^2.85.0, request@^2.88.0: +request@^2.85.0, request@^2.88.0: version "2.88.2" resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -5776,26 +5501,11 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" - integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== - -require-from-string@^2.0.0: +require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" @@ -5816,28 +5526,28 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.1.6, resolve@^1.10.0, resolve@1.17.0: +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@1.17.0, resolve@^1.1.6, resolve@^1.10.0: version "1.17.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== +retry@0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== retry@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== -retry@0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" @@ -5858,7 +5568,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.3, rlp@^2.2.4, rlp@2.2.6: +rlp@2.2.6, rlp@^2.2.3, rlp@^2.2.4: version "2.2.6" resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz" integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== @@ -5913,7 +5623,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -5938,26 +5648,17 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@^3.0.0, scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -secp256k1@4.0.3: +secp256k1@4.0.3, secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== @@ -5976,17 +5677,7 @@ semaphore-async-await@^1.5.1: resolved "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz" integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== -semver@^5.3.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -5996,32 +5687,13 @@ semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4: - version "7.5.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.8: - version "7.5.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.3: +semver@^7.3.4, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -"semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" @@ -6034,16 +5706,16 @@ set-blocking@^2.0.0: resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - setimmediate@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" @@ -6126,42 +5798,31 @@ smartwrap@^2.0.2: wcwidth "^1.0.1" yargs "^15.1.0" -solc@*, solc@0.8.15: - version "0.8.15" - resolved "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz" - integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== +solc@0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" - commander "^8.1.0" + commander "3.0.2" follow-redirects "^1.12.1" + fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" + require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== - dependencies: - fs-extra "^0.30.0" - memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -solc@0.7.3: - version "0.7.3" - resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.15: + version "0.8.15" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz" + integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -6172,10 +5833,10 @@ solhint-plugin-prettier@^0.0.5: dependencies: prettier-linter-helpers "^1.0.0" -solhint@^3.4.1: - version "3.4.1" - resolved "https://registry.npmjs.org/solhint/-/solhint-3.4.1.tgz" - integrity sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg== +solhint@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== dependencies: "@solidity-parser/parser" "^0.16.0" ajv "^6.12.6" @@ -6190,7 +5851,7 @@ solhint@^3.4.1: js-yaml "^4.1.0" lodash "^4.17.21" pluralize "^8.0.0" - semver "^6.3.0" + semver "^7.5.2" strip-ansi "^6.0.1" table "^6.8.1" text-table "^0.2.0" @@ -6246,12 +5907,7 @@ source-map-support@^0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6346,34 +6002,11 @@ streamsearch@^1.1.0: resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - string-format@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - "string-width@^1.0.2 || 2", string-width@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" @@ -6427,12 +6060,19 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: - ansi-regex "^2.0.0" + safe-buffer "~5.1.0" strip-ansi@^4.0.0: version "4.0.0" @@ -6455,13 +6095,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" @@ -6491,6 +6124,20 @@ strip-json-comments@3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^3.1.0: version "3.2.3" resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" @@ -6512,20 +6159,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - sync-request@^6.0.0: version "6.1.0" resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" @@ -6568,11 +6201,6 @@ term-size@^2.1.0: resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -6595,7 +6223,7 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" -tmp@^0.0.33, tmp@0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -6653,12 +6281,7 @@ tslib@^1.11.1, tslib@^1.9.3: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.3.1: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tslib@^2.5.0: +tslib@^2.3.1, tslib@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -6693,7 +6316,7 @@ tweetnacl-util@^0.15.1: resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== -tweetnacl@^0.14.3: +tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== @@ -6703,11 +6326,6 @@ tweetnacl@^1.0.3: resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== -tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - type-check@~0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" @@ -6745,7 +6363,7 @@ type-fest@^0.8.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typechain@^8.0.0, typechain@^8.1.1: +typechain@^8.0.0: version "8.1.1" resolved "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz" integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== @@ -6805,11 +6423,6 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@*, typescript@>=3.7.0, typescript@>=4.2, typescript@>=4.3.0: - version "5.0.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== - typical@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" @@ -6894,6 +6507,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== + uuid@^3.3.2: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" @@ -6909,11 +6527,6 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" @@ -6938,7 +6551,7 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: +web3-utils@^1.3.6: version "1.10.0" resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz" integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== @@ -6975,11 +6588,6 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== - which-module@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" @@ -7004,7 +6612,7 @@ which-typed-array@^1.1.10: gopd "^1.0.1" has-tostringtag "^1.0.0" -which@^1.1.1, which@^1.2.9, which@^1.3.1, which@1.3.1: +which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -7018,11 +6626,6 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz" - integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" @@ -7046,14 +6649,6 @@ workerpool@6.2.1: resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" @@ -7086,7 +6681,7 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.4.6, ws@7.4.6: +ws@7.4.6, ws@^7.4.6: version "7.4.6" resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== @@ -7101,11 +6696,6 @@ xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" @@ -7131,7 +6721,7 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^13.1.2, yargs-parser@13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -7139,15 +6729,12 @@ yargs-parser@^13.1.2, yargs-parser@13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@20.2.4, yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^18.1.3: +yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -7155,19 +6742,6 @@ yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" - integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^20.2.2, yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" @@ -7192,7 +6766,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@^13.3.0, yargs@13.3.2: +yargs@13.3.2, yargs@^13.3.0: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -7208,6 +6782,19 @@ yargs@^13.3.0, yargs@13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^15.1.0: version "15.4.1" resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" @@ -7238,39 +6825,6 @@ yargs@^17.7.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" - integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"