From 9d33ac18a61cf84e165c83aa2bc596e80a8379a2 Mon Sep 17 00:00:00 2001 From: nkrishang <62195808+nkrishang@users.noreply.github.com> Date: Tue, 19 Dec 2023 03:16:43 +0530 Subject: [PATCH 01/11] Release 3.11.0 (#592) * fix package.json * package update --- contracts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/package.json b/contracts/package.json index 48693cf4e..66d4d968a 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@thirdweb-dev/contracts", "description": "Collection of smart contracts deployable via the thirdweb SDK, dashboard and CLI", - "version": "3.10.3", + "version": "3.11.0", "license": "Apache-2.0", "repository": { "type": "git", From 25684989c94fb16c84d243343763820c7c93c3e5 Mon Sep 17 00:00:00 2001 From: nkrishang <62195808+nkrishang@users.noreply.github.com> Date: Wed, 20 Dec 2023 22:23:37 +0530 Subject: [PATCH 02/11] Update SDK to 4.0.22 (#593) --- package.json | 2 +- yarn.lock | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 8d19c33dd..01a2151a7 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@openzeppelin/contracts-upgradeable": "^4.9.3", "@thirdweb-dev/chains": "^0.1.54", "@thirdweb-dev/dynamic-contracts": "^1.2.4", - "@thirdweb-dev/sdk": "^4.0.16", + "@thirdweb-dev/sdk": "^4.0.22", "@typechain/ethers-v5": "^10.2.1", "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.1.1", diff --git a/yarn.lock b/yarn.lock index 12219cc65..367d8c8ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -557,6 +557,7 @@ fastq "^1.6.0" "@openzeppelin/contracts-upgradeable-4.7.3@npm:@openzeppelin/contracts-upgradeable@v4.7.3", "@openzeppelin/contracts-upgradeable@4.7.3": + name "@openzeppelin/contracts-upgradeable-4.7.3" version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== @@ -593,7 +594,12 @@ dependencies: antlr4ts "^0.5.0-alpha.4" -"@thirdweb-dev/chains@0.1.58", "@thirdweb-dev/chains@^0.1.54": +"@thirdweb-dev/chains@0.1.61": + version "0.1.61" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/chains/-/chains-0.1.61.tgz#4798164d1e7f07269c04f821e4d56102b476d3ae" + integrity sha512-SlFXjqtqZbGqSYKv1HEhGIG03QjnkQPrgLO7WAar7/ZreEqDb3CtUzysSXnblfMqDDwe51dmWBcZ3dXXtTSZxg== + +"@thirdweb-dev/chains@^0.1.54": version "0.1.58" resolved "https://registry.yarnpkg.com/@thirdweb-dev/chains/-/chains-0.1.58.tgz#5a26fe187ef39b7c6af87972166785d110cad53e" integrity sha512-prSShAWoLODuZQcDBwNDqcXLzfevV2BOw54cDaHetSP+Sw/BP6SaPKIxojRQGsXARjn0JMWniG/NCtppUUHALQ== @@ -644,17 +650,17 @@ buffer-reverse "^1.0.1" treeify "^1.1.0" -"@thirdweb-dev/sdk@^4.0.16": - version "4.0.16" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-4.0.16.tgz#2fec8d9bb645092473479e216eccd8942a2b5b13" - integrity sha512-WTG3sJTtEUpbY1SUd62GU//5npkgVQNJHOUqDjGl1jrTa8Ml0w1VQNe9p/0xbv+3cCTGYOhMvM4HkOZnrQp+gg== +"@thirdweb-dev/sdk@^4.0.22": + version "4.0.22" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-4.0.22.tgz#5302d5ea02a1c356284c39b2893b999e14bffcb6" + integrity sha512-5XRn6qnR0HHqN48kbvW00dO7l2GHBR1wITFCN4IXEgkCCOPJpck0h1jVqqQ9OLm6ILBoSaIkjKo3TIGwsxhmww== dependencies: - "@thirdweb-dev/chains" "0.1.58" + "@thirdweb-dev/chains" "0.1.61" "@thirdweb-dev/contracts-js" "1.3.16" "@thirdweb-dev/crypto" "0.2.0" "@thirdweb-dev/generated-abis" "0.0.1" "@thirdweb-dev/merkletree" "0.2.0" - "@thirdweb-dev/storage" "2.0.5" + "@thirdweb-dev/storage" "2.0.7" abitype "^0.2.5" bn.js "^5.2.1" bs58 "^5.0.0" @@ -667,10 +673,10 @@ yaml "^2.3.1" zod "^3.22.3" -"@thirdweb-dev/storage@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/storage/-/storage-2.0.5.tgz#e492923ca0037db7cd8f30572333a3bb2f67639e" - integrity sha512-I3DK/ZNWOMa/XE2hfJnGKVfc9INn5c3if1qavyK/1fjJBxhUiUXjT59UYbuoWhHLEq0rS/QZVOGS/9qcOs/DAQ== +"@thirdweb-dev/storage@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/storage/-/storage-2.0.7.tgz#249b5bb2949156542cc715b5262f8c88dd0370de" + integrity sha512-pi+wfUycHWoOVxD+CZtfGprP9+yQ2PgErsYwWbW3/pQtk8uatvGJMPgMNYsiu6G3B1V3xokBfnmCTsONjz+YNw== dependencies: "@thirdweb-dev/crypto" "0.2.0" cid-tool "^3.0.0" From 17c10d4f018ef1b71154b3a1bc10a3d6848394ab Mon Sep 17 00:00:00 2001 From: Yash <72552910+kumaryash90@users.noreply.github.com> Date: Fri, 12 Jan 2024 16:14:09 +0530 Subject: [PATCH 03/11] RoyaltyPayments: fix check for royalty amount (#599) fix check for royalty amount --- contracts/extension/upgradeable/RoyaltyPayments.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/extension/upgradeable/RoyaltyPayments.sol b/contracts/extension/upgradeable/RoyaltyPayments.sol index fc353376c..2b5f504be 100644 --- a/contracts/extension/upgradeable/RoyaltyPayments.sol +++ b/contracts/extension/upgradeable/RoyaltyPayments.sol @@ -68,7 +68,7 @@ abstract contract RoyaltyPaymentsLogic is IRoyaltyPayments { if (royaltyEngineAddress == address(0)) { try IERC2981(tokenAddress).royaltyInfo(tokenId, value) returns (address recipient, uint256 amount) { - require(amount < value, "Invalid royalty amount"); + require(amount <= value, "Invalid royalty amount"); recipients = new address payable[](1); amounts = new uint256[](1); From 6576c63497875f9a9d3de5a06c6098e8defbc308 Mon Sep 17 00:00:00 2001 From: nkrishang <62195808+nkrishang@users.noreply.github.com> Date: Thu, 25 Jan 2024 06:16:11 +0530 Subject: [PATCH 04/11] Update yarn lock file (#607) Update lock file --- package-lock.json | 5827 ----------------- .../utils/AABenchmarkArtifacts.sol | 4 +- yarn.lock | 351 +- 3 files changed, 231 insertions(+), 5951 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 47354e928..000000000 --- a/package-lock.json +++ /dev/null @@ -1,5827 +0,0 @@ -{ - "name": "@thirdweb-dev/contracts", - "version": "2.3.0-6", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@thirdweb-dev/contracts", - "version": "2.3.0-6", - "license": "Apache-2.0", - "devDependencies": { - "@chainlink/contracts": "^0.8.0", - "@openzeppelin/contracts": "^4.9.3", - "@openzeppelin/contracts-upgradeable": "^4.9.3", - "@thirdweb-dev/chains": "^0.1.54", - "@thirdweb-dev/dynamic-contracts": "^1.2.4", - "@thirdweb-dev/sdk": "^4.0.16", - "@typechain/ethers-v5": "^10.2.1", - "@types/fs-extra": "^9.0.13", - "@types/mocha": "^9.1.1", - "@types/node": "^17.0.45", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "dotenv": "^16.3.1", - "erc721a": "3.3.0", - "erc721a-upgradeable": "^3.3.0", - "eslint": "^8.54.0", - "eslint-config-prettier": "^8.10.0", - "ethers": "^5.7.2", - "fs-extra": "^10.1.0", - "keccak256": "^1.0.6", - "mocha": "^9.2.2", - "prettier": "^2.8.8", - "prettier-plugin-solidity": "^1.2.0", - "solhint": "^3.6.2", - "solhint-plugin-prettier": "^0.0.5", - "ts-node": "^10.9.1", - "tslib": "^2.6.2", - "tsup": "^5.12.9", - "typechain": "^8.3.2", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "ethers": "^5.0.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@chainlink/contracts": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.8.0.tgz", - "integrity": "sha512-nUv1Uxw5Mn92wgLs2bgPYmo8hpdQ3s9jB/lcbdU0LmNOVu0hbfmouVnqwRLa28Ll50q6GczUA+eO0ikNIKLZsA==", - "dev": true, - "dependencies": { - "@eth-optimism/contracts": "^0.5.21", - "@openzeppelin/contracts": "~4.3.3", - "@openzeppelin/contracts-upgradeable-4.7.3": "npm:@openzeppelin/contracts-upgradeable@v4.7.3", - "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" - } - }, - "node_modules/@chainlink/contracts/node_modules/@openzeppelin/contracts": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz", - "integrity": "sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eth-optimism/contracts": { - "version": "0.5.40", - "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.5.40.tgz", - "integrity": "sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==", - "dev": true, - "dependencies": { - "@eth-optimism/core-utils": "0.12.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0" - }, - "peerDependencies": { - "ethers": "^5" - } - }, - "node_modules/@eth-optimism/core-utils": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz", - "integrity": "sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^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/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/providers": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bufio": "^1.0.7", - "chai": "^4.3.4" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@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" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@multiformats/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==", - "dev": true - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==", - "dev": true - }, - "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz", - "integrity": "sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A==", - "dev": true - }, - "node_modules/@openzeppelin/contracts-upgradeable-4.7.3": { - "name": "@openzeppelin/contracts-upgradeable", - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz", - "integrity": "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==", - "dev": true - }, - "node_modules/@openzeppelin/contracts-v0.7": { - "name": "@openzeppelin/contracts", - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz", - "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==", - "dev": true - }, - "node_modules/@solidity-parser/parser": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", - "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", - "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/@thirdweb-dev/chains": { - "version": "0.1.58", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/chains/-/chains-0.1.58.tgz", - "integrity": "sha512-prSShAWoLODuZQcDBwNDqcXLzfevV2BOw54cDaHetSP+Sw/BP6SaPKIxojRQGsXARjn0JMWniG/NCtppUUHALQ==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@thirdweb-dev/contracts": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/contracts/-/contracts-3.10.3.tgz", - "integrity": "sha512-wSVNaEoosn0AgUtnxlvv7rgK+3EUMzJm2ZasofPgJgqGS3gYH5nDBmK29VMquA2BLc38OAPyYMWc/iQCiCikMg==", - "dev": true, - "dependencies": { - "@chainlink/contracts": "^0.6.1", - "@openzeppelin/contracts": "4.7.3", - "@openzeppelin/contracts-upgradeable": "4.7.3", - "@thirdweb-dev/dynamic-contracts": "^1.1.2", - "erc721a-upgradeable": "^3.3.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@thirdweb-dev/contracts-js": { - "version": "1.3.16", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/contracts-js/-/contracts-js-1.3.16.tgz", - "integrity": "sha512-EpLcD5mdm8b+tvSO7gD9cxSAqjLRr7ygktMp4Pe7Wvobl5ffq8O95futxdVsYc5pyciPZYr8apHUJFYMDlaTqA==", - "dev": true, - "dependencies": { - "@thirdweb-dev/contracts": "3.10.3" - }, - "peerDependencies": { - "ethers": "^5" - } - }, - "node_modules/@thirdweb-dev/contracts/node_modules/@chainlink/contracts": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.6.1.tgz", - "integrity": "sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ==", - "dev": true, - "dependencies": { - "@eth-optimism/contracts": "^0.5.21", - "@openzeppelin/contracts": "~4.3.3", - "@openzeppelin/contracts-upgradeable": "^4.7.3", - "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" - } - }, - "node_modules/@thirdweb-dev/contracts/node_modules/@chainlink/contracts/node_modules/@openzeppelin/contracts": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz", - "integrity": "sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==", - "dev": true - }, - "node_modules/@thirdweb-dev/contracts/node_modules/@openzeppelin/contracts": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", - "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==", - "dev": true - }, - "node_modules/@thirdweb-dev/contracts/node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz", - "integrity": "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==", - "dev": true - }, - "node_modules/@thirdweb-dev/crypto": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/crypto/-/crypto-0.2.0.tgz", - "integrity": "sha512-hQwSCL/imqSCcnUXlGqJi6dfs4UOcJ91Eq/t1cPXyAb6nwvyaePZPVFqGDglZMQvkS/NWZhifXZINRiCfazn2w==", - "dev": true, - "dependencies": { - "@noble/hashes": "^1.3.2", - "js-sha3": "^0.9.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@thirdweb-dev/crypto/node_modules/js-sha3": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.2.tgz", - "integrity": "sha512-8kgvwd03wNGQG1GRvl3yy1Yt40sICAcIMsDU2ZLgoL0Z6z9rkRmf9Vd+bi/gYSzgAqMUGl/jiDKu0J8AWFd+BQ==", - "dev": true - }, - "node_modules/@thirdweb-dev/dynamic-contracts": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/dynamic-contracts/-/dynamic-contracts-1.2.4.tgz", - "integrity": "sha512-cQtUznRXBDifzME3zmppVrfBM2Aw8C/okCLzsgcLU/Qr68TjLJTKTDGt2uGo/q5qAvRVJjQRD/bNvV1QTqjqSg==", - "dev": true - }, - "node_modules/@thirdweb-dev/generated-abis": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/generated-abis/-/generated-abis-0.0.1.tgz", - "integrity": "sha512-vO9/3lSLO8smyyH1QVeYravSTzFwV1nf1C/Im1NBDPdH8//YvcbhtETGGiNfHWpyCvSi0vRYwvf+/7FKdwpDGQ==", - "dev": true - }, - "node_modules/@thirdweb-dev/merkletree": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/merkletree/-/merkletree-0.2.0.tgz", - "integrity": "sha512-4KoH2EOCWKiaHfhDO5Tnf1HjeCXKVfLt31y0kcSG5C0gCldnhm7i1fGUB8e0hW3trfyPQAuSgyP67Ep3UwzClg==", - "dev": true, - "dependencies": { - "@thirdweb-dev/crypto": "0.2.0", - "buffer": "^6.0.3", - "buffer-reverse": "^1.0.1", - "treeify": "^1.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@thirdweb-dev/sdk": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/sdk/-/sdk-4.0.16.tgz", - "integrity": "sha512-WTG3sJTtEUpbY1SUd62GU//5npkgVQNJHOUqDjGl1jrTa8Ml0w1VQNe9p/0xbv+3cCTGYOhMvM4HkOZnrQp+gg==", - "dev": true, - "dependencies": { - "@thirdweb-dev/chains": "0.1.58", - "@thirdweb-dev/contracts-js": "1.3.16", - "@thirdweb-dev/crypto": "0.2.0", - "@thirdweb-dev/generated-abis": "0.0.1", - "@thirdweb-dev/merkletree": "0.2.0", - "@thirdweb-dev/storage": "2.0.5", - "abitype": "^0.2.5", - "bn.js": "^5.2.1", - "bs58": "^5.0.0", - "buffer": "^6.0.3", - "eventemitter3": "^5.0.1", - "fast-deep-equal": "^3.1.3", - "tiny-invariant": "^1.2.0", - "tweetnacl": "^1.0.3", - "uuid": "^9.0.1", - "yaml": "^2.3.1", - "zod": "^3.22.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@aws-sdk/client-secrets-manager": "^3.215.0", - "ethers": "^5", - "ethers-aws-kms-signer": "^1.3.2", - "zksync-web3": "^0.14.3" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-secrets-manager": { - "optional": true - }, - "ethers-aws-kms-signer": { - "optional": true - }, - "zksync-web3": { - "optional": true - } - } - }, - "node_modules/@thirdweb-dev/storage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@thirdweb-dev/storage/-/storage-2.0.5.tgz", - "integrity": "sha512-I3DK/ZNWOMa/XE2hfJnGKVfc9INn5c3if1qavyK/1fjJBxhUiUXjT59UYbuoWhHLEq0rS/QZVOGS/9qcOs/DAQ==", - "dev": true, - "dependencies": { - "@thirdweb-dev/crypto": "0.2.0", - "cid-tool": "^3.0.0", - "form-data": "^4.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@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, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abitype": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.2.5.tgz", - "integrity": "sha512-t1iiokWYpkrziu4WL2Gb6YdGvaP9ZKs7WnA39TI8TsW2E99GVRgDPW/xOKhzoCdyxOYt550CNYEFluCwGaFHaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "engines": { - "pnpm": ">=7" - }, - "peerDependencies": { - "typescript": ">=4.7.4", - "zod": ">=3.19.1" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/antlr4": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.1.tgz", - "integrity": "sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/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 - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", - "dev": true - }, - "node_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/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 - }, - "node_modules/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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "dev": true, - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", - "dev": true - }, - "node_modules/bufio": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.1.tgz", - "integrity": "sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/bundle-require": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-3.1.2.tgz", - "integrity": "sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA==", - "dev": true, - "dependencies": { - "load-tsconfig": "^0.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.13" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cid-tool": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cid-tool/-/cid-tool-3.0.0.tgz", - "integrity": "sha512-rgpV/LzuxUsGCJvUHe9+OuOAENVCiTn+mgGT8Nee1qDLS3xFGBUvZQdsY9MEpUi0YOFy6oz1pybHErcvE4SlGw==", - "dev": true, - "dependencies": { - "cids": "^1.0.0", - "explain-error": "^1.0.4", - "multibase": "^4.0.2", - "multihashes": "^4.0.2", - "split2": "^3.1.1", - "uint8arrays": "^2.1.3", - "yargs": "^16.2.0" - }, - "bin": { - "cid": "src/cli/bin.js" - } - }, - "node_modules/cids": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.9.tgz", - "integrity": "sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "multibase": "^4.0.1", - "multicodec": "^3.0.1", - "multihashes": "^4.0.1", - "uint8arrays": "^3.0.0" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" - } - }, - "node_modules/cids/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dev": true, - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/command-line-usage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/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, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/erc721a": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/erc721a/-/erc721a-3.3.0.tgz", - "integrity": "sha512-LqwmMcDPS3H9y7ZO+9B7R9sEoWApra17d4PwodXuP1072jP653jdo0TYkJbK4G5pBUFDdB5TCZwmJ6EQbmrysQ==", - "dev": true, - "dependencies": { - "@openzeppelin/contracts": "^4.4.2" - } - }, - "node_modules/erc721a-upgradeable": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/erc721a-upgradeable/-/erc721a-upgradeable-3.3.0.tgz", - "integrity": "sha512-ILE0SjKuvhx+PABG0A/41QUp0MFiYmzrgo71htQ0Ov6JfDOmgUzGxDW8gZuYfKrdlYjNwSAqMpUFWBbyW3sWBA==", - "dev": true, - "dependencies": { - "@openzeppelin/contracts-upgradeable": "^4.4.2" - } - }, - "node_modules/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, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "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", - "@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" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/explain-error": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/explain-error/-/explain-error-1.0.4.tgz", - "integrity": "sha512-/wSgNMxFusiYRy1rd19LT2SQlIXDppHpumpWo06wxjflD1OYxDLbl6rMVw+U3bxD5Nuhex4TKqv9Aem4D0lVzQ==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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 - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/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, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "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==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/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 - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/keccak256": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", - "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/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 - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "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/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/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 - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multibase": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", - "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "@multiformats/base-x": "^4.0.1" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multicodec": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.2.1.tgz", - "integrity": "sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "uint8arrays": "^3.0.0", - "varint": "^6.0.0" - } - }, - "node_modules/multicodec/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dev": true, - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "dev": true - }, - "node_modules/multihashes": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", - "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", - "dev": true, - "dependencies": { - "multibase": "^4.0.1", - "uint8arrays": "^3.0.0", - "varint": "^5.0.2" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multihashes/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dev": true, - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/multihashes/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node_modules/node-gyp-build": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.0.tgz", - "integrity": "sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/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, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/prettier-plugin-solidity": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.2.0.tgz", - "integrity": "sha512-fgxcUZpVAP+LlRfy5JI5oaAkXGkmsje2VJ5krv/YMm+rcTZbIUwFguSw5f+WFuttMjpDm6wB4UL7WVkArEfiVA==", - "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.16.2", - "semver": "^7.5.4", - "solidity-comments-extractor": "^0.0.7" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "prettier": ">=2.3.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "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/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, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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 - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/solhint": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.6.2.tgz", - "integrity": "sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==", - "dev": true, - "dependencies": { - "@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", - "semver": "^7.5.2", - "strip-ansi": "^6.0.1", - "table": "^6.8.1", - "text-table": "^0.2.0" - }, - "bin": { - "solhint": "solhint.js" - }, - "optionalDependencies": { - "prettier": "^2.8.3" - } - }, - "node_modules/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, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "peerDependencies": { - "prettier": "^1.15.0 || ^2.0.0", - "prettier-plugin-solidity": "^1.0.0-alpha.14" - } - }, - "node_modules/solhint/node_modules/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, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/solhint/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/solhint/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/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 - }, - "node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tsup": { - "version": "5.12.9", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-5.12.9.tgz", - "integrity": "sha512-dUpuouWZYe40lLufo64qEhDpIDsWhRbr2expv5dHEMjwqeKJS2aXA/FPqs1dxO4T6mBojo7rvo3jP9NNzaKyDg==", - "dev": true, - "dependencies": { - "bundle-require": "^3.0.2", - "cac": "^6.7.12", - "chokidar": "^3.5.1", - "debug": "^4.3.1", - "esbuild": "^0.14.25", - "execa": "^5.0.0", - "globby": "^11.0.3", - "joycon": "^3.0.1", - "postcss-load-config": "^3.0.1", - "resolve-from": "^5.0.0", - "rollup": "^2.74.1", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.20.3", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, - "peerDependencies": { - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": "^4.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/tsup/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/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typechain": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", - "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", - "dev": true, - "dependencies": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "bin": { - "typechain": "dist/cli/cli.js" - }, - "peerDependencies": { - "typescript": ">=4.3.0" - } - }, - "node_modules/typechain/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/typechain/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typechain/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/typechain/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/uint8arrays": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", - "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", - "dev": true, - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true - }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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/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, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol index 6502cae8f..2897e9129 100644 --- a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol +++ b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol @@ -9,6 +9,6 @@ interface ThirdwebAccount { } address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = 0x2e234DAe75C793f67A35089C9d99245E1C58470b; address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = 0xffD4505B3452Dc22f8473616d50503bA9E1710Ac; -bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101285760003560e01c806308e93d0a1461012d5780630b61e12b1461014b5780630e6254fd1461016057806311464fbe14610173578063248a9ca3146101b25780632f2ff15d146101d357806336568abe146101e657806358451f97146101f957806383a03f8c146102015780638878ed33146102145780639010d07c1461022757806391d148541461023a5780639387a3801461025d578063938e3d7b14610270578063a217fddf14610283578063a32fa5b31461028b578063a65d69d41461029e578063ac9650d8146102c5578063c3c5a547146102e5578063ca15c873146102f8578063d547741f1461030b578063d8fd8f441461031e578063e68a7c3b14610331578063e8a3d48514610344575b600080fd5b610135610359565b60405161014291906118d5565b60405180910390f35b61015e61015936600461193e565b61036a565b005b61013561016e366004611968565b61040b565b61019a7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b6040516001600160a01b039091168152602001610142565b6101c56101c0366004611983565b610435565b604051908152602001610142565b61015e6101e136600461199c565b610453565b61015e6101f436600461199c565b6104fd565b6101c561055c565b61015e61020f366004611983565b610568565b61019a6102223660046119c8565b6105b6565b61019a610235366004611a4a565b610630565b61024d61024836600461199c565b61073e565b6040519015158152602001610142565b61015e61026b36600461193e565b610772565b61015e61027e366004611a82565b610809565b6101c5600081565b61024d61029936600461199c565b61085a565b61019a7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102d86102d3366004611b32565b6108bd565b6040516101429190611bf6565b61024d6102f3366004611968565b6109a6565b6101c5610306366004611983565b6109b2565b61015e61031936600461199c565b610a4f565b61019a61032c3660046119c8565b610a5a565b61013561033f366004611a4a565b610ba5565b61034c610cd6565b6040516101429190611c5a565b60606103656000610d6e565b905090565b336103758183610d7b565b61039a5760405162461bcd60e51b815260040161039190611c6d565b60405180910390fd5b6001600160a01b03831660009081526002602052604081206103bc9083610dbf565b9050801561040557836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b6001600160a01b038116600090815260026020526040902060609061042f90610d6e565b92915050565b600061043f610dd4565b600092835260010160205250604090205490565b61047761045e610dd4565b6000848152600191909101602052604090205433610df8565b61047f610dd4565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104ef5760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610391565b6104f98282610e7d565b5050565b336001600160a01b038216146105525760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610391565b6104f98282610e91565b60006103656000610ea5565b336105738183610d7b565b61058f5760405162461bcd60e51b815260040161039190611c6d565b61059a600082610dbf565b6104f95760405162461bcd60e51b815260040161039190611ca4565b6000806105f98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610eaf92505050565b90506106257f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610ee2565b9150505b9392505050565b60008061063b610f42565b600085815260209190915260408120549150805b82811015610735576000610661610f42565b60008881526020918252604080822085835260010190925220546001600160a01b0316146106d9578482036106c757610698610f42565b600087815260209182526040808220938252600190930190915220546001600160a01b0316925061042f915050565b6106d2600183611d04565b9150610723565b6106e486600061073e565b801561071057506106f3610f42565b600087815260209182526040808220828052600201909252205481145b1561072357610720600183611d04565b91505b61072e600182611d04565b905061064f565b50505092915050565b6000610748610dd4565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b3361077d8183610d7b565b6107995760405162461bcd60e51b815260040161039190611c6d565b6001600160a01b03831660009081526002602052604081206107bb9083610f4c565b9050801561040557836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b610811610f61565b61084e5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610391565b61085781610f6d565b50565b6000610864610dd4565b600084815260209182526040808220828052909252205460ff166108b45761088a610dd4565b6000848152602091825260408082206001600160a01b0386168352909252205460ff16905061042f565b50600192915050565b6060816001600160401b038111156108d7576108d7611a6c565b60405190808252806020026020018201604052801561090a57816020015b60608152602001906001900390816108f55790505b50905060005b8281101561099f5761097a3085858481811061092e5761092e611d17565b90506020028101906109409190611d2d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061105492505050565b82828151811061098c5761098c611d17565b6020908102919091010152600101610910565b5092915050565b600061042f8183611079565b6000806109bd610f42565b6000848152602091909152604081205491505b81811015610a2a5760006109e2610f42565b60008681526020918252604080822085835260010190925220546001600160a01b031614610a1857610a15600184611d04565b92505b610a23600182611d04565b90506109d0565b50610a3683600061073e565b15610a4957610a46600183611d04565b91505b50919050565b61055261045e610dd4565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610ac28686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610eaf92505050565b90506000610ad08383610ee2565b90506001600160a01b0381163b15610aec579250610629915050565b610af6838361109b565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610b4f57610b33600082610dbf565b610b4f5760405162461bcd60e51b815260040161039190611ca4565b610b5b81888888611132565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b60608183108015610bbf5750610bbb6000610ea5565b8211155b610c175760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201526263657360e81b6064820152608401610391565b6000610c238484611d7a565b9050610c2f8484611d7a565b6001600160401b03811115610c4657610c46611a6c565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b50915060005b81811015610cce57610c92610c8a8683611d04565b60009061119a565b838281518110610ca457610ca4611d17565b6001600160a01b0390921660209283029190910190910152610cc7600182611d04565b9050610c75565b505092915050565b6060610ce06111a6565b8054610ceb90611d8d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1790611d8d565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050905090565b60606000610629836111ca565b600080610da87f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac84610ee2565b6001600160a01b0385811691161491505092915050565b6000610629836001600160a01b038416611226565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b610e00610dd4565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104f957610e3b816001600160a01b03166014611275565b610e46836020611275565b604051602001610e57929190611dc1565b60408051601f198184030181529082905262461bcd60e51b825261039191600401611c5a565b610e878282611410565b6104f98282611479565b610e9b8282611538565b6104f982826115a1565b600061042f825490565b60008282604051602001610ec4929190611e2e565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610629565b6000610365611630565b6000610629836001600160a01b038416611692565b6000610365813361073e565b6000610f776111a6565b8054610f8290611d8d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fae90611d8d565b8015610ffb5780601f10610fd057610100808354040283529160200191610ffb565b820191906000526020600020905b815481529060010190602001808311610fde57829003601f168201915b505050505090508161100b6111a6565b906110169082611eab565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051611048929190611f6a565b60405180910390a15050565b6060610629838360405180606001604052806027815260200161203060279139611785565b6001600160a01b03811660009081526001830160205260408120541515610629565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661042f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610391565b60405163347d5e2560e21b81526001600160a01b0385169063d1f578949061116290869086908690600401611f8f565b600060405180830381600087803b15801561117c57600080fd5b505af1158015611190573d6000803e3d6000fd5b5050505050505050565b60006106298383611863565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60608160000180548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b815481526020019060010190808311611206575b50505050509050919050565b600081815260018301602052604081205461126d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561042f565b50600061042f565b60606000611284836002611fcf565b61128f906002611d04565b6001600160401b038111156112a6576112a6611a6c565b6040519080825280601f01601f1916602001820160405280156112d0576020820181803683370190505b509050600360fc1b816000815181106112eb576112eb611d17565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061131a5761131a611d17565b60200101906001600160f81b031916908160001a905350600061133e846002611fcf565b611349906001611d04565b90505b60018111156113c1576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061137d5761137d611d17565b1a60f81b82828151811061139357611393611d17565b60200101906001600160f81b031916908160001a90535060049490941c936113ba81611fe6565b905061134c565b5083156106295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610391565b600161141a610dd4565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000611483610f42565b600084815260209190915260409020549050600161149f610f42565b60008581526020919091526040812080549091906114be908490611d04565b909155508290506114cd610f42565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b03929092169190911790558061150d610f42565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6115428282610df8565b61154a610dd4565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006115ab610f42565b6000848152602091825260408082206001600160a01b0386168352600201909252205490506115d8610f42565b6000848152602091825260408082208483526001019092522080546001600160a01b0319169055611607610f42565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b60008060ff1961166160017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611d7a565b60405160200161167391815260200190565b60408051601f1981840301815291905280516020909101201692915050565b6000818152600183016020526040812054801561177b5760006116b6600183611d7a565b85549091506000906116ca90600190611d7a565b905081811461172f5760008660000182815481106116ea576116ea611d17565b906000526020600020015490508087600001848154811061170d5761170d611d17565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061174057611740611ffd565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061042f565b600091505061042f565b60606117908461188d565b80156117a257506117a03361188d565b155b6117ee5760405162461bcd60e51b815260206004820152601e60248201527f416464726573733a20696e76616c69642064656c65676174652063616c6c00006044820152606401610391565b600080856001600160a01b0316856040516118099190612013565b600060405180830381855af49150503d8060008114611844576040519150601f19603f3d011682016040523d82523d6000602084013e611849565b606091505b509150915061185982828661189c565b9695505050505050565b600082600001828154811061187a5761187a611d17565b9060005260206000200154905092915050565b6001600160a01b03163b151590565b606083156118ab575081610629565b8251156118bb5782518084602001fd5b8160405162461bcd60e51b81526004016103919190611c5a565b6020808252825182820181905260009190848201906040850190845b818110156119165783516001600160a01b0316835292840192918401916001016118f1565b50909695505050505050565b80356001600160a01b038116811461193957600080fd5b919050565b6000806040838503121561195157600080fd5b61195a83611922565b946020939093013593505050565b60006020828403121561197a57600080fd5b61062982611922565b60006020828403121561199557600080fd5b5035919050565b600080604083850312156119af57600080fd5b823591506119bf60208401611922565b90509250929050565b6000806000604084860312156119dd57600080fd5b6119e684611922565b925060208401356001600160401b0380821115611a0257600080fd5b818601915086601f830112611a1657600080fd5b813581811115611a2557600080fd5b876020828501011115611a3757600080fd5b6020830194508093505050509250925092565b60008060408385031215611a5d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611a9457600080fd5b81356001600160401b0380821115611aab57600080fd5b818401915084601f830112611abf57600080fd5b813581811115611ad157611ad1611a6c565b604051601f8201601f19908116603f01168101908382118183101715611af957611af9611a6c565b81604052828152876020848701011115611b1257600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060208385031215611b4557600080fd5b82356001600160401b0380821115611b5c57600080fd5b818501915085601f830112611b7057600080fd5b813581811115611b7f57600080fd5b8660208260051b8501011115611b9457600080fd5b60209290920196919550909350505050565b60005b83811015611bc1578181015183820152602001611ba9565b50506000910152565b60008151808452611be2816020860160208601611ba6565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611c4d57603f19888603018452611c3b858351611bca565b94509285019290850190600101611c1f565b5092979650505050505050565b6020815260006106296020830184611bca565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042f5761042f611cee565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611d4457600080fd5b8301803591506001600160401b03821115611d5e57600080fd5b602001915036819003821315611d7357600080fd5b9250929050565b8181038181111561042f5761042f611cee565b600181811c90821680611da157607f821691505b602082108103610a4957634e487b7160e01b600052602260045260246000fd5b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611df1816015850160208801611ba6565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611e22816026840160208801611ba6565b01602601949350505050565b6001600160a01b0383168152604060208201819052600090611e5290830184611bca565b949350505050565b601f821115611ea6576000816000526020600020601f850160051c81016020861015611e835750805b601f850160051c820191505b81811015611ea257828155600101611e8f565b5050505b505050565b81516001600160401b03811115611ec457611ec4611a6c565b611ed881611ed28454611d8d565b84611e5a565b602080601f831160018114611f0d5760008415611ef55750858301515b600019600386901b1c1916600185901b178555611ea2565b600085815260208120601f198616915b82811015611f3c57888601518255948401946001909101908401611f1d565b5085821015611f5a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000611f7d6040830185611bca565b82810360208401526106258185611bca565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b808202811582820484141761042f5761042f611cee565b600081611ff557611ff5611cee565b506000190190565b634e487b7160e01b600052603160045260246000fd5b60008251612025818460208701611ba6565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f3f85d264596b5ea921ce5fd2e297c9ed38322d32f7f884eb4ef1c787629afd064736f6c63430008170033"; -bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"60806040526004361061014b5760003560e01c806301ffc9a7146101575780630a1028c41461018c578063150b7a02146101ba5780631626ba7e146101fe5780631dd756c51461021e57806324d7806c1461023e5780633a871cdd1461025e57806347e1da2a1461027e5780634a58db19146102a05780634d44560d146102a85780635892e236146102c85780637dff5a79146102e85780638b52d72314610308578063938e3d7b1461032a578063a9082d841461034a578063ac9650d814610389578063b0d691fe146103b6578063b61d27f6146103d8578063b76464d5146103f8578063bc197c8114610418578063c45a015514610444578063d087d28814610478578063d1f578941461048d578063d42f2f35146104ad578063e8a3d485146104c2578063e9523c97146104e4578063f15d424e14610506578063f23a6e611461053357600080fd5b3661015257005b600080fd5b34801561016357600080fd5b50610177610172366004612d1a565b61055f565b60405190151581526020015b60405180910390f35b34801561019857600080fd5b506101ac6101a7366004612e01565b6105a5565b604051908152602001610183565b3480156101c657600080fd5b506101e56101d5366004612e5a565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610183565b34801561020a57600080fd5b506101e5610219366004612ec5565b610649565b34801561022a57600080fd5b50610177610239366004612f24565b610789565b34801561024a57600080fd5b50610177610259366004612f69565b610a4d565b34801561026a57600080fd5b506101ac610279366004612f86565b610a7c565b34801561028a57600080fd5b5061029e610299366004613017565b610aa2565b005b61029e610c09565b3480156102b457600080fd5b5061029e6102c33660046130b0565b610c71565b3480156102d457600080fd5b5061029e6102e336600461311d565b610ce4565b3480156102f457600080fd5b50610177610303366004612f69565b6110a1565b34801561031457600080fd5b5061031d61115a565b6040516101839190613230565b34801561033657600080fd5b5061029e610345366004613294565b6113a1565b34801561035657600080fd5b5061036a61036536600461311d565b6113f2565b6040805192151583526001600160a01b03909116602083015201610183565b34801561039557600080fd5b506103a96103a43660046132dc565b611449565b604051610183919061336d565b3480156103c257600080fd5b506103cb611532565b60405161018391906133c4565b3480156103e457600080fd5b5061029e6103f33660046133d8565b61157b565b34801561040457600080fd5b5061029e610413366004612f69565b61160b565b34801561042457600080fd5b506101e56104333660046134c5565b63bc197c8160e01b95945050505050565b34801561045057600080fd5b506103cb7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561048457600080fd5b506101ac61163d565b34801561049957600080fd5b5061029e6104a8366004613572565b6116bd565b3480156104b957600080fd5b5061031d611875565b3480156104ce57600080fd5b506104d76119e6565b60405161018391906135b9565b3480156104f057600080fd5b506104f9611a7e565b60405161018391906135cc565b34801561051257600080fd5b50610526610521366004612f69565b611a90565b6040516101839190613619565b34801561053f57600080fd5b506101e561054e36600461362c565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061059057506001600160e01b03198216630a85bd0160e11b145b8061059f575061059f82611b68565b92915050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016105eb929190918252602082015260400190565b60405160208183030381529060405280519060200120905061060b611b9d565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b6000806106768460405160200161066291815260200190565b6040516020818303038152906040526105a5565b905060006106848285611cc4565b905061068f81610a4d565b156106a65750630b135d3f60e11b915061059f9050565b3360006106b1611ce8565b6001600160a01b03841660009081526006919091016020526040902090506106d98183611d0c565b8061070957506106e881611d2e565b6001148015610709575060006106fe8282611d38565b6001600160a01b0316145b6107665760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b61076f836110a1565b1561077f57630b135d3f60e11b94505b5050505092915050565b6000610793611ce8565b6001600160a01b0384166000908152600491909101602052604090205460ff16156107c05750600161059f565b60006107ca611ce8565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b9004909216908201529150610825611ce8565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b03161180610875575081604001516001600160801b03164210155b80610886575061088481611d2e565b155b156108965760009250505061059f565b60006108ad6108a86060870187613694565b611d44565b905060006108ba83611d2e565b60011480156108db575060006108d08482611d38565b6001600160a01b0316145b90506324f16c0560e11b6001600160e01b03198316016109525760008061090d61090860608a018a613694565b611d7e565b9150915082610933576109208583611d0c565b610933576000965050505050505061059f565b855181111561094b576000965050505050505061059f565b5050610a40565b635c0f12eb60e11b6001600160e01b0319831601610a335760008061098261097d60608a018a613694565b611de3565b5091509150826109e25760005b82518110156109e0576109c48382815181106109ad576109ad6136da565b602002602001015187611d0c90919063ffffffff16565b6109d857600097505050505050505061059f565b60010161098f565b505b60005b8251811015610a2b57818181518110610a0057610a006136da565b602002602001015187600001511015610a2357600097505050505050505061059f565b6001016109e5565b505050610a40565b600094505050505061059f565b5060019695505050505050565b6000610a57611ce8565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b6000610a86611e30565b610a908484611e99565b9050610a9b82611fde565b9392505050565b610aaa611532565b6001600160a01b0316336001600160a01b03161480610acd5750610acd33610a4d565b610ae95760405162461bcd60e51b815260040161075d906136f0565b610af161202b565b8481148015610aff57508483145b610b4b5760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000604482015260640161075d565b60005b85811015610c0057610bf7878783818110610b6b57610b6b6136da565b9050602002016020810190610b809190612f69565b868684818110610b9257610b926136da565b90506020020135858585818110610bab57610bab6136da565b9050602002810190610bbd9190613694565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061211192505050565b50600101610b4e565b50505050505050565b610c11611532565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610c3d91906133c4565b6000604051808303818588803b158015610c5657600080fd5b505af1158015610c6a573d6000803e3d6000fd5b5050505050565b610c79612182565b610c81611532565b6001600160a01b031663205c287883836040518363ffffffff1660e01b8152600401610cae929190613731565b600060405180830381600087803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050505050565b6000610cf36020850185612f69565b905042610d0660e0860160c08701613761565b6001600160801b031611158015610d355750610d29610100850160e08601613761565b6001600160801b031642105b610d6b5760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b604482015260640161075d565b600080610d798686866113f2565b9150915081610db35760405162461bcd60e51b815260040161075d906020808252600490820152632173696760e01b604082015260600190565b6001610dbd611ce8565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610df99190890190890161378d565b60ff161115610e26576000610e14604088016020890161378d565b60ff166001149050610c0084826121c0565b610e2f83610a4d565b15610e645760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b604482015260640161075d565b610e7983610e70611ce8565b60020190612295565b50604051806060016040528087606001358152602001876080016020810190610ea29190613761565b6001600160801b03168152602001610ec060c0890160a08a01613761565b6001600160801b03169052610ed3611ce8565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610f49610f28611ce8565b6001600160a01b0386166000908152600691909101602052604090206122aa565b805190915060005b81811015610fb357610fa0838281518110610f6e57610f6e6136da565b6020026020010151610f7e611ce8565b6001600160a01b038916600090815260069190910160205260409020906122b7565b50610fac6001826137be565b9050610f51565b50610fc160408901896137d1565b9050905060005b818110156110425761102f610fe060408b018b6137d1565b83818110610ff057610ff06136da565b90506020020160208101906110059190612f69565b61100d611ce8565b6001600160a01b03891660009081526006919091016020526040902090612295565b5061103b6001826137be565b9050610fc8565b5061104c886122cc565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a60405161108f91906138ab565b60405180910390a35050505050505050565b6000806110ac611ce8565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b9091041692810192909252909150421080159061111d575080604001516001600160801b031642105b8015610a9b57506000611152611131611ce8565b6001600160a01b038616600090815260069190910160205260409020611d2e565b119392505050565b60606000611171611169611ce8565b6002016122aa565b80519091506000805b82811015611202576111a4848281518110611197576111976136da565b60200260200101516110a1565b156111bb57816111b381613996565b9250506111f0565b60008482815181106111cf576111cf6136da565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6111fb6001826137be565b905061117a565b50806001600160401b0381111561121b5761121b612d44565b60405190808252806020026020018201604052801561125457816020015b611241612cd0565b8152602001906001900390816112395790505b5093506000805b838110156113995760006001600160a01b0316858281518110611280576112806136da565b60200260200101516001600160a01b0316146113875760008582815181106112aa576112aa6136da565b6020026020010151905060006112be611ce8565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611328610f28611ce8565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b031681525088858061136790613996565b965081518110611379576113796136da565b602002602001018190525050505b6113926001826137be565b905061125b565b505050505090565b6113a9612361565b6113e65760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161075d565b6113ef81612379565b50565b60008061140861140186612460565b85856125a4565b9050611412611ce8565b6101008601356000908152600791909101602052604090205460ff1615801561143f575061143f81610a4d565b9150935093915050565b6060816001600160401b0381111561146357611463612d44565b60405190808252806020026020018201604052801561149657816020015b60608152602001906001900390816114815790505b50905060005b8281101561152b57611506308585848181106114ba576114ba6136da565b90506020028101906114cc9190613694565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506125fe92505050565b828281518110611518576115186136da565b602090810291909101015260010161149c565b5092915050565b60008061153d612623565b546001600160a01b03169050801561155457919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b611583611532565b6001600160a01b0316336001600160a01b031614806115a657506115a633610a4d565b6115c25760405162461bcd60e51b815260040161075d906136f0565b6115ca61202b565b610c6a848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061211192505050565b611613612182565b8061161c612623565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000611647611532565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015611694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b891906139af565b905090565b60006116c7612647565b5460ff16905060006116d7612647565b54610100900460ff16905080158080156116f4575060018360ff16105b8061171357506117033061266b565b15801561171357508260ff166001145b6117765760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161075d565b6001611780612647565b805460ff191660ff9290921691909117905580156117b95760016117a2612647565b80549115156101000261ff00199092169190911790555b6117f98686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267a92505050565b611801612623565b600101819055506118138660016121c0565b8015610cdc576000611823612647565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b60606000611884611169611ce8565b8051909150806001600160401b038111156118a1576118a1612d44565b6040519080825280602002602001820160405280156118da57816020015b6118c7612cd0565b8152602001906001900390816118bf5790505b50925060005b818110156119e05760008382815181106118fc576118fc6136da565b602002602001015190506000611910611ce8565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161197a610f28611ce8565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106119bf576119bf6136da565b602002602001018190525050506001816119d991906137be565b90506118e0565b50505090565b60606119f06126ad565b80546119fb906139c8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a27906139c8565b8015611a745780601f10611a4957610100808354040283529160200191611a74565b820191906000526020600020905b815481529060010190602001808311611a5757829003601f168201915b5050505050905090565b60606116b8611a8b611ce8565b6122aa565b611a98612cd0565b6000611aa2611ce8565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611b2d611b0c611ce8565b6001600160a01b0387166000908152600691909101602052604090206122aa565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b60006001600160e01b03198216630271189760e51b148061059f57506301ffc9a760e01b6001600160e01b031983161461059f565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015611bf657507f0000000000000000000000000000000000000000000000000000000000007a6946145b15611c2057507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000806000611cd385856126d1565b91509150611ce081612716565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b03811660009081526001830160205260408120541515610a9b565b600061059f825490565b6000610a9b838361285b565b60006004821015611d675760405162461bcd60e51b815260040161075d906139fc565b611d75600460008486613a1b565b610a9b91613a45565b6000806044831015611da25760405162461bcd60e51b815260040161075d906139fc565b611db0602460048587613a1b565b810190611dbd9190612f69565b9150611dcd604460248587613a1b565b810190611dda9190613a75565b90509250929050565b606080806064841015611e085760405162461bcd60e51b815260040161075d906139fc565b611e158460048188613a1b565b810190611e229190613b0d565b919790965090945092505050565b611e38611532565b6001600160a01b0316336001600160a01b031614611e975760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b604482015260640161075d565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611f17611eda610140870187613694565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611cc49050565b9050611f238186610789565b611f325760019250505061059f565b6000611f3c611ce8565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b80156113ef57604051600090339060001990849084818181858888f193505050503d8060008114610c6a576040519150601f19603f3d011682016040523d82523d6000602084013e610c6a565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a547906120799030906004016133c4565b602060405180830381865afa158015612096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ba9190613bf2565b6113ef57806001600160a01b03166383a03f8c6120d5612623565b600101546040518263ffffffff1660e01b81526004016120f791815260200190565b600060405180830381600087803b158015610c5657600080fd5b60606000846001600160a01b0316848460405161212e9190613c14565b60006040518083038185875af1925050503d806000811461216b576040519150601f19603f3d011682016040523d82523d6000602084013e612170565b606091505b509250905080611ce057815160208301fd5b61218b33610a4d565b611e975760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015260640161075d565b6121ca8282612885565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b15612291578015612259577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630b61e12b83612238612623565b600101546040518363ffffffff1660e01b8152600401610cae929190613731565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639387a38083612238612623565b5050565b6000610a9b836001600160a01b038416612934565b60606000610a9b83612983565b6000610a9b836001600160a01b0384166129df565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156113ef576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16630b61e12b6123386020840184612f69565b612340612623565b600101546040518363ffffffff1660e01b81526004016120f7929190613731565b600061236c33610a4d565b806116b857505030331490565b60006123836126ad565b805461238e906139c8565b80601f01602080910402602001604051908101604052809291908181526020018280546123ba906139c8565b80156124075780601f106123dc57610100808354040283529160200191612407565b820191906000526020600020905b8154815290600101906020018083116123ea57829003601f168201915b50505050509050816124176126ad565b906124229082613c7d565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612454929190613d3c565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96124906020840184612f69565b6124a0604085016020860161378d565b6124ad60408601866137d1565b6040516020016124be929190613d6a565b60408051601f19818403018152919052805160209091012060608601356124eb60a0880160808901613761565b6124fb60c0890160a08a01613761565b61250b60e08a0160c08b01613761565b61251c6101008b0160e08c01613761565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b60006125f683838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050875160208901206125f092509050612ad2565b90611cc4565b949350505050565b6060610a9b8383604051806060016040528060278152602001613e1060279139612aff565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b6001600160a01b03163b151590565b6000828260405160200161268f929190613dac565b60405160208183030381529060405280519060200120905092915050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60008082516041036127075760208301516040840151606085015160001a6126fb87828585612bdd565b9450945050505061270f565b506000905060025b9250929050565b600081600481111561272a5761272a613dd0565b036127325750565b600181600481111561274657612746613dd0565b0361278e5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161075d565b60028160048111156127a2576127a2613dd0565b036127ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161075d565b600381600481111561280357612803613dd0565b036113ef5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161075d565b6000826000018281548110612872576128726136da565b9060005260206000200154905092915050565b8061288e611ce8565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156128d7576128d1826128cb611ce8565b90612295565b506128eb565b6128e9826128e3611ce8565b906122b7565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051612928911515815260200190565b60405180910390a25050565b600081815260018301602052604081205461297b5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561059f565b50600061059f565b6060816000018054806020026020016040519081016040528092919081815260200182805480156129d357602002820191906000526020600020905b8154815260200190600101908083116129bf575b50505050509050919050565b60008181526001830160205260408120548015612ac8576000612a03600183613de6565b8554909150600090612a1790600190613de6565b9050818114612a7c576000866000018281548110612a3757612a376136da565b9060005260206000200154905080876000018481548110612a5a57612a5a6136da565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612a8d57612a8d613df9565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061059f565b600091505061059f565b600061059f612adf611b9d565b8360405161190160f01b8152600281019290925260228201526042902090565b6060612b0a8461266b565b8015612b1c5750612b1a3361266b565b155b612b685760405162461bcd60e51b815260206004820152601e60248201527f416464726573733a20696e76616c69642064656c65676174652063616c6c0000604482015260640161075d565b600080856001600160a01b031685604051612b839190613c14565b600060405180830381855af49150503d8060008114612bbe576040519150601f19603f3d011682016040523d82523d6000602084013e612bc3565b606091505b5091509150612bd3828286612c97565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612c0a5750600090506003612c8e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c5e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c8757600060019250925050612c8e565b9150600090505b94509492505050565b60608315612ca6575081610a9b565b825115612cb65782518084602001fd5b8160405162461bcd60e51b815260040161075d91906135b9565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b600060208284031215612d2c57600080fd5b81356001600160e01b031981168114610a9b57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d8257612d82612d44565b604052919050565b60006001600160401b03831115612da357612da3612d44565b612db6601f8401601f1916602001612d5a565b9050828152838383011115612dca57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612df257600080fd5b610a9b83833560208501612d8a565b600060208284031215612e1357600080fd5b81356001600160401b03811115612e2957600080fd5b6125f684828501612de1565b6001600160a01b03811681146113ef57600080fd5b8035612e5581612e35565b919050565b60008060008060808587031215612e7057600080fd5b8435612e7b81612e35565b93506020850135612e8b81612e35565b92506040850135915060608501356001600160401b03811115612ead57600080fd5b612eb987828801612de1565b91505092959194509250565b60008060408385031215612ed857600080fd5b8235915060208301356001600160401b03811115612ef557600080fd5b612f0185828601612de1565b9150509250929050565b60006101608284031215612f1e57600080fd5b50919050565b60008060408385031215612f3757600080fd5b8235612f4281612e35565b915060208301356001600160401b03811115612f5d57600080fd5b612f0185828601612f0b565b600060208284031215612f7b57600080fd5b8135610a9b81612e35565b600080600060608486031215612f9b57600080fd5b83356001600160401b03811115612fb157600080fd5b612fbd86828701612f0b565b9660208601359650604090950135949350505050565b60008083601f840112612fe557600080fd5b5081356001600160401b03811115612ffc57600080fd5b6020830191508360208260051b850101111561270f57600080fd5b6000806000806000806060878903121561303057600080fd5b86356001600160401b038082111561304757600080fd5b6130538a838b01612fd3565b9098509650602089013591508082111561306c57600080fd5b6130788a838b01612fd3565b9096509450604089013591508082111561309157600080fd5b5061309e89828a01612fd3565b979a9699509497509295939492505050565b600080604083850312156130c357600080fd5b82356130ce81612e35565b946020939093013593505050565b60008083601f8401126130ee57600080fd5b5081356001600160401b0381111561310557600080fd5b60208301915083602082850101111561270f57600080fd5b60008060006040848603121561313257600080fd5b83356001600160401b038082111561314957600080fd5b90850190610120828803121561315e57600080fd5b9093506020850135908082111561317457600080fd5b50613181868287016130dc565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b808310156131f2578551851682529483019460019290920191908301906131d0565b506040870151604089015260608701519450613211606089018661318e565b60808701519450613225608089018661318e565b979650505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561328757603f1988860301845261327585835161319b565b94509285019290850190600101613259565b5092979650505050505050565b6000602082840312156132a657600080fd5b81356001600160401b038111156132bc57600080fd5b8201601f810184136132cd57600080fd5b6125f684823560208401612d8a565b600080602083850312156132ef57600080fd5b82356001600160401b0381111561330557600080fd5b61331185828601612fd3565b90969095509350505050565b60005b83811015613338578181015183820152602001613320565b50506000910152565b6000815180845261335981602086016020860161331d565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561328757603f198886030184526133b2858351613341565b94509285019290850190600101613396565b6001600160a01b0391909116815260200190565b600080600080606085870312156133ee57600080fd5b84356133f981612e35565b93506020850135925060408501356001600160401b0381111561341b57600080fd5b613427878288016130dc565b95989497509550505050565b60006001600160401b0382111561344c5761344c612d44565b5060051b60200190565b600082601f83011261346757600080fd5b8135602061347c61347783613433565b612d5a565b8083825260208201915060208460051b87010193508684111561349e57600080fd5b602086015b848110156134ba57803583529183019183016134a3565b509695505050505050565b600080600080600060a086880312156134dd57600080fd5b85356134e881612e35565b945060208601356134f881612e35565b935060408601356001600160401b038082111561351457600080fd5b61352089838a01613456565b9450606088013591508082111561353657600080fd5b61354289838a01613456565b9350608088013591508082111561355857600080fd5b5061356588828901612de1565b9150509295509295909350565b60008060006040848603121561358757600080fd5b833561359281612e35565b925060208401356001600160401b038111156135ad57600080fd5b613181868287016130dc565b602081526000610a9b6020830184613341565b6020808252825182820181905260009190848201906040850190845b8181101561360d5783516001600160a01b0316835292840192918401916001016135e8565b50909695505050505050565b602081526000610a9b602083018461319b565b600080600080600060a0868803121561364457600080fd5b853561364f81612e35565b9450602086013561365f81612e35565b9350604086013592506060860135915060808601356001600160401b0381111561368857600080fd5b61356588828901612de1565b6000808335601e198436030181126136ab57600080fd5b8301803591506001600160401b038211156136c557600080fd5b60200191503681900382131561270f57600080fd5b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80356001600160801b0381168114612e5557600080fd5b60006020828403121561377357600080fd5b610a9b8261374a565b803560ff81168114612e5557600080fd5b60006020828403121561379f57600080fd5b610a9b8261377c565b634e487b7160e01b600052601160045260246000fd5b8082018082111561059f5761059f6137a8565b6000808335601e198436030181126137e857600080fd5b8301803591506001600160401b0382111561380257600080fd5b6020019150600581901b360382131561270f57600080fd5b6000808335601e1984360301811261383157600080fd5b83016020810192503590506001600160401b0381111561385057600080fd5b8060051b360382131561270f57600080fd5b8183526000602080850194508260005b858110156138a057813561388581612e35565b6001600160a01b031687529582019590820190600101613872565b509495945050505050565b602081526138cc602082016138bf84612e4a565b6001600160a01b03169052565b60006138da6020840161377c565b60ff81166040840152506138f1604084018461381a565b61012080606086015261390961014086018385613862565b9250606086013560808601526139216080870161374a565b915061393060a086018361318e565b61393c60a0870161374a565b915061394b60c086018361318e565b61395760c0870161374a565b915061396660e086018361318e565b61397260e0870161374a565b91506101006139838187018461318e565b9590950135939094019290925250919050565b6000600182016139a8576139a86137a8565b5060010190565b6000602082840312156139c157600080fd5b5051919050565b600181811c908216806139dc57607f821691505b602082108103612f1e57634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b60008085851115613a2b57600080fd5b83861115613a3857600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613a6d5780818660040360031b1b83161692505b505092915050565b600060208284031215613a8757600080fd5b5035919050565b600082601f830112613a9f57600080fd5b81356020613aaf61347783613433565b82815260059290921b84018101918181019086841115613ace57600080fd5b8286015b848110156134ba5780356001600160401b03811115613af15760008081fd5b613aff8986838b0101612de1565b845250918301918301613ad2565b600080600060608486031215613b2257600080fd5b83356001600160401b0380821115613b3957600080fd5b818601915086601f830112613b4d57600080fd5b81356020613b5d61347783613433565b82815260059290921b8401810191818101908a841115613b7c57600080fd5b948201945b83861015613ba3578535613b9481612e35565b82529482019490820190613b81565b97505087013592505080821115613bb957600080fd5b613bc587838801613456565b93506040860135915080821115613bdb57600080fd5b50613be886828701613a8e565b9150509250925092565b600060208284031215613c0457600080fd5b81518015158114610a9b57600080fd5b60008251613c2681846020870161331d565b9190910192915050565b601f821115613c78576000816000526020600020601f850160051c81016020861015613c595750805b601f850160051c820191505b81811015610cdc57828155600101613c65565b505050565b81516001600160401b03811115613c9657613c96612d44565b613caa81613ca484546139c8565b84613c30565b602080601f831160018114613cdf5760008415613cc75750858301515b600019600386901b1c1916600185901b178555610cdc565b600085815260208120601f198616915b82811015613d0e57888601518255948401946001909101908401613cef565b5085821015613d2c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613d4f6040830185613341565b8281036020840152613d618185613341565b95945050505050565b60008184825b85811015613da1578135613d8381612e35565b6001600160a01b031683526020928301929190910190600101613d70565b509095945050505050565b6001600160a01b03831681526040602082018190526000906125f690830184613341565b634e487b7160e01b600052602160045260246000fd5b8181038181111561059f5761059f6137a8565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d2173bb723866f0f6899074ddc9d72c37aa0ec712faafb4bb7aed6492cb13c8764736f6c63430008170033"; +bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101285760003560e01c806308e93d0a1461012d5780630b61e12b1461014b5780630e6254fd1461016057806311464fbe14610173578063248a9ca3146101b25780632f2ff15d146101d357806336568abe146101e657806358451f97146101f957806383a03f8c146102015780638878ed33146102145780639010d07c1461022757806391d148541461023a5780639387a3801461025d578063938e3d7b14610270578063a217fddf14610283578063a32fa5b31461028b578063a65d69d41461029e578063ac9650d8146102c5578063c3c5a547146102e5578063ca15c873146102f8578063d547741f1461030b578063d8fd8f441461031e578063e68a7c3b14610331578063e8a3d48514610344575b600080fd5b610135610359565b6040516101429190611945565b60405180910390f35b61015e6101593660046119ae565b61036a565b005b61013561016e3660046119d8565b61040b565b61019a7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b6040516001600160a01b039091168152602001610142565b6101c56101c03660046119f3565b610435565b604051908152602001610142565b61015e6101e1366004611a0c565b610453565b61015e6101f4366004611a0c565b6104fd565b6101c561055c565b61015e61020f3660046119f3565b610568565b61019a610222366004611a38565b6105b6565b61019a610235366004611aba565b610630565b61024d610248366004611a0c565b61073e565b6040519015158152602001610142565b61015e61026b3660046119ae565b610772565b61015e61027e366004611af2565b610809565b6101c5600081565b61024d610299366004611a0c565b61085a565b61019a7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102d86102d3366004611ba2565b6108bd565b6040516101429190611c66565b61024d6102f33660046119d8565b610a19565b6101c56103063660046119f3565b610a25565b61015e610319366004611a0c565b610ac2565b61019a61032c366004611a38565b610acd565b61013561033f366004611aba565b610c18565b61034c610d49565b6040516101429190611cca565b60606103656000610de1565b905090565b336103758183610dee565b61039a5760405162461bcd60e51b815260040161039190611cdd565b60405180910390fd5b6001600160a01b03831660009081526002602052604081206103bc9083610e32565b9050801561040557836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b6001600160a01b038116600090815260026020526040902060609061042f90610de1565b92915050565b600061043f610e47565b600092835260010160205250604090205490565b61047761045e610e47565b6000848152600191909101602052604090205433610e6b565b61047f610e47565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104ef5760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610391565b6104f98282610ef0565b5050565b336001600160a01b038216146105525760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610391565b6104f98282610f04565b60006103656000610f18565b336105738183610dee565b61058f5760405162461bcd60e51b815260040161039190611cdd565b61059a600082610e32565b6104f95760405162461bcd60e51b815260040161039190611d14565b6000806105f98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f2292505050565b90506106257f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610f55565b9150505b9392505050565b60008061063b610fb5565b600085815260209190915260408120549150805b82811015610735576000610661610fb5565b60008881526020918252604080822085835260010190925220546001600160a01b0316146106d9578482036106c757610698610fb5565b600087815260209182526040808220938252600190930190915220546001600160a01b0316925061042f915050565b6106d2600183611d74565b9150610723565b6106e486600061073e565b801561071057506106f3610fb5565b600087815260209182526040808220828052600201909252205481145b1561072357610720600183611d74565b91505b61072e600182611d74565b905061064f565b50505092915050565b6000610748610e47565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b3361077d8183610dee565b6107995760405162461bcd60e51b815260040161039190611cdd565b6001600160a01b03831660009081526002602052604081206107bb9083610fbf565b9050801561040557836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b610811610fd4565b61084e5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610391565b61085781610fe0565b50565b6000610864610e47565b600084815260209182526040808220828052909252205460ff166108b45761088a610e47565b6000848152602091825260408082206001600160a01b0386168352909252205460ff16905061042f565b50600192915050565b6060816001600160401b038111156108d7576108d7611adc565b60405190808252806020026020018201604052801561090a57816020015b60608152602001906001900390816108f55790505b509050336000805b848110156107355781156109915761096f3087878481811061093657610936611d87565b90506020028101906109489190611d9d565b8660405160200161095b93929190611dea565b6040516020818303038152906040526110c7565b84828151811061098157610981611d87565b6020026020010181905250610a11565b6109f3308787848181106109a7576109a7611d87565b90506020028101906109b99190611d9d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110c792505050565b848281518110610a0557610a05611d87565b60200260200101819052505b600101610912565b600061042f81836110ec565b600080610a30610fb5565b6000848152602091909152604081205491505b81811015610a9d576000610a55610fb5565b60008681526020918252604080822085835260010190925220546001600160a01b031614610a8b57610a88600184611d74565b92505b610a96600182611d74565b9050610a43565b50610aa983600061073e565b15610abc57610ab9600183611d74565b91505b50919050565b61055261045e610e47565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610b358686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f2292505050565b90506000610b438383610f55565b90506001600160a01b0381163b15610b5f579250610629915050565b610b69838361110e565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610bc257610ba6600082610e32565b610bc25760405162461bcd60e51b815260040161039190611d14565b610bce818888886111a5565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b60608183108015610c325750610c2e6000610f18565b8211155b610c8a5760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201526263657360e81b6064820152608401610391565b6000610c968484611e0b565b9050610ca28484611e0b565b6001600160401b03811115610cb957610cb9611adc565b604051908082528060200260200182016040528015610ce2578160200160208202803683370190505b50915060005b81811015610d4157610d05610cfd8683611d74565b60009061120d565b838281518110610d1757610d17611d87565b6001600160a01b0390921660209283029190910190910152610d3a600182611d74565b9050610ce8565b505092915050565b6060610d53611219565b8054610d5e90611e1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8a90611e1e565b8015610dd75780601f10610dac57610100808354040283529160200191610dd7565b820191906000526020600020905b815481529060010190602001808311610dba57829003601f168201915b5050505050905090565b606060006106298361123d565b600080610e1b7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac84610f55565b6001600160a01b0385811691161491505092915050565b6000610629836001600160a01b038416611299565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b610e73610e47565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104f957610eae816001600160a01b031660146112e8565b610eb98360206112e8565b604051602001610eca929190611e52565b60408051601f198184030181529082905262461bcd60e51b825261039191600401611cca565b610efa8282611483565b6104f982826114ec565b610f0e82826115ab565b6104f98282611614565b600061042f825490565b60008282604051602001610f37929190611ebf565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610629565b60006103656116a3565b6000610629836001600160a01b038416611705565b6000610365813361073e565b6000610fea611219565b8054610ff590611e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461102190611e1e565b801561106e5780601f106110435761010080835404028352916020019161106e565b820191906000526020600020905b81548152906001019060200180831161105157829003601f168201915b505050505090508161107e611219565b906110899082611f34565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516110bb929190611ff3565b60405180910390a15050565b606061062983836040518060600160405280602781526020016120b9602791396117f8565b6001600160a01b03811660009081526001830160205260408120541515610629565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661042f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610391565b60405163347d5e2560e21b81526001600160a01b0385169063d1f57894906111d590869086908690600401612018565b600060405180830381600087803b1580156111ef57600080fd5b505af1158015611203573d6000803e3d6000fd5b5050505050505050565b60006106298383611870565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60608160000180548060200260200160405190810160405280929190818152602001828054801561128d57602002820191906000526020600020905b815481526020019060010190808311611279575b50505050509050919050565b60008181526001830160205260408120546112e05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561042f565b50600061042f565b606060006112f7836002612058565b611302906002611d74565b6001600160401b0381111561131957611319611adc565b6040519080825280601f01601f191660200182016040528015611343576020820181803683370190505b509050600360fc1b8160008151811061135e5761135e611d87565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061138d5761138d611d87565b60200101906001600160f81b031916908160001a90535060006113b1846002612058565b6113bc906001611d74565b90505b6001811115611434576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106113f0576113f0611d87565b1a60f81b82828151811061140657611406611d87565b60200101906001600160f81b031916908160001a90535060049490941c9361142d8161206f565b90506113bf565b5083156106295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610391565b600161148d610e47565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60006114f6610fb5565b6000848152602091909152604090205490506001611512610fb5565b6000858152602091909152604081208054909190611531908490611d74565b90915550829050611540610fb5565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b039290921691909117905580611580610fb5565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6115b58282610e6b565b6115bd610e47565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061161e610fb5565b6000848152602091825260408082206001600160a01b03861683526002019092522054905061164b610fb5565b6000848152602091825260408082208483526001019092522080546001600160a01b031916905561167a610fb5565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b60008060ff196116d460017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611e0b565b6040516020016116e691815260200190565b60408051601f1981840301815291905280516020909101201692915050565b600081815260018301602052604081205480156117ee576000611729600183611e0b565b855490915060009061173d90600190611e0b565b90508181146117a257600086600001828154811061175d5761175d611d87565b906000526020600020015490508087600001848154811061178057611780611d87565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806117b3576117b3612086565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061042f565b600091505061042f565b6060600080856001600160a01b031685604051611815919061209c565b600060405180830381855af49150503d8060008114611850576040519150601f19603f3d011682016040523d82523d6000602084013e611855565b606091505b50915091506118668683838761189a565b9695505050505050565b600082600001828154811061188757611887611d87565b9060005260206000200154905092915050565b60608315611909578251600003611902576001600160a01b0385163b6119025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610391565b5081611913565b611913838361191b565b949350505050565b81511561192b5781518083602001fd5b8060405162461bcd60e51b81526004016103919190611cca565b6020808252825182820181905260009190848201906040850190845b818110156119865783516001600160a01b031683529284019291840191600101611961565b50909695505050505050565b80356001600160a01b03811681146119a957600080fd5b919050565b600080604083850312156119c157600080fd5b6119ca83611992565b946020939093013593505050565b6000602082840312156119ea57600080fd5b61062982611992565b600060208284031215611a0557600080fd5b5035919050565b60008060408385031215611a1f57600080fd5b82359150611a2f60208401611992565b90509250929050565b600080600060408486031215611a4d57600080fd5b611a5684611992565b925060208401356001600160401b0380821115611a7257600080fd5b818601915086601f830112611a8657600080fd5b813581811115611a9557600080fd5b876020828501011115611aa757600080fd5b6020830194508093505050509250925092565b60008060408385031215611acd57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611b0457600080fd5b81356001600160401b0380821115611b1b57600080fd5b818401915084601f830112611b2f57600080fd5b813581811115611b4157611b41611adc565b604051601f8201601f19908116603f01168101908382118183101715611b6957611b69611adc565b81604052828152876020848701011115611b8257600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060208385031215611bb557600080fd5b82356001600160401b0380821115611bcc57600080fd5b818501915085601f830112611be057600080fd5b813581811115611bef57600080fd5b8660208260051b8501011115611c0457600080fd5b60209290920196919550909350505050565b60005b83811015611c31578181015183820152602001611c19565b50506000910152565b60008151808452611c52816020860160208601611c16565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611cbd57603f19888603018452611cab858351611c3a565b94509285019290850190600101611c8f565b5092979650505050505050565b6020815260006106296020830184611c3a565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042f5761042f611d5e565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611db457600080fd5b8301803591506001600160401b03821115611dce57600080fd5b602001915036819003821315611de357600080fd5b9250929050565b8284823760609190911b6001600160601b0319169101908152601401919050565b8181038181111561042f5761042f611d5e565b600181811c90821680611e3257607f821691505b602082108103610abc57634e487b7160e01b600052602260045260246000fd5b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611e82816015850160208801611c16565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611eb3816026840160208801611c16565b01602601949350505050565b6001600160a01b038316815260406020820181905260009061191390830184611c3a565b601f821115611f2f576000816000526020600020601f850160051c81016020861015611f0c5750805b601f850160051c820191505b81811015611f2b57828155600101611f18565b5050505b505050565b81516001600160401b03811115611f4d57611f4d611adc565b611f6181611f5b8454611e1e565b84611ee3565b602080601f831160018114611f965760008415611f7e5750858301515b600019600386901b1c1916600185901b178555611f2b565b600085815260208120601f198616915b82811015611fc557888601518255948401946001909101908401611fa6565b5085821015611fe35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006120066040830185611c3a565b82810360208401526106258185611c3a565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b808202811582820484141761042f5761042f611d5e565b60008161207e5761207e611d5e565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600082516120ae818460208701611c16565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a61135b53685bb0ed196dd5ad4d75bcd9d18cbd5f1c400b41cef4e22728763e164736f6c63430008170033"; +bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"60806040526004361061014b5760003560e01c806301ffc9a7146101575780630a1028c41461018c578063150b7a02146101ba5780631626ba7e146101f35780631dd756c51461021357806324d7806c146102335780633a871cdd1461025357806347e1da2a146102735780634a58db19146102955780634d44560d1461029d5780635892e236146102bd5780637dff5a79146102dd5780638b52d723146102fd578063938e3d7b1461031f578063a9082d841461033f578063ac9650d81461037e578063b0d691fe146103ab578063b61d27f6146103cd578063b76464d5146103ed578063bc197c811461040d578063c45a015514610439578063d087d2881461046d578063d1f5789414610482578063d42f2f35146104a2578063e8a3d485146104b7578063e9523c97146104d9578063f15d424e146104fb578063f23a6e611461052857600080fd5b3661015257005b600080fd5b34801561016357600080fd5b50610177610172366004612d91565b610554565b60405190151581526020015b60405180910390f35b34801561019857600080fd5b506101ac6101a7366004612e78565b61059a565b604051908152602001610183565b3480156101c657600080fd5b506101da6101d5366004612ed1565b61063e565b6040516001600160e01b03199091168152602001610183565b3480156101ff57600080fd5b506101da61020e366004612f3c565b61064f565b34801561021f57600080fd5b5061017761022e366004612f9b565b61078f565b34801561023f57600080fd5b5061017761024e366004612fe0565b610a53565b34801561025f57600080fd5b506101ac61026e366004612ffd565b610a82565b34801561027f57600080fd5b5061029361028e36600461308e565b610aa8565b005b610293610c0f565b3480156102a957600080fd5b506102936102b8366004613127565b610c77565b3480156102c957600080fd5b506102936102d8366004613194565b610cea565b3480156102e957600080fd5b506101776102f8366004612fe0565b6110a7565b34801561030957600080fd5b50610312611160565b60405161018391906132a7565b34801561032b57600080fd5b5061029361033a36600461330b565b6113a7565b34801561034b57600080fd5b5061035f61035a366004613194565b6113f8565b6040805192151583526001600160a01b03909116602083015201610183565b34801561038a57600080fd5b5061039e610399366004613353565b61144f565b60405161018391906133e4565b3480156103b757600080fd5b506103c06115b4565b604051610183919061343b565b3480156103d957600080fd5b506102936103e836600461344f565b6115fd565b3480156103f957600080fd5b50610293610408366004612fe0565b61168d565b34801561041957600080fd5b506101da61042836600461353c565b63bc197c8160e01b95945050505050565b34801561044557600080fd5b506103c07f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561047957600080fd5b506101ac6116bf565b34801561048e57600080fd5b5061029361049d3660046135e9565b61173f565b3480156104ae57600080fd5b506103126118f7565b3480156104c357600080fd5b506104cc611a68565b6040516101839190613630565b3480156104e557600080fd5b506104ee611b00565b6040516101839190613643565b34801561050757600080fd5b5061051b610516366004612fe0565b611b12565b6040516101839190613690565b34801561053457600080fd5b506101da6105433660046136a3565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061058557506001600160e01b03198216630a85bd0160e11b145b80610594575061059482611bea565b92915050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016105e0929190918252602082015260400190565b604051602081830303815290604052805190602001209050610600611c1f565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b630a85bd0160e11b5b949350505050565b60008061067c8460405160200161066891815260200190565b60405160208183030381529060405261059a565b9050600061068a8285611d46565b905061069581610a53565b156106ac5750630b135d3f60e11b91506105949050565b3360006106b7611d6a565b6001600160a01b03841660009081526006919091016020526040902090506106df8183611d8e565b8061070f57506106ee81611db0565b600114801561070f575060006107048282611dba565b6001600160a01b0316145b61076c5760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b610775836110a7565b1561078557630b135d3f60e11b94505b5050505092915050565b6000610799611d6a565b6001600160a01b0384166000908152600491909101602052604090205460ff16156107c657506001610594565b60006107d0611d6a565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b900490921690820152915061082b611d6a565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b0316118061087b575081604001516001600160801b03164210155b8061088c575061088a81611db0565b155b1561089c57600092505050610594565b60006108b36108ae606087018761370b565b611dc6565b905060006108c083611db0565b60011480156108e1575060006108d68482611dba565b6001600160a01b0316145b90506324f16c0560e11b6001600160e01b03198316016109585760008061091361090e60608a018a61370b565b611e00565b9150915082610939576109268583611d8e565b6109395760009650505050505050610594565b85518111156109515760009650505050505050610594565b5050610a46565b635c0f12eb60e11b6001600160e01b0319831601610a395760008061098861098360608a018a61370b565b611e65565b5091509150826109e85760005b82518110156109e6576109ca8382815181106109b3576109b3613751565b602002602001015187611d8e90919063ffffffff16565b6109de576000975050505050505050610594565b600101610995565b505b60005b8251811015610a3157818181518110610a0657610a06613751565b602002602001015187600001511015610a29576000975050505050505050610594565b6001016109eb565b505050610a46565b6000945050505050610594565b5060019695505050505050565b6000610a5d611d6a565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b6000610a8c611eb2565b610a968484611f1b565b9050610aa182612060565b9392505050565b610ab06115b4565b6001600160a01b0316336001600160a01b03161480610ad35750610ad333610a53565b610aef5760405162461bcd60e51b815260040161076390613767565b610af76120ad565b8481148015610b0557508483145b610b515760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e0000006044820152606401610763565b60005b85811015610c0657610bfd878783818110610b7157610b71613751565b9050602002016020810190610b869190612fe0565b868684818110610b9857610b98613751565b90506020020135858585818110610bb157610bb1613751565b9050602002810190610bc3919061370b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219392505050565b50600101610b54565b50505050505050565b610c176115b4565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610c43919061343b565b6000604051808303818588803b158015610c5c57600080fd5b505af1158015610c70573d6000803e3d6000fd5b5050505050565b610c7f612204565b610c876115b4565b6001600160a01b031663205c287883836040518363ffffffff1660e01b8152600401610cb49291906137a8565b600060405180830381600087803b158015610cce57600080fd5b505af1158015610ce2573d6000803e3d6000fd5b505050505050565b6000610cf96020850185612fe0565b905042610d0c60e0860160c087016137d8565b6001600160801b031611158015610d3b5750610d2f610100850160e086016137d8565b6001600160801b031642105b610d715760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b6044820152606401610763565b600080610d7f8686866113f8565b9150915081610db95760405162461bcd60e51b8152600401610763906020808252600490820152632173696760e01b604082015260600190565b6001610dc3611d6a565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610dff91908901908901613804565b60ff161115610e2c576000610e1a6040880160208901613804565b60ff166001149050610c068482612242565b610e3583610a53565b15610e6a5760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b6044820152606401610763565b610e7f83610e76611d6a565b60020190612317565b50604051806060016040528087606001358152602001876080016020810190610ea891906137d8565b6001600160801b03168152602001610ec660c0890160a08a016137d8565b6001600160801b03169052610ed9611d6a565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610f4f610f2e611d6a565b6001600160a01b03861660009081526006919091016020526040902061232c565b805190915060005b81811015610fb957610fa6838281518110610f7457610f74613751565b6020026020010151610f84611d6a565b6001600160a01b03891660009081526006919091016020526040902090612339565b50610fb2600182613835565b9050610f57565b50610fc76040890189613848565b9050905060005b8181101561104857611035610fe660408b018b613848565b83818110610ff657610ff6613751565b905060200201602081019061100b9190612fe0565b611013611d6a565b6001600160a01b03891660009081526006919091016020526040902090612317565b50611041600182613835565b9050610fce565b506110528861234e565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516110959190613922565b60405180910390a35050505050505050565b6000806110b2611d6a565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b90910416928101929092529091504210801590611123575080604001516001600160801b031642105b8015610aa157506000611158611137611d6a565b6001600160a01b038616600090815260069190910160205260409020611db0565b119392505050565b6060600061117761116f611d6a565b60020161232c565b80519091506000805b82811015611208576111aa84828151811061119d5761119d613751565b60200260200101516110a7565b156111c157816111b981613a0d565b9250506111f6565b60008482815181106111d5576111d5613751565b60200260200101906001600160a01b031690816001600160a01b0316815250505b611201600182613835565b9050611180565b50806001600160401b0381111561122157611221612dbb565b60405190808252806020026020018201604052801561125a57816020015b611247612d47565b81526020019060019003908161123f5790505b5093506000805b8381101561139f5760006001600160a01b031685828151811061128657611286613751565b60200260200101516001600160a01b03161461138d5760008582815181106112b0576112b0613751565b6020026020010151905060006112c4611d6a565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161132e610f2e611d6a565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b031681525088858061136d90613a0d565b96508151811061137f5761137f613751565b602002602001018190525050505b611398600182613835565b9050611261565b505050505090565b6113af6123e3565b6113ec5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610763565b6113f5816123fb565b50565b60008061140e611407866124e2565b8585612626565b9050611418611d6a565b6101008601356000908152600791909101602052604090205460ff16158015611445575061144581610a53565b9150935093915050565b6060816001600160401b0381111561146957611469612dbb565b60405190808252806020026020018201604052801561149c57816020015b60608152602001906001900390816114875790505b509050336000805b848110156115ab57811561152357611501308787848181106114c8576114c8613751565b90506020028101906114da919061370b565b866040516020016114ed93929190613a26565b604051602081830303815290604052612678565b84828151811061151357611513613751565b60200260200101819052506115a3565b6115853087878481811061153957611539613751565b905060200281019061154b919061370b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267892505050565b84828151811061159757611597613751565b60200260200101819052505b6001016114a4565b50505092915050565b6000806115bf61269d565b546001600160a01b0316905080156115d657919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b6116056115b4565b6001600160a01b0316336001600160a01b03161480611628575061162833610a53565b6116445760405162461bcd60e51b815260040161076390613767565b61164c6120ad565b610c70848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219392505050565b611695612204565b8061169e61269d565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60006116c96115b4565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190613a47565b905090565b60006117496126c1565b5460ff16905060006117596126c1565b54610100900460ff1690508015808015611776575060018360ff16105b806117955750611785306126e5565b15801561179557508260ff166001145b6117f85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b60016118026126c1565b805460ff191660ff92909216919091179055801561183b5760016118246126c1565b80549115156101000261ff00199092169190911790555b61187b8686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f492505050565b61188361269d565b60010181905550611895866001612242565b8015610ce25760006118a56126c1565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6060600061190661116f611d6a565b8051909150806001600160401b0381111561192357611923612dbb565b60405190808252806020026020018201604052801561195c57816020015b611949612d47565b8152602001906001900390816119415790505b50925060005b81811015611a6257600083828151811061197e5761197e613751565b602002602001015190506000611992611d6a565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016119fc610f2e611d6a565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250868481518110611a4157611a41613751565b60200260200101819052505050600181611a5b9190613835565b9050611962565b50505090565b6060611a72612727565b8054611a7d90613a60565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa990613a60565b8015611af65780601f10611acb57610100808354040283529160200191611af6565b820191906000526020600020905b815481529060010190602001808311611ad957829003601f168201915b5050505050905090565b606061173a611b0d611d6a565b61232c565b611b1a612d47565b6000611b24611d6a565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611baf611b8e611d6a565b6001600160a01b03871660009081526006919091016020526040902061232c565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b60006001600160e01b03198216630271189760e51b148061059457506301ffc9a760e01b6001600160e01b0319831614610594565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015611c7857507f0000000000000000000000000000000000000000000000000000000000007a6946145b15611ca257507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000806000611d55858561274b565b91509150611d6281612790565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b03811660009081526001830160205260408120541515610aa1565b6000610594825490565b6000610aa183836128d5565b60006004821015611de95760405162461bcd60e51b815260040161076390613a94565b611df7600460008486613ab3565b610aa191613add565b6000806044831015611e245760405162461bcd60e51b815260040161076390613a94565b611e32602460048587613ab3565b810190611e3f9190612fe0565b9150611e4f604460248587613ab3565b810190611e5c9190613b0d565b90509250929050565b606080806064841015611e8a5760405162461bcd60e51b815260040161076390613a94565b611e978460048188613ab3565b810190611ea49190613ba5565b919790965090945092505050565b611eba6115b4565b6001600160a01b0316336001600160a01b031614611f195760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b6044820152606401610763565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611f99611f5c61014087018761370b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611d469050565b9050611fa5818661078f565b611fb457600192505050610594565b6000611fbe611d6a565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b80156113f557604051600090339060001990849084818181858888f193505050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c70565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a547906120fb90309060040161343b565b602060405180830381865afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c9190613c8a565b6113f557806001600160a01b03166383a03f8c61215761269d565b600101546040518263ffffffff1660e01b815260040161217991815260200190565b600060405180830381600087803b158015610c5c57600080fd5b60606000846001600160a01b031684846040516121b09190613cac565b60006040518083038185875af1925050503d80600081146121ed576040519150601f19603f3d011682016040523d82523d6000602084013e6121f2565b606091505b509250905080611d6257815160208301fd5b61220d33610a53565b611f195760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b6044820152606401610763565b61224c82826128ff565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156123135780156122db577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630b61e12b836122ba61269d565b600101546040518363ffffffff1660e01b8152600401610cb49291906137a8565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639387a380836122ba61269d565b5050565b6000610aa1836001600160a01b0384166129ae565b60606000610aa1836129fd565b6000610aa1836001600160a01b038416612a59565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156113f5576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16630b61e12b6123ba6020840184612fe0565b6123c261269d565b600101546040518363ffffffff1660e01b81526004016121799291906137a8565b60006123ee33610a53565b8061173a57505030331490565b6000612405612727565b805461241090613a60565b80601f016020809104026020016040519081016040528092919081815260200182805461243c90613a60565b80156124895780601f1061245e57610100808354040283529160200191612489565b820191906000526020600020905b81548152906001019060200180831161246c57829003601f168201915b5050505050905081612499612727565b906124a49082613d15565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516124d6929190613dd4565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96125126020840184612fe0565b6125226040850160208601613804565b61252f6040860186613848565b604051602001612540929190613e02565b60408051601f198184030181529190528051602090910120606086013561256d60a08801608089016137d8565b61257d60c0890160a08a016137d8565b61258d60e08a0160c08b016137d8565b61259e6101008b0160e08c016137d8565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061064783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061267292509050612b4c565b90611d46565b6060610aa18383604051806060016040528060278152602001613ea860279139612b79565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b6001600160a01b03163b151590565b60008282604051602001612709929190613e44565b60405160208183030381529060405280519060200120905092915050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60008082516041036127815760208301516040840151606085015160001a61277587828585612bf1565b94509450505050612789565b506000905060025b9250929050565b60008160048111156127a4576127a4613e68565b036127ac5750565b60018160048111156127c0576127c0613e68565b036128085760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606401610763565b600281600481111561281c5761281c613e68565b036128695760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b600381600481111561287d5761287d613e68565b036113f55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b60008260000182815481106128ec576128ec613751565b9060005260206000200154905092915050565b80612908611d6a565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156129515761294b82612945611d6a565b90612317565b50612965565b6129638261295d611d6a565b90612339565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a11133826040516129a2911515815260200190565b60405180910390a25050565b60008181526001830160205260408120546129f557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610594565b506000610594565b606081600001805480602002602001604051908101604052809291908181526020018280548015612a4d57602002820191906000526020600020905b815481526020019060010190808311612a39575b50505050509050919050565b60008181526001830160205260408120548015612b42576000612a7d600183613e7e565b8554909150600090612a9190600190613e7e565b9050818114612af6576000866000018281548110612ab157612ab1613751565b9060005260206000200154905080876000018481548110612ad457612ad4613751565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612b0757612b07613e91565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610594565b6000915050610594565b6000610594612b59611c1f565b8360405161190160f01b8152600281019290925260228201526042902090565b6060600080856001600160a01b031685604051612b969190613cac565b600060405180830381855af49150503d8060008114612bd1576040519150601f19603f3d011682016040523d82523d6000602084013e612bd6565b606091505b5091509150612be786838387612cab565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612c1e5750600090506003612ca2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c72573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c9b57600060019250925050612ca2565b9150600090505b94509492505050565b60608315612d18578251600003612d1157612cc5856126e5565b612d115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610763565b5081610647565b6106478383815115612d2d5781518083602001fd5b8060405162461bcd60e51b81526004016107639190613630565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b600060208284031215612da357600080fd5b81356001600160e01b031981168114610aa157600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612df957612df9612dbb565b604052919050565b60006001600160401b03831115612e1a57612e1a612dbb565b612e2d601f8401601f1916602001612dd1565b9050828152838383011115612e4157600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e6957600080fd5b610aa183833560208501612e01565b600060208284031215612e8a57600080fd5b81356001600160401b03811115612ea057600080fd5b61064784828501612e58565b6001600160a01b03811681146113f557600080fd5b8035612ecc81612eac565b919050565b60008060008060808587031215612ee757600080fd5b8435612ef281612eac565b93506020850135612f0281612eac565b92506040850135915060608501356001600160401b03811115612f2457600080fd5b612f3087828801612e58565b91505092959194509250565b60008060408385031215612f4f57600080fd5b8235915060208301356001600160401b03811115612f6c57600080fd5b612f7885828601612e58565b9150509250929050565b60006101608284031215612f9557600080fd5b50919050565b60008060408385031215612fae57600080fd5b8235612fb981612eac565b915060208301356001600160401b03811115612fd457600080fd5b612f7885828601612f82565b600060208284031215612ff257600080fd5b8135610aa181612eac565b60008060006060848603121561301257600080fd5b83356001600160401b0381111561302857600080fd5b61303486828701612f82565b9660208601359650604090950135949350505050565b60008083601f84011261305c57600080fd5b5081356001600160401b0381111561307357600080fd5b6020830191508360208260051b850101111561278957600080fd5b600080600080600080606087890312156130a757600080fd5b86356001600160401b03808211156130be57600080fd5b6130ca8a838b0161304a565b909850965060208901359150808211156130e357600080fd5b6130ef8a838b0161304a565b9096509450604089013591508082111561310857600080fd5b5061311589828a0161304a565b979a9699509497509295939492505050565b6000806040838503121561313a57600080fd5b823561314581612eac565b946020939093013593505050565b60008083601f84011261316557600080fd5b5081356001600160401b0381111561317c57600080fd5b60208301915083602082850101111561278957600080fd5b6000806000604084860312156131a957600080fd5b83356001600160401b03808211156131c057600080fd5b9085019061012082880312156131d557600080fd5b909350602085013590808211156131eb57600080fd5b506131f886828701613153565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561326957855185168252948301946001929092019190830190613247565b5060408701516040890152606087015194506132886060890186613205565b6080870151945061329c6080890186613205565b979650505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156132fe57603f198886030184526132ec858351613212565b945092850192908501906001016132d0565b5092979650505050505050565b60006020828403121561331d57600080fd5b81356001600160401b0381111561333357600080fd5b8201601f8101841361334457600080fd5b61064784823560208401612e01565b6000806020838503121561336657600080fd5b82356001600160401b0381111561337c57600080fd5b6133888582860161304a565b90969095509350505050565b60005b838110156133af578181015183820152602001613397565b50506000910152565b600081518084526133d0816020860160208601613394565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156132fe57603f198886030184526134298583516133b8565b9450928501929085019060010161340d565b6001600160a01b0391909116815260200190565b6000806000806060858703121561346557600080fd5b843561347081612eac565b93506020850135925060408501356001600160401b0381111561349257600080fd5b61349e87828801613153565b95989497509550505050565b60006001600160401b038211156134c3576134c3612dbb565b5060051b60200190565b600082601f8301126134de57600080fd5b813560206134f36134ee836134aa565b612dd1565b8083825260208201915060208460051b87010193508684111561351557600080fd5b602086015b84811015613531578035835291830191830161351a565b509695505050505050565b600080600080600060a0868803121561355457600080fd5b853561355f81612eac565b9450602086013561356f81612eac565b935060408601356001600160401b038082111561358b57600080fd5b61359789838a016134cd565b945060608801359150808211156135ad57600080fd5b6135b989838a016134cd565b935060808801359150808211156135cf57600080fd5b506135dc88828901612e58565b9150509295509295909350565b6000806000604084860312156135fe57600080fd5b833561360981612eac565b925060208401356001600160401b0381111561362457600080fd5b6131f886828701613153565b602081526000610aa160208301846133b8565b6020808252825182820181905260009190848201906040850190845b818110156136845783516001600160a01b03168352928401929184019160010161365f565b50909695505050505050565b602081526000610aa16020830184613212565b600080600080600060a086880312156136bb57600080fd5b85356136c681612eac565b945060208601356136d681612eac565b9350604086013592506060860135915060808601356001600160401b038111156136ff57600080fd5b6135dc88828901612e58565b6000808335601e1984360301811261372257600080fd5b8301803591506001600160401b0382111561373c57600080fd5b60200191503681900382131561278957600080fd5b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80356001600160801b0381168114612ecc57600080fd5b6000602082840312156137ea57600080fd5b610aa1826137c1565b803560ff81168114612ecc57600080fd5b60006020828403121561381657600080fd5b610aa1826137f3565b634e487b7160e01b600052601160045260246000fd5b808201808211156105945761059461381f565b6000808335601e1984360301811261385f57600080fd5b8301803591506001600160401b0382111561387957600080fd5b6020019150600581901b360382131561278957600080fd5b6000808335601e198436030181126138a857600080fd5b83016020810192503590506001600160401b038111156138c757600080fd5b8060051b360382131561278957600080fd5b8183526000602080850194508260005b858110156139175781356138fc81612eac565b6001600160a01b0316875295820195908201906001016138e9565b509495945050505050565b602081526139436020820161393684612ec1565b6001600160a01b03169052565b6000613951602084016137f3565b60ff81166040840152506139686040840184613891565b610120806060860152613980610140860183856138d9565b925060608601356080860152613998608087016137c1565b91506139a760a0860183613205565b6139b360a087016137c1565b91506139c260c0860183613205565b6139ce60c087016137c1565b91506139dd60e0860183613205565b6139e960e087016137c1565b91506101006139fa81870184613205565b9590950135939094019290925250919050565b600060018201613a1f57613a1f61381f565b5060010190565b8284823760609190911b6001600160601b0319169101908152601401919050565b600060208284031215613a5957600080fd5b5051919050565b600181811c90821680613a7457607f821691505b602082108103612f9557634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b60008085851115613ac357600080fd5b83861115613ad057600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b055780818660040360031b1b83161692505b505092915050565b600060208284031215613b1f57600080fd5b5035919050565b600082601f830112613b3757600080fd5b81356020613b476134ee836134aa565b82815260059290921b84018101918181019086841115613b6657600080fd5b8286015b848110156135315780356001600160401b03811115613b895760008081fd5b613b978986838b0101612e58565b845250918301918301613b6a565b600080600060608486031215613bba57600080fd5b83356001600160401b0380821115613bd157600080fd5b818601915086601f830112613be557600080fd5b81356020613bf56134ee836134aa565b82815260059290921b8401810191818101908a841115613c1457600080fd5b948201945b83861015613c3b578535613c2c81612eac565b82529482019490820190613c19565b97505087013592505080821115613c5157600080fd5b613c5d878388016134cd565b93506040860135915080821115613c7357600080fd5b50613c8086828701613b26565b9150509250925092565b600060208284031215613c9c57600080fd5b81518015158114610aa157600080fd5b60008251613cbe818460208701613394565b9190910192915050565b601f821115613d10576000816000526020600020601f850160051c81016020861015613cf15750805b601f850160051c820191505b81811015610ce257828155600101613cfd565b505050565b81516001600160401b03811115613d2e57613d2e612dbb565b613d4281613d3c8454613a60565b84613cc8565b602080601f831160018114613d775760008415613d5f5750858301515b600019600386901b1c1916600185901b178555610ce2565b600085815260208120601f198616915b82811015613da657888601518255948401946001909101908401613d87565b5085821015613dc45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613de760408301856133b8565b8281036020840152613df981856133b8565b95945050505050565b60008184825b85811015613e39578135613e1b81612eac565b6001600160a01b031683526020928301929190910190600101613e08565b509095945050505050565b6001600160a01b0383168152604060208201819052600090610647908301846133b8565b634e487b7160e01b600052602160045260246000fd5b818103818111156105945761059461381f565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a031bcfe5c5246fc2b8326d1783bec18aa37ab91f19b647ed1f1162ac7b3a39f64736f6c63430008170033"; diff --git a/yarn.lock b/yarn.lock index 367d8c8ce..95cf6e69d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,9 +8,9 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@babel/code-frame@^7.0.0": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.4.tgz#03ae5af150be94392cb5c7ccd97db5a19a5da6aa" - integrity sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA== + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: "@babel/highlight" "^7.23.4" chalk "^2.4.2" @@ -73,10 +73,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" - integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -88,10 +88,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.54.0.tgz#4fab9a2ff7860082c304f750e94acd644cf984cf" - integrity sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ== +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== "@eth-optimism/contracts@^0.5.21": version "0.5.40" @@ -467,12 +467,12 @@ "@ethersproject/strings" "^5.7.0" "@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -480,10 +480,22 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" @@ -518,9 +530,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -531,9 +543,9 @@ integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== "@noble/hashes@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -557,15 +569,14 @@ fastq "^1.6.0" "@openzeppelin/contracts-upgradeable-4.7.3@npm:@openzeppelin/contracts-upgradeable@v4.7.3", "@openzeppelin/contracts-upgradeable@4.7.3": - name "@openzeppelin/contracts-upgradeable-4.7.3" version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== "@openzeppelin/contracts-upgradeable@^4.4.2", "@openzeppelin/contracts-upgradeable@^4.7.3", "@openzeppelin/contracts-upgradeable@^4.9.3": - version "4.9.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz#ff17a80fb945f5102571f8efecb5ce5915cc4811" - integrity sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A== + version "4.9.5" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz#572b5da102fc9be1d73f34968e0ca56765969812" + integrity sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg== "@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": version "3.4.2" @@ -578,31 +589,36 @@ integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== "@openzeppelin/contracts@^4.4.2", "@openzeppelin/contracts@^4.9.3": - version "4.9.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" - integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== + version "4.9.5" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.5.tgz#1eed23d4844c861a1835b5d33507c1017fa98de8" + integrity sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg== "@openzeppelin/contracts@~4.3.3": version "4.3.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== -"@solidity-parser/parser@^0.16.0", "@solidity-parser/parser@^0.16.2": +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@solidity-parser/parser@^0.16.0": version "0.16.2" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== dependencies: antlr4ts "^0.5.0-alpha.4" -"@thirdweb-dev/chains@0.1.61": - version "0.1.61" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/chains/-/chains-0.1.61.tgz#4798164d1e7f07269c04f821e4d56102b476d3ae" - integrity sha512-SlFXjqtqZbGqSYKv1HEhGIG03QjnkQPrgLO7WAar7/ZreEqDb3CtUzysSXnblfMqDDwe51dmWBcZ3dXXtTSZxg== +"@solidity-parser/parser@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.17.0.tgz#52a2fcc97ff609f72011014e4c5b485ec52243ef" + integrity sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== -"@thirdweb-dev/chains@^0.1.54": - version "0.1.58" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/chains/-/chains-0.1.58.tgz#5a26fe187ef39b7c6af87972166785d110cad53e" - integrity sha512-prSShAWoLODuZQcDBwNDqcXLzfevV2BOw54cDaHetSP+Sw/BP6SaPKIxojRQGsXARjn0JMWniG/NCtppUUHALQ== +"@thirdweb-dev/chains@0.1.65", "@thirdweb-dev/chains@^0.1.54": + version "0.1.65" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/chains/-/chains-0.1.65.tgz#a298e39d1c16b787008ace29b616bccc9b96d253" + integrity sha512-csxBZnnjSEAISjlQrYJP/FV4buUlqHb7NF4vX/15hYc31J6Z4vJPRWcsd2WhzPj9YXR5sgSJcu6ro2C6s4jmOA== "@thirdweb-dev/contracts-js@1.3.16": version "1.3.16" @@ -631,9 +647,9 @@ js-sha3 "^0.9.2" "@thirdweb-dev/dynamic-contracts@^1.1.2", "@thirdweb-dev/dynamic-contracts@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/dynamic-contracts/-/dynamic-contracts-1.2.4.tgz#468de8a98e3be211ad1a0e541da1190093ceca49" - integrity sha512-cQtUznRXBDifzME3zmppVrfBM2Aw8C/okCLzsgcLU/Qr68TjLJTKTDGt2uGo/q5qAvRVJjQRD/bNvV1QTqjqSg== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/dynamic-contracts/-/dynamic-contracts-1.2.5.tgz#f9735c0d46198e7bf2f98c277f0a9a79c54da1e8" + integrity sha512-YVsz+jUWbwj+6aF2eTZGMfyw47a1HRmgNl4LQ3gW9gwYL5y5+OX/yOzv6aV5ibvoqCk/k10aIVK2eFrcpMubQA== "@thirdweb-dev/generated-abis@0.0.1": version "0.0.1" @@ -651,16 +667,16 @@ treeify "^1.1.0" "@thirdweb-dev/sdk@^4.0.22": - version "4.0.22" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-4.0.22.tgz#5302d5ea02a1c356284c39b2893b999e14bffcb6" - integrity sha512-5XRn6qnR0HHqN48kbvW00dO7l2GHBR1wITFCN4IXEgkCCOPJpck0h1jVqqQ9OLm6ILBoSaIkjKo3TIGwsxhmww== + version "4.0.28" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-4.0.28.tgz#4a9dd353997cff5b5424656bf66329cad8b8c119" + integrity sha512-IZey3pzyow7JqjQaQfNKZoRR7ZI8yQ5XfVCy0/O9NWut9RC+L3uMONodH96O9x8z3uTgiMgKNKkUGQ8G3BdxMg== dependencies: - "@thirdweb-dev/chains" "0.1.61" + "@thirdweb-dev/chains" "0.1.65" "@thirdweb-dev/contracts-js" "1.3.16" "@thirdweb-dev/crypto" "0.2.0" "@thirdweb-dev/generated-abis" "0.0.1" "@thirdweb-dev/merkletree" "0.2.0" - "@thirdweb-dev/storage" "2.0.7" + "@thirdweb-dev/storage" "2.0.8" abitype "^0.2.5" bn.js "^5.2.1" bs58 "^5.0.0" @@ -673,10 +689,10 @@ yaml "^2.3.1" zod "^3.22.3" -"@thirdweb-dev/storage@2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/storage/-/storage-2.0.7.tgz#249b5bb2949156542cc715b5262f8c88dd0370de" - integrity sha512-pi+wfUycHWoOVxD+CZtfGprP9+yQ2PgErsYwWbW3/pQtk8uatvGJMPgMNYsiu6G3B1V3xokBfnmCTsONjz+YNw== +"@thirdweb-dev/storage@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/storage/-/storage-2.0.8.tgz#ffc4014d46b575d08af2f69ef360d95497773d52" + integrity sha512-h1+3px/01jxM3Ob4fDB+11Jm9r5rEPk8NLrcuKRCRZYxfsThaINpIvmuAkvKlVR2kVvYGKTGbmPVydjNBmPkbA== dependencies: "@thirdweb-dev/crypto" "0.2.0" cid-tool "^3.0.0" @@ -729,9 +745,9 @@ integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/node@*": - version "20.9.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.4.tgz#cc8f970e869c26834bdb7ed480b30ede622d74c7" - integrity sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA== + version "20.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.6.tgz#6adf4241460e28be53836529c033a41985f85b6e" + integrity sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q== dependencies: undici-types "~5.26.4" @@ -855,14 +871,14 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.3.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" - integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== acorn@^8.4.1, acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== aes-js@3.0.0: version "3.0.0" @@ -899,6 +915,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -913,6 +934,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + antlr4@^4.11.0: version "4.13.1" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" @@ -1096,9 +1122,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== chai@^4.3.4: - version "4.3.10" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" - integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== dependencies: assertion-error "^1.1.0" check-error "^1.0.3" @@ -1260,7 +1286,7 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1276,7 +1302,7 @@ debug@4.3.3: dependencies: ms "2.1.2" -debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1335,9 +1361,14 @@ doctrine@^3.0.0: esutils "^2.0.2" dotenv@^16.3.1: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.4.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.1.tgz#1d9931f1d3e5d2959350d1250efab299561f7f11" + integrity sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== elliptic@6.5.4: version "6.5.4" @@ -1357,6 +1388,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + erc721a-upgradeable@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/erc721a-upgradeable/-/erc721a-upgradeable-3.3.0.tgz#c7b481668694756120868261fe98ab3a245a06b4" @@ -1547,14 +1583,14 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.54.0: - version "8.54.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.54.0.tgz#588e0dd4388af91a2e8fa37ea64924074c783537" - integrity sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA== + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.3" - "@eslint/js" "8.54.0" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -1721,9 +1757,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== dependencies: reusify "^1.0.4" @@ -1775,6 +1811,14 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -1841,18 +1885,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -1877,6 +1909,17 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -1901,9 +1944,9 @@ glob@^8.0.3: once "^1.3.0" globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -2066,6 +2109,15 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + joycon@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" @@ -2077,9 +2129,9 @@ js-sha3@0.8.0, js-sha3@^0.8.0: integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== js-sha3@^0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.9.2.tgz#a5ba3967ddf5a095f7b3389ef14a6297b10d6409" - integrity sha512-8kgvwd03wNGQG1GRvl3yy1Yt40sICAcIMsDU2ZLgoL0Z6z9rkRmf9Vd+bi/gYSzgAqMUGl/jiDKu0J8AWFd+BQ== + version "0.9.3" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.9.3.tgz#f0209432b23a66a0f6c7af592c26802291a75c2a" + integrity sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg== js-tokens@^4.0.0: version "4.0.0" @@ -2236,6 +2288,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -2307,6 +2364,18 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -2411,9 +2480,9 @@ node-addon-api@^2.0.0: integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-gyp-build@^4.2.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.7.0.tgz#749f0033590b2a89ac8edb5e0775f95f5ae86d15" - integrity sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg== + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -2504,6 +2573,14 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -2550,13 +2627,13 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier-plugin-solidity@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.2.0.tgz#dc620b4fc7708a60687a87cdc803e57a1856b6fd" - integrity sha512-fgxcUZpVAP+LlRfy5JI5oaAkXGkmsje2VJ5krv/YMm+rcTZbIUwFguSw5f+WFuttMjpDm6wB4UL7WVkArEfiVA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz#59944d3155b249f7f234dee29f433524b9a4abcf" + integrity sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== dependencies: - "@solidity-parser/parser" "^0.16.2" + "@solidity-parser/parser" "^0.17.0" semver "^7.5.4" - solidity-comments-extractor "^0.0.7" + solidity-comments-extractor "^0.0.8" prettier@^2.3.1, prettier@^2.8.3, prettier@^2.8.8: version "2.8.8" @@ -2688,6 +2765,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2734,10 +2816,10 @@ solhint@^3.6.2: optionalDependencies: prettier "^2.8.3" -solidity-comments-extractor@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" - integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== +solidity-comments-extractor@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz#f6e148ab0c49f30c1abcbecb8b8df01ed8e879f8" + integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== source-map@0.8.0-beta.0: version "0.8.0-beta.0" @@ -2758,7 +2840,7 @@ string-format@^2.0.0: resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2767,6 +2849,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -2774,13 +2865,20 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -2792,13 +2890,13 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.1: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== sucrase@^3.20.3: - version "3.34.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" - integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" commander "^4.0.0" - glob "7.1.6" + glob "^10.3.10" lines-and-columns "^1.1.6" mz "^2.7.0" pirates "^4.0.1" @@ -2915,9 +3013,9 @@ ts-interface-checker@^0.1.9: integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -3014,9 +3112,9 @@ typescript@^4.9.5: integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" - integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== typical@^4.0.0: version "4.0.0" @@ -3123,7 +3221,7 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -3132,6 +3230,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From 4ff7235115baf6beb93fc04a14cd4a237fcb422a Mon Sep 17 00:00:00 2001 From: nkrishang <62195808+nkrishang@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:36:04 +0530 Subject: [PATCH 05/11] Resolve: Deletion on mapping containing a struct-with-mapping #602 (#608) Update test for unpublish contract --- src/test/ContractPublisher.t.sol | 60 ++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/src/test/ContractPublisher.t.sol b/src/test/ContractPublisher.t.sol index 969e8b7ad..4ff5ca50a 100644 --- a/src/test/ContractPublisher.t.sol +++ b/src/test/ContractPublisher.t.sol @@ -232,18 +232,42 @@ contract ContractPublisherTest is BaseTest, IContractPublisherData { // ); // } - function test_unpublish() public { + function test_unpublish_state() public { string memory contractId = "MyContract"; - vm.prank(publisher); + vm.startPrank(publisher); byoc.publishContract( publisher, contractId, - publishMetadataUri, + "publish URI 1", compilerMetadataUri, keccak256(type(MockCustomContract).creationCode), address(0) ); + byoc.publishContract( + publisher, + contractId, + "publish URI 2", + compilerMetadataUri, + keccak256(type(MockCustomContract).creationCode), + address(0) + ); + byoc.publishContract( + publisher, + contractId, + "publish URI 3", + compilerMetadataUri, + keccak256(type(MockCustomContract).creationCode), + address(0) + ); + + vm.stopPrank(); + + IContractPublisher.CustomContractInstance[] memory allCustomContractsBefore = byoc.getPublishedContractVersions( + publisher, + contractId + ); + assertEq(allCustomContractsBefore.length, 3); vm.prank(publisher); byoc.unpublishContract(publisher, contractId); @@ -257,6 +281,36 @@ contract ContractPublisherTest is BaseTest, IContractPublisherData { assertEq(customContract.publishMetadataUri, ""); assertEq(customContract.bytecodeHash, bytes32(0)); assertEq(customContract.implementation, address(0)); + + IContractPublisher.CustomContractInstance[] memory allCustomContracts = byoc.getPublishedContractVersions( + publisher, + contractId + ); + + assertEq(allCustomContracts.length, 0); + + vm.prank(publisher); + byoc.publishContract( + publisher, + contractId, + "publish URI 4", + compilerMetadataUri, + keccak256(type(MockCustomContract).creationCode), + address(0) + ); + + IContractPublisher.CustomContractInstance memory customContractRepublish = byoc.getPublishedContract( + publisher, + contractId + ); + + assertEq(customContractRepublish.contractId, contractId); + assertEq(customContractRepublish.publishMetadataUri, "publish URI 4"); + + IContractPublisher.CustomContractInstance[] memory allCustomContractsRepublish = byoc + .getPublishedContractVersions(publisher, contractId); + + assertEq(allCustomContractsRepublish.length, 1); } // Deprecated From 3f192ecbd2c13f9408742563dd6b5787e2061959 Mon Sep 17 00:00:00 2001 From: nkrishang <62195808+nkrishang@users.noreply.github.com> Date: Thu, 25 Jan 2024 16:33:00 +0530 Subject: [PATCH 06/11] Resolve: Emit appropriate events in initialize function #604 (#610) Emit events in initialize --- contracts/prebuilts/token/TokenERC1155.sol | 4 ++++ contracts/prebuilts/token/TokenERC20.sol | 3 +++ contracts/prebuilts/token/TokenERC721.sol | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/contracts/prebuilts/token/TokenERC1155.sol b/contracts/prebuilts/token/TokenERC1155.sol index fd2375eed..f3a167802 100644 --- a/contracts/prebuilts/token/TokenERC1155.sol +++ b/contracts/prebuilts/token/TokenERC1155.sol @@ -173,6 +173,10 @@ contract TokenERC1155 is _setupRole(METADATA_ROLE, _defaultAdmin); _setRoleAdmin(METADATA_ROLE, METADATA_ROLE); + + emit PrimarySaleRecipientUpdated(_primarySaleRecipient); + emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps); + emit DefaultRoyalty(_royaltyRecipient, _royaltyBps); } /// ===== Public functions ===== diff --git a/contracts/prebuilts/token/TokenERC20.sol b/contracts/prebuilts/token/TokenERC20.sol index 4ff5898b1..ade523599 100644 --- a/contracts/prebuilts/token/TokenERC20.sol +++ b/contracts/prebuilts/token/TokenERC20.sol @@ -112,6 +112,9 @@ contract TokenERC20 is _setupRole(TRANSFER_ROLE, _defaultAdmin); _setupRole(MINTER_ROLE, _defaultAdmin); _setupRole(TRANSFER_ROLE, address(0)); + + emit PrimarySaleRecipientUpdated(_primarySaleRecipient); + emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps); } /// @dev Returns the module type of the contract. diff --git a/contracts/prebuilts/token/TokenERC721.sol b/contracts/prebuilts/token/TokenERC721.sol index 13f977c6b..7f710afa9 100644 --- a/contracts/prebuilts/token/TokenERC721.sol +++ b/contracts/prebuilts/token/TokenERC721.sol @@ -154,6 +154,10 @@ contract TokenERC721 is _setupRole(TRANSFER_ROLE, _defaultAdmin); _setupRole(TRANSFER_ROLE, address(0)); + + emit PrimarySaleRecipientUpdated(_saleRecipient); + emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps); + emit DefaultRoyalty(_royaltyRecipient, _royaltyBps); } /// ===== Public functions ===== From ed8b32931063a7b833e3eabd8c5e14fc26e7f6f1 Mon Sep 17 00:00:00 2001 From: nkrishang <62195808+nkrishang@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:01:55 +0530 Subject: [PATCH 07/11] Resolve: Update state variables that could be declared immutable as immutable #605 (#609) * Turn vars to immutable * Make vars immutable --- contracts/base/Staking1155Base.sol | 2 +- contracts/base/Staking20Base.sol | 2 +- contracts/base/Staking721Base.sol | 4 ++-- contracts/extension/Staking1155.sol | 2 +- contracts/extension/Staking721.sol | 2 +- contracts/infra/ContractPublisher.sol | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/base/Staking1155Base.sol b/contracts/base/Staking1155Base.sol index e5c8f8773..a557d06a1 100644 --- a/contracts/base/Staking1155Base.sol +++ b/contracts/base/Staking1155Base.sol @@ -46,7 +46,7 @@ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; contract Staking1155Base is ContractMetadata, Multicall, Ownable, Staking1155, ERC165, IERC1155Receiver { /// @dev ERC20 Reward Token address. See {_mintRewards} below. - address public rewardToken; + address public immutable rewardToken; /// @dev The address of the native token wrapper contract. address internal immutable nativeTokenWrapper; diff --git a/contracts/base/Staking20Base.sol b/contracts/base/Staking20Base.sol index 917699afc..6e6cbe05b 100644 --- a/contracts/base/Staking20Base.sol +++ b/contracts/base/Staking20Base.sol @@ -45,7 +45,7 @@ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; contract Staking20Base is ContractMetadata, Multicall, Ownable, Staking20 { /// @dev ERC20 Reward Token address. See {_mintRewards} below. - address public rewardToken; + address public immutable rewardToken; /// @dev Total amount of reward tokens in the contract. uint256 private rewardTokenBalance; diff --git a/contracts/base/Staking721Base.sol b/contracts/base/Staking721Base.sol index 75b40bc2c..ad1ebb19d 100644 --- a/contracts/base/Staking721Base.sol +++ b/contracts/base/Staking721Base.sol @@ -46,10 +46,10 @@ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; contract Staking721Base is ContractMetadata, Multicall, Ownable, Staking721, ERC165, IERC721Receiver { /// @dev ERC20 Reward Token address. See {_mintRewards} below. - address public rewardToken; + address public immutable rewardToken; /// @dev The address of the native token wrapper contract. - address public nativeTokenWrapper; + address public immutable nativeTokenWrapper; /// @dev Total amount of reward tokens in the contract. uint256 private rewardTokenBalance; diff --git a/contracts/extension/Staking1155.sol b/contracts/extension/Staking1155.sol index 28c1084d7..d30885b12 100644 --- a/contracts/extension/Staking1155.sol +++ b/contracts/extension/Staking1155.sol @@ -15,7 +15,7 @@ abstract contract Staking1155 is ReentrancyGuard, IStaking1155 { //////////////////////////////////////////////////////////////*/ ///@dev Address of ERC1155 contract -- staked tokens belong to this contract. - address public stakingToken; + address public immutable stakingToken; /// @dev Flag to check direct transfers of staking tokens. uint8 internal isStaking = 1; diff --git a/contracts/extension/Staking721.sol b/contracts/extension/Staking721.sol index 38d786511..9d18144c5 100644 --- a/contracts/extension/Staking721.sol +++ b/contracts/extension/Staking721.sol @@ -15,7 +15,7 @@ abstract contract Staking721 is ReentrancyGuard, IStaking721 { //////////////////////////////////////////////////////////////*/ ///@dev Address of ERC721 NFT contract -- staked tokens belong to this contract. - address public stakingToken; + address public immutable stakingToken; /// @dev Flag to check direct transfers of staking tokens. uint8 internal isStaking = 1; diff --git a/contracts/infra/ContractPublisher.sol b/contracts/infra/ContractPublisher.sol index 0b7f98ab6..8400462a4 100644 --- a/contracts/infra/ContractPublisher.sol +++ b/contracts/infra/ContractPublisher.sol @@ -30,7 +30,7 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE /// @notice Whether the contract publisher is paused. bool public isPaused; - IContractPublisher public prevPublisher; + IContractPublisher public immutable prevPublisher; /*/////////////////////////////////////////////////////////////// Mappings From da53846aef23fac97de20b36b86276b8acad0f22 Mon Sep 17 00:00:00 2001 From: nkrishang <62195808+nkrishang@users.noreply.github.com> Date: Thu, 25 Jan 2024 18:12:31 +0530 Subject: [PATCH 08/11] Resolve: Add nonReentrant modifier to relevant base contract functions #601 (#611) Add nonReentrant to possible reentrant fn calls --- contracts/base/ERC1155SignatureMint.sol | 6 +++--- contracts/base/ERC20SignatureMint.sol | 6 +++--- contracts/base/ERC20SignatureMintVote.sol | 6 +++--- contracts/base/ERC721Multiwrap.sol | 16 +++++++++++++--- contracts/base/ERC721SignatureMint.sol | 6 +++--- contracts/prebuilts/loyalty/LoyaltyCard.sol | 5 ++++- .../english-auctions/EnglishAuctionsLogic.sol | 6 ++++-- contracts/prebuilts/pack/Pack.sol | 2 +- contracts/prebuilts/split/Split.sol | 12 +++++++----- contracts/prebuilts/staking/EditionStake.sol | 2 +- contracts/prebuilts/staking/NFTStake.sol | 2 +- contracts/prebuilts/token/TokenERC1155.sol | 2 +- contracts/prebuilts/token/TokenERC20.sol | 2 +- contracts/prebuilts/token/TokenERC721.sol | 2 +- .../extension/BurnToClaimDrop721Logic.sol | 6 ++++-- 15 files changed, 50 insertions(+), 31 deletions(-) diff --git a/contracts/base/ERC1155SignatureMint.sol b/contracts/base/ERC1155SignatureMint.sol index 3ccee476f..b7a74af24 100644 --- a/contracts/base/ERC1155SignatureMint.sol +++ b/contracts/base/ERC1155SignatureMint.sol @@ -7,7 +7,7 @@ import "./ERC1155Base.sol"; import "../extension/PrimarySale.sol"; import "../extension/SignatureMintERC1155.sol"; - +import { ReentrancyGuard } from "../extension/upgradeable/ReentrancyGuard.sol"; import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; /** @@ -23,7 +23,7 @@ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; * */ -contract ERC1155SignatureMint is ERC1155Base, PrimarySale, SignatureMintERC1155 { +contract ERC1155SignatureMint is ERC1155Base, PrimarySale, SignatureMintERC1155, ReentrancyGuard { /*////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ @@ -52,7 +52,7 @@ contract ERC1155SignatureMint is ERC1155Base, PrimarySale, SignatureMintERC1155 function mintWithSignature( MintRequest calldata _req, bytes calldata _signature - ) external payable virtual override returns (address signer) { + ) external payable virtual override nonReentrant returns (address signer) { require(_req.quantity > 0, "Minting zero tokens."); uint256 tokenIdToMint; diff --git a/contracts/base/ERC20SignatureMint.sol b/contracts/base/ERC20SignatureMint.sol index a3a2a2f00..6090aabd1 100644 --- a/contracts/base/ERC20SignatureMint.sol +++ b/contracts/base/ERC20SignatureMint.sol @@ -7,7 +7,7 @@ import "./ERC20Base.sol"; import "../extension/PrimarySale.sol"; import { SignatureMintERC20 } from "../extension/SignatureMintERC20.sol"; - +import { ReentrancyGuard } from "../extension/upgradeable/ReentrancyGuard.sol"; import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; /** @@ -23,7 +23,7 @@ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; * */ -contract ERC20SignatureMint is ERC20Base, PrimarySale, SignatureMintERC20 { +contract ERC20SignatureMint is ERC20Base, PrimarySale, SignatureMintERC20, ReentrancyGuard { /*////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ @@ -50,7 +50,7 @@ contract ERC20SignatureMint is ERC20Base, PrimarySale, SignatureMintERC20 { function mintWithSignature( MintRequest calldata _req, bytes calldata _signature - ) external payable virtual returns (address signer) { + ) external payable virtual nonReentrant returns (address signer) { require(_req.quantity > 0, "Minting zero tokens."); // Verify and process payload. diff --git a/contracts/base/ERC20SignatureMintVote.sol b/contracts/base/ERC20SignatureMintVote.sol index 80dae73a3..f0d03542e 100644 --- a/contracts/base/ERC20SignatureMintVote.sol +++ b/contracts/base/ERC20SignatureMintVote.sol @@ -7,7 +7,7 @@ import "./ERC20Vote.sol"; import "../extension/PrimarySale.sol"; import { SignatureMintERC20 } from "../extension/SignatureMintERC20.sol"; - +import { ReentrancyGuard } from "../extension/upgradeable/ReentrancyGuard.sol"; import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; /** @@ -23,7 +23,7 @@ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; * */ -contract ERC20SignatureMintVote is ERC20Vote, PrimarySale, SignatureMintERC20 { +contract ERC20SignatureMintVote is ERC20Vote, PrimarySale, SignatureMintERC20, ReentrancyGuard { /*////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ @@ -50,7 +50,7 @@ contract ERC20SignatureMintVote is ERC20Vote, PrimarySale, SignatureMintERC20 { function mintWithSignature( MintRequest calldata _req, bytes calldata _signature - ) external payable virtual returns (address signer) { + ) external payable virtual nonReentrant returns (address signer) { require(_req.quantity > 0, "Minting zero tokens."); // Verify and process payload. diff --git a/contracts/base/ERC721Multiwrap.sol b/contracts/base/ERC721Multiwrap.sol index a2ee916f1..6125b059f 100644 --- a/contracts/base/ERC721Multiwrap.sol +++ b/contracts/base/ERC721Multiwrap.sol @@ -11,6 +11,7 @@ import "../extension/Royalty.sol"; import "../extension/SoulboundERC721A.sol"; import "../extension/TokenStore.sol"; import "../extension/Multicall.sol"; +import { ReentrancyGuard } from "../extension/upgradeable/ReentrancyGuard.sol"; /** * BASE: ERC721Base @@ -26,7 +27,16 @@ import "../extension/Multicall.sol"; * */ -contract ERC721Multiwrap is Multicall, TokenStore, SoulboundERC721A, ERC721A, ContractMetadata, Ownable, Royalty { +contract ERC721Multiwrap is + Multicall, + TokenStore, + SoulboundERC721A, + ERC721A, + ContractMetadata, + Ownable, + Royalty, + ReentrancyGuard +{ /*////////////////////////////////////////////////////////////// Permission control roles //////////////////////////////////////////////////////////////*/ @@ -148,7 +158,7 @@ contract ERC721Multiwrap is Multicall, TokenStore, SoulboundERC721A, ERC721A, Co Token[] calldata _tokensToWrap, string calldata _uriForWrappedToken, address _recipient - ) public payable virtual onlyRoleWithSwitch(MINTER_ROLE) returns (uint256 tokenId) { + ) public payable virtual onlyRoleWithSwitch(MINTER_ROLE) nonReentrant returns (uint256 tokenId) { if (!hasRole(ASSET_ROLE, address(0))) { for (uint256 i = 0; i < _tokensToWrap.length; i += 1) { _checkRole(ASSET_ROLE, _tokensToWrap[i].assetContract); @@ -170,7 +180,7 @@ contract ERC721Multiwrap is Multicall, TokenStore, SoulboundERC721A, ERC721A, Co * @param _tokenId The token Id of the wrapped NFT to unwrap. * @param _recipient The recipient of the underlying ERC1155, ERC721, ERC20 tokens of the wrapped NFT. */ - function unwrap(uint256 _tokenId, address _recipient) public virtual onlyRoleWithSwitch(UNWRAP_ROLE) { + function unwrap(uint256 _tokenId, address _recipient) public virtual onlyRoleWithSwitch(UNWRAP_ROLE) nonReentrant { require(_tokenId < nextTokenIdToMint(), "wrapped NFT DNE."); require(isApprovedOrOwner(msg.sender, _tokenId), "caller not approved for unwrapping."); diff --git a/contracts/base/ERC721SignatureMint.sol b/contracts/base/ERC721SignatureMint.sol index e6ec12e4f..a3b389b00 100644 --- a/contracts/base/ERC721SignatureMint.sol +++ b/contracts/base/ERC721SignatureMint.sol @@ -8,7 +8,7 @@ import "./ERC721Base.sol"; import "../extension/PrimarySale.sol"; import "../extension/PermissionsEnumerable.sol"; import "../extension/SignatureMintERC721.sol"; - +import { ReentrancyGuard } from "../extension/upgradeable/ReentrancyGuard.sol"; import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; /** @@ -24,7 +24,7 @@ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol"; * */ -contract ERC721SignatureMint is ERC721Base, PrimarySale, SignatureMintERC721 { +contract ERC721SignatureMint is ERC721Base, PrimarySale, SignatureMintERC721, ReentrancyGuard { /*////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ @@ -53,7 +53,7 @@ contract ERC721SignatureMint is ERC721Base, PrimarySale, SignatureMintERC721 { function mintWithSignature( MintRequest calldata _req, bytes calldata _signature - ) external payable virtual override returns (address signer) { + ) external payable virtual override nonReentrant returns (address signer) { require(_req.quantity == 1, "quantiy must be 1"); uint256 tokenIdToMint = nextTokenIdToMint(); diff --git a/contracts/prebuilts/loyalty/LoyaltyCard.sol b/contracts/prebuilts/loyalty/LoyaltyCard.sol index 7f986a352..a841aab17 100644 --- a/contracts/prebuilts/loyalty/LoyaltyCard.sol +++ b/contracts/prebuilts/loyalty/LoyaltyCard.sol @@ -158,7 +158,10 @@ contract LoyaltyCard is } /// @dev Lets an account with MINTER_ROLE mint an NFT. Always mints 1 NFT. - function mintTo(address _to, string calldata _uri) external onlyRole(MINTER_ROLE) returns (uint256 tokenIdMinted) { + function mintTo( + address _to, + string calldata _uri + ) external onlyRole(MINTER_ROLE) nonReentrant returns (uint256 tokenIdMinted) { tokenIdMinted = _mintTo(_to, _uri); emit TokensMinted(_to, tokenIdMinted, _uri); } diff --git a/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsLogic.sol b/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsLogic.sol index 66574a050..89a56f756 100644 --- a/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsLogic.sol +++ b/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsLogic.sol @@ -88,7 +88,7 @@ contract EnglishAuctionsLogic is IEnglishAuctions, ReentrancyGuard, ERC2771Conte /// @notice Auction ERC721 or ERC1155 NFTs. function createAuction( AuctionParameters calldata _params - ) external onlyListerRole onlyAssetRole(_params.assetContract) returns (uint256 auctionId) { + ) external onlyListerRole onlyAssetRole(_params.assetContract) nonReentrant returns (uint256 auctionId) { auctionId = _getNextAuctionId(); address auctionCreator = _msgSender(); TokenType tokenType = _getTokenType(_params.assetContract); @@ -181,7 +181,9 @@ contract EnglishAuctionsLogic is IEnglishAuctions, ReentrancyGuard, ERC2771Conte } /// @dev Cancels an auction. - function cancelAuction(uint256 _auctionId) external onlyExistingAuction(_auctionId) onlyAuctionCreator(_auctionId) { + function cancelAuction( + uint256 _auctionId + ) external onlyExistingAuction(_auctionId) onlyAuctionCreator(_auctionId) nonReentrant { Auction memory _targetAuction = _englishAuctionsStorage().auctions[_auctionId]; Bid memory _winningBid = _englishAuctionsStorage().winningBid[_auctionId]; diff --git a/contracts/prebuilts/pack/Pack.sol b/contracts/prebuilts/pack/Pack.sol index 0b427bc75..cdd9f2ef7 100644 --- a/contracts/prebuilts/pack/Pack.sol +++ b/contracts/prebuilts/pack/Pack.sol @@ -270,7 +270,7 @@ contract Pack is } /// @notice Lets a pack owner open packs and receive the packs' reward units. - function openPack(uint256 _packId, uint256 _amountToOpen) external returns (Token[] memory) { + function openPack(uint256 _packId, uint256 _amountToOpen) external nonReentrant returns (Token[] memory) { address opener = _msgSender(); require(isTrustedForwarder(msg.sender) || opener == tx.origin, "!EOA"); diff --git a/contracts/prebuilts/split/Split.sol b/contracts/prebuilts/split/Split.sol index 69bc32bcd..028f5a0ee 100644 --- a/contracts/prebuilts/split/Split.sol +++ b/contracts/prebuilts/split/Split.sol @@ -25,6 +25,7 @@ import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgrad // Utils import "../../extension/Multicall.sol"; import "../../lib/FeeType.sol"; +import "../../extension/upgradeable/ReentrancyGuard.sol"; contract Split is IThirdwebContract, @@ -32,7 +33,8 @@ contract Split is Multicall, ERC2771ContextUpgradeable, AccessControlEnumerableUpgradeable, - PaymentSplitterUpgradeable + PaymentSplitterUpgradeable, + ReentrancyGuard { bytes32 private constant MODULE_TYPE = bytes32("Split"); uint128 private constant VERSION = 1; @@ -76,7 +78,7 @@ contract Split is * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ - function release(address payable account) public virtual override { + function release(address payable account) public virtual override nonReentrant { uint256 payment = _release(account); require(payment != 0, "PaymentSplitter: account is not due payment"); } @@ -86,7 +88,7 @@ contract Split is * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ - function release(IERC20Upgradeable token, address account) public virtual override { + function release(IERC20Upgradeable token, address account) public virtual override nonReentrant { uint256 payment = _release(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); } @@ -134,7 +136,7 @@ contract Split is /** * @dev Release the owed amount of token to all of the payees. */ - function distribute() public virtual { + function distribute() public virtual nonReentrant { uint256 count = payeeCount(); for (uint256 i = 0; i < count; i++) { _release(payable(payee(i))); @@ -144,7 +146,7 @@ contract Split is /** * @dev Release owed amount of the `token` to all of the payees. */ - function distribute(IERC20Upgradeable token) public virtual { + function distribute(IERC20Upgradeable token) public virtual nonReentrant { uint256 count = payeeCount(); for (uint256 i = 0; i < count; i++) { _release(token, payee(i)); diff --git a/contracts/prebuilts/staking/EditionStake.sol b/contracts/prebuilts/staking/EditionStake.sol index 67f8aea42..9f5375bbc 100644 --- a/contracts/prebuilts/staking/EditionStake.sol +++ b/contracts/prebuilts/staking/EditionStake.sol @@ -115,7 +115,7 @@ contract EditionStake is } /// @dev Admin can withdraw excess reward tokens. - function withdrawRewardTokens(uint256 _amount) external { + function withdrawRewardTokens(uint256 _amount) external nonReentrant { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Not authorized"); // to prevent locking of direct-transferred tokens diff --git a/contracts/prebuilts/staking/NFTStake.sol b/contracts/prebuilts/staking/NFTStake.sol index 32d5a6f9d..c50794ffc 100644 --- a/contracts/prebuilts/staking/NFTStake.sol +++ b/contracts/prebuilts/staking/NFTStake.sol @@ -115,7 +115,7 @@ contract NFTStake is } /// @dev Admin can withdraw excess reward tokens. - function withdrawRewardTokens(uint256 _amount) external { + function withdrawRewardTokens(uint256 _amount) external nonReentrant { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Not authorized"); // to prevent locking of direct-transferred tokens diff --git a/contracts/prebuilts/token/TokenERC1155.sol b/contracts/prebuilts/token/TokenERC1155.sol index f3a167802..8856ebf64 100644 --- a/contracts/prebuilts/token/TokenERC1155.sol +++ b/contracts/prebuilts/token/TokenERC1155.sol @@ -215,7 +215,7 @@ contract TokenERC1155 is uint256 _tokenId, string calldata _uri, uint256 _amount - ) external onlyRole(MINTER_ROLE) { + ) external nonReentrant onlyRole(MINTER_ROLE) { uint256 tokenIdToMint; if (_tokenId == type(uint256).max) { tokenIdToMint = nextTokenIdToMint; diff --git a/contracts/prebuilts/token/TokenERC20.sol b/contracts/prebuilts/token/TokenERC20.sol index ade523599..79f747378 100644 --- a/contracts/prebuilts/token/TokenERC20.sol +++ b/contracts/prebuilts/token/TokenERC20.sol @@ -161,7 +161,7 @@ contract TokenERC20 is * * - the caller must have the `MINTER_ROLE`. */ - function mintTo(address to, uint256 amount) public virtual { + function mintTo(address to, uint256 amount) public virtual nonReentrant { require(hasRole(MINTER_ROLE, _msgSender()), "not minter."); _mintTo(to, amount); } diff --git a/contracts/prebuilts/token/TokenERC721.sol b/contracts/prebuilts/token/TokenERC721.sol index 7f710afa9..f8011785e 100644 --- a/contracts/prebuilts/token/TokenERC721.sol +++ b/contracts/prebuilts/token/TokenERC721.sol @@ -191,7 +191,7 @@ contract TokenERC721 is } /// @dev Lets an account with MINTER_ROLE mint an NFT. - function mintTo(address _to, string calldata _uri) external onlyRole(MINTER_ROLE) returns (uint256) { + function mintTo(address _to, string calldata _uri) external nonReentrant onlyRole(MINTER_ROLE) returns (uint256) { // `_mintTo` is re-used. `mintTo` just adds a minter role check. return _mintTo(_to, _uri); } diff --git a/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Logic.sol b/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Logic.sol index 77a14a5b9..80d1411f6 100644 --- a/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Logic.sol +++ b/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Logic.sol @@ -33,6 +33,7 @@ import { ContractMetadata } from "../../../../extension/upgradeable/ContractMeta import { Ownable } from "../../../../extension/upgradeable/Ownable.sol"; import { PermissionsStorage } from "../../../../extension/upgradeable/Permissions.sol"; import { BurnToClaim, BurnToClaimStorage } from "../../../../extension/upgradeable/BurnToClaim.sol"; +import { ReentrancyGuard } from "../../../../extension/upgradeable/ReentrancyGuard.sol"; contract BurnToClaimDrop721Logic is ContractMetadata, @@ -45,7 +46,8 @@ contract BurnToClaimDrop721Logic is LazyMint, Drop, ERC2771ContextUpgradeable, - ERC721AUpgradeable + ERC721AUpgradeable, + ReentrancyGuard { using Strings for uint256; @@ -137,7 +139,7 @@ contract BurnToClaimDrop721Logic is //////////////////////////////////////////////////////////////*/ /// @notice Claim lazy minted tokens after burning required tokens from origin contract. - function burnAndClaim(uint256 _burnTokenId, uint256 _quantity) external payable { + function burnAndClaim(uint256 _burnTokenId, uint256 _quantity) external payable nonReentrant { _checkTokenSupply(_quantity); // Verify and burn tokens on origin contract From effd208da8de40a275d18408013f54709d071ef6 Mon Sep 17 00:00:00 2001 From: Yash <72552910+kumaryash90@users.noreply.github.com> Date: Fri, 26 Jan 2024 23:12:03 +0530 Subject: [PATCH 09/11] OpenEditionERC721 flat platform fee (#614) * OpenEditionERC721 with flat fee * flat fee support OE * fix tests --- .../open-edition/OpenEditionERC721FlatFee.sol | 290 +++++++ src/test/OpenEditionERC721FlatFee.t.sol | 796 ++++++++++++++++++ .../_beforeTokenTransfers.t.sol | 63 ++ .../_beforeTokenTransfers.tree | 12 + .../_canSetFunctions/_canSetFunctions.t.sol | 130 +++ .../_canSetFunctions/_canSetFunctions.tree | 39 + .../_collectPriceOnClaim.t.sol | 209 +++++ .../_collectPriceOnClaim.tree | 37 + .../_transferTokensOnClaim.t.sol | 98 +++ .../_transferTokensOnClaim.tree | 8 + .../initialize/initialize.t.sol | 255 ++++++ .../initialize/initialize.tree | 39 + .../open-edition-flat-fee/misc/misc.t.sol | 233 +++++ src/test/open-edition-flat-fee/misc/misc.tree | 33 + 14 files changed, 2242 insertions(+) create mode 100644 contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol create mode 100644 src/test/OpenEditionERC721FlatFee.t.sol create mode 100644 src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.t.sol create mode 100644 src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.tree create mode 100644 src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.t.sol create mode 100644 src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.tree create mode 100644 src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.t.sol create mode 100644 src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.tree create mode 100644 src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.t.sol create mode 100644 src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.tree create mode 100644 src/test/open-edition-flat-fee/initialize/initialize.t.sol create mode 100644 src/test/open-edition-flat-fee/initialize/initialize.tree create mode 100644 src/test/open-edition-flat-fee/misc/misc.t.sol create mode 100644 src/test/open-edition-flat-fee/misc/misc.tree diff --git a/contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol b/contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol new file mode 100644 index 000000000..4ad26f927 --- /dev/null +++ b/contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol @@ -0,0 +1,290 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.11; + +/// @author thirdweb + +// $$\ $$\ $$\ $$\ $$\ +// $$ | $$ | \__| $$ | $$ | +// $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\ +// \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\ +// $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ | +// $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ | +// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ | +// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/ + +// ========== External imports ========== + +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol"; + +import "../../eip/queryable/ERC721AQueryableUpgradeable.sol"; + +// ========== Internal imports ========== + +import "../../external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol"; +import "../../lib/CurrencyTransferLib.sol"; + +// ========== Features ========== + +import "../../extension/Multicall.sol"; +import "../../extension/ContractMetadata.sol"; +import "../../extension/Royalty.sol"; +import "../../extension/PrimarySale.sol"; +import "../../extension/Ownable.sol"; +import "../../extension/SharedMetadata.sol"; +import "../../extension/PermissionsEnumerable.sol"; +import "../../extension/Drop.sol"; +import "../../extension/PlatformFee.sol"; + +contract OpenEditionERC721FlatFee is + Initializable, + ContractMetadata, + PlatformFee, + Royalty, + PrimarySale, + Ownable, + SharedMetadata, + PermissionsEnumerable, + Drop, + ERC2771ContextUpgradeable, + Multicall, + ERC721AQueryableUpgradeable +{ + using StringsUpgradeable for uint256; + + /*/////////////////////////////////////////////////////////////// + State variables + //////////////////////////////////////////////////////////////*/ + + /// @dev Only transfers to or from TRANSFER_ROLE holders are valid, when transfers are restricted. + bytes32 private transferRole; + /// @dev Only MINTER_ROLE holders can update the shared metadata of tokens. + bytes32 private minterRole; + + /// @dev Max bps in the thirdweb system. + uint256 private constant MAX_BPS = 10_000; + + /*/////////////////////////////////////////////////////////////// + Constructor + initializer logic + //////////////////////////////////////////////////////////////*/ + + constructor() initializer {} + + /// @dev Initializes the contract, like a constructor. + function initialize( + address _defaultAdmin, + string memory _name, + string memory _symbol, + string memory _contractURI, + address[] memory _trustedForwarders, + address _saleRecipient, + address _royaltyRecipient, + uint128 _royaltyBps, + uint128 _platformFeeBps, + address _platformFeeRecipient + ) external initializerERC721A initializer { + bytes32 _transferRole = keccak256("TRANSFER_ROLE"); + bytes32 _minterRole = keccak256("MINTER_ROLE"); + + // Initialize inherited contracts, most base-like -> most derived. + __ERC2771Context_init(_trustedForwarders); + __ERC721A_init(_name, _symbol); + + _setupContractURI(_contractURI); + _setupOwner(_defaultAdmin); + + _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); + _setupRole(_minterRole, _defaultAdmin); + _setupRole(_transferRole, _defaultAdmin); + _setupRole(_transferRole, address(0)); + + _setupPlatformFeeInfo(_platformFeeRecipient, _platformFeeBps); + _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps); + _setupPrimarySaleRecipient(_saleRecipient); + + transferRole = _transferRole; + minterRole = _minterRole; + } + + /*/////////////////////////////////////////////////////////////// + ERC 165 / 721 / 2981 logic + //////////////////////////////////////////////////////////////*/ + + /// @dev Returns the URI for a given tokenId. + function tokenURI( + uint256 _tokenId + ) public view virtual override(ERC721AUpgradeable, IERC721AUpgradeable) returns (string memory) { + if (!_exists(_tokenId)) { + revert("!ID"); + } + + return _getURIFromSharedMetadata(_tokenId); + } + + /// @dev See ERC 165 + function supportsInterface( + bytes4 interfaceId + ) public view virtual override(ERC721AUpgradeable, IERC165, IERC721AUpgradeable) returns (bool) { + return super.supportsInterface(interfaceId) || type(IERC2981Upgradeable).interfaceId == interfaceId; + } + + /// @dev The start token ID for the contract. + function _startTokenId() internal pure override returns (uint256) { + return 1; + } + + function startTokenId() public pure returns (uint256) { + return _startTokenId(); + } + + /*/////////////////////////////////////////////////////////////// + Internal functions + //////////////////////////////////////////////////////////////*/ + + /// @dev Collects and distributes the primary sale value of NFTs being claimed. + function _collectPriceOnClaim( + address _primarySaleRecipient, + uint256 _quantityToClaim, + address _currency, + uint256 _pricePerToken + ) internal override { + if (_pricePerToken == 0) { + require(msg.value == 0, "!Value"); + return; + } + + uint256 totalPrice = _quantityToClaim * _pricePerToken; + uint256 platformFees; + address platformFeeRecipient; + + if (getPlatformFeeType() == IPlatformFee.PlatformFeeType.Flat) { + (platformFeeRecipient, platformFees) = getFlatPlatformFeeInfo(); + } else { + (address recipient, uint16 platformFeeBps) = getPlatformFeeInfo(); + platformFeeRecipient = recipient; + platformFees = ((totalPrice * platformFeeBps) / MAX_BPS); + } + require(totalPrice >= platformFees, "price less than platform fee"); + + bool validMsgValue; + if (_currency == CurrencyTransferLib.NATIVE_TOKEN) { + validMsgValue = msg.value == totalPrice; + } else { + validMsgValue = msg.value == 0; + } + require(validMsgValue, "!V"); + + address saleRecipient = _primarySaleRecipient == address(0) ? primarySaleRecipient() : _primarySaleRecipient; + + CurrencyTransferLib.transferCurrency(_currency, _msgSender(), platformFeeRecipient, platformFees); + CurrencyTransferLib.transferCurrency(_currency, _msgSender(), saleRecipient, totalPrice - platformFees); + } + + /// @dev Transfers the NFTs being claimed. + function _transferTokensOnClaim( + address _to, + uint256 _quantityBeingClaimed + ) internal override returns (uint256 startTokenId_) { + startTokenId_ = _nextTokenId(); + _safeMint(_to, _quantityBeingClaimed); + } + + /// @dev Checks whether primary sale recipient can be set in the given execution context. + function _canSetPrimarySaleRecipient() internal view override returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /// @dev Checks whether owner can be set in the given execution context. + function _canSetOwner() internal view override returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /// @dev Checks whether royalty info can be set in the given execution context. + function _canSetRoyaltyInfo() internal view override returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /// @dev Checks whether contract metadata can be set in the given execution context. + function _canSetContractURI() internal view override returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /// @dev Checks whether platform fee info can be set in the given execution context. + function _canSetClaimConditions() internal view override returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /// @dev Returns whether the shared metadata of tokens can be set in the given execution context. + function _canSetSharedMetadata() internal view virtual override returns (bool) { + return hasRole(minterRole, _msgSender()); + } + + /// @dev Checks whether platform fee info can be set in the given execution context. + function _canSetPlatformFeeInfo() internal view override returns (bool) { + return hasRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /*/////////////////////////////////////////////////////////////// + Miscellaneous + //////////////////////////////////////////////////////////////*/ + + /** + * Returns the total amount of tokens minted in the contract. + */ + function totalMinted() external view returns (uint256) { + unchecked { + return _nextTokenId() - _startTokenId(); + } + } + + /// @dev The tokenId of the next NFT that will be minted / lazy minted. + function nextTokenIdToMint() external view returns (uint256) { + return _nextTokenId(); + } + + /// @dev The next token ID of the NFT that can be claimed. + function nextTokenIdToClaim() external view returns (uint256) { + return _nextTokenId(); + } + + /// @dev Burns `tokenId`. See {ERC721-_burn}. + function burn(uint256 tokenId) external virtual { + // note: ERC721AUpgradeable's `_burn(uint256,bool)` internally checks for token approvals. + _burn(tokenId, true); + } + + /// @dev See {ERC721-_beforeTokenTransfer}. + function _beforeTokenTransfers( + address from, + address to, + uint256 startTokenId_, + uint256 quantity + ) internal virtual override { + super._beforeTokenTransfers(from, to, startTokenId_, quantity); + + // if transfer is restricted on the contract, we still want to allow burning and minting + if (!hasRole(transferRole, address(0)) && from != address(0) && to != address(0)) { + if (!hasRole(transferRole, from) && !hasRole(transferRole, to)) { + revert("!T"); + } + } + } + + function _dropMsgSender() internal view virtual override returns (address) { + return _msgSender(); + } + + function _msgSenderERC721A() internal view virtual override returns (address) { + return _msgSender(); + } + + function _msgSender() + internal + view + virtual + override(ERC2771ContextUpgradeable, Multicall) + returns (address sender) + { + return ERC2771ContextUpgradeable._msgSender(); + } +} diff --git a/src/test/OpenEditionERC721FlatFee.t.sol b/src/test/OpenEditionERC721FlatFee.t.sol new file mode 100644 index 000000000..4c94b0ae7 --- /dev/null +++ b/src/test/OpenEditionERC721FlatFee.t.sol @@ -0,0 +1,796 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import { ERC721AUpgradeable, OpenEditionERC721FlatFee, ISharedMetadata } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { NFTMetadataRenderer } from "contracts/lib/NFTMetadataRenderer.sol"; +import { TWProxy } from "contracts/infra/TWProxy.sol"; + +// Test imports +import "erc721a-upgradeable/contracts/IERC721AUpgradeable.sol"; +import "./utils/BaseTest.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; + +contract OpenEditionERC721FlatFeeTest is BaseTest { + using Strings for uint256; + using Strings for address; + + event SharedMetadataUpdated(string name, string description, string imageURI, string animationURI); + + OpenEditionERC721FlatFee public openEdition; + ISharedMetadata.SharedMetadataInfo public sharedMetadata; + + bytes private emptyEncodedBytes = abi.encode("", ""); + + using stdStorage for StdStorage; + + function setUp() public override { + super.setUp(); + address openEditionImpl = address(new OpenEditionERC721FlatFee()); + + vm.prank(deployer); + openEdition = OpenEditionERC721FlatFee( + address( + new TWProxy( + openEditionImpl, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient + ) + ) + ) + ) + ); + + sharedMetadata = ISharedMetadata.SharedMetadataInfo({ + name: "Test", + description: "Test", + imageURI: "https://test.com", + animationURI: "https://test.com" + }); + + erc20.mint(deployer, 1_000 ether); + vm.deal(deployer, 1_000 ether); + } + + /*/////////////////////////////////////////////////////////////// + Unit tests: misc. + //////////////////////////////////////////////////////////////*/ + + /** + * note: Tests whether contract reverts when a non-holder renounces a role. + */ + function test_revert_nonHolder_renounceRole() public { + address caller = address(0x123); + bytes32 role = keccak256("MINTER_ROLE"); + + vm.prank(caller); + vm.expectRevert( + abi.encodePacked( + "Permissions: account ", + Strings.toHexString(uint160(caller), 20), + " is missing role ", + Strings.toHexString(uint256(role), 32) + ) + ); + + openEdition.renounceRole(role, caller); + } + + /** + * note: Tests whether contract reverts when a role admin revokes a role for a non-holder. + */ + function test_revert_revokeRoleForNonHolder() public { + address target = address(0x123); + bytes32 role = keccak256("MINTER_ROLE"); + + vm.prank(deployer); + vm.expectRevert( + abi.encodePacked( + "Permissions: account ", + Strings.toHexString(uint160(target), 20), + " is missing role ", + Strings.toHexString(uint256(role), 32) + ) + ); + + openEdition.revokeRole(role, target); + } + + /** + * @dev Tests whether contract reverts when a role is granted to an existent role holder. + */ + function test_revert_grant_role_to_account_with_role() public { + bytes32 role = keccak256("ABC_ROLE"); + address receiver = getActor(0); + + vm.startPrank(deployer); + + openEdition.grantRole(role, receiver); + + vm.expectRevert("Can only grant to non holders"); + openEdition.grantRole(role, receiver); + + vm.stopPrank(); + } + + /** + * @dev Tests contract state for Transfer role. + */ + function test_state_grant_transferRole() public { + bytes32 role = keccak256("TRANSFER_ROLE"); + + // check if admin and address(0) have transfer role in the beginning + bool checkAddressZero = openEdition.hasRole(role, address(0)); + bool checkAdmin = openEdition.hasRole(role, deployer); + assertTrue(checkAddressZero); + assertTrue(checkAdmin); + + // check if transfer role can be granted to a non-holder + address receiver = getActor(0); + vm.startPrank(deployer); + openEdition.grantRole(role, receiver); + + // expect revert when granting to a holder + vm.expectRevert("Can only grant to non holders"); + openEdition.grantRole(role, receiver); + + // check if receiver has transfer role + bool checkReceiver = openEdition.hasRole(role, receiver); + assertTrue(checkReceiver); + + // check if role is correctly revoked + openEdition.revokeRole(role, receiver); + checkReceiver = openEdition.hasRole(role, receiver); + assertFalse(checkReceiver); + openEdition.revokeRole(role, address(0)); + checkAddressZero = openEdition.hasRole(role, address(0)); + assertFalse(checkAddressZero); + + vm.stopPrank(); + } + + /** + * note: Testing transfer of tokens when transfer-role is restricted + */ + function test_claim_transferRole() public { + vm.warp(1); + + address receiver = getActor(0); + bytes32[] memory proofs = new bytes32[](0); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 100; + conditions[0].quantityLimitPerWallet = 100; + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + vm.prank(getActor(5), getActor(5)); + openEdition.claim(receiver, 1, address(0), 0, alp, ""); + + // revoke transfer role from address(0) + vm.prank(deployer); + openEdition.revokeRole(keccak256("TRANSFER_ROLE"), address(0)); + vm.startPrank(receiver); + vm.expectRevert(bytes("!T")); + openEdition.transferFrom(receiver, address(123), 1); + } + + function test_claimCondition_with_startTimestamp() public { + vm.warp(1); + + address receiver = getActor(0); + bytes32[] memory proofs = new bytes32[](0); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].startTimestamp = 100; + conditions[0].maxClaimableSupply = 100; + conditions[0].quantityLimitPerWallet = 100; + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + vm.warp(99); + vm.prank(getActor(5), getActor(5)); + vm.expectRevert("!CONDITION."); + openEdition.claim(receiver, 1, address(0), 0, alp, ""); + + vm.warp(100); + vm.prank(getActor(4), getActor(4)); + openEdition.claim(receiver, 1, address(0), 0, alp, ""); + } + + /*/////////////////////////////////////////////////////////////// + Set Shared Metadata Tests + //////////////////////////////////////////////////////////////*/ + + /* + * note: Testing state changes; set shared metadata for tokens. + */ + function test_state_sharedMetadata() public { + // SET METADATA + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + + // CLAIM 1 TOKEN + string[] memory inputs = new string[](5); + + inputs[0] = "node"; + inputs[1] = "src/test/scripts/generateRoot.ts"; + inputs[2] = "300"; + inputs[3] = "0"; + inputs[4] = Strings.toHexString(uint160(address(erc20))); // address of erc20 + + bytes memory result = vm.ffi(inputs); + // revert(); + bytes32 root = abi.decode(result, (bytes32)); + + inputs[1] = "src/test/scripts/getProof.ts"; + result = vm.ffi(inputs); + bytes32[] memory proofs = abi.decode(result, (bytes32[])); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = 300; + alp.pricePerToken = 0; + alp.currency = address(erc20); + + vm.warp(1); + + address receiver = address(0xDDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd); // in allowlist + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 10; + conditions[0].merkleRoot = root; + conditions[0].pricePerToken = 10; + conditions[0].currency = address(erc20); + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + // vm.prank(getActor(5), getActor(5)); + vm.prank(receiver, receiver); + openEdition.claim(receiver, 100, address(erc20), 0, alp, ""); + + string memory uri = openEdition.tokenURI(1); + assertEq( + uri, + NFTMetadataRenderer.createMetadataEdition({ + name: sharedMetadata.name, + description: sharedMetadata.description, + imageURI: sharedMetadata.imageURI, + animationURI: sharedMetadata.animationURI, + tokenOfEdition: 1 + }) + ); + } + + /** + * note: Testing revert condition; an address without MINTER_ROLE calls setSharedMetadata function. + */ + function test_revert_setSharedMetadata_MINTER_ROLE() public { + vm.expectRevert(); + openEdition.setSharedMetadata(sharedMetadata); + } + + /** + * note: Testing event emission; shared metadata set. + */ + function test_event_setSharedMetadata_SharedMetadataUpdated() public { + vm.startPrank(deployer); + + vm.expectEmit(true, false, false, true); + emit SharedMetadataUpdated( + sharedMetadata.name, + sharedMetadata.description, + sharedMetadata.imageURI, + sharedMetadata.animationURI + ); + openEdition.setSharedMetadata(sharedMetadata); + + vm.stopPrank(); + } + + /*/////////////////////////////////////////////////////////////// + Claim Tests + //////////////////////////////////////////////////////////////*/ + + /** + * note: Testing revert condition; exceed max claimable supply. + */ + function test_revert_claimCondition_exceedMaxClaimableSupply() public { + vm.warp(1); + + address receiver = getActor(0); + bytes32[] memory proofs = new bytes32[](0); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 100; + conditions[0].quantityLimitPerWallet = 200; + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + vm.prank(getActor(5), getActor(5)); + openEdition.claim(receiver, 100, address(0), 0, alp, ""); + + vm.expectRevert("!MaxSupply"); + vm.prank(getActor(6), getActor(6)); + openEdition.claim(receiver, 1, address(0), 0, alp, ""); + } + + /** + * note: Testing quantity limit restriction when no allowlist present. + */ + function test_fuzz_claim_noAllowlist(uint256 x) public { + vm.assume(x != 0); + vm.warp(1); + + address receiver = getActor(0); + bytes32[] memory proofs = new bytes32[](0); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = x; + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 100; + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + bytes memory errorQty = "!Qty"; + + vm.prank(getActor(5), getActor(5)); + vm.expectRevert(errorQty); + openEdition.claim(receiver, 0, address(0), 0, alp, ""); + + vm.prank(getActor(5), getActor(5)); + vm.expectRevert(errorQty); + openEdition.claim(receiver, 101, address(0), 0, alp, ""); + + vm.prank(deployer); + openEdition.setClaimConditions(conditions, true); + + vm.prank(getActor(5), getActor(5)); + vm.expectRevert(errorQty); + openEdition.claim(receiver, 101, address(0), 0, alp, ""); + } + + /** + * note: Testing quantity limit restriction + * - allowlist quantity set to some value different than general limit + * - allowlist price set to 0 + */ + function test_state_claim_allowlisted_SetQuantityZeroPrice() public { + string[] memory inputs = new string[](5); + + inputs[0] = "node"; + inputs[1] = "src/test/scripts/generateRoot.ts"; + inputs[2] = "300"; + inputs[3] = "0"; + inputs[4] = Strings.toHexString(uint160(address(erc20))); // address of erc20 + + bytes memory result = vm.ffi(inputs); + // revert(); + bytes32 root = abi.decode(result, (bytes32)); + + inputs[1] = "src/test/scripts/getProof.ts"; + result = vm.ffi(inputs); + bytes32[] memory proofs = abi.decode(result, (bytes32[])); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = 300; + alp.pricePerToken = 0; + alp.currency = address(erc20); + + vm.warp(1); + + address receiver = address(0xDDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd); // in allowlist + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 10; + conditions[0].merkleRoot = root; + conditions[0].pricePerToken = 10; + conditions[0].currency = address(erc20); + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + // vm.prank(getActor(5), getActor(5)); + vm.prank(receiver, receiver); + openEdition.claim(receiver, 100, address(erc20), 0, alp, ""); // claims for free, because allowlist price is 0 + assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), 100); + } + + /** + * note: Testing quantity limit restriction + * - allowlist quantity set to some value different than general limit + * - allowlist price set to non-zero value + */ + function test_state_claim_allowlisted_SetQuantityPrice() public { + string[] memory inputs = new string[](5); + + inputs[0] = "node"; + inputs[1] = "src/test/scripts/generateRoot.ts"; + inputs[2] = "300"; + inputs[3] = "5"; + inputs[4] = Strings.toHexString(uint160(address(erc20))); // address of erc20 + + bytes memory result = vm.ffi(inputs); + // revert(); + bytes32 root = abi.decode(result, (bytes32)); + + inputs[1] = "src/test/scripts/getProof.ts"; + result = vm.ffi(inputs); + bytes32[] memory proofs = abi.decode(result, (bytes32[])); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = 300; + alp.pricePerToken = 5; + alp.currency = address(erc20); + + vm.warp(1); + + address receiver = address(0xDDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd); // in allowlist + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 10; + conditions[0].merkleRoot = root; + conditions[0].pricePerToken = 10; + conditions[0].currency = address(erc20); + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + vm.prank(receiver, receiver); + vm.expectRevert("!PriceOrCurrency"); + openEdition.claim(receiver, 100, address(erc20), 0, alp, ""); + + erc20.mint(receiver, 10000); + vm.prank(receiver); + erc20.approve(address(openEdition), 10000); + + // vm.prank(getActor(5), getActor(5)); + vm.prank(receiver, receiver); + openEdition.claim(receiver, 100, address(erc20), 5, alp, ""); + assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), 100); + assertEq(erc20.balanceOf(receiver), 10000 - 500); + } + + /** + * note: Testing quantity limit restriction + * - allowlist quantity set to some value different than general limit + * - allowlist price not set; should default to general price and currency + */ + function test_state_claim_allowlisted_SetQuantityDefaultPrice() public { + string[] memory inputs = new string[](5); + + inputs[0] = "node"; + inputs[1] = "src/test/scripts/generateRoot.ts"; + inputs[2] = "300"; + inputs[3] = Strings.toString(type(uint256).max); // this implies that general price is applicable + inputs[4] = "0x0000000000000000000000000000000000000000"; + + bytes memory result = vm.ffi(inputs); + // revert(); + bytes32 root = abi.decode(result, (bytes32)); + + inputs[1] = "src/test/scripts/getProof.ts"; + result = vm.ffi(inputs); + bytes32[] memory proofs = abi.decode(result, (bytes32[])); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = 300; + alp.pricePerToken = type(uint256).max; + alp.currency = address(0); + + vm.warp(1); + + address receiver = address(0xDDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd); // in allowlist + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 10; + conditions[0].merkleRoot = root; + conditions[0].pricePerToken = 10; + conditions[0].currency = address(erc20); + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + erc20.mint(receiver, 10000); + vm.prank(receiver); + erc20.approve(address(openEdition), 10000); + + // vm.prank(getActor(5), getActor(5)); + vm.prank(receiver, receiver); + openEdition.claim(receiver, 100, address(erc20), 10, alp, ""); + assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), 100); + assertEq(erc20.balanceOf(receiver), 10000 - 1000); + } + + /** + * note: Testing quantity limit restriction + * - allowlist quantity set to 0 => should default to general limit + * - allowlist price set to some value different than general price + */ + function test_state_claim_allowlisted_DefaultQuantitySomePrice() public { + string[] memory inputs = new string[](5); + + inputs[0] = "node"; + inputs[1] = "src/test/scripts/generateRoot.ts"; + inputs[2] = "0"; // this implies that general limit is applicable + inputs[3] = "5"; + inputs[4] = "0x0000000000000000000000000000000000000000"; // general currency will be applicable + + bytes memory result = vm.ffi(inputs); + // revert(); + bytes32 root = abi.decode(result, (bytes32)); + + inputs[1] = "src/test/scripts/getProof.ts"; + result = vm.ffi(inputs); + bytes32[] memory proofs = abi.decode(result, (bytes32[])); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = 0; + alp.pricePerToken = 5; + alp.currency = address(0); + + vm.warp(1); + + address receiver = address(0xDDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd); // in allowlist + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 10; + conditions[0].merkleRoot = root; + conditions[0].pricePerToken = 10; + conditions[0].currency = address(erc20); + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + erc20.mint(receiver, 10000); + vm.prank(receiver); + erc20.approve(address(openEdition), 10000); + + bytes memory errorQty = "!Qty"; + vm.prank(receiver, receiver); + vm.expectRevert(errorQty); + openEdition.claim(receiver, 100, address(erc20), 5, alp, ""); // trying to claim more than general limit + + // vm.prank(getActor(5), getActor(5)); + vm.prank(receiver, receiver); + openEdition.claim(receiver, 10, address(erc20), 5, alp, ""); + assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), 10); + assertEq(erc20.balanceOf(receiver), 10000 - 50); + } + + function test_fuzz_claim_merkleProof(uint256 x) public { + vm.assume(x > 10 && x < 500); + string[] memory inputs = new string[](5); + + inputs[0] = "node"; + inputs[1] = "src/test/scripts/generateRoot.ts"; + inputs[2] = Strings.toString(x); + inputs[3] = "0"; + inputs[4] = "0x0000000000000000000000000000000000000000"; + + bytes memory result = vm.ffi(inputs); + // revert(); + bytes32 root = abi.decode(result, (bytes32)); + + inputs[1] = "src/test/scripts/getProof.ts"; + result = vm.ffi(inputs); + bytes32[] memory proofs = abi.decode(result, (bytes32[])); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = x; + alp.pricePerToken = 0; + alp.currency = address(0); + + vm.warp(1); + + address receiver = address(0xDDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd); + + // bytes32[] memory proofs = new bytes32[](0); + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = x; + conditions[0].quantityLimitPerWallet = 1; + conditions[0].merkleRoot = root; + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + // vm.prank(getActor(5), getActor(5)); + vm.prank(receiver, receiver); + openEdition.claim(receiver, x - 5, address(0), 0, alp, ""); + assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), x - 5); + + bytes memory errorQty = "!Qty"; + + vm.prank(receiver, receiver); + vm.expectRevert(errorQty); + openEdition.claim(receiver, 6, address(0), 0, alp, ""); + + vm.prank(receiver, receiver); + openEdition.claim(receiver, 5, address(0), 0, alp, ""); + assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), x); + + vm.prank(receiver, receiver); + vm.expectRevert(errorQty); + openEdition.claim(receiver, 5, address(0), 0, alp, ""); // quantity limit already claimed + } + + /** + * note: Testing state changes; reset eligibility of claim conditions and claiming again for same condition id. + */ + function test_state_claimCondition_resetEligibility() public { + vm.warp(1); + + address receiver = getActor(0); + bytes32[] memory proofs = new bytes32[](0); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 100; + + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + vm.prank(getActor(5), getActor(5)); + openEdition.claim(receiver, 100, address(0), 0, alp, ""); + + bytes memory errorQty = "!Qty"; + + vm.prank(getActor(5), getActor(5)); + vm.expectRevert(errorQty); + openEdition.claim(receiver, 100, address(0), 0, alp, ""); + + vm.prank(deployer); + openEdition.setClaimConditions(conditions, true); + + vm.prank(getActor(5), getActor(5)); + openEdition.claim(receiver, 100, address(0), 0, alp, ""); + } + + /*/////////////////////////////////////////////////////////////// + setClaimConditions + //////////////////////////////////////////////////////////////*/ + + function test_claimCondition_startIdAndCount() public { + vm.startPrank(deployer); + + uint256 currentStartId = 0; + uint256 count = 0; + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](2); + conditions[0].startTimestamp = 0; + conditions[0].maxClaimableSupply = 10; + conditions[1].startTimestamp = 1; + conditions[1].maxClaimableSupply = 10; + + openEdition.setClaimConditions(conditions, false); + (currentStartId, count) = openEdition.claimCondition(); + assertEq(currentStartId, 0); + assertEq(count, 2); + + openEdition.setClaimConditions(conditions, false); + (currentStartId, count) = openEdition.claimCondition(); + assertEq(currentStartId, 0); + assertEq(count, 2); + + openEdition.setClaimConditions(conditions, true); + (currentStartId, count) = openEdition.claimCondition(); + assertEq(currentStartId, 2); + assertEq(count, 2); + + openEdition.setClaimConditions(conditions, true); + (currentStartId, count) = openEdition.claimCondition(); + assertEq(currentStartId, 4); + assertEq(count, 2); + } + + function test_claimCondition_startPhase() public { + vm.startPrank(deployer); + + uint256 activeConditionId = 0; + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](3); + conditions[0].startTimestamp = 10; + conditions[0].maxClaimableSupply = 11; + conditions[0].quantityLimitPerWallet = 12; + conditions[1].startTimestamp = 20; + conditions[1].maxClaimableSupply = 21; + conditions[1].quantityLimitPerWallet = 22; + conditions[2].startTimestamp = 30; + conditions[2].maxClaimableSupply = 31; + conditions[2].quantityLimitPerWallet = 32; + openEdition.setClaimConditions(conditions, false); + + vm.expectRevert("!CONDITION."); + openEdition.getActiveClaimConditionId(); + + vm.warp(10); + activeConditionId = openEdition.getActiveClaimConditionId(); + assertEq(activeConditionId, 0); + assertEq(openEdition.getClaimConditionById(activeConditionId).startTimestamp, 10); + assertEq(openEdition.getClaimConditionById(activeConditionId).maxClaimableSupply, 11); + assertEq(openEdition.getClaimConditionById(activeConditionId).quantityLimitPerWallet, 12); + + vm.warp(20); + activeConditionId = openEdition.getActiveClaimConditionId(); + assertEq(activeConditionId, 1); + assertEq(openEdition.getClaimConditionById(activeConditionId).startTimestamp, 20); + assertEq(openEdition.getClaimConditionById(activeConditionId).maxClaimableSupply, 21); + assertEq(openEdition.getClaimConditionById(activeConditionId).quantityLimitPerWallet, 22); + + vm.warp(30); + activeConditionId = openEdition.getActiveClaimConditionId(); + assertEq(activeConditionId, 2); + assertEq(openEdition.getClaimConditionById(activeConditionId).startTimestamp, 30); + assertEq(openEdition.getClaimConditionById(activeConditionId).maxClaimableSupply, 31); + assertEq(openEdition.getClaimConditionById(activeConditionId).quantityLimitPerWallet, 32); + + vm.warp(40); + assertEq(openEdition.getActiveClaimConditionId(), 2); + } +} diff --git a/src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.t.sol b/src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.t.sol new file mode 100644 index 000000000..4ea304d13 --- /dev/null +++ b/src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.t.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import { OpenEditionERC721FlatFee } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { TWProxy } from "contracts/infra/TWProxy.sol"; + +// Test imports +import "src/test/utils/BaseTest.sol"; + +contract OpenEditionERC721FlatFeeHarness is OpenEditionERC721FlatFee { + function beforeTokenTransfers(address from, address to, uint256 startTokenId_, uint256 quantity) public { + _beforeTokenTransfers(from, to, startTokenId_, quantity); + } +} + +contract OpenEditionERC721FlatFeeTest_beforeTokenTransfers is BaseTest { + OpenEditionERC721FlatFeeHarness public openEdition; + + address private openEditionImpl; + + function setUp() public override { + super.setUp(); + openEditionImpl = address(new OpenEditionERC721FlatFeeHarness()); + vm.prank(deployer); + openEdition = OpenEditionERC721FlatFeeHarness( + address( + new TWProxy( + openEditionImpl, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient + ) + ) + ) + ) + ); + } + + /*/////////////////////////////////////////////////////////////// + Unit tests: misc + //////////////////////////////////////////////////////////////*/ + + function test_revert_transfersRestricted() public { + address from = address(0x1); + address to = address(0x2); + bytes32 role = keccak256("TRANSFER_ROLE"); + vm.prank(deployer); + openEdition.revokeRole(role, address(0)); + + vm.expectRevert(bytes("!T")); + openEdition.beforeTokenTransfers(from, to, 0, 1); + } +} diff --git a/src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.tree b/src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.tree new file mode 100644 index 000000000..078bd6a79 --- /dev/null +++ b/src/test/open-edition-flat-fee/_beforeTokenTransfers/_beforeTokenTransfers.tree @@ -0,0 +1,12 @@ +function _beforeTokenTransfers( + address from, + address to, + uint256 startTokenId_, + uint256 quantity +) +└── when address(0) does not have the transfer role + └── when from does not equal address(0) + └── when to does not equal address(0) + └── when from does not have the transfer role + └── when to does not have the transfer role + └── it should revert ✅ diff --git a/src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.t.sol b/src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.t.sol new file mode 100644 index 000000000..c45ca2514 --- /dev/null +++ b/src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.t.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import { OpenEditionERC721FlatFee } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { TWProxy } from "contracts/infra/TWProxy.sol"; + +// Test imports +import "src/test/utils/BaseTest.sol"; + +contract OpenEditionERC721FlatFeeHarness is OpenEditionERC721FlatFee { + function canSetPrimarySaleRecipient() external view returns (bool) { + return _canSetPrimarySaleRecipient(); + } + + function canSetOwner() external view returns (bool) { + return _canSetOwner(); + } + + /// @dev Checks whether royalty info can be set in the given execution context. + function canSetRoyaltyInfo() external view returns (bool) { + return _canSetRoyaltyInfo(); + } + + /// @dev Checks whether contract metadata can be set in the given execution context. + function canSetContractURI() external view returns (bool) { + return _canSetContractURI(); + } + + /// @dev Checks whether platform fee info can be set in the given execution context. + function canSetClaimConditions() external view returns (bool) { + return _canSetClaimConditions(); + } + + /// @dev Returns whether the shared metadata of tokens can be set in the given execution context. + function canSetSharedMetadata() external view virtual returns (bool) { + return _canSetSharedMetadata(); + } +} + +contract OpenEditionERC721FlatFeeTest_canSetFunctions is BaseTest { + OpenEditionERC721FlatFeeHarness public openEdition; + + address private openEditionImpl; + + function setUp() public override { + super.setUp(); + openEditionImpl = address(new OpenEditionERC721FlatFeeHarness()); + vm.prank(deployer); + openEdition = OpenEditionERC721FlatFeeHarness( + address( + new TWProxy( + openEditionImpl, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient + ) + ) + ) + ) + ); + } + + /*/////////////////////////////////////////////////////////////// + Unit tests: misc + //////////////////////////////////////////////////////////////*/ + + function test_canSetPrimarySaleRecipient_returnTrue() public { + vm.prank(deployer); + assertTrue(openEdition.canSetPrimarySaleRecipient()); + } + + function test_canSetPrimarySaleRecipient_returnFalse() public { + assertFalse(openEdition.canSetPrimarySaleRecipient()); + } + + function test_canSetOwner_returnTrue() public { + vm.prank(deployer); + assertTrue(openEdition.canSetOwner()); + } + + function test_canSetOwner_returnFalse() public { + assertFalse(openEdition.canSetOwner()); + } + + function test_canSetRoyaltyInfo_returnTrue() public { + vm.prank(deployer); + assertTrue(openEdition.canSetRoyaltyInfo()); + } + + function test_canSetRoyaltyInfo_returnFalse() public { + assertFalse(openEdition.canSetRoyaltyInfo()); + } + + function test_canSetContractURI_returnTrue() public { + vm.prank(deployer); + assertTrue(openEdition.canSetContractURI()); + } + + function test_canSetContractURI_returnFalse() public { + assertFalse(openEdition.canSetContractURI()); + } + + function test_canSetClaimConditions_returnTrue() public { + vm.prank(deployer); + assertTrue(openEdition.canSetClaimConditions()); + } + + function test_canSetClaimConditions_returnFalse() public { + assertFalse(openEdition.canSetClaimConditions()); + } + + function test_canSetSharedMetadata_returnTrue() public { + vm.prank(deployer); + assertTrue(openEdition.canSetSharedMetadata()); + } + + function test_canSetSharedMetadata_returnFalse() public { + assertFalse(openEdition.canSetSharedMetadata()); + } +} diff --git a/src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.tree b/src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.tree new file mode 100644 index 000000000..1ccb478fd --- /dev/null +++ b/src/test/open-edition-flat-fee/_canSetFunctions/_canSetFunctions.tree @@ -0,0 +1,39 @@ +function _canSetPrimarySaleRecipient() +├── when _msgSender has DEFAULT_ADMIN_ROLE +│ └── it should return true ✅ +└── when _msgSender does not have DEFAULT_ADMIN_ROLE + └── it should return false ✅ + +function _canSetOwner() +├── when _msgSender has DEFAULT_ADMIN_ROLE +│ └── it should return true ✅ +└── when _msgSender does not have DEFAULT_ADMIN_ROLE + └── it should return false ✅ + + +function _canSetRoyaltyInfo() +├── when _msgSender has DEFAULT_ADMIN_ROLE +│ └── it should return true ✅ +└── when _msgSender does not have DEFAULT_ADMIN_ROLE + └── it should return false ✅ + + +function _canSetContractURI() +├── when _msgSender has DEFAULT_ADMIN_ROLE +│ └── it should return true ✅ +└── when _msgSender does not have DEFAULT_ADMIN_ROLE + └── it should return false ✅ + + +function _canSetClaimConditions() +├── when _msgSender has DEFAULT_ADMIN_ROLE +│ └── it should return true ✅ +└── when _msgSender does not have DEFAULT_ADMIN_ROLE + └── it should return false ✅ + + +function _canSetSharedMetadata() +├── when _msgSender has minter role +│ └── it should return true ✅ +└── when _msgSender does not have minter role + └── it should return false ✅ diff --git a/src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.t.sol b/src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.t.sol new file mode 100644 index 000000000..bc165f600 --- /dev/null +++ b/src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.t.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import { OpenEditionERC721FlatFee } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { TWProxy } from "contracts/infra/TWProxy.sol"; + +// Test imports +import "src/test/utils/BaseTest.sol"; + +contract OpenEditionERC721FlatFeeHarness is OpenEditionERC721FlatFee { + function collectPriceOnClaim( + address _primarySaleRecipient, + uint256 _quantityToClaim, + address _currency, + uint256 _pricePerToken + ) external payable { + _collectPriceOnClaim(_primarySaleRecipient, _quantityToClaim, _currency, _pricePerToken); + } +} + +contract OpenEditionERC721FlatFeeTest_collectPrice is BaseTest { + OpenEditionERC721FlatFeeHarness public openEdition; + + address private openEditionImpl; + + address private currency; + address private primarySaleRecipient; + uint256 private msgValue; + uint256 private pricePerToken; + uint256 private qty = 1; + + function setUp() public override { + super.setUp(); + openEditionImpl = address(new OpenEditionERC721FlatFeeHarness()); + vm.prank(deployer); + openEdition = OpenEditionERC721FlatFeeHarness( + address( + new TWProxy( + openEditionImpl, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient + ) + ) + ) + ) + ); + } + + /*/////////////////////////////////////////////////////////////// + Unit tests: misc + //////////////////////////////////////////////////////////////*/ + + modifier pricePerTokenZero() { + _; + } + + modifier pricePerTokenNotZero() { + pricePerToken = 1 ether; + _; + } + + modifier msgValueZero() { + _; + } + + modifier msgValueNotZero() { + msgValue = 1 ether; + _; + } + + modifier valuePriceMismatch() { + msgValue = 1 ether; + pricePerToken = 2 ether; + _; + } + + modifier primarySaleRecipientZeroAddress() { + primarySaleRecipient = address(0); + _; + } + + modifier primarySaleRecipientNotZeroAddress() { + primarySaleRecipient = address(0x0999); + _; + } + + modifier currencyNativeToken() { + currency = NATIVE_TOKEN; + _; + } + + modifier currencyNotNativeToken() { + currency = address(erc20); + _; + } + + function test_revert_pricePerTokenZeroMsgValueNotZero() public pricePerTokenZero msgValueNotZero { + vm.expectRevert("!Value"); + openEdition.collectPriceOnClaim{ value: msgValue }(primarySaleRecipient, qty, currency, pricePerToken); + } + + function test_revert_nativeCurrencyValuePriceMismatch() public currencyNativeToken valuePriceMismatch { + vm.expectRevert(bytes("!V")); + openEdition.collectPriceOnClaim{ value: msgValue }(primarySaleRecipient, qty, currency, pricePerToken); + } + + function test_revert_erc20ValuePriceMismatch() public currencyNotNativeToken valuePriceMismatch { + vm.expectRevert(bytes("!V")); + openEdition.collectPriceOnClaim{ value: msgValue }(primarySaleRecipient, qty, currency, pricePerToken); + } + + function test_state_nativeCurrency() + public + currencyNativeToken + pricePerTokenNotZero + msgValueNotZero + primarySaleRecipientNotZeroAddress + { + uint256 beforeBalancePrimarySaleRecipient = address(primarySaleRecipient).balance; + + openEdition.collectPriceOnClaim{ value: msgValue }(primarySaleRecipient, qty, currency, pricePerToken); + + uint256 afterBalancePrimarySaleRecipient = address(primarySaleRecipient).balance; + + uint256 platformFeeVal = (msgValue * platformFeeBps) / 10_000; + uint256 primarySaleRecipientVal = msgValue - platformFeeVal; + + assertEq(beforeBalancePrimarySaleRecipient + primarySaleRecipientVal, afterBalancePrimarySaleRecipient); + } + + function test_revert_erc20_msgValueNotZero() + public + currencyNotNativeToken + msgValueNotZero + primarySaleRecipientNotZeroAddress + { + vm.expectRevert("!Value"); + openEdition.collectPriceOnClaim{ value: msgValue }(primarySaleRecipient, qty, currency, pricePerToken); + } + + function test_state_erc20() public currencyNotNativeToken pricePerTokenNotZero primarySaleRecipientNotZeroAddress { + erc20.mint(address(this), pricePerToken); + ERC20(erc20).approve(address(openEdition), pricePerToken); + uint256 beforeBalancePrimarySaleRecipient = erc20.balanceOf(primarySaleRecipient); + + openEdition.collectPriceOnClaim(primarySaleRecipient, qty, currency, pricePerToken); + + uint256 afterBalancePrimarySaleRecipient = erc20.balanceOf(primarySaleRecipient); + + uint256 platformFeeVal = (1 ether * platformFeeBps) / 10_000; + uint256 primarySaleRecipientVal = 1 ether - platformFeeVal; + + assertEq(beforeBalancePrimarySaleRecipient + primarySaleRecipientVal, afterBalancePrimarySaleRecipient); + } + + function test_state_erc20StoredPrimarySaleRecipient() + public + currencyNotNativeToken + pricePerTokenNotZero + primarySaleRecipientZeroAddress + { + address storedPrimarySaleRecipient = openEdition.primarySaleRecipient(); + + erc20.mint(address(this), pricePerToken); + ERC20(erc20).approve(address(openEdition), pricePerToken); + uint256 beforeBalancePrimarySaleRecipient = erc20.balanceOf(storedPrimarySaleRecipient); + + openEdition.collectPriceOnClaim(primarySaleRecipient, qty, currency, pricePerToken); + + uint256 afterBalancePrimarySaleRecipient = erc20.balanceOf(storedPrimarySaleRecipient); + + uint256 platformFeeVal = (1 ether * platformFeeBps) / 10_000; + uint256 primarySaleRecipientVal = 1 ether - platformFeeVal; + + assertEq(beforeBalancePrimarySaleRecipient + primarySaleRecipientVal, afterBalancePrimarySaleRecipient); + } + + function test_state_nativeCurrencyStoredPrimarySaleRecipient() + public + currencyNativeToken + pricePerTokenNotZero + primarySaleRecipientZeroAddress + msgValueNotZero + { + address storedPrimarySaleRecipient = openEdition.primarySaleRecipient(); + + uint256 beforeBalancePrimarySaleRecipient = address(storedPrimarySaleRecipient).balance; + + openEdition.collectPriceOnClaim{ value: msgValue }(primarySaleRecipient, qty, currency, pricePerToken); + + uint256 afterBalancePrimarySaleRecipient = address(storedPrimarySaleRecipient).balance; + + uint256 platformFeeVal = (msgValue * platformFeeBps) / 10_000; + uint256 primarySaleRecipientVal = msgValue - platformFeeVal; + + assertEq(beforeBalancePrimarySaleRecipient + primarySaleRecipientVal, afterBalancePrimarySaleRecipient); + } +} diff --git a/src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.tree b/src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.tree new file mode 100644 index 000000000..2054cf049 --- /dev/null +++ b/src/test/open-edition-flat-fee/_collectPriceOnClaim/_collectPriceOnClaim.tree @@ -0,0 +1,37 @@ +function _collectPriceOnClaim( + address _primarySaleRecipient, + uint256 _quantityToClaim, + address _currency, + uint256 _pricePerToken +) +├── when _pricePerToken is equal to zero +│ ├── when msg.value does not equal to zero +│ │ └── it should revert ✅ +│ └── when msg.value is equal to zero +│ └── it should return ✅ +└── when _pricePerToken is not equal to zero + ├── when _primarySaleRecipient is equal to address(0) + │ ├── when saleRecipient for _tokenId is equal to address(0) + │ │ ├── when currency is native token + │ │ │ ├── when msg.value does not equal totalPrice + │ │ │ │ └── it should revert ✅ + │ │ │ └── when msg.value does equal totalPrice + │ │ │ └── it should transfer totalPrice to primarySaleRecipient in native token ✅ + │ │ └── when currency is not native token + │ │ └── it should transfer totalPrice to primarySaleRecipient in _currency token ✅ + │ └── when salerecipient for _tokenId is not equal to address(0) + │ ├── when currency is native token + │ │ ├── when msg.value does not equal totalPrice + │ │ │ └── it should revert ✅ + │ │ └── when msg.value does equal totalPrice + │ │ └── it should transfer totalPrice to saleRecipient for _tokenId in native token ✅ + │ └── when currency is not native token + │ └── it should transfer totalPrice to saleRecipient for _tokenId in _currency token ✅ + └── when _primarySaleRecipient is not equal to address(0) + ├── when currency is native token + │ ├── when msg.value does not equal totalPrice + │ │ └── it should revert ✅ + │ └── when msg.value does equal totalPrice + │ └── it should transfer totalPrice to _primarySaleRecipient in native token ✅ + └── when currency is not native token + └── it should transfer totalPrice to _primarySaleRecipient in _currency token ✅ \ No newline at end of file diff --git a/src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.t.sol b/src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.t.sol new file mode 100644 index 000000000..681ca6caa --- /dev/null +++ b/src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.t.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import { OpenEditionERC721FlatFee, IERC721AUpgradeable } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { TWProxy } from "contracts/infra/TWProxy.sol"; + +// Test imports +import "src/test/utils/BaseTest.sol"; + +contract OpenEditionERC721FlatFeeHarness is OpenEditionERC721FlatFee { + function transferTokensOnClaim(address _to, uint256 quantityBeingClaimed) public { + _transferTokensOnClaim(_to, quantityBeingClaimed); + } +} + +contract MockERC721Receiver { + function onERC721Received(address, address, uint256, bytes memory) external pure returns (bytes4) { + return this.onERC721Received.selector; + } +} + +contract MockERC721NotReceiver {} + +contract OpenEditionERC721FlatFeeTest_transferTokensOnClaim is BaseTest { + OpenEditionERC721FlatFeeHarness public openEdition; + + MockERC721NotReceiver private notReceiver; + MockERC721Receiver private receiver; + + address private openEditionImpl; + + function setUp() public override { + super.setUp(); + openEditionImpl = address(new OpenEditionERC721FlatFeeHarness()); + vm.prank(deployer); + openEdition = OpenEditionERC721FlatFeeHarness( + address( + new TWProxy( + openEditionImpl, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient + ) + ) + ) + ) + ); + + receiver = new MockERC721Receiver(); + notReceiver = new MockERC721NotReceiver(); + } + + /*/////////////////////////////////////////////////////////////// + Unit tests: misc + //////////////////////////////////////////////////////////////*/ + + function test_revert_TransferToNonReceiverContract() public { + vm.expectRevert(IERC721AUpgradeable.TransferToNonERC721ReceiverImplementer.selector); + openEdition.transferTokensOnClaim(address(notReceiver), 1); + } + + function test_state_transferToReceiverContract() public { + uint256 receiverBalanceBefore = openEdition.balanceOf(address(receiver)); + uint256 nextTokenToMintBefore = openEdition.nextTokenIdToMint(); + + openEdition.transferTokensOnClaim(address(receiver), 1); + + uint256 receiverBalanceAfter = openEdition.balanceOf(address(receiver)); + uint256 nextTokenToMintAfter = openEdition.nextTokenIdToMint(); + + assertEq(receiverBalanceAfter, receiverBalanceBefore + 1); + assertEq(nextTokenToMintAfter, nextTokenToMintBefore + 1); + } + + function test_state_transferToEOA() public { + address to = address(0x01); + uint256 receiverBalanceBefore = openEdition.balanceOf(to); + uint256 nextTokenToMintBefore = openEdition.nextTokenIdToMint(); + + openEdition.transferTokensOnClaim(to, 1); + + uint256 receiverBalanceAfter = openEdition.balanceOf(to); + uint256 nextTokenToMintAfter = openEdition.nextTokenIdToMint(); + + assertEq(receiverBalanceAfter, receiverBalanceBefore + 1); + assertEq(nextTokenToMintAfter, nextTokenToMintBefore + 1); + } +} diff --git a/src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.tree b/src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.tree new file mode 100644 index 000000000..bddcf87f6 --- /dev/null +++ b/src/test/open-edition-flat-fee/_transferTokensOnClaim/_transferTokensOnClaim.tree @@ -0,0 +1,8 @@ +function _transferTokensOnClaim(address _to, uint256 _quantityBeingClaimed) +├── when _to is a smart contract +│ ├── when _to has not implemented ERC721Receiver +│ │ └── it should revert ✅ +│ └── when _to has implemented ERC721Receiver +│ └── it should mint _quantityBeingClaimed tokens to _to ✅ +└── when _to is an EOA + └── it should mint _quantityBeingClaimed tokens to _to ✅ \ No newline at end of file diff --git a/src/test/open-edition-flat-fee/initialize/initialize.t.sol b/src/test/open-edition-flat-fee/initialize/initialize.t.sol new file mode 100644 index 000000000..61c1f3a22 --- /dev/null +++ b/src/test/open-edition-flat-fee/initialize/initialize.t.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import { OpenEditionERC721FlatFee } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { TWProxy } from "contracts/infra/TWProxy.sol"; + +// Test imports +import "src/test/utils/BaseTest.sol"; + +contract OpenEditionERC721FlatFeeTest_initialize is BaseTest { + event ContractURIUpdated(string prevURI, string newURI); + event OwnerUpdated(address indexed prevOwner, address indexed newOwner); + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + event PrimarySaleRecipientUpdated(address indexed recipient); + + OpenEditionERC721FlatFee public openEdition; + + address private openEditionImpl; + + function deployOpenEdition( + address _defaultAdmin, + string memory _name, + string memory _symbol, + string memory _contractURI, + address[] memory _trustedForwarders, + address _saleRecipient, + address _royaltyRecipient, + uint128 _royaltyBps, + uint128 _platformFeeBps, + address _platformFeeRecipient, + address _imp + ) public { + vm.prank(deployer); + openEdition = OpenEditionERC721FlatFee( + address( + new TWProxy( + _imp, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + _defaultAdmin, + _name, + _symbol, + _contractURI, + _trustedForwarders, + _saleRecipient, + _royaltyRecipient, + _royaltyBps, + _platformFeeBps, + _platformFeeRecipient + ) + ) + ) + ) + ); + } + + function setUp() public override { + super.setUp(); + openEditionImpl = address(new OpenEditionERC721FlatFee()); + } + + /*/////////////////////////////////////////////////////////////// + Unit tests: initialize + //////////////////////////////////////////////////////////////*/ + + function test_state() public { + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + + address _saleRecipient = openEdition.primarySaleRecipient(); + (address _royaltyRecipient, uint16 _royaltyBps) = openEdition.getDefaultRoyaltyInfo(); + string memory _name = openEdition.name(); + string memory _symbol = openEdition.symbol(); + string memory _contractURI = openEdition.contractURI(); + address _owner = openEdition.owner(); + + assertEq(_name, NAME); + assertEq(_symbol, SYMBOL); + assertEq(_contractURI, CONTRACT_URI); + assertEq(_saleRecipient, saleRecipient); + assertEq(_royaltyRecipient, royaltyRecipient); + assertEq(_royaltyBps, royaltyBps); + assertEq(_owner, deployer); + + for (uint256 i = 0; i < forwarders().length; i++) { + assertEq(openEdition.isTrustedForwarder(forwarders()[i]), true); + } + + assertTrue(openEdition.hasRole(openEdition.DEFAULT_ADMIN_ROLE(), deployer)); + assertTrue(openEdition.hasRole(keccak256("TRANSFER_ROLE"), deployer)); + assertTrue(openEdition.hasRole(keccak256("MINTER_ROLE"), deployer)); + assertTrue(openEdition.hasRole(keccak256("TRANSFER_ROLE"), address(0))); + } + + function test_revert_RoyaltyTooHigh() public { + uint128 _royaltyBps = 10001; + + vm.expectRevert("Exceeds max bps"); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + _royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } + + function test_event_ContractURIUpdated() public { + vm.expectEmit(false, false, false, true); + emit ContractURIUpdated("", CONTRACT_URI); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } + + function test_event_OwnerUpdated() public { + vm.expectEmit(true, true, false, false); + emit OwnerUpdated(address(0), deployer); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } + + function test_event_TransferRoleAddressZero() public { + bytes32 role = keccak256("TRANSFER_ROLE"); + vm.expectEmit(true, true, false, false); + emit RoleGranted(role, address(0), deployer); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } + + function test_event_TransferRoleAdmin() public { + bytes32 role = keccak256("TRANSFER_ROLE"); + vm.expectEmit(true, true, false, false); + emit RoleGranted(role, deployer, deployer); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } + + function test_event_MinterRoleAdmin() public { + bytes32 role = keccak256("MINTER_ROLE"); + vm.expectEmit(true, true, false, false); + emit RoleGranted(role, deployer, deployer); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } + + function test_event_DefaultAdminRoleAdmin() public { + bytes32 role = bytes32(0x00); + vm.expectEmit(true, true, false, false); + emit RoleGranted(role, deployer, deployer); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } + + function test_event_PrimarysaleRecipientUpdated() public { + vm.expectEmit(true, false, false, false); + emit PrimarySaleRecipientUpdated(saleRecipient); + deployOpenEdition( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient, + openEditionImpl + ); + } +} diff --git a/src/test/open-edition-flat-fee/initialize/initialize.tree b/src/test/open-edition-flat-fee/initialize/initialize.tree new file mode 100644 index 000000000..f56ad144b --- /dev/null +++ b/src/test/open-edition-flat-fee/initialize/initialize.tree @@ -0,0 +1,39 @@ +function initialize( + address _defaultAdmin, + string memory _name, + string memory _symbol, + string memory _contractURI, + address[] memory _trustedForwarders, + address _saleRecipient, + address _royaltyRecipient, + uint128 _royaltyBps, + uint128 _platformFeeBps, + address _platformFeeRecipient +) +├── when _trustedForwarders.length > 0 +│ └── it should set _trustedForwarder[_trustedForwarders[i]] as true for each address in _trustedForwarders ✅ +├── it should set _name as the value provided in _name ✅ +├── it should set _symbol as the value provided in _symbol ✅ +├── it should set _currentIndex as 0 ✅ +├── it should set contractURI as _contractURI ✅ +├── it should emit ContractURIUpdated with the parameters: prevURI, _uri ✅ +├── it should set _defaultAdmin as the owner of the contract ✅ +├── it should emit OwnerUpdated with the parameters: _prevOwner, _defaultAdmin ✅ +├── it should assign the role DEFAULT_ADMIN_ROLE to _defaultAdmin ✅ +├── it should emit RoleGranted with the parameters: DEFAULT_ADMIN_ROLE, _defaultAdmin, msg.sender ✅ +├── it should assign the role _minterRole to _defaultAdmin ✅ +├── it should emit RoleGranted with the parameters: _minterRole, _defaultAdmin, msg.sender ✅ +├── it should assign the role _transferRole to _defaultAdmin ✅ +├── it should emit RoleGranted with the parameters: _transferRole, _defaultAdmin, msg.sender ✅ +├── it should assign the role _transferRole to address(0) ✅ +├── it should emit RoleGranted with the parameters: _transferRole, address(0), msg.sender ✅ +├── when _royaltyBps is greater than 10_000 +│ └── it should revert ✅ +├── when _royaltyBps is less than or equal to 10_000 +│ ├── it should set royaltyRecipient as _royaltyRecipient ✅ +│ ├── it should set royaltyBps as uint16(_royaltyBps) ✅ +│ └── it should emit DefaultRoyalty with the parameters _royaltyRecipient, _royaltyBps +├── it should set recipient as _primarySaleRecipient ✅ +├── it should emit PrimarySaleRecipientUpdated with the parameters _primarySaleRecipient ✅ +├── it should set transferRole as keccak256("TRANSFER_ROLE") ✅ +└── it should set minterRole as keccak256("MINTER_ROLE") ✅ diff --git a/src/test/open-edition-flat-fee/misc/misc.t.sol b/src/test/open-edition-flat-fee/misc/misc.t.sol new file mode 100644 index 000000000..760373600 --- /dev/null +++ b/src/test/open-edition-flat-fee/misc/misc.t.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import { IERC721AUpgradeable, OpenEditionERC721FlatFee, ISharedMetadata } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { NFTMetadataRenderer } from "contracts/lib/NFTMetadataRenderer.sol"; +import { TWProxy } from "contracts/infra/TWProxy.sol"; + +// Test imports +import "src/test/utils/BaseTest.sol"; +import "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol"; + +contract HarnessOpenEditionERC721FlatFee is OpenEditionERC721FlatFee { + function msgData() public view returns (bytes memory) { + return _msgData(); + } +} + +contract OpenEditionERC721FlatFeeTest_misc is BaseTest { + OpenEditionERC721FlatFee public openEdition; + HarnessOpenEditionERC721FlatFee public harnessOpenEdition; + + address private openEditionImpl; + address private harnessImpl; + + address private receiver = 0xDDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd; + + ISharedMetadata.SharedMetadataInfo public sharedMetadata; + + function setUp() public override { + super.setUp(); + openEditionImpl = address(new OpenEditionERC721FlatFee()); + vm.prank(deployer); + openEdition = OpenEditionERC721FlatFee( + address( + new TWProxy( + openEditionImpl, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient + ) + ) + ) + ) + ); + + sharedMetadata = ISharedMetadata.SharedMetadataInfo({ + name: "Test", + description: "Test", + imageURI: "https://test.com", + animationURI: "https://test.com" + }); + } + + function deployHarness() internal { + harnessImpl = address(new HarnessOpenEditionERC721FlatFee()); + harnessOpenEdition = HarnessOpenEditionERC721FlatFee( + address( + new TWProxy( + harnessImpl, + abi.encodeCall( + OpenEditionERC721FlatFee.initialize, + ( + deployer, + NAME, + SYMBOL, + CONTRACT_URI, + forwarders(), + saleRecipient, + royaltyRecipient, + royaltyBps, + platformFeeBps, + platformFeeRecipient + ) + ) + ) + ) + ); + } + + /*/////////////////////////////////////////////////////////////// + Unit tests: misc + //////////////////////////////////////////////////////////////*/ + + modifier claimTokens() { + string[] memory inputs = new string[](5); + + inputs[0] = "node"; + inputs[1] = "src/test/scripts/generateRoot.ts"; + inputs[2] = "300"; + inputs[3] = "0"; + inputs[4] = Strings.toHexString(uint160(address(erc20))); // address of erc20 + + bytes memory result = vm.ffi(inputs); + bytes32 root = abi.decode(result, (bytes32)); + + inputs[1] = "src/test/scripts/getProof.ts"; + result = vm.ffi(inputs); + bytes32[] memory proofs = abi.decode(result, (bytes32[])); + + OpenEditionERC721FlatFee.AllowlistProof memory alp; + alp.proof = proofs; + alp.quantityLimitPerWallet = 300; + alp.pricePerToken = 0; + alp.currency = address(erc20); + + vm.warp(1); + + OpenEditionERC721FlatFee.ClaimCondition[] memory conditions = new OpenEditionERC721FlatFee.ClaimCondition[](1); + conditions[0].maxClaimableSupply = 500; + conditions[0].quantityLimitPerWallet = 10; + conditions[0].merkleRoot = root; + conditions[0].pricePerToken = 10; + conditions[0].currency = address(erc20); + + vm.prank(deployer); + openEdition.setClaimConditions(conditions, false); + + vm.prank(receiver, receiver); + openEdition.claim(receiver, 100, address(erc20), 0, alp, ""); + _; + } + + modifier callerOwner() { + vm.startPrank(receiver); + _; + } + + modifier callerNotOwner() { + _; + } + + function test_tokenURI_revert_tokenDoesNotExist() public { + vm.expectRevert(bytes("!ID")); + openEdition.tokenURI(1); + } + + function test_tokenURI_returnMetadata() public claimTokens { + vm.prank(deployer); + openEdition.setSharedMetadata(sharedMetadata); + + string memory uri = openEdition.tokenURI(1); + assertEq( + uri, + NFTMetadataRenderer.createMetadataEdition({ + name: sharedMetadata.name, + description: sharedMetadata.description, + imageURI: sharedMetadata.imageURI, + animationURI: sharedMetadata.animationURI, + tokenOfEdition: 1 + }) + ); + } + + function test_startTokenId_returnOne() public { + assertEq(openEdition.startTokenId(), 1); + } + + function test_totalMinted_returnZero() public { + assertEq(openEdition.totalMinted(), 0); + } + + function test_totalMinted_returnOneHundred() public claimTokens { + assertEq(openEdition.totalMinted(), 100); + } + + function test_nextTokenIdToMint_returnOne() public { + assertEq(openEdition.nextTokenIdToMint(), 1); + } + + function test_nextTokenIdToMint_returnOneHundredAndOne() public claimTokens { + assertEq(openEdition.nextTokenIdToMint(), 101); + } + + function test_nextTokenIdToClaim_returnOne() public { + assertEq(openEdition.nextTokenIdToClaim(), 1); + } + + function test_nextTokenIdToClaim_returnOneHundredAndOne() public claimTokens { + assertEq(openEdition.nextTokenIdToClaim(), 101); + } + + function test_burn_revert_callerNotOwner() public claimTokens callerNotOwner { + vm.expectRevert(IERC721AUpgradeable.TransferCallerNotOwnerNorApproved.selector); + openEdition.burn(1); + } + + function test_burn_state_callerOwner() public claimTokens callerOwner { + uint256 balanceBeforeBurn = openEdition.balanceOf(receiver); + + openEdition.burn(1); + + uint256 balanceAfterBurn = openEdition.balanceOf(receiver); + + assertEq(balanceBeforeBurn - balanceAfterBurn, 1); + } + + function test_burn_state_callerApproved() public claimTokens { + uint256 balanceBeforeBurn = openEdition.balanceOf(receiver); + + vm.prank(receiver); + openEdition.setApprovalForAll(deployer, true); + + vm.prank(deployer); + openEdition.burn(1); + + uint256 balanceAfterBurn = openEdition.balanceOf(receiver); + + assertEq(balanceBeforeBurn - balanceAfterBurn, 1); + } + + function test_supportsInterface() public { + assertEq(openEdition.supportsInterface(type(IERC2981Upgradeable).interfaceId), true); + bytes4 invalidId = bytes4(0); + assertEq(openEdition.supportsInterface(invalidId), false); + } + + function test_msgData_returnValue() public { + deployHarness(); + bytes memory msgData = harnessOpenEdition.msgData(); + bytes4 expectedData = harnessOpenEdition.msgData.selector; + assertEq(bytes4(msgData), expectedData); + } +} diff --git a/src/test/open-edition-flat-fee/misc/misc.tree b/src/test/open-edition-flat-fee/misc/misc.tree new file mode 100644 index 000000000..07abb950c --- /dev/null +++ b/src/test/open-edition-flat-fee/misc/misc.tree @@ -0,0 +1,33 @@ +function tokenURI(uint256 _tokenId) +├── when _tokenId does not exist +│ └── it should revert ✅ +└── when _tokenID does exist + └── it should return the shared metadata ✅ + +function supportsInterface(bytes4 interfaceId) +├── it should return true for any of the listed interface ids ✅ +└── it should return false for any interfaces ids that are not listed ✅ + +function _startTokenId() +└── it should return 1 ✅ + +function startTokenId() +└── it should return _startTokenId (1) ✅ + +function totalminted() +└── it should return the total number of NFTs minted ✅ + +function nextTokenIdToMint() +└── it should return the next token ID to mint (last minted + 1) ✅ + +function nextTokenIdToClaim() +└── it should return the next token ID to mint (last minted + 1) ✅ + +function burn(uint256 tokenId) +├── when caller is not the owner of tokenId +│ ├── when caller is not an approved operator of the owner of tokenId +│ │ └── it should revert ✅ +│ └── when caller is an approved operator of the owner of tokenId +│ └── it should burn the token ✅ +└── when caller is the owner of tokenId + └── it should burn the token ✅ \ No newline at end of file From 89590887cde2060fa6d252b11f8fe546c1bb1ea9 Mon Sep 17 00:00:00 2001 From: Yash <72552910+kumaryash90@users.noreply.github.com> Date: Mon, 26 Feb 2024 17:22:47 +0530 Subject: [PATCH 10/11] Custom errors, etc (#619) * custom error for extensions * contract publisher * legacy contracts * custom error for CurrencyTransferLib * efficient hash function MerkleProof * Pack without forwarder * fix test * fix tests * fix btt tests * extension tests * extension tests * test pack * more btt * more tests * drop prebuilt tests * fix lint --- contracts/extension/BatchMintMetadata.sol | 27 +++- contracts/extension/ContractMetadata.sol | 5 +- contracts/extension/DelayedReveal.sol | 15 +- contracts/extension/Drop.sol | 44 +++++- contracts/extension/Drop1155.sol | 43 +++++- contracts/extension/DropSinglePhase.sol | 41 +++++- contracts/extension/LazyMint.sol | 8 +- contracts/extension/NFTMetadata.sol | 25 +++- contracts/extension/Ownable.sol | 7 +- contracts/extension/Permissions.sol | 35 ++--- contracts/extension/PlatformFee.sol | 19 ++- contracts/extension/PrimarySale.sol | 11 +- contracts/extension/Royalty.sol | 17 ++- contracts/extension/SignatureMintERC721.sol | 29 +++- .../SignatureMintERC721Upgradeable.sol | 29 +++- contracts/infra/ContractPublisher.sol | 54 +++++-- .../extension/PlatformFee_V1.sol | 66 ++------- .../extension/PrimarySale_V1.sol | 8 +- .../extension/interface/IPlatformFee_V1.sol | 12 -- contracts/lib/CurrencyTransferLib.sol | 11 +- contracts/lib/MerkleProof.sol | 20 ++- contracts/prebuilts/pack/Pack.sol | 69 +++------ src/test/ContractPublisher.t.sol | 80 ++++++++++- src/test/LoyaltyCard.t.sol | 6 +- src/test/Multiwrap.t.sol | 72 ++++------ src/test/OpenEditionERC721.t.sol | 68 +++++---- src/test/OpenEditionERC721FlatFee.t.sol | 68 +++++---- src/test/SignatureDrop.t.sol | 92 ++++++------ src/test/drop/DropERC1155.t.sol | 61 +++----- src/test/drop/DropERC20.t.sol | 69 ++++----- src/test/drop/DropERC721.t.sol | 92 ++++++------ .../freezeBatchBaseURI.t.sol | 15 +- .../drop-erc1155/initialize/initialize.t.sol | 6 +- .../setMaxTotalSupply/setMaxTotalSupply.t.sol | 7 +- .../setSaleRecipientForToken.t.sol | 7 +- .../updateBatchBaseURI.t.sol | 15 +- .../drop-erc20/initialize/initialize.t.sol | 6 +- .../setMaxTotalSupply/setMaxTotalSupply.t.sol | 8 +- .../_canSetFunctions/_canSetFunctions.t.sol | 16 +-- .../freezeBatchBaseURI.t.sol | 13 +- .../drop-erc721/initalizer/initializer.t.sol | 6 +- .../drop/drop-erc721/lazyMint/lazyMint.t.sol | 6 +- src/test/drop/drop-erc721/reveal/reveal.t.sol | 24 ++-- .../setMaxTotalSupply/setMaxTotalSupply.t.sol | 7 +- .../updateBatchBaseURI.t.sol | 13 +- .../initialize/initialize.t.sol | 4 +- .../open-edition/initialize/initialize.t.sol | 4 +- src/test/pack/Pack.t.sol | 54 ++++--- src/test/pack/PackVRFDirect.t.sol | 20 +-- src/test/sdk/base/ERC721DelayedReveal.t.sol | 4 +- .../sdk/extension/BatchMintMetadata.t.sol | 6 +- src/test/sdk/extension/ContractMetadata.t.sol | 2 +- src/test/sdk/extension/DelayedReveal.t.sol | 11 +- src/test/sdk/extension/DropSinglePhase.t.sol | 36 +++-- src/test/sdk/extension/LazyMint.t.sol | 4 +- src/test/sdk/extension/NFTMetadata.t.sol | 8 +- src/test/sdk/extension/Ownable.t.sol | 2 +- src/test/sdk/extension/Permissions.t.sol | 51 +++---- src/test/sdk/extension/PlatformFee.t.sol | 6 +- src/test/sdk/extension/PrimarySale.t.sol | 2 +- src/test/sdk/extension/Royalty.t.sol | 6 +- .../sdk/extension/SignatureMintERC721.t.sol | 11 +- .../_batchMintMetadata.t.sol | 2 +- .../freeze-base-uri/_freezeBaseURI.t.sol | 4 +- .../get-base-uri/_getBaseURI.t.sol | 2 +- .../get-batch-id/_getBatchId.t.sol | 2 +- .../get-batch-start-id/_getBatchStartId.t.sol | 2 +- .../set-base-uri/_setBaseURI.t.sol | 4 +- .../set-contract-uri/setContractURI.t.sol | 2 +- .../get-reveal-uri/getRevealURI.t.sol | 11 +- src/test/sdk/extension/drop/claim/claim.t.sol | 2 +- .../setClaimConditions.t.sol | 6 +- .../drop/verify-claim/verifyClaim.t.sol | 136 +++++++++++++++--- .../lazy-mint/lazy-mint/lazyMint.t.sol | 4 +- .../ownable/set-owner/setOwner.t.sol | 2 +- .../setDefaultRoyaltyInfo.t.sol | 4 +- .../setRoyaltyInfoForToken.t.sol | 4 +- .../utils/AABenchmarkArtifacts.sol | 4 +- src/test/token/TokenERC1155.t.sol | 6 +- src/test/token/TokenERC721.t.sol | 6 +- src/test/utils/BaseTest.sol | 4 +- 81 files changed, 1049 insertions(+), 741 deletions(-) diff --git a/contracts/extension/BatchMintMetadata.sol b/contracts/extension/BatchMintMetadata.sol index 605b2435b..108d43a63 100644 --- a/contracts/extension/BatchMintMetadata.sol +++ b/contracts/extension/BatchMintMetadata.sol @@ -11,6 +11,15 @@ pragma solidity ^0.8.0; */ contract BatchMintMetadata { + /// @dev Invalid index for batch + error BatchMintInvalidBatchId(uint256 index); + + /// @dev Invalid token + error BatchMintInvalidTokenId(uint256 tokenId); + + /// @dev Metadata frozen + error BatchMintMetadataFrozen(uint256 batchId); + /// @dev Largest tokenId of each batch of tokens with the same baseURI + 1 {ex: batchId 100 at position 0 includes tokens 0-99} uint256[] private batchIds; @@ -46,7 +55,7 @@ contract BatchMintMetadata { */ function getBatchIdAtIndex(uint256 _index) public view returns (uint256) { if (_index >= getBaseURICount()) { - revert("Invalid index"); + revert BatchMintInvalidBatchId(_index); } return batchIds[_index]; } @@ -65,7 +74,7 @@ contract BatchMintMetadata { } } - revert("Invalid tokenId"); + revert BatchMintInvalidTokenId(_tokenId); } /// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + tokenId. @@ -78,7 +87,8 @@ contract BatchMintMetadata { return baseURI[indices[i]]; } } - revert("Invalid tokenId"); + + revert BatchMintInvalidTokenId(_tokenId); } /// @dev returns the starting tokenId of a given batchId. @@ -94,12 +104,15 @@ contract BatchMintMetadata { return 0; } } - revert("Invalid batchId"); + + revert BatchMintInvalidBatchId(_batchID); } /// @dev Sets the base URI for the batch of tokens with the given batchId. function _setBaseURI(uint256 _batchId, string memory _baseURI) internal { - require(!batchFrozen[_batchId], "Batch frozen"); + if (batchFrozen[_batchId]) { + revert BatchMintMetadataFrozen(_batchId); + } baseURI[_batchId] = _baseURI; emit BatchMetadataUpdate(_getBatchStartId(_batchId), _batchId); } @@ -107,7 +120,9 @@ contract BatchMintMetadata { /// @dev Freezes the base URI for the batch of tokens with the given batchId. function _freezeBaseURI(uint256 _batchId) internal { string memory baseURIForBatch = baseURI[_batchId]; - require(bytes(baseURIForBatch).length > 0, "Invalid batch"); + if (bytes(baseURIForBatch).length == 0) { + revert BatchMintInvalidBatchId(_batchId); + } batchFrozen[_batchId] = true; emit MetadataFrozen(); } diff --git a/contracts/extension/ContractMetadata.sol b/contracts/extension/ContractMetadata.sol index 16315594a..ec968f2b6 100644 --- a/contracts/extension/ContractMetadata.sol +++ b/contracts/extension/ContractMetadata.sol @@ -13,6 +13,9 @@ import "./interface/IContractMetadata.sol"; */ abstract contract ContractMetadata is IContractMetadata { + /// @dev The sender is not authorized to perform the action + error ContractMetadataUnauthorized(); + /// @notice Returns the contract metadata URI. string public override contractURI; @@ -26,7 +29,7 @@ abstract contract ContractMetadata is IContractMetadata { */ function setContractURI(string memory _uri) external override { if (!_canSetContractURI()) { - revert("Not authorized"); + revert ContractMetadataUnauthorized(); } _setupContractURI(_uri); diff --git a/contracts/extension/DelayedReveal.sol b/contracts/extension/DelayedReveal.sol index 22cfcfde1..bc0d09d22 100644 --- a/contracts/extension/DelayedReveal.sol +++ b/contracts/extension/DelayedReveal.sol @@ -12,6 +12,12 @@ import "./interface/IDelayedReveal.sol"; */ abstract contract DelayedReveal is IDelayedReveal { + /// @dev The contract doesn't have any url to be delayed revealed + error DelayedRevealNothingToReveal(); + + /// @dev The result of the returned an incorrect hash + error DelayedRevealIncorrectResultHash(bytes32 expected, bytes32 actual); + /// @dev Mapping from tokenId of a batch of tokens => to delayed reveal data. mapping(uint256 => bytes) public encryptedData; @@ -34,14 +40,19 @@ abstract contract DelayedReveal is IDelayedReveal { function getRevealURI(uint256 _batchId, bytes calldata _key) public view returns (string memory revealedURI) { bytes memory data = encryptedData[_batchId]; if (data.length == 0) { - revert("Nothing to reveal"); + revert DelayedRevealNothingToReveal(); } (bytes memory encryptedURI, bytes32 provenanceHash) = abi.decode(data, (bytes, bytes32)); revealedURI = string(encryptDecrypt(encryptedURI, _key)); - require(keccak256(abi.encodePacked(revealedURI, _key, block.chainid)) == provenanceHash, "Incorrect key"); + if (keccak256(abi.encodePacked(revealedURI, _key, block.chainid)) != provenanceHash) { + revert DelayedRevealIncorrectResultHash( + provenanceHash, + keccak256(abi.encodePacked(revealedURI, _key, block.chainid)) + ); + } } /** diff --git a/contracts/extension/Drop.sol b/contracts/extension/Drop.sol index 50ce350df..5a1ee1a62 100644 --- a/contracts/extension/Drop.sol +++ b/contracts/extension/Drop.sol @@ -7,6 +7,32 @@ import "./interface/IDrop.sol"; import "../lib/MerkleProof.sol"; abstract contract Drop is IDrop { + /// @dev The sender is not authorized to perform the action + error DropUnauthorized(); + + /// @dev Exceeded the max token total supply + error DropExceedMaxSupply(); + + /// @dev No active claim condition + error DropNoActiveCondition(); + + /// @dev Claim condition invalid currency or price + error DropClaimInvalidTokenPrice( + address expectedCurrency, + uint256 expectedPricePerToken, + address actualCurrency, + uint256 actualExpectedPricePerToken + ); + + /// @dev Claim condition exceeded limit + error DropClaimExceedLimit(uint256 expected, uint256 actual); + + /// @dev Claim condition exceeded max supply + error DropClaimExceedMaxSupply(uint256 expected, uint256 actual); + + /// @dev Claim condition not started yet + error DropClaimNotStarted(uint256 expected, uint256 actual); + /*/////////////////////////////////////////////////////////////// State variables //////////////////////////////////////////////////////////////*/ @@ -54,7 +80,7 @@ abstract contract Drop is IDrop { bool _resetClaimEligibility ) external virtual override { if (!_canSetClaimConditions()) { - revert("Not authorized"); + revert DropUnauthorized(); } uint256 existingStartIndex = claimCondition.currentStartId; @@ -81,7 +107,7 @@ abstract contract Drop is IDrop { uint256 supplyClaimedAlready = claimCondition.conditions[newStartIndex + i].supplyClaimed; if (supplyClaimedAlready > _conditions[i].maxClaimableSupply) { - revert("max supply claimed"); + revert DropExceedMaxSupply(); } claimCondition.conditions[newStartIndex + i] = _conditions[i]; @@ -163,18 +189,22 @@ abstract contract Drop is IDrop { uint256 supplyClaimedByWallet = claimCondition.supplyClaimedByWallet[_conditionId][_claimer]; if (_currency != claimCurrency || _pricePerToken != claimPrice) { - revert("!PriceOrCurrency"); + revert DropClaimInvalidTokenPrice(_currency, _pricePerToken, claimCurrency, claimPrice); } if (_quantity == 0 || (_quantity + supplyClaimedByWallet > claimLimit)) { - revert("!Qty"); + revert DropClaimExceedLimit(claimLimit, _quantity + supplyClaimedByWallet); } + if (currentClaimPhase.supplyClaimed + _quantity > currentClaimPhase.maxClaimableSupply) { - revert("!MaxSupply"); + revert DropClaimExceedMaxSupply( + currentClaimPhase.maxClaimableSupply, + currentClaimPhase.supplyClaimed + _quantity + ); } if (currentClaimPhase.startTimestamp > block.timestamp) { - revert("cant claim yet"); + revert DropClaimNotStarted(currentClaimPhase.startTimestamp, block.timestamp); } } @@ -186,7 +216,7 @@ abstract contract Drop is IDrop { } } - revert("!CONDITION."); + revert DropNoActiveCondition(); } /// @dev Returns the claim condition at the given uid. diff --git a/contracts/extension/Drop1155.sol b/contracts/extension/Drop1155.sol index dc11569e3..07631e32d 100644 --- a/contracts/extension/Drop1155.sol +++ b/contracts/extension/Drop1155.sol @@ -7,6 +7,32 @@ import "./interface/IDrop1155.sol"; import "../lib/MerkleProof.sol"; abstract contract Drop1155 is IDrop1155 { + /// @dev The sender is not authorized to perform the action + error DropUnauthorized(); + + /// @dev Exceeded the max token total supply + error DropExceedMaxSupply(); + + /// @dev No active claim condition + error DropNoActiveCondition(); + + /// @dev Claim condition invalid currency or price + error DropClaimInvalidTokenPrice( + address expectedCurrency, + uint256 expectedPricePerToken, + address actualCurrency, + uint256 actualExpectedPricePerToken + ); + + /// @dev Claim condition exceeded limit + error DropClaimExceedLimit(uint256 expected, uint256 actual); + + /// @dev Claim condition exceeded max supply + error DropClaimExceedMaxSupply(uint256 expected, uint256 actual); + + /// @dev Claim condition not started yet + error DropClaimNotStarted(uint256 expected, uint256 actual); + /*/////////////////////////////////////////////////////////////// State variables //////////////////////////////////////////////////////////////*/ @@ -64,7 +90,7 @@ abstract contract Drop1155 is IDrop1155 { bool _resetClaimEligibility ) external virtual override { if (!_canSetClaimConditions()) { - revert("Not authorized"); + revert DropUnauthorized(); } ClaimConditionList storage conditionList = claimCondition[_tokenId]; uint256 existingStartIndex = conditionList.currentStartId; @@ -91,7 +117,7 @@ abstract contract Drop1155 is IDrop1155 { uint256 supplyClaimedAlready = conditionList.conditions[newStartIndex + i].supplyClaimed; if (supplyClaimedAlready > _conditions[i].maxClaimableSupply) { - revert("max supply claimed"); + revert DropExceedMaxSupply(); } conditionList.conditions[newStartIndex + i] = _conditions[i]; @@ -174,19 +200,22 @@ abstract contract Drop1155 is IDrop1155 { uint256 supplyClaimedByWallet = claimCondition[_tokenId].supplyClaimedByWallet[_conditionId][_claimer]; if (_currency != claimCurrency || _pricePerToken != claimPrice) { - revert("!PriceOrCurrency"); + revert DropClaimInvalidTokenPrice(_currency, _pricePerToken, claimCurrency, claimPrice); } if (_quantity == 0 || (_quantity + supplyClaimedByWallet > claimLimit)) { - revert("!Qty"); + revert DropClaimExceedLimit(claimLimit, _quantity + supplyClaimedByWallet); } if (currentClaimPhase.supplyClaimed + _quantity > currentClaimPhase.maxClaimableSupply) { - revert("!MaxSupply"); + revert DropClaimExceedMaxSupply( + currentClaimPhase.maxClaimableSupply, + currentClaimPhase.supplyClaimed + _quantity + ); } if (currentClaimPhase.startTimestamp > block.timestamp) { - revert("cant claim yet"); + revert DropClaimNotStarted(currentClaimPhase.startTimestamp, block.timestamp); } } @@ -199,7 +228,7 @@ abstract contract Drop1155 is IDrop1155 { } } - revert("!CONDITION."); + revert DropNoActiveCondition(); } /// @dev Returns the claim condition at the given uid. diff --git a/contracts/extension/DropSinglePhase.sol b/contracts/extension/DropSinglePhase.sol index 8a2f59425..e7b7cf29a 100644 --- a/contracts/extension/DropSinglePhase.sol +++ b/contracts/extension/DropSinglePhase.sol @@ -7,6 +7,32 @@ import "./interface/IDropSinglePhase.sol"; import "../lib/MerkleProof.sol"; abstract contract DropSinglePhase is IDropSinglePhase { + /// @dev The sender is not authorized to perform the action + error DropUnauthorized(); + + /// @dev Exceeded the max token total supply + error DropExceedMaxSupply(); + + /// @dev No active claim condition + error DropNoActiveCondition(); + + /// @dev Claim condition invalid currency or price + error DropClaimInvalidTokenPrice( + address expectedCurrency, + uint256 expectedPricePerToken, + address actualCurrency, + uint256 actualExpectedPricePerToken + ); + + /// @dev Claim condition exceeded limit + error DropClaimExceedLimit(uint256 expected, uint256 actual); + + /// @dev Claim condition exceeded max supply + error DropClaimExceedMaxSupply(uint256 expected, uint256 actual); + + /// @dev Claim condition not started yet + error DropClaimNotStarted(uint256 expected, uint256 actual); + /*/////////////////////////////////////////////////////////////// State variables //////////////////////////////////////////////////////////////*/ @@ -63,7 +89,7 @@ abstract contract DropSinglePhase is IDropSinglePhase { /// @dev Lets a contract admin set claim conditions. function setClaimConditions(ClaimCondition calldata _condition, bool _resetClaimEligibility) external override { if (!_canSetClaimConditions()) { - revert("Not authorized"); + revert DropUnauthorized(); } bytes32 targetConditionId = conditionId; @@ -75,7 +101,7 @@ abstract contract DropSinglePhase is IDropSinglePhase { } if (supplyClaimedAlready > _condition.maxClaimableSupply) { - revert("max supply claimed"); + revert DropExceedMaxSupply(); } claimCondition = ClaimCondition({ @@ -140,19 +166,22 @@ abstract contract DropSinglePhase is IDropSinglePhase { uint256 _supplyClaimedByWallet = supplyClaimedByWallet[conditionId][_claimer]; if (_currency != claimCurrency || _pricePerToken != claimPrice) { - revert("!PriceOrCurrency"); + revert DropClaimInvalidTokenPrice(_currency, _pricePerToken, claimCurrency, claimPrice); } if (_quantity == 0 || (_quantity + _supplyClaimedByWallet > claimLimit)) { - revert("!Qty"); + revert DropClaimExceedLimit(claimLimit, _quantity + _supplyClaimedByWallet); } if (currentClaimPhase.supplyClaimed + _quantity > currentClaimPhase.maxClaimableSupply) { - revert("!MaxSupply"); + revert DropClaimExceedMaxSupply( + currentClaimPhase.maxClaimableSupply, + currentClaimPhase.supplyClaimed + _quantity + ); } if (currentClaimPhase.startTimestamp > block.timestamp) { - revert("cant claim yet"); + revert DropClaimNotStarted(currentClaimPhase.startTimestamp, block.timestamp); } } diff --git a/contracts/extension/LazyMint.sol b/contracts/extension/LazyMint.sol index b6581e554..ee59abc17 100644 --- a/contracts/extension/LazyMint.sol +++ b/contracts/extension/LazyMint.sol @@ -13,6 +13,10 @@ import "./BatchMintMetadata.sol"; */ abstract contract LazyMint is ILazyMint, BatchMintMetadata { + /// @dev The sender is not authorized to perform the action + error LazyMintUnauthorized(); + error LazyMintInvalidAmount(); + /// @notice The tokenId assigned to the next new NFT to be lazy minted. uint256 internal nextTokenIdToLazyMint; @@ -31,11 +35,11 @@ abstract contract LazyMint is ILazyMint, BatchMintMetadata { bytes calldata _data ) public virtual override returns (uint256 batchId) { if (!_canLazyMint()) { - revert("Not authorized"); + revert LazyMintUnauthorized(); } if (_amount == 0) { - revert("0 amt"); + revert LazyMintInvalidAmount(); } uint256 startId = nextTokenIdToLazyMint; diff --git a/contracts/extension/NFTMetadata.sol b/contracts/extension/NFTMetadata.sol index c0f2707f8..3a0ded1e1 100644 --- a/contracts/extension/NFTMetadata.sol +++ b/contracts/extension/NFTMetadata.sol @@ -4,6 +4,15 @@ pragma solidity ^0.8.0; import "./interface/INFTMetadata.sol"; abstract contract NFTMetadata is INFTMetadata { + /// @dev The sender is not authorized to perform the action + error NFTMetadataUnauthorized(); + + /// @dev Invalid token metadata url + error NFTMetadataInvalidUrl(); + + /// @dev the nft metadata is frozen + error NFTMetadataFrozen(uint256 tokenId); + bool public uriFrozen; mapping(uint256 => string) internal _tokenURI; @@ -15,7 +24,9 @@ abstract contract NFTMetadata is INFTMetadata { /// @notice Sets the metadata URI for a given NFT. function _setTokenURI(uint256 _tokenId, string memory _uri) internal virtual { - require(bytes(_uri).length > 0, "NFTMetadata: empty metadata."); + if (bytes(_uri).length == 0) { + revert NFTMetadataInvalidUrl(); + } _tokenURI[_tokenId] = _uri; emit MetadataUpdate(_tokenId); @@ -23,13 +34,19 @@ abstract contract NFTMetadata is INFTMetadata { /// @notice Sets the metadata URI for a given NFT. function setTokenURI(uint256 _tokenId, string memory _uri) public virtual { - require(_canSetMetadata(), "NFTMetadata: not authorized to set metadata."); - require(!uriFrozen, "NFTMetadata: metadata is frozen."); + if (!_canSetMetadata()) { + revert NFTMetadataUnauthorized(); + } + if (uriFrozen) { + revert NFTMetadataFrozen(_tokenId); + } _setTokenURI(_tokenId, _uri); } function freezeMetadata() public virtual { - require(_canFreezeMetadata(), "NFTMetadata: not authorized to freeze metdata"); + if (!_canFreezeMetadata()) { + revert NFTMetadataUnauthorized(); + } uriFrozen = true; emit MetadataFrozen(); } diff --git a/contracts/extension/Ownable.sol b/contracts/extension/Ownable.sol index ddb6c83f2..bdfb98d47 100644 --- a/contracts/extension/Ownable.sol +++ b/contracts/extension/Ownable.sol @@ -13,13 +13,16 @@ import "./interface/IOwnable.sol"; */ abstract contract Ownable is IOwnable { + /// @dev The sender is not authorized to perform the action + error OwnableUnauthorized(); + /// @dev Owner of the contract (purpose: OpenSea compatibility) address private _owner; /// @dev Reverts if caller is not the owner. modifier onlyOwner() { if (msg.sender != _owner) { - revert("Not authorized"); + revert OwnableUnauthorized(); } _; } @@ -37,7 +40,7 @@ abstract contract Ownable is IOwnable { */ function setOwner(address _newOwner) external override { if (!_canSetOwner()) { - revert("Not authorized"); + revert OwnableUnauthorized(); } _setupOwner(_newOwner); } diff --git a/contracts/extension/Permissions.sol b/contracts/extension/Permissions.sol index 9322b3d43..29362ddcf 100644 --- a/contracts/extension/Permissions.sol +++ b/contracts/extension/Permissions.sol @@ -11,6 +11,15 @@ import "../lib/Strings.sol"; * @dev This contracts provides extending-contracts with role-based access control mechanisms */ contract Permissions is IPermissions { + /// @dev The `account` is missing a role. + error PermissionsUnauthorizedAccount(address account, bytes32 neededRole); + + /// @dev The `account` already is a holder of `role` + error PermissionsAlreadyGranted(address account, bytes32 role); + + /// @dev Invalid priviledge to revoke + error PermissionsInvalidPermission(address expected, address actual); + /// @dev Map from keccak256 hash of a role => a map from address => whether address has role. mapping(bytes32 => mapping(address => bool)) private _hasRole; @@ -81,7 +90,7 @@ contract Permissions is IPermissions { function grantRole(bytes32 role, address account) public virtual override { _checkRole(_getRoleAdmin[role], msg.sender); if (_hasRole[role][account]) { - revert("Can only grant to non holders"); + revert PermissionsAlreadyGranted(account, role); } _setupRole(role, account); } @@ -109,7 +118,7 @@ contract Permissions is IPermissions { */ function renounceRole(bytes32 role, address account) public virtual override { if (msg.sender != account) { - revert("Can only renounce for self"); + revert PermissionsInvalidPermission(msg.sender, account); } _revokeRole(role, account); } @@ -137,32 +146,14 @@ contract Permissions is IPermissions { /// @dev Checks `role` for `account`. Reverts with a message including the required role. function _checkRole(bytes32 role, address account) internal view virtual { if (!_hasRole[role][account]) { - revert( - string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(account), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ) - ); + revert PermissionsUnauthorizedAccount(account, role); } } /// @dev Checks `role` for `account`. Reverts with a message including the required role. function _checkRoleWithSwitch(bytes32 role, address account) internal view virtual { if (!hasRoleWithSwitch(role, account)) { - revert( - string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(account), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ) - ); + revert PermissionsUnauthorizedAccount(account, role); } } } diff --git a/contracts/extension/PlatformFee.sol b/contracts/extension/PlatformFee.sol index 5f3bdca9d..4c92c20cb 100644 --- a/contracts/extension/PlatformFee.sol +++ b/contracts/extension/PlatformFee.sol @@ -13,6 +13,15 @@ import "./interface/IPlatformFee.sol"; */ abstract contract PlatformFee is IPlatformFee { + /// @dev The sender is not authorized to perform the action + error PlatformFeeUnauthorized(); + + /// @dev The recipient is invalid + error PlatformFeeInvalidRecipient(address recipient); + + /// @dev The fee bps exceeded the max value + error PlatformFeeExceededMaxFeeBps(uint256 max, uint256 actual); + /// @dev The address that receives all platform fees from all sales. address private platformFeeRecipient; @@ -51,7 +60,7 @@ abstract contract PlatformFee is IPlatformFee { */ function setPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) external override { if (!_canSetPlatformFeeInfo()) { - revert("Not authorized"); + revert PlatformFeeUnauthorized(); } _setupPlatformFeeInfo(_platformFeeRecipient, _platformFeeBps); } @@ -59,10 +68,10 @@ abstract contract PlatformFee is IPlatformFee { /// @dev Sets the platform fee recipient and bps function _setupPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) internal { if (_platformFeeBps > 10_000) { - revert("Exceeds max bps"); + revert PlatformFeeExceededMaxFeeBps(10_000, _platformFeeBps); } if (_platformFeeRecipient == address(0)) { - revert("Invalid recipient"); + revert PlatformFeeInvalidRecipient(_platformFeeRecipient); } platformFeeBps = uint16(_platformFeeBps); @@ -74,7 +83,7 @@ abstract contract PlatformFee is IPlatformFee { /// @notice Lets a module admin set a flat fee on primary sales. function setFlatPlatformFeeInfo(address _platformFeeRecipient, uint256 _flatFee) external { if (!_canSetPlatformFeeInfo()) { - revert("Not authorized"); + revert PlatformFeeUnauthorized(); } _setupFlatPlatformFeeInfo(_platformFeeRecipient, _flatFee); @@ -91,7 +100,7 @@ abstract contract PlatformFee is IPlatformFee { /// @notice Lets a module admin set platform fee type. function setPlatformFeeType(PlatformFeeType _feeType) external { if (!_canSetPlatformFeeInfo()) { - revert("Not authorized"); + revert PlatformFeeUnauthorized(); } _setupPlatformFeeType(_feeType); } diff --git a/contracts/extension/PrimarySale.sol b/contracts/extension/PrimarySale.sol index 551607e13..ca3588edd 100644 --- a/contracts/extension/PrimarySale.sol +++ b/contracts/extension/PrimarySale.sol @@ -13,6 +13,12 @@ import "./interface/IPrimarySale.sol"; */ abstract contract PrimarySale is IPrimarySale { + /// @dev The sender is not authorized to perform the action + error PrimarySaleUnauthorized(); + + /// @dev The recipient is invalid + error PrimarySaleInvalidRecipient(address recipient); + /// @dev The address that receives all primary sales value. address private recipient; @@ -31,7 +37,7 @@ abstract contract PrimarySale is IPrimarySale { */ function setPrimarySaleRecipient(address _saleRecipient) external override { if (!_canSetPrimarySaleRecipient()) { - revert("Not authorized"); + revert PrimarySaleUnauthorized(); } _setupPrimarySaleRecipient(_saleRecipient); } @@ -39,8 +45,9 @@ abstract contract PrimarySale is IPrimarySale { /// @dev Lets a contract admin set the recipient for all primary sales. function _setupPrimarySaleRecipient(address _saleRecipient) internal { if (_saleRecipient == address(0)) { - revert("Invalid recipient"); + revert PrimarySaleInvalidRecipient(_saleRecipient); } + recipient = _saleRecipient; emit PrimarySaleRecipientUpdated(_saleRecipient); } diff --git a/contracts/extension/Royalty.sol b/contracts/extension/Royalty.sol index cbe7ff28a..765fcd08f 100644 --- a/contracts/extension/Royalty.sol +++ b/contracts/extension/Royalty.sol @@ -15,6 +15,15 @@ import "./interface/IRoyalty.sol"; */ abstract contract Royalty is IRoyalty { + /// @dev The sender is not authorized to perform the action + error RoyaltyUnauthorized(); + + /// @dev The recipient is invalid + error RoyaltyInvalidRecipient(address recipient); + + /// @dev The fee bps exceeded the max value + error RoyaltyExceededMaxFeeBps(uint256 max, uint256 actual); + /// @dev The (default) address that receives all royalty value. address private royaltyRecipient; @@ -74,7 +83,7 @@ abstract contract Royalty is IRoyalty { */ function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external override { if (!_canSetRoyaltyInfo()) { - revert("Not authorized"); + revert RoyaltyUnauthorized(); } _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps); @@ -83,7 +92,7 @@ abstract contract Royalty is IRoyalty { /// @dev Lets a contract admin update the default royalty recipient and bps. function _setupDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) internal { if (_royaltyBps > 10_000) { - revert("Exceeds max bps"); + revert RoyaltyExceededMaxFeeBps(10_000, _royaltyBps); } royaltyRecipient = _royaltyRecipient; @@ -103,7 +112,7 @@ abstract contract Royalty is IRoyalty { */ function setRoyaltyInfoForToken(uint256 _tokenId, address _recipient, uint256 _bps) external override { if (!_canSetRoyaltyInfo()) { - revert("Not authorized"); + revert RoyaltyUnauthorized(); } _setupRoyaltyInfoForToken(_tokenId, _recipient, _bps); @@ -112,7 +121,7 @@ abstract contract Royalty is IRoyalty { /// @dev Lets a contract admin set the royalty recipient and bps for a particular token Id. function _setupRoyaltyInfoForToken(uint256 _tokenId, address _recipient, uint256 _bps) internal { if (_bps > 10_000) { - revert("Exceeds max bps"); + revert RoyaltyExceededMaxFeeBps(10_000, _bps); } royaltyInfoForToken[_tokenId] = RoyaltyInfo({ recipient: _recipient, bps: _bps }); diff --git a/contracts/extension/SignatureMintERC721.sol b/contracts/extension/SignatureMintERC721.sol index 3b8d9b318..2db421f8f 100644 --- a/contracts/extension/SignatureMintERC721.sol +++ b/contracts/extension/SignatureMintERC721.sol @@ -7,6 +7,21 @@ import "./interface/ISignatureMintERC721.sol"; import "../external-deps/openzeppelin/utils/cryptography/EIP712.sol"; abstract contract SignatureMintERC721 is EIP712, ISignatureMintERC721 { + /// @dev The sender is not authorized to perform the action + error SignatureMintUnauthorized(); + + /// @dev The signer is not authorized to perform the signing action + error SignatureMintInvalidSigner(); + + /// @dev The signature is either expired or not ready to be claimed yet + error SignatureMintInvalidTime(uint256 startTime, uint256 endTime, uint256 actualTime); + + /// @dev Invalid mint recipient + error SignatureMintInvalidRecipient(); + + /// @dev Invalid mint quantity + error SignatureMintInvalidQuantity(); + using ECDSA for bytes32; bytes32 private constant TYPEHASH = @@ -37,14 +52,20 @@ abstract contract SignatureMintERC721 is EIP712, ISignatureMintERC721 { (success, signer) = verify(_req, _signature); if (!success) { - revert("Invalid req"); + revert SignatureMintInvalidSigner(); } if (_req.validityStartTimestamp > block.timestamp || block.timestamp > _req.validityEndTimestamp) { - revert("Req expired"); + revert SignatureMintInvalidTime(_req.validityStartTimestamp, _req.validityEndTimestamp, block.timestamp); + } + + if (_req.to == address(0)) { + revert SignatureMintInvalidRecipient(); + } + + if (_req.quantity == 0) { + revert SignatureMintInvalidQuantity(); } - require(_req.to != address(0), "recipient undefined"); - require(_req.quantity > 0, "0 qty"); minted[_req.uid] = true; } diff --git a/contracts/extension/SignatureMintERC721Upgradeable.sol b/contracts/extension/SignatureMintERC721Upgradeable.sol index 0dd97a417..935cd749a 100644 --- a/contracts/extension/SignatureMintERC721Upgradeable.sol +++ b/contracts/extension/SignatureMintERC721Upgradeable.sol @@ -9,6 +9,21 @@ import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable. import "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol"; abstract contract SignatureMintERC721Upgradeable is Initializable, EIP712Upgradeable, ISignatureMintERC721 { + /// @dev The sender is not authorized to perform the action + error SignatureMintUnauthorized(); + + /// @dev The signer is not authorized to perform the signing action + error SignatureMintInvalidSigner(); + + /// @dev The signature is either expired or not ready to be claimed yet + error SignatureMintInvalidTime(uint256 startTime, uint256 endTime, uint256 actualTime); + + /// @dev Invalid mint recipient + error SignatureMintInvalidRecipient(); + + /// @dev Invalid mint quantity + error SignatureMintInvalidQuantity(); + using ECDSAUpgradeable for bytes32; bytes32 private constant TYPEHASH = @@ -43,14 +58,20 @@ abstract contract SignatureMintERC721Upgradeable is Initializable, EIP712Upgrade (success, signer) = verify(_req, _signature); if (!success) { - revert("Invalid req"); + revert SignatureMintInvalidSigner(); } if (_req.validityStartTimestamp > block.timestamp || block.timestamp > _req.validityEndTimestamp) { - revert("Req expired"); + revert SignatureMintInvalidTime(_req.validityStartTimestamp, _req.validityEndTimestamp, block.timestamp); + } + + if (_req.to == address(0)) { + revert SignatureMintInvalidRecipient(); + } + + if (_req.quantity == 0) { + revert SignatureMintInvalidQuantity(); } - require(_req.to != address(0), "recipient undefined"); - require(_req.quantity > 0, "0 qty"); minted[_req.uid] = true; } diff --git a/contracts/infra/ContractPublisher.sol b/contracts/infra/ContractPublisher.sol index 8400462a4..01c01d91e 100644 --- a/contracts/infra/ContractPublisher.sol +++ b/contracts/infra/ContractPublisher.sol @@ -16,7 +16,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/metatx/ERC2771Context.sol"; import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import "../extension/Multicall.sol"; +import "@openzeppelin/contracts/utils/Multicall.sol"; // ========== Internal imports ========== import { IContractPublisher } from "./interface/IContractPublisher.sol"; @@ -30,7 +30,10 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE /// @notice Whether the contract publisher is paused. bool public isPaused; - IContractPublisher public immutable prevPublisher; + IContractPublisher public prevPublisher; + + /// @dev Only MIGRATION holders can override previous publisher or migrate data + bytes32 private constant MIGRATION_ROLE = keccak256("MIGRATION_ROLE"); /*/////////////////////////////////////////////////////////////// Mappings @@ -61,8 +64,15 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE _; } - constructor(address _trustedForwarder, IContractPublisher _prevPublisher) ERC2771Context(_trustedForwarder) { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); + constructor( + address _defaultAdmin, + address _trustedForwarder, + IContractPublisher _prevPublisher + ) ERC2771Context(_trustedForwarder) { + _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); + _setupRole(MIGRATION_ROLE, _defaultAdmin); + _setRoleAdmin(MIGRATION_ROLE, MIGRATION_ROLE); + prevPublisher = _prevPublisher; } @@ -74,7 +84,10 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE function getAllPublishedContracts( address _publisher ) external view returns (CustomContractInstance[] memory published) { - CustomContractInstance[] memory linkedData = prevPublisher.getAllPublishedContracts(_publisher); + CustomContractInstance[] memory linkedData; + if (address(prevPublisher) != address(0)) { + linkedData = prevPublisher.getAllPublishedContracts(_publisher); + } uint256 currentTotal = EnumerableSet.length(contractsOfPublisher[_publisher].contractIds); uint256 prevTotal = linkedData.length; uint256 total = prevTotal + currentTotal; @@ -95,10 +108,11 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE address _publisher, string memory _contractId ) external view returns (CustomContractInstance[] memory published) { - CustomContractInstance[] memory linkedVersions = prevPublisher.getPublishedContractVersions( - _publisher, - _contractId - ); + CustomContractInstance[] memory linkedVersions; + + if (address(prevPublisher) != address(0)) { + linkedVersions = prevPublisher.getPublishedContractVersions(_publisher, _contractId); + } uint256 prevTotal = linkedVersions.length; bytes32 id = keccak256(bytes(_contractId)); @@ -124,7 +138,7 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE ) external view returns (CustomContractInstance memory published) { published = contractsOfPublisher[_publisher].contracts[keccak256(bytes(_contractId))].latest; // if not found, check the previous publisher - if (published.publishTimestamp == 0) { + if (address(prevPublisher) != address(0) && published.publishTimestamp == 0) { published = prevPublisher.getPublishedContract(_publisher, _contractId); } } @@ -181,8 +195,17 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE emit ContractUnpublished(_msgSender(), _publisher, _contractId); } + function setPrevPublisher(IContractPublisher _prevPublisher) external { + require(hasRole(MIGRATION_ROLE, _msgSender()), "Not authorized"); + prevPublisher = _prevPublisher; + } + /// @notice Lets an account set its own publisher profile uri - function setPublisherProfileUri(address publisher, string memory uri) public onlyPublisher(publisher) { + function setPublisherProfileUri(address publisher, string memory uri) public { + require( + (!isPaused && _msgSender() == publisher) || hasRole(MIGRATION_ROLE, _msgSender()), + "Registry paused or caller not authorized" + ); string memory currentURI = profileUriOfPublisher[publisher]; profileUriOfPublisher[publisher] = uri; @@ -193,7 +216,7 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE function getPublisherProfileUri(address publisher) public view returns (string memory uri) { uri = profileUriOfPublisher[publisher]; // if not found, check the previous publisher - if (bytes(uri).length == 0) { + if (address(prevPublisher) != address(0) && bytes(uri).length == 0) { uri = prevPublisher.getPublisherProfileUri(publisher); } } @@ -202,7 +225,10 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE function getPublishedUriFromCompilerUri( string memory compilerMetadataUri ) public view returns (string[] memory publishedMetadataUris) { - string[] memory linkedUris = prevPublisher.getPublishedUriFromCompilerUri(compilerMetadataUri); + string[] memory linkedUris; + if (address(prevPublisher) != address(0)) { + linkedUris = prevPublisher.getPublishedUriFromCompilerUri(compilerMetadataUri); + } uint256 prevTotal = linkedUris.length; uint256 currentTotal = compilerMetadataUriToPublishedMetadataUris[compilerMetadataUri].index; uint256 total = prevTotal + currentTotal; @@ -231,7 +257,7 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE } /// @dev ERC2771Context overrides - function _msgSender() internal view virtual override(Context, ERC2771Context, Multicall) returns (address sender) { + function _msgSender() internal view virtual override(Context, ERC2771Context) returns (address sender) { return ERC2771Context._msgSender(); } diff --git a/contracts/legacy-contracts/extension/PlatformFee_V1.sol b/contracts/legacy-contracts/extension/PlatformFee_V1.sol index 9014b7dca..9e3af425f 100644 --- a/contracts/legacy-contracts/extension/PlatformFee_V1.sol +++ b/contracts/legacy-contracts/extension/PlatformFee_V1.sol @@ -13,45 +13,38 @@ import "./interface/IPlatformFee_V1.sol"; */ abstract contract PlatformFee is IPlatformFee { + /// @dev The sender is not authorized to perform the action + error PlatformFeeUnauthorized(); + + /// @dev The recipient is invalid + error PlatformFeeInvalidRecipient(address recipient); + + /// @dev The fee bps exceeded the max value + error PlatformFeeExceededMaxFeeBps(uint256 max, uint256 actual); + /// @dev The address that receives all platform fees from all sales. address private platformFeeRecipient; /// @dev The % of primary sales collected as platform fees. uint16 private platformFeeBps; - /// @dev Fee type variants: percentage fee and flat fee - PlatformFeeType private platformFeeType; - - /// @dev The flat amount collected by the contract as fees on primary sales. - uint256 private flatPlatformFee; - /// @dev Returns the platform fee recipient and bps. function getPlatformFeeInfo() public view override returns (address, uint16) { return (platformFeeRecipient, uint16(platformFeeBps)); } - /// @dev Returns the platform fee bps and recipient. - function getFlatPlatformFeeInfo() public view returns (address, uint256) { - return (platformFeeRecipient, flatPlatformFee); - } - - /// @dev Returns the platform fee bps and recipient. - function getPlatformFeeType() public view returns (PlatformFeeType) { - return platformFeeType; - } - /** * @notice Updates the platform fee recipient and bps. * @dev Caller should be authorized to set platform fee info. * See {_canSetPlatformFeeInfo}. * Emits {PlatformFeeInfoUpdated Event}; See {_setupPlatformFeeInfo}. - * + * @param _platformFeeRecipient Address to be set as new platformFeeRecipient. * @param _platformFeeBps Updated platformFeeBps. */ function setPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) external override { if (!_canSetPlatformFeeInfo()) { - revert("Not authorized"); + revert PlatformFeeUnauthorized(); } _setupPlatformFeeInfo(_platformFeeRecipient, _platformFeeBps); } @@ -59,7 +52,10 @@ abstract contract PlatformFee is IPlatformFee { /// @dev Sets the platform fee recipient and bps function _setupPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) internal { if (_platformFeeBps > 10_000) { - revert("Exceeds max bps"); + revert PlatformFeeExceededMaxFeeBps(10_000, _platformFeeBps); + } + if (_platformFeeRecipient == address(0)) { + revert PlatformFeeInvalidRecipient(_platformFeeRecipient); } platformFeeBps = uint16(_platformFeeBps); @@ -68,38 +64,6 @@ abstract contract PlatformFee is IPlatformFee { emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps); } - /// @notice Lets a module admin set a flat fee on primary sales. - function setFlatPlatformFeeInfo(address _platformFeeRecipient, uint256 _flatFee) external { - if (!_canSetPlatformFeeInfo()) { - revert("Not authorized"); - } - - _setupFlatPlatformFeeInfo(_platformFeeRecipient, _flatFee); - } - - /// @dev Sets a flat fee on primary sales. - function _setupFlatPlatformFeeInfo(address _platformFeeRecipient, uint256 _flatFee) internal { - flatPlatformFee = _flatFee; - platformFeeRecipient = _platformFeeRecipient; - - emit FlatPlatformFeeUpdated(_platformFeeRecipient, _flatFee); - } - - /// @notice Lets a module admin set platform fee type. - function setPlatformFeeType(PlatformFeeType _feeType) external { - if (!_canSetPlatformFeeInfo()) { - revert("Not authorized"); - } - _setupPlatformFeeType(_feeType); - } - - /// @dev Sets platform fee type. - function _setupPlatformFeeType(PlatformFeeType _feeType) internal { - platformFeeType = _feeType; - - emit PlatformFeeTypeUpdated(_feeType); - } - /// @dev Returns whether platform fee info can be set in the given execution context. function _canSetPlatformFeeInfo() internal view virtual returns (bool); } diff --git a/contracts/legacy-contracts/extension/PrimarySale_V1.sol b/contracts/legacy-contracts/extension/PrimarySale_V1.sol index 8536c9724..165501754 100644 --- a/contracts/legacy-contracts/extension/PrimarySale_V1.sol +++ b/contracts/legacy-contracts/extension/PrimarySale_V1.sol @@ -13,6 +13,12 @@ import "./interface/IPrimarySale_V1.sol"; */ abstract contract PrimarySale is IPrimarySale { + /// @dev The sender is not authorized to perform the action + error PrimarySaleUnauthorized(); + + /// @dev The recipient is invalid + error PrimarySaleInvalidRecipient(address recipient); + /// @dev The address that receives all primary sales value. address private recipient; @@ -31,7 +37,7 @@ abstract contract PrimarySale is IPrimarySale { */ function setPrimarySaleRecipient(address _saleRecipient) external override { if (!_canSetPrimarySaleRecipient()) { - revert("Not authorized"); + revert PrimarySaleUnauthorized(); } _setupPrimarySaleRecipient(_saleRecipient); } diff --git a/contracts/legacy-contracts/extension/interface/IPlatformFee_V1.sol b/contracts/legacy-contracts/extension/interface/IPlatformFee_V1.sol index 1a1fc778a..28932effa 100644 --- a/contracts/legacy-contracts/extension/interface/IPlatformFee_V1.sol +++ b/contracts/legacy-contracts/extension/interface/IPlatformFee_V1.sol @@ -10,12 +10,6 @@ pragma solidity ^0.8.0; */ interface IPlatformFee { - /// @dev Fee type variants: percentage fee and flat fee - enum PlatformFeeType { - Bps, - Flat - } - /// @dev Returns the platform fee bps and recipient. function getPlatformFeeInfo() external view returns (address, uint16); @@ -24,10 +18,4 @@ interface IPlatformFee { /// @dev Emitted when fee on primary sales is updated. event PlatformFeeInfoUpdated(address indexed platformFeeRecipient, uint256 platformFeeBps); - - /// @dev Emitted when the flat platform fee is updated. - event FlatPlatformFeeUpdated(address platformFeeRecipient, uint256 flatFee); - - /// @dev Emitted when the platform fee type is updated. - event PlatformFeeTypeUpdated(PlatformFeeType feeType); } diff --git a/contracts/lib/CurrencyTransferLib.sol b/contracts/lib/CurrencyTransferLib.sol index 1cb9cf8d9..531020ffa 100644 --- a/contracts/lib/CurrencyTransferLib.sol +++ b/contracts/lib/CurrencyTransferLib.sol @@ -10,6 +10,9 @@ import { SafeERC20, IERC20 } from "../external-deps/openzeppelin/token/ERC20/uti library CurrencyTransferLib { using SafeERC20 for IERC20; + error CurrencyTransferLibMismatchedValue(uint256 expected, uint256 actual); + error CurrencyTransferLibFailedNativeTransfer(address recipient, uint256 value); + /// @dev The address interpreted as native token of the chain. address public constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; @@ -45,7 +48,9 @@ library CurrencyTransferLib { safeTransferNativeTokenWithWrapper(_to, _amount, _nativeTokenWrapper); } else if (_to == address(this)) { // store native currency in weth - require(_amount == msg.value, "msg.value != amount"); + if (_amount != msg.value) { + revert CurrencyTransferLibMismatchedValue(msg.value, _amount); + } IWETH(_nativeTokenWrapper).deposit{ value: _amount }(); } else { safeTransferNativeTokenWithWrapper(_to, _amount, _nativeTokenWrapper); @@ -73,7 +78,9 @@ library CurrencyTransferLib { // solhint-disable avoid-low-level-calls // slither-disable-next-line low-level-calls (bool success, ) = to.call{ value: value }(""); - require(success, "native token transfer failed"); + if (!success) { + revert CurrencyTransferLibFailedNativeTransfer(to, value); + } } /// @dev Transfers `amount` of native token to `to`. (With native token wrapping) diff --git a/contracts/lib/MerkleProof.sol b/contracts/lib/MerkleProof.sol index c71db5cfe..f8a703761 100644 --- a/contracts/lib/MerkleProof.sol +++ b/contracts/lib/MerkleProof.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; -/// @author thirdweb +/// @author OpenZeppelin, thirdweb library MerkleProof { - function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool, uint256) { + function verify(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool, uint256) { bytes32 computedHash = leaf; uint256 index = 0; @@ -14,10 +14,10 @@ library MerkleProof { if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) - computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); + computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) - computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); + computedHash = _efficientHash(proofElement, computedHash); index += 1; } } @@ -25,4 +25,16 @@ library MerkleProof { // Check if the computed hash (root) is equal to the provided root return (computedHash == root, index); } + + /** + * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. + */ + function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, a) + mstore(0x20, b) + value := keccak256(0x00, 0x40) + } + } } diff --git a/contracts/prebuilts/pack/Pack.sol b/contracts/prebuilts/pack/Pack.sol index cdd9f2ef7..196448def 100644 --- a/contracts/prebuilts/pack/Pack.sol +++ b/contracts/prebuilts/pack/Pack.sol @@ -56,7 +56,12 @@ contract Pack is bytes32 private constant MODULE_TYPE = bytes32("Pack"); uint256 private constant VERSION = 2; - address private immutable forwarder; + /// @dev Only transfers to or from TRANSFER_ROLE holders are valid, when transfers are restricted. + bytes32 private constant TRANSFER_ROLE = keccak256("TRANSFER_ROLE"); + /// @dev Only MINTER_ROLE holders can create packs. + bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE"); + /// @dev Only assets with ASSET_ROLE can be packed, when packing is restricted to particular assets. + bytes32 private constant ASSET_ROLE = keccak256("ASSET_ROLE"); // Token name string public name; @@ -64,15 +69,6 @@ contract Pack is // Token symbol string public symbol; - /// @dev Only transfers to or from TRANSFER_ROLE holders are valid, when transfers are restricted. - bytes32 private transferRole; - - /// @dev Only MINTER_ROLE holders can create packs. - bytes32 private minterRole; - - /// @dev Only assets with ASSET_ROLE can be packed, when packing is restricted to particular assets. - bytes32 private assetRole; - /// @dev The token Id of the next set of packs to be minted. uint256 public nextTokenIdToMint; @@ -93,11 +89,10 @@ contract Pack is Constructor + initializer logic //////////////////////////////////////////////////////////////*/ - constructor(address _nativeTokenWrapper, address _trustedForwarder) TokenStore(_nativeTokenWrapper) initializer { - forwarder = _trustedForwarder; - } + constructor(address _nativeTokenWrapper) TokenStore(_nativeTokenWrapper) initializer {} /// @dev Initializes the contract, like a constructor. + /* solhint-disable no-unused-vars */ function initialize( address _defaultAdmin, string memory _name, @@ -107,22 +102,6 @@ contract Pack is address _royaltyRecipient, uint256 _royaltyBps ) external initializer { - bytes32 _transferRole = keccak256("TRANSFER_ROLE"); - bytes32 _minterRole = keccak256("MINTER_ROLE"); - bytes32 _assetRole = keccak256("ASSET_ROLE"); - - /** note: The immutable state-variable `forwarder` is an EOA-only forwarder, - * which guards against automated attacks. - * - * Use other forwarders only if there's a strong reason to bypass this check. - */ - address[] memory forwarders = new address[](_trustedForwarders.length + 1); - uint256 i; - for (; i < _trustedForwarders.length; i++) { - forwarders[i] = _trustedForwarders[i]; - } - forwarders[i] = forwarder; - __ERC2771Context_init(forwarders); __ERC1155_init(_contractURI); name = _name; @@ -131,21 +110,17 @@ contract Pack is _setupContractURI(_contractURI); _setupOwner(_defaultAdmin); _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); - - _setupRole(_transferRole, _defaultAdmin); - _setupRole(_minterRole, _defaultAdmin); - _setupRole(_transferRole, address(0)); + _setupRole(MINTER_ROLE, _defaultAdmin); // note: see `onlyRoleWithSwitch` for ASSET_ROLE behaviour. - _setupRole(_assetRole, address(0)); + _setupRole(ASSET_ROLE, address(0)); + _setupRole(TRANSFER_ROLE, address(0)); _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps); - - transferRole = _transferRole; - minterRole = _minterRole; - assetRole = _assetRole; } + /* solhint-enable no-unused-vars */ + receive() external payable { require(msg.sender == nativeTokenWrapper, "!nativeTokenWrapper."); } @@ -205,12 +180,12 @@ contract Pack is uint128 _openStartTimestamp, uint128 _amountDistributedPerOpen, address _recipient - ) external payable onlyRoleWithSwitch(minterRole) nonReentrant returns (uint256 packId, uint256 packTotalSupply) { + ) external payable onlyRoleWithSwitch(MINTER_ROLE) nonReentrant returns (uint256 packId, uint256 packTotalSupply) { require(_contents.length > 0 && _contents.length == _numOfRewardUnits.length, "!Len"); - if (!hasRole(assetRole, address(0))) { + if (!hasRole(ASSET_ROLE, address(0))) { for (uint256 i = 0; i < _contents.length; i += 1) { - _checkRole(assetRole, _contents[i].assetContract); + _checkRole(ASSET_ROLE, _contents[i].assetContract); } } @@ -245,7 +220,7 @@ contract Pack is ) external payable - onlyRoleWithSwitch(minterRole) + onlyRoleWithSwitch(MINTER_ROLE) nonReentrant returns (uint256 packTotalSupply, uint256 newSupplyAdded) { @@ -253,9 +228,9 @@ contract Pack is require(_contents.length > 0 && _contents.length == _numOfRewardUnits.length, "!Len"); require(balanceOf(_recipient, _packId) != 0, "!Bal"); - if (!hasRole(assetRole, address(0))) { + if (!hasRole(ASSET_ROLE, address(0))) { for (uint256 i = 0; i < _contents.length; i += 1) { - _checkRole(assetRole, _contents[i].assetContract); + _checkRole(ASSET_ROLE, _contents[i].assetContract); } } @@ -273,7 +248,7 @@ contract Pack is function openPack(uint256 _packId, uint256 _amountToOpen) external nonReentrant returns (Token[] memory) { address opener = _msgSender(); - require(isTrustedForwarder(msg.sender) || opener == tx.origin, "!EOA"); + require(opener == tx.origin, "!EOA"); require(balanceOf(opener, _packId) >= _amountToOpen, "!Bal"); PackInfo memory pack = packInfo[_packId]; @@ -440,8 +415,8 @@ contract Pack is super._beforeTokenTransfer(operator, from, to, ids, amounts, data); // if transfer is restricted on the contract, we still want to allow burning and minting - if (!hasRole(transferRole, address(0)) && from != address(0) && to != address(0)) { - require(hasRole(transferRole, from) || hasRole(transferRole, to), "!TRANSFER_ROLE"); + if (!hasRole(TRANSFER_ROLE, address(0)) && from != address(0) && to != address(0)) { + require(hasRole(TRANSFER_ROLE, from) || hasRole(TRANSFER_ROLE, to), "!TRANSFER_ROLE"); } if (from == address(0)) { diff --git a/src/test/ContractPublisher.t.sol b/src/test/ContractPublisher.t.sol index 4ff5ca50a..e80fe7d43 100644 --- a/src/test/ContractPublisher.t.sol +++ b/src/test/ContractPublisher.t.sol @@ -7,7 +7,7 @@ import "contracts/infra/interface/IContractPublisher.sol"; import "contracts/infra/TWRegistry.sol"; // Test helpers -import { BaseTest } from "./utils/BaseTest.sol"; +import { BaseTest, MockContractPublisher } from "./utils/BaseTest.sol"; import "@openzeppelin/contracts/utils/Create2.sol"; contract MockCustomContract { @@ -114,6 +114,84 @@ contract ContractPublisherTest is BaseTest, IContractPublisherData { // assertEq(customContract.implementation, address(0)); // } + function test_state_setPrevPublisher() public { + // === when prevPublisher address is address(0) + vm.prank(factoryAdmin); + byoc.setPrevPublisher(IContractPublisher(address(0))); + + assertEq(byoc.getAllPublishedContracts(publisher).length, 0); + assertEq(address(byoc.prevPublisher()), address(0)); + + string memory contractId = "MyContract"; + vm.prank(publisher); + byoc.publishContract( + publisher, + contractId, + publishMetadataUri, + compilerMetadataUri, + keccak256(type(MockCustomContract).creationCode), + address(0) + ); + IContractPublisher.CustomContractInstance[] memory contracts = byoc.getAllPublishedContracts(publisher); + assertEq(contracts.length, 1); + assertEq(contracts[0].contractId, "MyContract"); + + // === when prevPublisher address is set to MockPublisher + address mock = address(new MockContractPublisher()); + vm.prank(factoryAdmin); + byoc.setPrevPublisher(IContractPublisher(mock)); + + contracts = byoc.getAllPublishedContracts(publisher); + assertEq(contracts.length, 2); + assertEq(address(byoc.prevPublisher()), mock); + assertEq(contracts[0].contractId, "MockContract"); + assertEq(contracts[1].contractId, "MyContract"); + } + + function test_revert_setPrevPublisher() public { + vm.expectRevert("Not authorized"); + byoc.setPrevPublisher(IContractPublisher(address(0))); + } + + function test_state_setPublisherProfileUri() public { + address user = address(0x123); + string memory uriOne = "ipfs://one"; + string memory uriTwo = "ipfs://two"; + + // user updating for self + vm.prank(user); + byoc.setPublisherProfileUri(user, uriOne); + assertEq(byoc.getPublisherProfileUri(user), uriOne); + + // random caller + vm.prank(address(0x345)); + vm.expectRevert("Registry paused or caller not authorized"); + byoc.setPublisherProfileUri(user, uriOne); + + // MIGRATION_ROLE holder updating for a user + vm.prank(factoryAdmin); + byoc.setPublisherProfileUri(user, uriTwo); + assertEq(byoc.getPublisherProfileUri(user), uriTwo); + } + + function test_state_setPublisherProfileUri_whenPaused() public { + vm.prank(factoryAdmin); + byoc.setPause(true); + address user = address(0x123); + string memory uriOne = "ipfs://one"; + string memory uriTwo = "ipfs://two"; + + // user updating for self + vm.prank(user); + vm.expectRevert("Registry paused or caller not authorized"); + byoc.setPublisherProfileUri(user, uriOne); + + // MIGRATION_ROLE holder updating for a user + vm.prank(factoryAdmin); + byoc.setPublisherProfileUri(user, uriTwo); + assertEq(byoc.getPublisherProfileUri(user), uriTwo); + } + function test_publish_revert_unapprovedCaller() public { string memory contractId = "MyContract"; diff --git a/src/test/LoyaltyCard.t.sol b/src/test/LoyaltyCard.t.sol index 9f0d1f022..f9e26498b 100644 --- a/src/test/LoyaltyCard.t.sol +++ b/src/test/LoyaltyCard.t.sol @@ -7,7 +7,7 @@ import "@ds-test/test.sol"; import "./utils/BaseTest.sol"; import "contracts/infra/TWProxy.sol"; import { Strings } from "contracts/lib/Strings.sol"; -import { LoyaltyCard } from "contracts/prebuilts/loyalty/LoyaltyCard.sol"; +import { LoyaltyCard, NFTMetadata } from "contracts/prebuilts/loyalty/LoyaltyCard.sol"; contract LoyaltyCardTest is BaseTest { LoyaltyCard internal loyaltyCard; @@ -320,7 +320,7 @@ contract LoyaltyCardTest is BaseTest { function test_setTokenURI_revert_NotAuthorized() public { string memory uri = "uri_string"; - vm.expectRevert("NFTMetadata: not authorized to set metadata."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataUnauthorized.selector)); vm.prank(address(0x1)); loyaltyCard.setTokenURI(0, uri); } @@ -331,7 +331,7 @@ contract LoyaltyCardTest is BaseTest { vm.startPrank(signer); loyaltyCard.freezeMetadata(); - vm.expectRevert("NFTMetadata: metadata is frozen."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataFrozen.selector, 0)); loyaltyCard.setTokenURI(0, uri); } diff --git a/src/test/Multiwrap.t.sol b/src/test/Multiwrap.t.sol index a8b34e923..de0dd7bf8 100644 --- a/src/test/Multiwrap.t.sol +++ b/src/test/Multiwrap.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import { Multiwrap } from "contracts/prebuilts/multiwrap/Multiwrap.sol"; import { ITokenBundle } from "contracts/extension/interface/ITokenBundle.sol"; +import { CurrencyTransferLib } from "contracts/lib/CurrencyTransferLib.sol"; // Test imports import { MockERC20 } from "./mocks/MockERC20.sol"; @@ -112,14 +113,7 @@ contract MultiwrapTest is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(caller); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, caller, role)); multiwrap.renounceRole(role, caller); } @@ -132,14 +126,7 @@ contract MultiwrapTest is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(deployer); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(target), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, target, role)); multiwrap.revokeRole(role, target); } @@ -334,17 +321,14 @@ contract MultiwrapTest is BaseTest { address recipient = address(0x123); - string memory errorMsg = string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(wrappedContent[0].assetContract), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("ASSET_ROLE")), 32) + vm.prank(address(tokenOwner)); + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(erc20), + keccak256("ASSET_ROLE") ) ); - - vm.prank(address(tokenOwner)); - vm.expectRevert(bytes(errorMsg)); multiwrap.wrap(wrappedContent, uriForWrappedToken, recipient); } @@ -357,17 +341,14 @@ contract MultiwrapTest is BaseTest { address recipient = address(0x123); - string memory errorMsg = string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(tokenOwner)), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("MINTER_ROLE")), 32) + vm.prank(address(tokenOwner)); + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(tokenOwner), + keccak256("MINTER_ROLE") ) ); - - vm.prank(address(tokenOwner)); - vm.expectRevert(bytes(errorMsg)); multiwrap.wrap(wrappedContent, uriForWrappedToken, recipient); } @@ -388,7 +369,9 @@ contract MultiwrapTest is BaseTest { }); vm.prank(address(tokenOwner)); - vm.expectRevert("msg.value != amount"); + vm.expectRevert( + abi.encodeWithSelector(CurrencyTransferLib.CurrencyTransferLibMismatchedValue.selector, 0, 10 ether) + ); multiwrap.wrap(nativeTokenContentToWrap, uriForWrappedToken, recipient); } @@ -529,7 +512,9 @@ contract MultiwrapTest is BaseTest { }); vm.prank(address(tokenOwner)); - vm.expectRevert("msg.value != amount"); + vm.expectRevert( + abi.encodeWithSelector(CurrencyTransferLib.CurrencyTransferLibMismatchedValue.selector, 10 ether, 20 ether) + ); multiwrap.wrap{ value: 10 ether }(nativeTokenContentToWrap, uriForWrappedToken, recipient); assertEq(address(multiwrap).balance, 10 ether); @@ -743,17 +728,14 @@ contract MultiwrapTest is BaseTest { vm.prank(deployer); multiwrap.revokeRole(keccak256("UNWRAP_ROLE"), address(0)); - string memory errorMsg = string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(recipient), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("UNWRAP_ROLE")), 32) + vm.prank(recipient); + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + recipient, + keccak256("UNWRAP_ROLE") ) ); - - vm.prank(recipient); - vm.expectRevert(bytes(errorMsg)); multiwrap.unwrap(expectedIdForWrappedToken, recipient); } diff --git a/src/test/OpenEditionERC721.t.sol b/src/test/OpenEditionERC721.t.sol index fb9310f30..2b9a63db7 100644 --- a/src/test/OpenEditionERC721.t.sol +++ b/src/test/OpenEditionERC721.t.sol @@ -2,6 +2,9 @@ pragma solidity ^0.8.0; import { ERC721AUpgradeable, OpenEditionERC721, ISharedMetadata } from "contracts/prebuilts/open-edition/OpenEditionERC721.sol"; +import { Drop } from "contracts/extension/Drop.sol"; +import { LazyMint } from "contracts/extension/LazyMint.sol"; +import { OpenEditionERC721 } from "contracts/prebuilts/open-edition/OpenEditionERC721.sol"; import { NFTMetadataRenderer } from "contracts/lib/NFTMetadataRenderer.sol"; import { TWProxy } from "contracts/infra/TWProxy.sol"; @@ -72,14 +75,7 @@ contract OpenEditionERC721Test is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(caller); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, caller, role)); openEdition.renounceRole(role, caller); } @@ -92,14 +88,7 @@ contract OpenEditionERC721Test is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(deployer); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(target), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, target, role)); openEdition.revokeRole(role, target); } @@ -115,7 +104,7 @@ contract OpenEditionERC721Test is BaseTest { openEdition.grantRole(role, receiver); - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); openEdition.grantRole(role, receiver); vm.stopPrank(); @@ -139,7 +128,7 @@ contract OpenEditionERC721Test is BaseTest { openEdition.grantRole(role, receiver); // expect revert when granting to a holder - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); openEdition.grantRole(role, receiver); // check if receiver has transfer role @@ -211,7 +200,7 @@ contract OpenEditionERC721Test is BaseTest { vm.warp(99); vm.prank(getActor(5), getActor(5)); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); openEdition.claim(receiver, 1, address(0), 0, alp, ""); vm.warp(100); @@ -341,7 +330,9 @@ contract OpenEditionERC721Test is BaseTest { vm.prank(getActor(5), getActor(5)); openEdition.claim(receiver, 100, address(0), 0, alp, ""); - vm.expectRevert("!MaxSupply"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedMaxSupply.selector, conditions[0].maxClaimableSupply, 101) + ); vm.prank(getActor(6), getActor(6)); openEdition.claim(receiver, 1, address(0), 0, alp, ""); } @@ -370,21 +361,25 @@ contract OpenEditionERC721Test is BaseTest { vm.prank(deployer); openEdition.setClaimConditions(conditions, false); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 0) + ); openEdition.claim(receiver, 0, address(0), 0, alp, ""); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); openEdition.claim(receiver, 101, address(0), 0, alp, ""); vm.prank(deployer); openEdition.setClaimConditions(conditions, true); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); openEdition.claim(receiver, 101, address(0), 0, alp, ""); } @@ -483,7 +478,9 @@ contract OpenEditionERC721Test is BaseTest { openEdition.setClaimConditions(conditions, false); vm.prank(receiver, receiver); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimInvalidTokenPrice.selector, address(erc20), 0, address(erc20), 5) + ); openEdition.claim(receiver, 100, address(erc20), 0, alp, ""); erc20.mint(receiver, 10000); @@ -600,9 +597,10 @@ contract OpenEditionERC721Test is BaseTest { vm.prank(receiver); erc20.approve(address(openEdition), 10000); - bytes memory errorQty = "!Qty"; vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 100) + ); openEdition.claim(receiver, 100, address(erc20), 5, alp, ""); // trying to claim more than general limit // vm.prank(getActor(5), getActor(5)); @@ -657,10 +655,8 @@ contract OpenEditionERC721Test is BaseTest { openEdition.claim(receiver, x - 5, address(0), 0, alp, ""); assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), x - 5); - bytes memory errorQty = "!Qty"; - vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 1)); openEdition.claim(receiver, 6, address(0), 0, alp, ""); vm.prank(receiver, receiver); @@ -668,7 +664,7 @@ contract OpenEditionERC721Test is BaseTest { assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), x); vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 5)); openEdition.claim(receiver, 5, address(0), 0, alp, ""); // quantity limit already claimed } @@ -697,10 +693,10 @@ contract OpenEditionERC721Test is BaseTest { vm.prank(getActor(5), getActor(5)); openEdition.claim(receiver, 100, address(0), 0, alp, ""); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 200) + ); openEdition.claim(receiver, 100, address(0), 0, alp, ""); vm.prank(deployer); @@ -764,7 +760,7 @@ contract OpenEditionERC721Test is BaseTest { conditions[2].quantityLimitPerWallet = 32; openEdition.setClaimConditions(conditions, false); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); openEdition.getActiveClaimConditionId(); vm.warp(10); diff --git a/src/test/OpenEditionERC721FlatFee.t.sol b/src/test/OpenEditionERC721FlatFee.t.sol index 4c94b0ae7..38de7326c 100644 --- a/src/test/OpenEditionERC721FlatFee.t.sol +++ b/src/test/OpenEditionERC721FlatFee.t.sol @@ -2,6 +2,9 @@ pragma solidity ^0.8.0; import { ERC721AUpgradeable, OpenEditionERC721FlatFee, ISharedMetadata } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { Drop } from "contracts/extension/Drop.sol"; +import { LazyMint } from "contracts/extension/LazyMint.sol"; +import { OpenEditionERC721FlatFee } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; import { NFTMetadataRenderer } from "contracts/lib/NFTMetadataRenderer.sol"; import { TWProxy } from "contracts/infra/TWProxy.sol"; @@ -74,14 +77,7 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(caller); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, caller, role)); openEdition.renounceRole(role, caller); } @@ -94,14 +90,7 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(deployer); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(target), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, target, role)); openEdition.revokeRole(role, target); } @@ -117,7 +106,7 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { openEdition.grantRole(role, receiver); - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); openEdition.grantRole(role, receiver); vm.stopPrank(); @@ -141,7 +130,7 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { openEdition.grantRole(role, receiver); // expect revert when granting to a holder - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); openEdition.grantRole(role, receiver); // check if receiver has transfer role @@ -213,7 +202,7 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { vm.warp(99); vm.prank(getActor(5), getActor(5)); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); openEdition.claim(receiver, 1, address(0), 0, alp, ""); vm.warp(100); @@ -343,7 +332,9 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { vm.prank(getActor(5), getActor(5)); openEdition.claim(receiver, 100, address(0), 0, alp, ""); - vm.expectRevert("!MaxSupply"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedMaxSupply.selector, conditions[0].maxClaimableSupply, 101) + ); vm.prank(getActor(6), getActor(6)); openEdition.claim(receiver, 1, address(0), 0, alp, ""); } @@ -372,21 +363,25 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { vm.prank(deployer); openEdition.setClaimConditions(conditions, false); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 0) + ); openEdition.claim(receiver, 0, address(0), 0, alp, ""); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); openEdition.claim(receiver, 101, address(0), 0, alp, ""); vm.prank(deployer); openEdition.setClaimConditions(conditions, true); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); openEdition.claim(receiver, 101, address(0), 0, alp, ""); } @@ -485,7 +480,9 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { openEdition.setClaimConditions(conditions, false); vm.prank(receiver, receiver); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimInvalidTokenPrice.selector, address(erc20), 0, address(erc20), 5) + ); openEdition.claim(receiver, 100, address(erc20), 0, alp, ""); erc20.mint(receiver, 10000); @@ -602,9 +599,10 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { vm.prank(receiver); erc20.approve(address(openEdition), 10000); - bytes memory errorQty = "!Qty"; vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 100) + ); openEdition.claim(receiver, 100, address(erc20), 5, alp, ""); // trying to claim more than general limit // vm.prank(getActor(5), getActor(5)); @@ -659,10 +657,8 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { openEdition.claim(receiver, x - 5, address(0), 0, alp, ""); assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), x - 5); - bytes memory errorQty = "!Qty"; - vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 1)); openEdition.claim(receiver, 6, address(0), 0, alp, ""); vm.prank(receiver, receiver); @@ -670,7 +666,7 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { assertEq(openEdition.getSupplyClaimedByWallet(openEdition.getActiveClaimConditionId(), receiver), x); vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 5)); openEdition.claim(receiver, 5, address(0), 0, alp, ""); // quantity limit already claimed } @@ -699,10 +695,10 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { vm.prank(getActor(5), getActor(5)); openEdition.claim(receiver, 100, address(0), 0, alp, ""); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 200) + ); openEdition.claim(receiver, 100, address(0), 0, alp, ""); vm.prank(deployer); @@ -766,7 +762,7 @@ contract OpenEditionERC721FlatFeeTest is BaseTest { conditions[2].quantityLimitPerWallet = 32; openEdition.setClaimConditions(conditions, false); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); openEdition.getActiveClaimConditionId(); vm.warp(10); diff --git a/src/test/SignatureDrop.t.sol b/src/test/SignatureDrop.t.sol index ea47d9d64..393799338 100644 --- a/src/test/SignatureDrop.t.sol +++ b/src/test/SignatureDrop.t.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { SignatureDrop, IDropSinglePhase, IDelayedReveal, ISignatureMintERC721, ERC721AUpgradeable, IPermissions, ILazyMint } from "contracts/prebuilts/signature-drop/SignatureDrop.sol"; +import { SignatureDrop, DropSinglePhase, Permissions, LazyMint, BatchMintMetadata, DelayedReveal, IDropSinglePhase, IDelayedReveal, ISignatureMintERC721, ERC721AUpgradeable, IPermissions, ILazyMint } from "contracts/prebuilts/signature-drop/SignatureDrop.sol"; +import { SignatureMintERC721 } from "contracts/extension/SignatureMintERC721.sol"; // Test imports import "erc721a-upgradeable/contracts/IERC721AUpgradeable.sol"; @@ -64,14 +65,7 @@ contract SignatureDropTest is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(caller); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(); sigdrop.renounceRole(role, caller); } @@ -84,14 +78,7 @@ contract SignatureDropTest is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(deployerSigner); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(target), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, target, role)); sigdrop.revokeRole(role, target); } @@ -107,7 +94,7 @@ contract SignatureDropTest is BaseTest { sigdrop.grantRole(role, receiver); - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(); sigdrop.grantRole(role, receiver); vm.stopPrank(); @@ -131,7 +118,7 @@ contract SignatureDropTest is BaseTest { sigdrop.grantRole(role, receiver); // expect revert when granting to a holder - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); sigdrop.grantRole(role, receiver); // check if receiver has transfer role @@ -291,7 +278,13 @@ contract SignatureDropTest is BaseTest { vm.warp(99); vm.prank(getActor(5), getActor(5)); - vm.expectRevert("cant claim yet"); + vm.expectRevert( + abi.encodeWithSelector( + DropSinglePhase.DropClaimNotStarted.selector, + conditions[0].startTimestamp, + block.timestamp + ) + ); sigdrop.claim(receiver, 1, address(0), 0, alp, ""); } @@ -361,7 +354,7 @@ contract SignatureDropTest is BaseTest { sigdrop.lazyMint(100, "ipfs://", emptyEncodedBytes); vm.prank(address(0x567)); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintUnauthorized.selector)); sigdrop.lazyMint(100, "ipfs://", emptyEncodedBytes); } @@ -373,7 +366,7 @@ contract SignatureDropTest is BaseTest { sigdrop.lazyMint(100, "ipfs://", emptyEncodedBytes); - vm.expectRevert("Invalid tokenId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidTokenId.selector, 100)); sigdrop.tokenURI(100); vm.stopPrank(); @@ -531,14 +524,13 @@ contract SignatureDropTest is BaseTest { vm.prank(deployerSigner); sigdrop.reveal(0, "key"); - bytes memory errorMessage = abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(this)), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("MINTER_ROLE")), 32) + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(this), + keccak256("MINTER_ROLE") + ) ); - - vm.expectRevert(errorMessage); sigdrop.reveal(0, "key"); } @@ -557,7 +549,7 @@ contract SignatureDropTest is BaseTest { console.log(sigdrop.getBaseURICount()); sigdrop.lazyMint(100, "", abi.encode(encryptedURI, provenanceHash)); - vm.expectRevert("Invalid index"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, 2)); sigdrop.reveal(2, "key"); vm.stopPrank(); @@ -575,7 +567,7 @@ contract SignatureDropTest is BaseTest { sigdrop.lazyMint(100, "", abi.encode(encryptedURI, provenanceHash)); sigdrop.reveal(0, "key"); - vm.expectRevert("Nothing to reveal"); + vm.expectRevert(abi.encodeWithSelector(DelayedReveal.DelayedRevealNothingToReveal.selector)); sigdrop.reveal(0, "key"); vm.stopPrank(); @@ -802,7 +794,7 @@ contract SignatureDropTest is BaseTest { sigdrop.mintWithSignature(mintrequest, signature); signature = signMintRequest(mintrequest, 4321); - vm.expectRevert("Invalid req"); + vm.expectRevert(abi.encodeWithSelector(SignatureMintERC721.SignatureMintInvalidSigner.selector)); sigdrop.mintWithSignature(mintrequest, signature); } @@ -831,7 +823,7 @@ contract SignatureDropTest is BaseTest { vm.warp(1000); vm.prank(deployerSigner); - vm.expectRevert("0 qty"); + vm.expectRevert(abi.encodeWithSelector(SignatureMintERC721.SignatureMintInvalidQuantity.selector)); sigdrop.mintWithSignature(mintrequest, signature); } @@ -1044,7 +1036,13 @@ contract SignatureDropTest is BaseTest { vm.prank(getActor(5), getActor(5)); sigdrop.claim(receiver, 100, address(0), 0, alp, ""); - vm.expectRevert("!MaxSupply"); + vm.expectRevert( + abi.encodeWithSelector( + DropSinglePhase.DropClaimExceedMaxSupply.selector, + conditions[0].maxClaimableSupply, + 101 + ) + ); vm.prank(getActor(6), getActor(6)); sigdrop.claim(receiver, 1, address(0), 0, alp, ""); } @@ -1073,17 +1071,27 @@ contract SignatureDropTest is BaseTest { vm.prank(deployerSigner); sigdrop.setClaimConditions(conditions[0], false); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector( + DropSinglePhase.DropClaimExceedLimit.selector, + conditions[0].quantityLimitPerWallet, + 101 + ) + ); sigdrop.claim(receiver, 101, address(0), 0, alp, ""); vm.prank(deployerSigner); sigdrop.setClaimConditions(conditions[0], true); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector( + DropSinglePhase.DropClaimExceedLimit.selector, + conditions[0].quantityLimitPerWallet, + 101 + ) + ); sigdrop.claim(receiver, 101, address(0), 0, alp, ""); } @@ -1132,10 +1140,8 @@ contract SignatureDropTest is BaseTest { sigdrop.claim(receiver, x - 5, address(0), 0, alp, ""); assertEq(sigdrop.getSupplyClaimedByWallet(receiver), x - 5); - bytes memory errorQty = "!Qty"; - vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(DropSinglePhase.DropClaimExceedLimit.selector, x, x + 1)); sigdrop.claim(receiver, 6, address(0), 0, alp, ""); vm.prank(receiver, receiver); @@ -1143,7 +1149,7 @@ contract SignatureDropTest is BaseTest { assertEq(sigdrop.getSupplyClaimedByWallet(receiver), x); vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(DropSinglePhase.DropClaimExceedLimit.selector, x, x + 5)); sigdrop.claim(receiver, 5, address(0), 0, alp, ""); } @@ -1195,7 +1201,7 @@ contract SignatureDropTest is BaseTest { assertEq(uri, string(abi.encodePacked("ipfs://", "1"))); bytes memory newEncryptedURI = sigdrop.encryptDecrypt("ipfs://secret", "key"); - vm.expectRevert("0 amt"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintInvalidAmount.selector)); sigdrop.lazyMint(0, "", abi.encode(newEncryptedURI, provenanceHash)); vm.stopPrank(); diff --git a/src/test/drop/DropERC1155.t.sol b/src/test/drop/DropERC1155.t.sol index 8905ab80d..840f78cf6 100644 --- a/src/test/drop/DropERC1155.t.sol +++ b/src/test/drop/DropERC1155.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC1155, IPermissions, ILazyMint } from "contracts/prebuilts/drop/DropERC1155.sol"; +import { DropERC1155, BatchMintMetadata, Drop1155, LazyMint, IPermissions, ILazyMint } from "contracts/prebuilts/drop/DropERC1155.sol"; // Test imports @@ -42,14 +42,7 @@ contract DropERC1155Test is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(caller); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, caller, role)); drop.renounceRole(role, caller); } @@ -62,14 +55,7 @@ contract DropERC1155Test is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(deployer); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(target), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, target, role)); drop.revokeRole(role, target); } @@ -85,7 +71,7 @@ contract DropERC1155Test is BaseTest { drop.grantRole(role, receiver); - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); drop.grantRole(role, receiver); vm.stopPrank(); @@ -109,7 +95,7 @@ contract DropERC1155Test is BaseTest { drop.grantRole(role, receiver); // expect revert when granting to a holder - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); drop.grantRole(role, receiver); // check if receiver has transfer role @@ -267,7 +253,7 @@ contract DropERC1155Test is BaseTest { vm.warp(99); vm.prank(getActor(5), getActor(5)); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropNoActiveCondition.selector)); drop.claim(receiver, _tokenId, 1, address(0), 0, alp, ""); vm.warp(100); @@ -307,7 +293,7 @@ contract DropERC1155Test is BaseTest { * note: Testing revert condition; an address without MINTER_ROLE calls lazyMint function. */ function test_revert_lazyMint_MINTER_ROLE() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintUnauthorized.selector)); drop.lazyMint(100, "ipfs://", emptyEncodedBytes); } @@ -319,7 +305,7 @@ contract DropERC1155Test is BaseTest { drop.lazyMint(100, "ipfs://", emptyEncodedBytes); - vm.expectRevert("Invalid tokenId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidTokenId.selector, 100)); drop.uri(100); vm.stopPrank(); @@ -419,7 +405,7 @@ contract DropERC1155Test is BaseTest { vm.prank(deployer); drop.setClaimConditions(_tokenId, conditions, false); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropNoActiveCondition.selector)); vm.prank(getActor(6), getActor(6)); drop.claim(receiver, 100, 101, address(0), 0, alp, ""); } @@ -449,7 +435,7 @@ contract DropERC1155Test is BaseTest { vm.prank(getActor(5), getActor(5)); drop.claim(receiver, _tokenId, 100, address(0), 0, alp, ""); - vm.expectRevert("!MaxSupply"); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedMaxSupply.selector, 100, 101)); vm.prank(getActor(6), getActor(6)); drop.claim(receiver, _tokenId, 1, address(0), 0, alp, ""); } @@ -479,21 +465,19 @@ contract DropERC1155Test is BaseTest { vm.prank(deployer); drop.setClaimConditions(_tokenId, conditions, false); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedLimit.selector, 100, 0)); drop.claim(receiver, _tokenId, 0, address(0), 0, alp, ""); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedLimit.selector, 100, 101)); drop.claim(receiver, _tokenId, 101, address(0), 0, alp, ""); vm.prank(deployer); drop.setClaimConditions(_tokenId, conditions, true); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedLimit.selector, 100, 101)); drop.claim(receiver, _tokenId, 101, address(0), 0, alp, ""); } @@ -594,7 +578,9 @@ contract DropERC1155Test is BaseTest { drop.setClaimConditions(_tokenId, conditions, false); vm.prank(receiver, receiver); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector(Drop1155.DropClaimInvalidTokenPrice.selector, address(erc20), 0, address(erc20), 5) + ); drop.claim(receiver, _tokenId, 100, address(erc20), 0, alp, ""); erc20.mint(receiver, 10000); @@ -713,9 +699,8 @@ contract DropERC1155Test is BaseTest { vm.prank(receiver); erc20.approve(address(drop), 10000); - bytes memory errorQty = "!Qty"; vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedLimit.selector, 10, 100)); drop.claim(receiver, _tokenId, 100, address(erc20), 5, alp, ""); // trying to claim more than general limit // vm.prank(getActor(5), getActor(5)); @@ -771,10 +756,8 @@ contract DropERC1155Test is BaseTest { drop.claim(receiver, _tokenId, x - 5, address(0), 0, alp, ""); assertEq(drop.getSupplyClaimedByWallet(_tokenId, drop.getActiveClaimConditionId(_tokenId), receiver), x - 5); - bytes memory errorQty = "!Qty"; - vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedLimit.selector, x, x + 1)); drop.claim(receiver, _tokenId, 6, address(0), 0, alp, ""); vm.prank(receiver, receiver); @@ -782,7 +765,7 @@ contract DropERC1155Test is BaseTest { assertEq(drop.getSupplyClaimedByWallet(_tokenId, drop.getActiveClaimConditionId(_tokenId), receiver), x); vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedLimit.selector, x, x + 5)); drop.claim(receiver, _tokenId, 5, address(0), 0, alp, ""); // quantity limit already claimed } @@ -812,10 +795,8 @@ contract DropERC1155Test is BaseTest { vm.prank(getActor(5), getActor(5)); drop.claim(receiver, _tokenId, 100, address(0), 0, alp, ""); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropClaimExceedLimit.selector, 100, 200)); drop.claim(receiver, _tokenId, 100, address(0), 0, alp, ""); vm.prank(deployer); @@ -881,7 +862,7 @@ contract DropERC1155Test is BaseTest { conditions[2].quantityLimitPerWallet = 32; drop.setClaimConditions(_tokenId, conditions, false); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop1155.DropNoActiveCondition.selector)); drop.getActiveClaimConditionId(_tokenId); vm.warp(10); diff --git a/src/test/drop/DropERC20.t.sol b/src/test/drop/DropERC20.t.sol index bfa52455d..f0958a5fb 100644 --- a/src/test/drop/DropERC20.t.sol +++ b/src/test/drop/DropERC20.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC20 } from "contracts/prebuilts/drop/DropERC20.sol"; +import { DropERC20, Permissions, Drop } from "contracts/prebuilts/drop/DropERC20.sol"; // Test imports @@ -36,15 +36,7 @@ contract DropERC20Test is BaseTest { bytes32 role = keccak256("TRANSFER_ROLE"); vm.prank(caller); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); - + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, caller, role)); drop.renounceRole(role, caller); } @@ -56,15 +48,7 @@ contract DropERC20Test is BaseTest { bytes32 role = keccak256("TRANSFER_ROLE"); vm.prank(deployer); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(target), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); - + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, target, role)); drop.revokeRole(role, target); } @@ -79,7 +63,7 @@ contract DropERC20Test is BaseTest { drop.grantRole(role, receiver); - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); drop.grantRole(role, receiver); vm.stopPrank(); @@ -103,7 +87,7 @@ contract DropERC20Test is BaseTest { drop.grantRole(role, receiver); // expect revert when granting to a holder - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); drop.grantRole(role, receiver); // check if receiver has transfer role @@ -254,7 +238,7 @@ contract DropERC20Test is BaseTest { vm.warp(99); vm.prank(getActor(5), getActor(5)); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); drop.claim(receiver, 1, address(0), 0, alp, ""); vm.warp(100); @@ -288,7 +272,9 @@ contract DropERC20Test is BaseTest { vm.prank(getActor(5), getActor(5)); drop.claim(receiver, 100, address(0), 0, alp, ""); - vm.expectRevert("!MaxSupply"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedMaxSupply.selector, conditions[0].maxClaimableSupply, 101) + ); vm.prank(getActor(6), getActor(6)); drop.claim(receiver, 1, address(0), 0, alp, ""); } @@ -314,21 +300,25 @@ contract DropERC20Test is BaseTest { vm.prank(deployer); drop.setClaimConditions(conditions, false); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 0) + ); drop.claim(receiver, 0, address(0), 0, alp, ""); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); drop.claim(receiver, 101, address(0), 0, alp, ""); vm.prank(deployer); drop.setClaimConditions(conditions, true); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); drop.claim(receiver, 101, address(0), 0, alp, ""); } @@ -423,7 +413,9 @@ contract DropERC20Test is BaseTest { drop.setClaimConditions(conditions, false); vm.prank(receiver, receiver); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimInvalidTokenPrice.selector, address(erc20), 0, address(erc20), 1 ether) + ); drop.claim(receiver, 100 ether, address(erc20), 0, alp, ""); erc20.mint(receiver, 1000 ether); @@ -536,9 +528,10 @@ contract DropERC20Test is BaseTest { vm.prank(receiver); erc20.approve(address(drop), 10000 ether); - bytes memory errorQty = "!Qty"; vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 100 ether) + ); drop.claim(receiver, 100 ether, address(erc20), 5 ether, alp, ""); // trying to claim more than general limit // vm.prank(getActor(5), getActor(5)); @@ -591,10 +584,8 @@ contract DropERC20Test is BaseTest { drop.claim(receiver, x - 5, address(0), 0, alp, ""); assertEq(drop.getSupplyClaimedByWallet(drop.getActiveClaimConditionId(), receiver), x - 5); - bytes memory errorQty = "!Qty"; - vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 1)); drop.claim(receiver, 6, address(0), 0, alp, ""); vm.prank(receiver, receiver); @@ -602,7 +593,7 @@ contract DropERC20Test is BaseTest { assertEq(drop.getSupplyClaimedByWallet(drop.getActiveClaimConditionId(), receiver), x); vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 5)); drop.claim(receiver, 5, address(0), 0, alp, ""); // quantity limit already claimed } @@ -628,10 +619,10 @@ contract DropERC20Test is BaseTest { vm.prank(getActor(5), getActor(5)); drop.claim(receiver, 100, address(0), 0, alp, ""); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 200) + ); drop.claim(receiver, 100, address(0), 0, alp, ""); vm.prank(deployer); @@ -695,7 +686,7 @@ contract DropERC20Test is BaseTest { conditions[2].quantityLimitPerWallet = 32; drop.setClaimConditions(conditions, false); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); drop.getActiveClaimConditionId(); vm.warp(10); diff --git a/src/test/drop/DropERC721.t.sol b/src/test/drop/DropERC721.t.sol index 8be788e05..dbf660c09 100644 --- a/src/test/drop/DropERC721.t.sol +++ b/src/test/drop/DropERC721.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC721, IDelayedReveal, ERC721AUpgradeable, IPermissions, ILazyMint } from "contracts/prebuilts/drop/DropERC721.sol"; +import { DropERC721, Permissions, LazyMint, BatchMintMetadata, Drop, DelayedReveal, IDelayedReveal, ERC721AUpgradeable, IPermissions, ILazyMint } from "contracts/prebuilts/drop/DropERC721.sol"; // Test imports import "erc721a-upgradeable/contracts/IERC721AUpgradeable.sol"; @@ -43,15 +43,7 @@ contract DropERC721Test is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(caller); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); - + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, caller, role)); drop.renounceRole(role, caller); } @@ -63,15 +55,7 @@ contract DropERC721Test is BaseTest { bytes32 role = keccak256("MINTER_ROLE"); vm.prank(deployer); - vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(target), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ); - + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, target, role)); drop.revokeRole(role, target); } @@ -86,7 +70,7 @@ contract DropERC721Test is BaseTest { drop.grantRole(role, receiver); - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); drop.grantRole(role, receiver); vm.stopPrank(); @@ -110,7 +94,7 @@ contract DropERC721Test is BaseTest { drop.grantRole(role, receiver); // expect revert when granting to a holder - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert(abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, receiver, role)); drop.grantRole(role, receiver); // check if receiver has transfer role @@ -290,7 +274,7 @@ contract DropERC721Test is BaseTest { vm.warp(99); vm.prank(getActor(5), getActor(5)); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); drop.claim(receiver, 1, address(0), 0, alp, ""); vm.warp(100); @@ -356,7 +340,7 @@ contract DropERC721Test is BaseTest { * note: Testing revert condition; an address without MINTER_ROLE calls lazyMint function. */ function test_revert_lazyMint_MINTER_ROLE() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintUnauthorized.selector)); drop.lazyMint(100, "ipfs://", emptyEncodedBytes); } @@ -368,7 +352,7 @@ contract DropERC721Test is BaseTest { drop.lazyMint(100, "ipfs://", emptyEncodedBytes); - vm.expectRevert("Invalid tokenId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidTokenId.selector, 100)); drop.tokenURI(100); vm.stopPrank(); @@ -526,14 +510,13 @@ contract DropERC721Test is BaseTest { vm.prank(deployer); drop.reveal(0, "key"); - bytes memory errorMessage = abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(this)), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("METADATA_ROLE")), 32) + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(this), + keccak256("METADATA_ROLE") + ) ); - - vm.expectRevert(errorMessage); drop.reveal(0, "key"); } @@ -552,7 +535,7 @@ contract DropERC721Test is BaseTest { console.log(drop.getBaseURICount()); drop.lazyMint(100, "", abi.encode(encryptedURI, provenanceHash)); - vm.expectRevert("Invalid index"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, 2)); drop.reveal(2, "key"); vm.stopPrank(); @@ -570,7 +553,7 @@ contract DropERC721Test is BaseTest { drop.lazyMint(100, "", abi.encode(encryptedURI, provenanceHash)); drop.reveal(0, "key"); - vm.expectRevert("Nothing to reveal"); + vm.expectRevert(abi.encodeWithSelector(DelayedReveal.DelayedRevealNothingToReveal.selector)); drop.reveal(0, "key"); vm.stopPrank(); @@ -738,7 +721,9 @@ contract DropERC721Test is BaseTest { vm.prank(getActor(5), getActor(5)); drop.claim(receiver, 100, address(0), 0, alp, ""); - vm.expectRevert("!MaxSupply"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedMaxSupply.selector, conditions[0].maxClaimableSupply, 101) + ); vm.prank(getActor(6), getActor(6)); drop.claim(receiver, 1, address(0), 0, alp, ""); } @@ -767,21 +752,25 @@ contract DropERC721Test is BaseTest { vm.prank(deployer); drop.setClaimConditions(conditions, false); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 0) + ); drop.claim(receiver, 0, address(0), 0, alp, ""); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); drop.claim(receiver, 101, address(0), 0, alp, ""); vm.prank(deployer); drop.setClaimConditions(conditions, true); vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 101) + ); drop.claim(receiver, 101, address(0), 0, alp, ""); } @@ -880,7 +869,9 @@ contract DropERC721Test is BaseTest { drop.setClaimConditions(conditions, false); vm.prank(receiver, receiver); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimInvalidTokenPrice.selector, address(erc20), 0, address(erc20), 5) + ); drop.claim(receiver, 100, address(erc20), 0, alp, ""); erc20.mint(receiver, 10000); @@ -997,9 +988,10 @@ contract DropERC721Test is BaseTest { vm.prank(receiver); erc20.approve(address(drop), 10000); - bytes memory errorQty = "!Qty"; vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 100) + ); drop.claim(receiver, 100, address(erc20), 5, alp, ""); // trying to claim more than general limit // vm.prank(getActor(5), getActor(5)); @@ -1054,10 +1046,8 @@ contract DropERC721Test is BaseTest { drop.claim(receiver, x - 5, address(0), 0, alp, ""); assertEq(drop.getSupplyClaimedByWallet(drop.getActiveClaimConditionId(), receiver), x - 5); - bytes memory errorQty = "!Qty"; - vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 1)); drop.claim(receiver, 6, address(0), 0, alp, ""); vm.prank(receiver, receiver); @@ -1065,7 +1055,7 @@ contract DropERC721Test is BaseTest { assertEq(drop.getSupplyClaimedByWallet(drop.getActiveClaimConditionId(), receiver), x); vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, x, x + 5)); drop.claim(receiver, 5, address(0), 0, alp, ""); // quantity limit already claimed } @@ -1094,10 +1084,10 @@ contract DropERC721Test is BaseTest { vm.prank(getActor(5), getActor(5)); drop.claim(receiver, 100, address(0), 0, alp, ""); - bytes memory errorQty = "!Qty"; - vm.prank(getActor(5), getActor(5)); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, conditions[0].quantityLimitPerWallet, 200) + ); drop.claim(receiver, 100, address(0), 0, alp, ""); vm.prank(deployer); @@ -1161,7 +1151,7 @@ contract DropERC721Test is BaseTest { conditions[2].quantityLimitPerWallet = 32; drop.setClaimConditions(conditions, false); - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); drop.getActiveClaimConditionId(); vm.warp(10); @@ -1205,7 +1195,7 @@ contract DropERC721Test is BaseTest { assertEq(uri, string(abi.encodePacked("ipfs://", "1"))); bytes memory newEncryptedURI = drop.encryptDecrypt("ipfs://secret", "key"); - vm.expectRevert("0 amt"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintInvalidAmount.selector)); drop.lazyMint(0, "", abi.encode(newEncryptedURI, provenanceHash)); vm.stopPrank(); diff --git a/src/test/drop/drop-erc1155/freezeBatchBaseURI/freezeBatchBaseURI.t.sol b/src/test/drop/drop-erc1155/freezeBatchBaseURI/freezeBatchBaseURI.t.sol index 6a54d0d3d..774669b51 100644 --- a/src/test/drop/drop-erc1155/freezeBatchBaseURI/freezeBatchBaseURI.t.sol +++ b/src/test/drop/drop-erc1155/freezeBatchBaseURI/freezeBatchBaseURI.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC1155 } from "contracts/prebuilts/drop/DropERC1155.sol"; +import { DropERC1155, BatchMintMetadata } from "contracts/prebuilts/drop/DropERC1155.sol"; // Test imports @@ -51,23 +51,20 @@ contract DropERC1155Test_freezeBatchBaseURI is BaseTest { function test_revert_NoMetadataRole() public lazyMint callerWithoutMetadataRole { bytes32 role = keccak256("METADATA_ROLE"); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.freezeBatchBaseURI(0); } function test_revert_IndexTooHigh() public lazyMint callerWithMetadataRole { - vm.expectRevert("Invalid index"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, 1)); drop.freezeBatchBaseURI(1); } function test_revert_EmptyBaseURI() public lazyMintEmptyUri callerWithMetadataRole { - vm.expectRevert("Invalid batch"); + vm.expectRevert( + abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, drop.getBatchIdAtIndex(0)) + ); drop.freezeBatchBaseURI(0); } diff --git a/src/test/drop/drop-erc1155/initialize/initialize.t.sol b/src/test/drop/drop-erc1155/initialize/initialize.t.sol index 0dff9ca09..4f242b9e9 100644 --- a/src/test/drop/drop-erc1155/initialize/initialize.t.sol +++ b/src/test/drop/drop-erc1155/initialize/initialize.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC1155 } from "contracts/prebuilts/drop/DropERC1155.sol"; +import { DropERC1155, Royalty, PlatformFee } from "contracts/prebuilts/drop/DropERC1155.sol"; // Test imports import "../../../utils/BaseTest.sol"; @@ -72,7 +72,7 @@ contract DropERC1155Test_initializer is BaseTest { } function test_revert_RoyaltyBPSTooHigh() public royaltyBPSTooHigh { - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, 10_001)); deployContractProxy( "DropERC1155", abi.encodeCall( @@ -94,7 +94,7 @@ contract DropERC1155Test_initializer is BaseTest { } function test_revert_PlatformFeeBPSTooHigh() public platformFeeBPSTooHigh { - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(PlatformFee.PlatformFeeExceededMaxFeeBps.selector, 10_000, 10_001)); deployContractProxy( "DropERC1155", abi.encodeCall( diff --git a/src/test/drop/drop-erc1155/setMaxTotalSupply/setMaxTotalSupply.t.sol b/src/test/drop/drop-erc1155/setMaxTotalSupply/setMaxTotalSupply.t.sol index 8b694d0b0..965c4ce5e 100644 --- a/src/test/drop/drop-erc1155/setMaxTotalSupply/setMaxTotalSupply.t.sol +++ b/src/test/drop/drop-erc1155/setMaxTotalSupply/setMaxTotalSupply.t.sol @@ -40,12 +40,7 @@ contract DropERC1155Test_setMaxTotalSupply is BaseTest { function test_revert_NoAdminRole() public callerWithoutAdminRole { bytes32 role = bytes32(0x00); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.setMaxTotalSupply(0, newMaxSupply); } diff --git a/src/test/drop/drop-erc1155/setSaleRecipientForToken/setSaleRecipientForToken.t.sol b/src/test/drop/drop-erc1155/setSaleRecipientForToken/setSaleRecipientForToken.t.sol index 7c3ce82ae..a3d194a53 100644 --- a/src/test/drop/drop-erc1155/setSaleRecipientForToken/setSaleRecipientForToken.t.sol +++ b/src/test/drop/drop-erc1155/setSaleRecipientForToken/setSaleRecipientForToken.t.sol @@ -41,12 +41,7 @@ contract DropERC1155Test_setSaleRecipientForToken is BaseTest { function test_revert_NoAdminRole() public callerWithoutAdminRole { bytes32 role = bytes32(0x00); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.setSaleRecipientForToken(0, recipient); } diff --git a/src/test/drop/drop-erc1155/updateBatchBaseURI/updateBatchBaseURI.t.sol b/src/test/drop/drop-erc1155/updateBatchBaseURI/updateBatchBaseURI.t.sol index c96599065..fa980975b 100644 --- a/src/test/drop/drop-erc1155/updateBatchBaseURI/updateBatchBaseURI.t.sol +++ b/src/test/drop/drop-erc1155/updateBatchBaseURI/updateBatchBaseURI.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC1155 } from "contracts/prebuilts/drop/DropERC1155.sol"; +import { DropERC1155, BatchMintMetadata } from "contracts/prebuilts/drop/DropERC1155.sol"; // Test imports @@ -63,23 +63,20 @@ contract DropERC1155Test_updateBatchBaseURI is BaseTest { function test_revert_NoMetadataRole() public lazyMint callerWithoutMetadataRole { bytes32 role = keccak256("METADATA_ROLE"); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.updateBatchBaseURI(0, updatedBaseURI); } function test_revert_IndexTooHigh() public lazyMint callerWithMetadataRole { - vm.expectRevert("Invalid index"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, 1)); drop.updateBatchBaseURI(1, updatedBaseURI); } function test_revert_BatchFrozen() public lazyMint batchFrozen callerWithMetadataRole { - vm.expectRevert("Batch frozen"); + vm.expectRevert( + abi.encodeWithSelector(BatchMintMetadata.BatchMintMetadataFrozen.selector, drop.getBatchIdAtIndex(0)) + ); drop.updateBatchBaseURI(0, updatedBaseURI); } diff --git a/src/test/drop/drop-erc20/initialize/initialize.t.sol b/src/test/drop/drop-erc20/initialize/initialize.t.sol index c6a6ddbd6..61debd129 100644 --- a/src/test/drop/drop-erc20/initialize/initialize.t.sol +++ b/src/test/drop/drop-erc20/initialize/initialize.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC20 } from "contracts/prebuilts/drop/DropERC20.sol"; +import { DropERC20, PlatformFee } from "contracts/prebuilts/drop/DropERC20.sol"; // Test imports import "../../../utils/BaseTest.sol"; @@ -58,7 +58,9 @@ contract DropERC20Test_initializer is BaseTest { } function test_revert_PlatformFeeBPSTooHigh() public platformFeeBPSTooHigh { - vm.expectRevert("Exceeds max bps"); + vm.expectRevert( + abi.encodeWithSelector(PlatformFee.PlatformFeeExceededMaxFeeBps.selector, 10_000, platformFeeBps) + ); deployContractProxy( "DropERC20", abi.encodeCall( diff --git a/src/test/drop/drop-erc20/setMaxTotalSupply/setMaxTotalSupply.t.sol b/src/test/drop/drop-erc20/setMaxTotalSupply/setMaxTotalSupply.t.sol index 88c338e36..8349f808c 100644 --- a/src/test/drop/drop-erc20/setMaxTotalSupply/setMaxTotalSupply.t.sol +++ b/src/test/drop/drop-erc20/setMaxTotalSupply/setMaxTotalSupply.t.sol @@ -28,13 +28,9 @@ contract DropERC20Test_setMaxTotalSupply is BaseTest { function test_revert_doesNotHaveAdminRole() public callerDoesNotHaveDefaultAdminRole { bytes32 role = bytes32(0x00); + vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(this)), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, address(this), role) ); drop.setMaxTotalSupply(0); } diff --git a/src/test/drop/drop-erc721/_canSetFunctions/_canSetFunctions.t.sol b/src/test/drop/drop-erc721/_canSetFunctions/_canSetFunctions.t.sol index 4dbdf57b1..61d67d687 100644 --- a/src/test/drop/drop-erc721/_canSetFunctions/_canSetFunctions.t.sol +++ b/src/test/drop/drop-erc721/_canSetFunctions/_canSetFunctions.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC721 } from "contracts/prebuilts/drop/DropERC721.sol"; +import { DropERC721, PlatformFee, PrimarySale, ContractMetadata, Royalty, LazyMint, Drop, Ownable } from "contracts/prebuilts/drop/DropERC721.sol"; // Test imports import "../../../utils/BaseTest.sol"; @@ -46,7 +46,7 @@ contract DropERC721Test_canSetFunctions is BaseTest { } function test__canSetPlatformFeeInfo_revert_callerNotAdmin() public callerNotAdmin { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(PlatformFee.PlatformFeeUnauthorized.selector)); drop.setPlatformFeeInfo(address(0x1), 1); } @@ -58,7 +58,7 @@ contract DropERC721Test_canSetFunctions is BaseTest { } function test__canSetPrimarySaleRecipient_revert_callerNotAdmin() public callerNotAdmin { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(PrimarySale.PrimarySaleUnauthorized.selector)); drop.setPrimarySaleRecipient(address(0x1)); } @@ -68,7 +68,7 @@ contract DropERC721Test_canSetFunctions is BaseTest { } function test__canSetOwner_revert_callerNotAdmin() public callerNotAdmin { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorized.selector)); drop.setOwner(address(0x1)); } @@ -78,7 +78,7 @@ contract DropERC721Test_canSetFunctions is BaseTest { } function test__canSetRoyaltyInfo_revert_callerNotAdmin() public callerNotAdmin { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyUnauthorized.selector)); drop.setDefaultRoyaltyInfo(address(0x1), 1); } @@ -90,7 +90,7 @@ contract DropERC721Test_canSetFunctions is BaseTest { } function test__canSetContractURI_revert_callerNotAdmin() public callerNotAdmin { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(ContractMetadata.ContractMetadataUnauthorized.selector)); drop.setContractURI("ipfs://"); } @@ -106,7 +106,7 @@ contract DropERC721Test_canSetFunctions is BaseTest { conditions[0].merkleRoot = bytes32(0); conditions[0].pricePerToken = 10; conditions[0].currency = address(0x111); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Drop.DropUnauthorized.selector)); drop.setClaimConditions(conditions, true); } @@ -124,7 +124,7 @@ contract DropERC721Test_canSetFunctions is BaseTest { canset_amount = 10; canset_baseURI = "ipfs://"; canset_data = abi.encode(canset_encryptedURI, canset_provenanceHash); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintUnauthorized.selector)); drop.lazyMint(canset_amount, canset_baseURI, canset_data); } diff --git a/src/test/drop/drop-erc721/freezeBatchBaseURI/freezeBatchBaseURI.t.sol b/src/test/drop/drop-erc721/freezeBatchBaseURI/freezeBatchBaseURI.t.sol index 799435fee..9cb5c23c2 100644 --- a/src/test/drop/drop-erc721/freezeBatchBaseURI/freezeBatchBaseURI.t.sol +++ b/src/test/drop/drop-erc721/freezeBatchBaseURI/freezeBatchBaseURI.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC721 } from "contracts/prebuilts/drop/DropERC721.sol"; +import { DropERC721, BatchMintMetadata } from "contracts/prebuilts/drop/DropERC721.sol"; // Test imports import "../../../utils/BaseTest.sol"; @@ -71,12 +71,7 @@ contract DropERC721Test_freezeBatchBaseURI is BaseTest { function test_revert_NoMetadataRole() public callerWithoutMetadataRole { bytes32 role = keccak256("METADATA_ROLE"); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.freezeBatchBaseURI(0); } @@ -87,7 +82,9 @@ contract DropERC721Test_freezeBatchBaseURI is BaseTest { } function test_revert_EmptyBaseURI() public lazyMintUnEncryptedEmptyBaseURI callerWithMetadataRole { - vm.expectRevert("Invalid batch"); + vm.expectRevert( + abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, drop.getBatchIdAtIndex(0)) + ); drop.freezeBatchBaseURI(0); } diff --git a/src/test/drop/drop-erc721/initalizer/initializer.t.sol b/src/test/drop/drop-erc721/initalizer/initializer.t.sol index b43fb881d..5ef6ba8f1 100644 --- a/src/test/drop/drop-erc721/initalizer/initializer.t.sol +++ b/src/test/drop/drop-erc721/initalizer/initializer.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC721 } from "contracts/prebuilts/drop/DropERC721.sol"; +import { DropERC721, PlatformFee, Royalty } from "contracts/prebuilts/drop/DropERC721.sol"; // Test imports import "../../../utils/BaseTest.sol"; @@ -72,7 +72,7 @@ contract DropERC721Test_initializer is BaseTest { } function test_revert_RoyaltyBPSTooHigh() public royaltyBPSTooHigh { - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, 10_001)); deployContractProxy( "DropERC721", abi.encodeCall( @@ -94,7 +94,7 @@ contract DropERC721Test_initializer is BaseTest { } function test_revert_PlatformFeeBPSTooHigh() public platformFeeBPSTooHigh { - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(PlatformFee.PlatformFeeExceededMaxFeeBps.selector, 10_000, 10_001)); deployContractProxy( "DropERC721", abi.encodeCall( diff --git a/src/test/drop/drop-erc721/lazyMint/lazyMint.t.sol b/src/test/drop/drop-erc721/lazyMint/lazyMint.t.sol index baff5a29b..921976be7 100644 --- a/src/test/drop/drop-erc721/lazyMint/lazyMint.t.sol +++ b/src/test/drop/drop-erc721/lazyMint/lazyMint.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC721 } from "contracts/prebuilts/drop/DropERC721.sol"; +import { DropERC721, LazyMint } from "contracts/prebuilts/drop/DropERC721.sol"; // Test imports import "../../../utils/BaseTest.sol"; @@ -83,12 +83,12 @@ contract DropERC721Test_lazyMint is BaseTest { } function test_revert_NoMinterRole() public callerWithoutMinterRole dataLengthZero { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintUnauthorized.selector)); drop.lazyMint(lazyMint_amount, lazyMint_revealedURI, lazymint_data); } function test_revert_AmountEqualZero() public callerWithMinterRole dataLengthZero amountEqualZero { - vm.expectRevert("0 amt"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintInvalidAmount.selector)); drop.lazyMint(lazyMint_amount, lazyMint_revealedURI, lazymint_data); } diff --git a/src/test/drop/drop-erc721/reveal/reveal.t.sol b/src/test/drop/drop-erc721/reveal/reveal.t.sol index 13b53c7ab..998c7ee27 100644 --- a/src/test/drop/drop-erc721/reveal/reveal.t.sol +++ b/src/test/drop/drop-erc721/reveal/reveal.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC721 } from "contracts/prebuilts/drop/DropERC721.sol"; +import { DropERC721, BatchMintMetadata, DelayedReveal } from "contracts/prebuilts/drop/DropERC721.sol"; // Test imports @@ -82,13 +82,9 @@ contract DropERC721Test_reveal is BaseTest { function test_revert_NoMetadataRole() public callerWithoutMetadataRole { bytes32 role = keccak256("METADATA_ROLE"); + vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.reveal(reveal_index, reveal_key); } @@ -117,17 +113,25 @@ contract DropERC721Test_reveal is BaseTest { } function test_revert_InvalidIndex() public invalidIndex lazyMintEncrypted callerWithMetadataRole { - vm.expectRevert("Invalid index"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, reveal_index)); drop.reveal(reveal_index, reveal_key); } function test_revert_InvalidKey() public validIndex lazyMintEncrypted invalidKey callerWithMetadataRole { - vm.expectRevert("Incorrect key"); + string memory incorrectURI = string(drop.encryptDecrypt(reveal_encryptedURI, reveal_key)); + + vm.expectRevert( + abi.encodeWithSelector( + DelayedReveal.DelayedRevealIncorrectResultHash.selector, + reveal_provenanceHash, + keccak256(abi.encodePacked(incorrectURI, reveal_key, block.chainid)) + ) + ); drop.reveal(reveal_index, reveal_key); } function test_revert_NoEncryptedData() public validIndex lazyMintUnEncrypted callerWithMetadataRole { - vm.expectRevert("Nothing to reveal"); + vm.expectRevert(abi.encodeWithSelector(DelayedReveal.DelayedRevealNothingToReveal.selector)); drop.reveal(reveal_index, reveal_key); } } diff --git a/src/test/drop/drop-erc721/setMaxTotalSupply/setMaxTotalSupply.t.sol b/src/test/drop/drop-erc721/setMaxTotalSupply/setMaxTotalSupply.t.sol index 4ec6e1e35..592fa0fac 100644 --- a/src/test/drop/drop-erc721/setMaxTotalSupply/setMaxTotalSupply.t.sol +++ b/src/test/drop/drop-erc721/setMaxTotalSupply/setMaxTotalSupply.t.sol @@ -36,12 +36,7 @@ contract DropERC721Test_setMaxTotalSupply is BaseTest { function test_revert_CallerNotAdmin() public callerNotAdmin { bytes32 role = bytes32(0x00); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.setMaxTotalSupply(0); } diff --git a/src/test/drop/drop-erc721/updateBatchBaseURI/updateBatchBaseURI.t.sol b/src/test/drop/drop-erc721/updateBatchBaseURI/updateBatchBaseURI.t.sol index b50e1b43c..901d7a7b1 100644 --- a/src/test/drop/drop-erc721/updateBatchBaseURI/updateBatchBaseURI.t.sol +++ b/src/test/drop/drop-erc721/updateBatchBaseURI/updateBatchBaseURI.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { DropERC721 } from "contracts/prebuilts/drop/DropERC721.sol"; +import { DropERC721, BatchMintMetadata, Permissions } from "contracts/prebuilts/drop/DropERC721.sol"; // Test imports @@ -83,12 +83,7 @@ contract DropERC721Test_updateBatchBaseURI is BaseTest { function test_revert_NoMetadataRole() public callerWithoutMetadataRole { bytes32 role = keccak256("METADATA_ROLE"); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(unauthorized), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, unauthorized, role) ); drop.updateBatchBaseURI(0, updateBatch_newBaseURI); } @@ -99,7 +94,9 @@ contract DropERC721Test_updateBatchBaseURI is BaseTest { } function test_revert_FrozenBatch() public lazyMintUnEncryptedRegularBaseURI callerWithMetadataRole batchFrozen { - vm.expectRevert("Batch frozen"); + vm.expectRevert( + abi.encodeWithSelector(BatchMintMetadata.BatchMintMetadataFrozen.selector, drop.getBatchIdAtIndex(0)) + ); drop.updateBatchBaseURI(0, updateBatch_newBaseURI); } diff --git a/src/test/open-edition-flat-fee/initialize/initialize.t.sol b/src/test/open-edition-flat-fee/initialize/initialize.t.sol index 61c1f3a22..7e60c0903 100644 --- a/src/test/open-edition-flat-fee/initialize/initialize.t.sol +++ b/src/test/open-edition-flat-fee/initialize/initialize.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { OpenEditionERC721FlatFee } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; +import { OpenEditionERC721FlatFee, Royalty } from "contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol"; import { TWProxy } from "contracts/infra/TWProxy.sol"; // Test imports @@ -107,7 +107,7 @@ contract OpenEditionERC721FlatFeeTest_initialize is BaseTest { function test_revert_RoyaltyTooHigh() public { uint128 _royaltyBps = 10001; - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, _royaltyBps)); deployOpenEdition( deployer, NAME, diff --git a/src/test/open-edition/initialize/initialize.t.sol b/src/test/open-edition/initialize/initialize.t.sol index 270118999..9f759ffb6 100644 --- a/src/test/open-edition/initialize/initialize.t.sol +++ b/src/test/open-edition/initialize/initialize.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { OpenEditionERC721 } from "contracts/prebuilts/open-edition/OpenEditionERC721.sol"; +import { OpenEditionERC721, Royalty } from "contracts/prebuilts/open-edition/OpenEditionERC721.sol"; import { TWProxy } from "contracts/infra/TWProxy.sol"; // Test imports @@ -101,7 +101,7 @@ contract OpenEditionERC721Test_initialize is BaseTest { function test_revert_RoyaltyTooHigh() public { uint128 _royaltyBps = 10001; - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, _royaltyBps)); deployOpenEdition( deployer, NAME, diff --git a/src/test/pack/Pack.t.sol b/src/test/pack/Pack.t.sol index 94d5a8060..37fdae635 100644 --- a/src/test/pack/Pack.t.sol +++ b/src/test/pack/Pack.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import { Pack, IERC2981Upgradeable, IERC721Receiver, IERC1155Upgradeable } from "contracts/prebuilts/pack/Pack.sol"; import { IPack } from "contracts/prebuilts/interface/IPack.sol"; import { ITokenBundle } from "contracts/extension/interface/ITokenBundle.sol"; +import { CurrencyTransferLib } from "contracts/lib/CurrencyTransferLib.sol"; // Test imports import { MockERC20 } from "../mocks/MockERC20.sol"; @@ -201,8 +202,8 @@ contract PackTest is BaseTest { } function test_checkForwarders() public { - assertTrue(pack.isTrustedForwarder(eoaForwarder)); - assertTrue(pack.isTrustedForwarder(forwarder)); + assertFalse(pack.isTrustedForwarder(eoaForwarder)); + assertFalse(pack.isTrustedForwarder(forwarder)); } /*/////////////////////////////////////////////////////////////// @@ -393,17 +394,14 @@ contract PackTest is BaseTest { address recipient = address(0x123); - string memory errorMsg = string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(packContents[0].assetContract), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("ASSET_ROLE")), 32) + vm.prank(address(tokenOwner)); + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(erc721), + keccak256("ASSET_ROLE") ) ); - - vm.prank(address(tokenOwner)); - vm.expectRevert(bytes(errorMsg)); pack.createPack(packContents, numOfRewardUnits, packUri, 0, 1, recipient); } @@ -416,17 +414,14 @@ contract PackTest is BaseTest { address recipient = address(0x123); - string memory errorMsg = string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(tokenOwner)), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("MINTER_ROLE")), 32) + vm.prank(address(tokenOwner)); + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(tokenOwner), + keccak256("MINTER_ROLE") ) ); - - vm.prank(address(tokenOwner)); - vm.expectRevert(bytes(errorMsg)); pack.createPack(packContents, numOfRewardUnits, packUri, 0, 1, recipient); } @@ -449,7 +444,9 @@ contract PackTest is BaseTest { numOfRewardUnits.push(1); vm.prank(address(tokenOwner)); - vm.expectRevert("msg.value != amount"); + vm.expectRevert( + abi.encodeWithSelector(CurrencyTransferLib.CurrencyTransferLibMismatchedValue.selector, 0, 20 ether) + ); pack.createPack(packContents, numOfRewardUnits, packUri, 0, 1, recipient); } @@ -712,17 +709,14 @@ contract PackTest is BaseTest { address randomAccount = address(0x123); - string memory errorMsg = string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(randomAccount)), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("MINTER_ROLE")), 32) + vm.prank(randomAccount); + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + randomAccount, + keccak256("MINTER_ROLE") ) ); - - vm.prank(randomAccount); - vm.expectRevert(bytes(errorMsg)); pack.addPackContents(packId, additionalContents, additionalContentsRewardUnits, recipient); } diff --git a/src/test/pack/PackVRFDirect.t.sol b/src/test/pack/PackVRFDirect.t.sol index 305378252..55a620e19 100644 --- a/src/test/pack/PackVRFDirect.t.sol +++ b/src/test/pack/PackVRFDirect.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import { PackVRFDirect, IERC2981Upgradeable, IERC721Receiver, IERC1155Upgradeable } from "contracts/prebuilts/pack/PackVRFDirect.sol"; import { IPack } from "contracts/prebuilts/interface/IPack.sol"; import { ITokenBundle } from "contracts/extension/interface/ITokenBundle.sol"; +import { CurrencyTransferLib } from "contracts/lib/CurrencyTransferLib.sol"; // Test imports import { MockERC20 } from "../mocks/MockERC20.sol"; @@ -332,17 +333,14 @@ contract PackVRFDirectTest is BaseTest { address recipient = address(0x123); - string memory errorMsg = string( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(tokenOwner)), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("MINTER_ROLE")), 32) + vm.prank(address(tokenOwner)); + vm.expectRevert( + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(tokenOwner), + keccak256("MINTER_ROLE") ) ); - - vm.prank(address(tokenOwner)); - vm.expectRevert(bytes(errorMsg)); pack.createPack(packContents, numOfRewardUnits, packUri, 0, 1, recipient); } @@ -365,7 +363,9 @@ contract PackVRFDirectTest is BaseTest { numOfRewardUnits.push(1); vm.prank(address(tokenOwner)); - vm.expectRevert("msg.value != amount"); + vm.expectRevert( + abi.encodeWithSelector(CurrencyTransferLib.CurrencyTransferLibMismatchedValue.selector, 0, 20 ether) + ); pack.createPack(packContents, numOfRewardUnits, packUri, 0, 1, recipient); } diff --git a/src/test/sdk/base/ERC721DelayedReveal.t.sol b/src/test/sdk/base/ERC721DelayedReveal.t.sol index 89a901357..dce4da3c2 100644 --- a/src/test/sdk/base/ERC721DelayedReveal.t.sol +++ b/src/test/sdk/base/ERC721DelayedReveal.t.sol @@ -5,7 +5,7 @@ import "@std/Test.sol"; import "@ds-test/test.sol"; import "./BaseUtilTest.sol"; -import { ERC721DelayedReveal } from "contracts/base/ERC721DelayedReveal.sol"; +import { ERC721DelayedReveal, BatchMintMetadata } from "contracts/base/ERC721DelayedReveal.sol"; contract BaseERC721DelayedRevealTest is BaseUtilTest { ERC721DelayedReveal internal base; @@ -77,7 +77,7 @@ contract BaseERC721DelayedRevealTest is BaseUtilTest { vm.startPrank(deployer); base.lazyMint(_amount, _baseURIForTokens, abi.encode(_encryptedBaseURI, provenanceHash)); - vm.expectRevert("Invalid tokenId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidTokenId.selector, 100)); base.tokenURI(100); vm.stopPrank(); diff --git a/src/test/sdk/extension/BatchMintMetadata.t.sol b/src/test/sdk/extension/BatchMintMetadata.t.sol index 2449451ea..31da1aa4d 100644 --- a/src/test/sdk/extension/BatchMintMetadata.t.sol +++ b/src/test/sdk/extension/BatchMintMetadata.t.sol @@ -76,7 +76,7 @@ contract ExtensionBatchMintMetadata is DSTest, Test { ext.freezeBaseURI(batchId); - vm.expectRevert("Batch frozen"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintMetadataFrozen.selector, batchId)); string memory baseUri = "one"; ext.setBaseURI(batchId, baseUri); } @@ -94,7 +94,7 @@ contract ExtensionBatchMintMetadata is DSTest, Test { } function test_freezeBaseURI_revert_invalidBatch() public { - vm.expectRevert("Invalid batch"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, 100)); ext.freezeBaseURI(100); } @@ -103,7 +103,7 @@ contract ExtensionBatchMintMetadata is DSTest, Test { //////////////////////////////////////////////////////////////*/ function test_viewBaseURI_revert_invalidTokenId() public { - vm.expectRevert("Invalid tokenId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidTokenId.selector, 100)); ext.viewBaseURI(100); } } diff --git a/src/test/sdk/extension/ContractMetadata.t.sol b/src/test/sdk/extension/ContractMetadata.t.sol index a28b9d076..ad6e7060d 100644 --- a/src/test/sdk/extension/ContractMetadata.t.sol +++ b/src/test/sdk/extension/ContractMetadata.t.sol @@ -38,7 +38,7 @@ contract ExtensionContractMetadataTest is DSTest, Test { } function test_revert_setContractURI() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(ContractMetadata.ContractMetadataUnauthorized.selector)); ext.setContractURI(""); } diff --git a/src/test/sdk/extension/DelayedReveal.t.sol b/src/test/sdk/extension/DelayedReveal.t.sol index 9c10e35a0..12576b227 100644 --- a/src/test/sdk/extension/DelayedReveal.t.sol +++ b/src/test/sdk/extension/DelayedReveal.t.sol @@ -58,12 +58,19 @@ contract ExtensionDelayedReveal is DSTest, Test { bytes memory encryptedUri = ext.encryptDecrypt(bytes(uriToEncrypt), key); bytes32 provenanceHash = keccak256(abi.encodePacked(uriToEncrypt, key, block.chainid)); + string memory incorrectURI = string(ext.encryptDecrypt(encryptedUri, incorrectKey)); bytes memory data = abi.encode(encryptedUri, provenanceHash); ext.setEncryptedData(0, data); - vm.expectRevert("Incorrect key"); + vm.expectRevert( + abi.encodeWithSelector( + DelayedReveal.DelayedRevealIncorrectResultHash.selector, + provenanceHash, + keccak256(abi.encodePacked(incorrectURI, incorrectKey, block.chainid)) + ) + ); ext.getRevealURI(0, incorrectKey); } @@ -82,7 +89,7 @@ contract ExtensionDelayedReveal is DSTest, Test { ext.setEncryptedData(0, ""); assertFalse(ext.isEncryptedBatch(0)); - vm.expectRevert("Nothing to reveal"); + vm.expectRevert(abi.encodeWithSelector(DelayedReveal.DelayedRevealNothingToReveal.selector)); ext.getRevealURI(0, key); } } diff --git a/src/test/sdk/extension/DropSinglePhase.t.sol b/src/test/sdk/extension/DropSinglePhase.t.sol index af22ee551..51d684eb6 100644 --- a/src/test/sdk/extension/DropSinglePhase.t.sol +++ b/src/test/sdk/extension/DropSinglePhase.t.sol @@ -75,7 +75,13 @@ contract ExtensionDropSinglePhase is DSTest, Test { vm.prank(claimer1, claimer1); ext.claim(receiver, 100, address(0), 0, alp, ""); - vm.expectRevert("!MaxSupply"); + vm.expectRevert( + abi.encodeWithSelector( + DropSinglePhase.DropClaimExceedMaxSupply.selector, + conditions[0].maxClaimableSupply, + 1 + conditions[0].maxClaimableSupply + ) + ); vm.prank(claimer2, claimer2); ext.claim(receiver, 1, address(0), 0, alp, ""); } @@ -102,16 +108,26 @@ contract ExtensionDropSinglePhase is DSTest, Test { ext.setClaimConditions(conditions[0], false); - bytes memory errorQty = "!Qty"; - vm.prank(claimer, claimer); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector( + DropSinglePhase.DropClaimExceedLimit.selector, + conditions[0].quantityLimitPerWallet, + 101 + ) + ); ext.claim(receiver, 101, address(0), 0, alp, ""); ext.setClaimConditions(conditions[0], true); vm.prank(claimer, claimer); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector( + DropSinglePhase.DropClaimExceedLimit.selector, + conditions[0].quantityLimitPerWallet, + 101 + ) + ); ext.claim(receiver, 101, address(0), 0, alp, ""); } @@ -158,10 +174,10 @@ contract ExtensionDropSinglePhase is DSTest, Test { ext.claim(receiver, x - 5, address(0), 0, alp, ""); assertEq(ext.getSupplyClaimedByWallet(receiver), x - 5); - bytes memory errorQty = "!Qty"; - vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(DropSinglePhase.DropClaimExceedLimit.selector, alp.quantityLimitPerWallet, x + 1) + ); ext.claim(receiver, 6, address(0), 0, alp, ""); vm.prank(receiver, receiver); @@ -169,7 +185,9 @@ contract ExtensionDropSinglePhase is DSTest, Test { assertEq(ext.getSupplyClaimedByWallet(receiver), x); vm.prank(receiver, receiver); - vm.expectRevert(errorQty); + vm.expectRevert( + abi.encodeWithSelector(DropSinglePhase.DropClaimExceedLimit.selector, alp.quantityLimitPerWallet, x + 5) + ); ext.claim(receiver, 5, address(0), 0, alp, ""); } diff --git a/src/test/sdk/extension/LazyMint.t.sol b/src/test/sdk/extension/LazyMint.t.sol index 73a7d6569..ae152d1e8 100644 --- a/src/test/sdk/extension/LazyMint.t.sol +++ b/src/test/sdk/extension/LazyMint.t.sol @@ -42,13 +42,13 @@ contract ExtensionLazyMint is DSTest, Test { } function test_state_lazyMint_NotAuthorized() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintUnauthorized.selector)); ext.lazyMint(100, "", ""); } function test_state_lazyMint_ZeroAmount() public { ext.setCondition(true); - vm.expectRevert("0 amt"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintInvalidAmount.selector)); ext.lazyMint(0, "", ""); } diff --git a/src/test/sdk/extension/NFTMetadata.t.sol b/src/test/sdk/extension/NFTMetadata.t.sol index 22798d008..819921433 100644 --- a/src/test/sdk/extension/NFTMetadata.t.sol +++ b/src/test/sdk/extension/NFTMetadata.t.sol @@ -58,20 +58,20 @@ contract ExtensionNFTMetadata is DSTest, Test { function test_setTokenURI_revert_notAuthorized() public { vm.startPrank(address(0x1)); string memory uri = "test"; - vm.expectRevert("NFTMetadata: not authorized to set metadata."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataUnauthorized.selector)); ext.setTokenURI(1, uri); } function test_setTokenURI_revert_emptyMetadata() public { string memory uri = ""; - vm.expectRevert("NFTMetadata: empty metadata."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataInvalidUrl.selector)); ext.setTokenURI(1, uri); } function test_setTokenURI_revert_frozen() public { ext.freezeMetadata(); string memory uri = "test"; - vm.expectRevert("NFTMetadata: metadata is frozen."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataFrozen.selector, 2)); ext.setTokenURI(2, uri); } @@ -86,7 +86,7 @@ contract ExtensionNFTMetadata is DSTest, Test { function test_freezeMetadata_revert_notAuthorized() public { vm.startPrank(address(0x1)); - vm.expectRevert("NFTMetadata: not authorized to freeze metdata"); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataUnauthorized.selector)); ext.freezeMetadata(); } } diff --git a/src/test/sdk/extension/Ownable.t.sol b/src/test/sdk/extension/Ownable.t.sol index efc8e7ee8..ca8edbe64 100644 --- a/src/test/sdk/extension/Ownable.t.sol +++ b/src/test/sdk/extension/Ownable.t.sol @@ -37,7 +37,7 @@ contract ExtensionOwnableTest is DSTest, Test { } function test_revert_setOwner() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorized.selector)); ext.setOwner(address(0x1234)); } diff --git a/src/test/sdk/extension/Permissions.t.sol b/src/test/sdk/extension/Permissions.t.sol index ec4adcab2..0c8bfdfbd 100644 --- a/src/test/sdk/extension/Permissions.t.sol +++ b/src/test/sdk/extension/Permissions.t.sol @@ -92,11 +92,10 @@ contract ExtensionPermissions is DSTest, Test { vm.startPrank(caller); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(caller), 20), - " is missing role ", - Strings.toHexString(uint256(ext.DEFAULT_ADMIN_ROLE()), 32) + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + caller, + ext.DEFAULT_ADMIN_ROLE() ) ); ext.grantRole(keccak256("role"), address(0x1)); @@ -106,7 +105,9 @@ contract ExtensionPermissions is DSTest, Test { vm.startPrank(defaultAdmin); ext.grantRole(keccak256("role"), address(0x1)); - vm.expectRevert("Can only grant to non holders"); + vm.expectRevert( + abi.encodeWithSelector(Permissions.PermissionsAlreadyGranted.selector, address(0x1), keccak256("role")) + ); ext.grantRole(keccak256("role"), address(0x1)); } @@ -139,11 +140,10 @@ contract ExtensionPermissions is DSTest, Test { vm.startPrank(address(0x345)); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(0x345)), 20), - " is missing role ", - Strings.toHexString(uint256(ext.DEFAULT_ADMIN_ROLE()), 32) + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(0x345), + ext.DEFAULT_ADMIN_ROLE() ) ); ext.revokeRole(keccak256("role"), address(0x567)); @@ -151,11 +151,10 @@ contract ExtensionPermissions is DSTest, Test { vm.startPrank(defaultAdmin); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(0x789)), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("role")), 32) + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(0x789), + keccak256("role") ) ); ext.revokeRole(keccak256("role"), address(0x789)); @@ -190,12 +189,7 @@ contract ExtensionPermissions is DSTest, Test { function test_revert_renounceRole_missingRole() public { vm.startPrank(defaultAdmin); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(defaultAdmin), 20), - " is missing role ", - Strings.toHexString(uint256(keccak256("role")), 32) - ) + abi.encodeWithSelector(Permissions.PermissionsUnauthorizedAccount.selector, defaultAdmin, keccak256("role")) ); ext.renounceRole(keccak256("role"), defaultAdmin); vm.stopPrank(); @@ -206,7 +200,9 @@ contract ExtensionPermissions is DSTest, Test { ext.grantRole(keccak256("role"), address(0x567)); assertTrue(ext.hasRole(keccak256("role"), address(0x567))); - vm.expectRevert("Can only renounce for self"); + vm.expectRevert( + abi.encodeWithSelector(Permissions.PermissionsInvalidPermission.selector, defaultAdmin, address(0x567)) + ); ext.renounceRole(keccak256("role"), address(0x567)); vm.stopPrank(); } @@ -218,11 +214,10 @@ contract ExtensionPermissions is DSTest, Test { function test_modifier_onlyRole() public { vm.startPrank(address(0x345)); vm.expectRevert( - abi.encodePacked( - "Permissions: account ", - Strings.toHexString(uint160(address(0x345)), 20), - " is missing role ", - Strings.toHexString(uint256(ext.DEFAULT_ADMIN_ROLE()), 32) + abi.encodeWithSelector( + Permissions.PermissionsUnauthorizedAccount.selector, + address(0x345), + ext.DEFAULT_ADMIN_ROLE() ) ); ext.checkModifier(); diff --git a/src/test/sdk/extension/PlatformFee.t.sol b/src/test/sdk/extension/PlatformFee.t.sol index da05dc114..9b5fd0128 100644 --- a/src/test/sdk/extension/PlatformFee.t.sol +++ b/src/test/sdk/extension/PlatformFee.t.sol @@ -44,12 +44,14 @@ contract ExtensionPlatformFee is DSTest, Test { address _platformFeeRecipient = address(0x123); uint256 _platformFeeBps = 10001; - vm.expectRevert("Exceeds max bps"); + vm.expectRevert( + abi.encodeWithSelector(PlatformFee.PlatformFeeExceededMaxFeeBps.selector, 10_000, _platformFeeBps) + ); ext.setPlatformFeeInfo(_platformFeeRecipient, _platformFeeBps); } function test_revert_setPlatformFeeInfo_NotAuthorized() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(PlatformFee.PlatformFeeUnauthorized.selector)); ext.setPlatformFeeInfo(address(1), 1000); } diff --git a/src/test/sdk/extension/PrimarySale.t.sol b/src/test/sdk/extension/PrimarySale.t.sol index ce360dbdf..acb30f37e 100644 --- a/src/test/sdk/extension/PrimarySale.t.sol +++ b/src/test/sdk/extension/PrimarySale.t.sol @@ -39,7 +39,7 @@ contract ExtensionPrimarySale is DSTest, Test { function test_revert_setPrimarySaleRecipient_NotAuthorized() public { address _primarySaleRecipient = address(0x123); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(PrimarySale.PrimarySaleUnauthorized.selector)); ext.setPrimarySaleRecipient(_primarySaleRecipient); } diff --git a/src/test/sdk/extension/Royalty.t.sol b/src/test/sdk/extension/Royalty.t.sol index 51a73a6c5..1c3a888a7 100644 --- a/src/test/sdk/extension/Royalty.t.sol +++ b/src/test/sdk/extension/Royalty.t.sol @@ -53,7 +53,7 @@ contract ExtensionRoyaltyTest is DSTest, Test { address _royaltyRecipient = address(0x123); uint256 _royaltyBps = 10001; - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, _royaltyBps)); ext.setDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps); } @@ -71,7 +71,7 @@ contract ExtensionRoyaltyTest is DSTest, Test { } function test_revert_setRoyaltyInfo_NotAuthorized() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyUnauthorized.selector)); ext.setRoyaltyInfoForToken(0, address(1), 1000); } @@ -82,7 +82,7 @@ contract ExtensionRoyaltyTest is DSTest, Test { address _recipient = address(0x123); uint256 _bps = 10001; - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, _bps)); ext.setRoyaltyInfoForToken(_tokenId, _recipient, _bps); } diff --git a/src/test/sdk/extension/SignatureMintERC721.t.sol b/src/test/sdk/extension/SignatureMintERC721.t.sol index 555c54115..85c0e7db1 100644 --- a/src/test/sdk/extension/SignatureMintERC721.t.sol +++ b/src/test/sdk/extension/SignatureMintERC721.t.sol @@ -122,7 +122,7 @@ contract ExtensionSignatureMintERC721 is DSTest, Test { vm.prank(signer); ext.mintWithSignature(_mintrequest, _signature); - vm.expectRevert("Invalid req"); + vm.expectRevert(abi.encodeWithSelector(SignatureMintERC721.SignatureMintInvalidSigner.selector)); ext.mintWithSignature(_mintrequest, _signature); } @@ -131,7 +131,14 @@ contract ExtensionSignatureMintERC721 is DSTest, Test { ext.setCondition(true); vm.prank(signer); - vm.expectRevert("Req expired"); + vm.expectRevert( + abi.encodeWithSelector( + SignatureMintERC721.SignatureMintInvalidTime.selector, + _mintrequest.validityStartTimestamp, + _mintrequest.validityEndTimestamp, + block.timestamp + ) + ); ext.mintWithSignature(_mintrequest, _signature); } } diff --git a/src/test/sdk/extension/batch-mint-metadata/batch-mint-metadata/_batchMintMetadata.t.sol b/src/test/sdk/extension/batch-mint-metadata/batch-mint-metadata/_batchMintMetadata.t.sol index 70a5b4493..63dd48e7f 100644 --- a/src/test/sdk/extension/batch-mint-metadata/batch-mint-metadata/_batchMintMetadata.t.sol +++ b/src/test/sdk/extension/batch-mint-metadata/batch-mint-metadata/_batchMintMetadata.t.sol @@ -46,7 +46,7 @@ contract BatchMintMetadata_BatchMintMetadata is ExtensionUtilTest { assertEq(newBaseURICount, prevBaseURICount + 1); assertEq(ext.getBatchIdAtIndex(newBaseURICount - 1), batchId); - vm.expectRevert("Invalid index"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, newBaseURICount)); ext.getBatchIdAtIndex(newBaseURICount); } } diff --git a/src/test/sdk/extension/batch-mint-metadata/freeze-base-uri/_freezeBaseURI.t.sol b/src/test/sdk/extension/batch-mint-metadata/freeze-base-uri/_freezeBaseURI.t.sol index ac839fbcd..147820874 100644 --- a/src/test/sdk/extension/batch-mint-metadata/freeze-base-uri/_freezeBaseURI.t.sol +++ b/src/test/sdk/extension/batch-mint-metadata/freeze-base-uri/_freezeBaseURI.t.sol @@ -49,7 +49,9 @@ contract BatchMintMetadata_FreezeBaseURI is ExtensionUtilTest { } function test_freezeBaseURI_invalidBatch() public { - vm.expectRevert("Invalid batch"); + vm.expectRevert( + abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, batchIds[indexToFreeze] * 10) + ); ext.freezeBaseURI(batchIds[indexToFreeze] * 10); // non-existent batchId } diff --git a/src/test/sdk/extension/batch-mint-metadata/get-base-uri/_getBaseURI.t.sol b/src/test/sdk/extension/batch-mint-metadata/get-base-uri/_getBaseURI.t.sol index 088adba26..afa7aa6de 100644 --- a/src/test/sdk/extension/batch-mint-metadata/get-base-uri/_getBaseURI.t.sol +++ b/src/test/sdk/extension/batch-mint-metadata/get-base-uri/_getBaseURI.t.sol @@ -46,7 +46,7 @@ contract BatchMintMetadata_GetBaseURI is ExtensionUtilTest { function test_getBaseURI_invalidTokenId() public { uint256 tokenId = batchIds[4]; // tokenId greater than the last batchId - vm.expectRevert("Invalid tokenId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidTokenId.selector, tokenId)); ext.getBaseURI(tokenId); } diff --git a/src/test/sdk/extension/batch-mint-metadata/get-batch-id/_getBatchId.t.sol b/src/test/sdk/extension/batch-mint-metadata/get-batch-id/_getBatchId.t.sol index ffea5de91..a4f16687e 100644 --- a/src/test/sdk/extension/batch-mint-metadata/get-batch-id/_getBatchId.t.sol +++ b/src/test/sdk/extension/batch-mint-metadata/get-batch-id/_getBatchId.t.sol @@ -43,7 +43,7 @@ contract BatchMintMetadata_GetBatchId is ExtensionUtilTest { function test_getBatchId_invalidTokenId() public { uint256 tokenId = batchIds[4]; // tokenId greater than the last batchId - vm.expectRevert("Invalid tokenId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidTokenId.selector, tokenId)); ext.getBatchId(tokenId); } diff --git a/src/test/sdk/extension/batch-mint-metadata/get-batch-start-id/_getBatchStartId.t.sol b/src/test/sdk/extension/batch-mint-metadata/get-batch-start-id/_getBatchStartId.t.sol index b3cfba004..18d1fc954 100644 --- a/src/test/sdk/extension/batch-mint-metadata/get-batch-start-id/_getBatchStartId.t.sol +++ b/src/test/sdk/extension/batch-mint-metadata/get-batch-start-id/_getBatchStartId.t.sol @@ -43,7 +43,7 @@ contract BatchMintMetadata_GetBatchStartId is ExtensionUtilTest { function test_getBatchStartId_invalidBatchId() public { uint256 batchId = batchIds[4] + 1; // non-existent batchId - vm.expectRevert("Invalid batchId"); + vm.expectRevert(abi.encodeWithSelector(BatchMintMetadata.BatchMintInvalidBatchId.selector, batchId)); ext.getBatchStartId(batchId); } diff --git a/src/test/sdk/extension/batch-mint-metadata/set-base-uri/_setBaseURI.t.sol b/src/test/sdk/extension/batch-mint-metadata/set-base-uri/_setBaseURI.t.sol index ee4baa4d6..1ec55e8a8 100644 --- a/src/test/sdk/extension/batch-mint-metadata/set-base-uri/_setBaseURI.t.sol +++ b/src/test/sdk/extension/batch-mint-metadata/set-base-uri/_setBaseURI.t.sol @@ -59,7 +59,9 @@ contract BatchMintMetadata_SetBaseURI is ExtensionUtilTest { } function test_setBaseURI_frozenBatchId() public { - vm.expectRevert("Batch frozen"); + vm.expectRevert( + abi.encodeWithSelector(BatchMintMetadata.BatchMintMetadataFrozen.selector, batchIds[indexToUpdate]) + ); ext.setBaseURI(batchIds[indexToUpdate], newBaseURI); } diff --git a/src/test/sdk/extension/contract-metadata/set-contract-uri/setContractURI.t.sol b/src/test/sdk/extension/contract-metadata/set-contract-uri/setContractURI.t.sol index 30b463c4d..3395c0850 100644 --- a/src/test/sdk/extension/contract-metadata/set-contract-uri/setContractURI.t.sol +++ b/src/test/sdk/extension/contract-metadata/set-contract-uri/setContractURI.t.sol @@ -39,7 +39,7 @@ contract ContractMetadata_SetContractURI is ExtensionUtilTest { function test_setContractURI_callerNotAuthorized() public { vm.prank(address(caller)); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(ContractMetadata.ContractMetadataUnauthorized.selector)); ext.setContractURI(uri); } diff --git a/src/test/sdk/extension/delayed-reveal/get-reveal-uri/getRevealURI.t.sol b/src/test/sdk/extension/delayed-reveal/get-reveal-uri/getRevealURI.t.sol index ad9e08828..0e97a5eb4 100644 --- a/src/test/sdk/extension/delayed-reveal/get-reveal-uri/getRevealURI.t.sol +++ b/src/test/sdk/extension/delayed-reveal/get-reveal-uri/getRevealURI.t.sol @@ -38,7 +38,7 @@ contract DelayedReveal_GetRevealURI is ExtensionUtilTest { } function test_getRevealURI_encryptedDataNotSet() public { - vm.expectRevert("Nothing to reveal"); + vm.expectRevert(abi.encodeWithSelector(DelayedReveal.DelayedRevealNothingToReveal.selector)); ext.getRevealURI(batchId, encryptionKey); } @@ -49,8 +49,15 @@ contract DelayedReveal_GetRevealURI is ExtensionUtilTest { function test_getRevealURI_incorrectKey() public whenEncryptedDataIsSet { bytes memory incorrectKey = "incorrect key"; + string memory incorrectURI = string(ext.encryptDecrypt(encryptedURI, incorrectKey)); - vm.expectRevert("Incorrect key"); + vm.expectRevert( + abi.encodeWithSelector( + DelayedReveal.DelayedRevealIncorrectResultHash.selector, + provenanceHash, + keccak256(abi.encodePacked(incorrectURI, incorrectKey, block.chainid)) + ) + ); ext.getRevealURI(batchId, incorrectKey); } diff --git a/src/test/sdk/extension/drop/claim/claim.t.sol b/src/test/sdk/extension/drop/claim/claim.t.sol index c1228add8..f1dbab680 100644 --- a/src/test/sdk/extension/drop/claim/claim.t.sol +++ b/src/test/sdk/extension/drop/claim/claim.t.sol @@ -72,7 +72,7 @@ contract Drop_Claim is ExtensionUtilTest { } function test_claim_noConditionsSet() public { - vm.expectRevert("!CONDITION."); + vm.expectRevert(abi.encodeWithSelector(Drop.DropNoActiveCondition.selector)); ext.claim(_claimer, _quantity, _currency, _pricePerToken, _allowlistProof, ""); } diff --git a/src/test/sdk/extension/drop/set-claim-conditions/setClaimConditions.t.sol b/src/test/sdk/extension/drop/set-claim-conditions/setClaimConditions.t.sol index 9cd4ca78b..476155352 100644 --- a/src/test/sdk/extension/drop/set-claim-conditions/setClaimConditions.t.sol +++ b/src/test/sdk/extension/drop/set-claim-conditions/setClaimConditions.t.sol @@ -139,10 +139,10 @@ contract Drop_SetClaimConditions is ExtensionUtilTest { } function test_setClaimConditions_notAuthorized() public { - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Drop.DropUnauthorized.selector)); ext.setClaimConditions(newClaimConditions, false); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Drop.DropUnauthorized.selector)); ext.setClaimConditions(newClaimConditions, true); } @@ -257,7 +257,7 @@ contract Drop_SetClaimConditions is ExtensionUtilTest { // set new maxClaimableSupply less than supplyClaimed of the old condition newClaimConditions[0].maxClaimableSupply = _oldCondition.supplyClaimed - 1; - vm.expectRevert("max supply claimed"); + vm.expectRevert(abi.encodeWithSelector(Drop.DropExceedMaxSupply.selector)); ext.setClaimConditions(newClaimConditions, false); } diff --git a/src/test/sdk/extension/drop/verify-claim/verifyClaim.t.sol b/src/test/sdk/extension/drop/verify-claim/verifyClaim.t.sol index 60d1d03be..0057f6220 100644 --- a/src/test/sdk/extension/drop/verify-claim/verifyClaim.t.sol +++ b/src/test/sdk/extension/drop/verify-claim/verifyClaim.t.sol @@ -119,7 +119,15 @@ contract Drop_VerifyClaim is ExtensionUtilTest { function test_verifyClaim_noAllowlist_invalidCurrency() public { ext.setCondition(claimCondition, _conditionId); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + claimCondition.currency, + claimCondition.pricePerToken + ) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -131,7 +139,15 @@ contract Drop_VerifyClaim is ExtensionUtilTest { function test_verifyClaim_noAllowlist_invalidPrice() public whenValidCurrency_open { ext.setCondition(claimCondition, _conditionId); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + claimCondition.currency, + claimCondition.pricePerToken + ) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -144,7 +160,9 @@ contract Drop_VerifyClaim is ExtensionUtilTest { ext.setCondition(claimCondition, _conditionId); _quantity = 0; - vm.expectRevert(bytes("!Qty")); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, claimCondition.quantityLimitPerWallet, 0) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -162,7 +180,13 @@ contract Drop_VerifyClaim is ExtensionUtilTest { ext.setCondition(claimCondition, _conditionId); ext.setSupplyClaimedByWallet(_conditionId, _claimer, claimCondition.quantityLimitPerWallet); - vm.expectRevert(bytes("!Qty")); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimExceedLimit.selector, + claimCondition.quantityLimitPerWallet, + _quantity + claimCondition.quantityLimitPerWallet + ) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -181,7 +205,13 @@ contract Drop_VerifyClaim is ExtensionUtilTest { claimCondition.supplyClaimed = claimCondition.maxClaimableSupply; ext.setCondition(claimCondition, _conditionId); - vm.expectRevert("!MaxSupply"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimExceedMaxSupply.selector, + claimCondition.maxClaimableSupply, + _quantity + claimCondition.maxClaimableSupply + ) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -199,7 +229,9 @@ contract Drop_VerifyClaim is ExtensionUtilTest { { ext.setCondition(claimCondition, _conditionId); - vm.expectRevert("cant claim yet"); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimNotStarted.selector, claimCondition.startTimestamp, block.timestamp) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -229,14 +261,30 @@ contract Drop_VerifyClaim is ExtensionUtilTest { function test_verifyClaim_incorrectProof_invalidCurrency() public { ext.setCondition(claimConditionWithAllowlist, _conditionId); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + claimCondition.currency, + claimCondition.pricePerToken + ) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } function test_verifyClaim_incorrectProof_invalidPrice() public whenValidCurrency_open { ext.setCondition(claimConditionWithAllowlist, _conditionId); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + claimCondition.currency, + claimCondition.pricePerToken + ) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -244,7 +292,9 @@ contract Drop_VerifyClaim is ExtensionUtilTest { ext.setCondition(claimConditionWithAllowlist, _conditionId); _quantity = 0; - vm.expectRevert(bytes("!Qty")); + vm.expectRevert( + abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, claimCondition.quantityLimitPerWallet, _quantity) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -257,7 +307,13 @@ contract Drop_VerifyClaim is ExtensionUtilTest { ext.setCondition(claimConditionWithAllowlist, _conditionId); ext.setSupplyClaimedByWallet(_conditionId, _claimer, claimCondition.quantityLimitPerWallet); - vm.expectRevert(bytes("!Qty")); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimExceedLimit.selector, + claimCondition.quantityLimitPerWallet, + claimCondition.quantityLimitPerWallet + _quantity + ) + ); ext.verifyClaim(_conditionId, _claimer, _quantity, _currency, _pricePerToken, _allowlistProofEmpty); } @@ -282,7 +338,15 @@ contract Drop_VerifyClaim is ExtensionUtilTest { function test_verifyClaim_allowlist_defaultPriceAndCurrency_invalidCurrencyParam() public { ext.setCondition(claimConditionWithAllowlist, _conditionId); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + claimCondition.currency, + claimCondition.pricePerToken + ) + ); ext.verifyClaim(_conditionId, _allowlistClaimer, _quantity, _currency, _pricePerToken, _allowlistProof); } @@ -294,7 +358,15 @@ contract Drop_VerifyClaim is ExtensionUtilTest { ); ext.setCondition(claimConditionWithAllowlist, _conditionId); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + claimCondition.currency, + claimCondition.pricePerToken + ) + ); ext.verifyClaim(_conditionId, _allowlistClaimer, _quantity, _currency, _pricePerToken, _allowlistProof); } @@ -306,7 +378,15 @@ contract Drop_VerifyClaim is ExtensionUtilTest { ); ext.setCondition(claimConditionWithAllowlist, _conditionId); - vm.expectRevert("!PriceOrCurrency"); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + address(weth), + 2 + ) + ); ext.verifyClaim(_conditionId, _allowlistClaimer, _quantity, _currency, _pricePerToken, _allowlistProof); } @@ -326,7 +406,13 @@ contract Drop_VerifyClaim is ExtensionUtilTest { _currency = address(weth); _pricePerToken = 2; _quantity = 1; - vm.expectRevert(bytes("!Qty")); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimExceedLimit.selector, + claimCondition.quantityLimitPerWallet, + claimCondition.quantityLimitPerWallet + _quantity + ) + ); ext.verifyClaim(_conditionId, _allowlistClaimer, _quantity, _currency, _pricePerToken, _allowlistProof); } @@ -338,7 +424,7 @@ contract Drop_VerifyClaim is ExtensionUtilTest { _currency = address(weth); _pricePerToken = 2; _quantity = 1; - vm.expectRevert(bytes("!Qty")); + vm.expectRevert(abi.encodeWithSelector(Drop.DropClaimExceedLimit.selector, 5, 5 + _quantity)); ext.verifyClaim(_conditionId, _allowlistClaimer, _quantity, _currency, _pricePerToken, _allowlistProof); } @@ -352,7 +438,15 @@ contract Drop_VerifyClaim is ExtensionUtilTest { _currency = address(weth); _quantity = 1; - vm.expectRevert(bytes("!PriceOrCurrency")); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + claimCondition.currency, + claimCondition.pricePerToken + ) + ); ext.verifyClaim(_conditionId, _allowlistClaimer, _quantity, _currency, _pricePerToken, _allowlistProof); } @@ -363,7 +457,15 @@ contract Drop_VerifyClaim is ExtensionUtilTest { _currency = address(weth); _quantity = 1; _pricePerToken = 2; - vm.expectRevert(bytes("!PriceOrCurrency")); + vm.expectRevert( + abi.encodeWithSelector( + Drop.DropClaimInvalidTokenPrice.selector, + _currency, + _pricePerToken, + address(weth), + 1 + ) + ); ext.verifyClaim(_conditionId, _allowlistClaimer, _quantity, _currency, _pricePerToken, _allowlistProof); } diff --git a/src/test/sdk/extension/lazy-mint/lazy-mint/lazyMint.t.sol b/src/test/sdk/extension/lazy-mint/lazy-mint/lazyMint.t.sol index 135980bad..ae6774d9e 100644 --- a/src/test/sdk/extension/lazy-mint/lazy-mint/lazyMint.t.sol +++ b/src/test/sdk/extension/lazy-mint/lazy-mint/lazyMint.t.sol @@ -65,7 +65,7 @@ contract LazyMint_LazyMint is ExtensionUtilTest { function test_lazyMint_callerNotAuthorized() public { vm.prank(address(caller)); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintUnauthorized.selector)); ext.lazyMint(amount, "", ""); } @@ -76,7 +76,7 @@ contract LazyMint_LazyMint is ExtensionUtilTest { function test_lazyMint_zeroAmount() public whenCallerAuthorized { vm.prank(address(caller)); - vm.expectRevert("0 amt"); + vm.expectRevert(abi.encodeWithSelector(LazyMint.LazyMintInvalidAmount.selector)); ext.lazyMint(amount, "", ""); } diff --git a/src/test/sdk/extension/ownable/set-owner/setOwner.t.sol b/src/test/sdk/extension/ownable/set-owner/setOwner.t.sol index 328c53d2a..7f6d136d6 100644 --- a/src/test/sdk/extension/ownable/set-owner/setOwner.t.sol +++ b/src/test/sdk/extension/ownable/set-owner/setOwner.t.sol @@ -47,7 +47,7 @@ contract Ownable_SetOwner is ExtensionUtilTest { function test_setOwner_callerNotAuthorized() public { vm.prank(address(caller)); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorized.selector)); ext.setOwner(newOwner); } diff --git a/src/test/sdk/extension/royalty/set-default-royalty-info/setDefaultRoyaltyInfo.t.sol b/src/test/sdk/extension/royalty/set-default-royalty-info/setDefaultRoyaltyInfo.t.sol index a218d1125..792f1c52e 100644 --- a/src/test/sdk/extension/royalty/set-default-royalty-info/setDefaultRoyaltyInfo.t.sol +++ b/src/test/sdk/extension/royalty/set-default-royalty-info/setDefaultRoyaltyInfo.t.sol @@ -42,7 +42,7 @@ contract Royalty_SetDefaultRoyaltyInfo is ExtensionUtilTest { function test_setDefaultRoyaltyInfo_callerNotAuthorized() public { vm.prank(address(caller)); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyUnauthorized.selector)); ext.setDefaultRoyaltyInfo(defaultRoyaltyRecipient, defaultRoyaltyBps); } @@ -54,7 +54,7 @@ contract Royalty_SetDefaultRoyaltyInfo is ExtensionUtilTest { function test_setDefaultRoyaltyInfo_exceedMaxBps() public whenCallerAuthorized { defaultRoyaltyBps = 10_001; vm.prank(address(caller)); - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, defaultRoyaltyBps)); ext.setDefaultRoyaltyInfo(defaultRoyaltyRecipient, defaultRoyaltyBps); } diff --git a/src/test/sdk/extension/royalty/set-royalty-info-for-token/setRoyaltyInfoForToken.t.sol b/src/test/sdk/extension/royalty/set-royalty-info-for-token/setRoyaltyInfoForToken.t.sol index e167be3db..997697a5e 100644 --- a/src/test/sdk/extension/royalty/set-royalty-info-for-token/setRoyaltyInfoForToken.t.sol +++ b/src/test/sdk/extension/royalty/set-royalty-info-for-token/setRoyaltyInfoForToken.t.sol @@ -52,7 +52,7 @@ contract Royalty_SetRoyaltyInfoForToken is ExtensionUtilTest { function test_setRoyaltyInfoForToken_callerNotAuthorized() public { vm.prank(address(caller)); - vm.expectRevert("Not authorized"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyUnauthorized.selector)); ext.setRoyaltyInfoForToken(tokenId, royaltyRecipientForToken, royaltyBpsForToken); } @@ -64,7 +64,7 @@ contract Royalty_SetRoyaltyInfoForToken is ExtensionUtilTest { function test_setRoyaltyInfoForToken_exceedMaxBps() public whenCallerAuthorized { royaltyBpsForToken = 10_001; vm.prank(address(caller)); - vm.expectRevert("Exceeds max bps"); + vm.expectRevert(abi.encodeWithSelector(Royalty.RoyaltyExceededMaxFeeBps.selector, 10_000, royaltyBpsForToken)); ext.setRoyaltyInfoForToken(tokenId, royaltyRecipientForToken, royaltyBpsForToken); } diff --git a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol index 2897e9129..049b16036 100644 --- a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol +++ b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol @@ -9,6 +9,6 @@ interface ThirdwebAccount { } address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = 0x2e234DAe75C793f67A35089C9d99245E1C58470b; address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = 0xffD4505B3452Dc22f8473616d50503bA9E1710Ac; -bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101285760003560e01c806308e93d0a1461012d5780630b61e12b1461014b5780630e6254fd1461016057806311464fbe14610173578063248a9ca3146101b25780632f2ff15d146101d357806336568abe146101e657806358451f97146101f957806383a03f8c146102015780638878ed33146102145780639010d07c1461022757806391d148541461023a5780639387a3801461025d578063938e3d7b14610270578063a217fddf14610283578063a32fa5b31461028b578063a65d69d41461029e578063ac9650d8146102c5578063c3c5a547146102e5578063ca15c873146102f8578063d547741f1461030b578063d8fd8f441461031e578063e68a7c3b14610331578063e8a3d48514610344575b600080fd5b610135610359565b6040516101429190611945565b60405180910390f35b61015e6101593660046119ae565b61036a565b005b61013561016e3660046119d8565b61040b565b61019a7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b6040516001600160a01b039091168152602001610142565b6101c56101c03660046119f3565b610435565b604051908152602001610142565b61015e6101e1366004611a0c565b610453565b61015e6101f4366004611a0c565b6104fd565b6101c561055c565b61015e61020f3660046119f3565b610568565b61019a610222366004611a38565b6105b6565b61019a610235366004611aba565b610630565b61024d610248366004611a0c565b61073e565b6040519015158152602001610142565b61015e61026b3660046119ae565b610772565b61015e61027e366004611af2565b610809565b6101c5600081565b61024d610299366004611a0c565b61085a565b61019a7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102d86102d3366004611ba2565b6108bd565b6040516101429190611c66565b61024d6102f33660046119d8565b610a19565b6101c56103063660046119f3565b610a25565b61015e610319366004611a0c565b610ac2565b61019a61032c366004611a38565b610acd565b61013561033f366004611aba565b610c18565b61034c610d49565b6040516101429190611cca565b60606103656000610de1565b905090565b336103758183610dee565b61039a5760405162461bcd60e51b815260040161039190611cdd565b60405180910390fd5b6001600160a01b03831660009081526002602052604081206103bc9083610e32565b9050801561040557836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b6001600160a01b038116600090815260026020526040902060609061042f90610de1565b92915050565b600061043f610e47565b600092835260010160205250604090205490565b61047761045e610e47565b6000848152600191909101602052604090205433610e6b565b61047f610e47565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104ef5760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610391565b6104f98282610ef0565b5050565b336001600160a01b038216146105525760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610391565b6104f98282610f04565b60006103656000610f18565b336105738183610dee565b61058f5760405162461bcd60e51b815260040161039190611cdd565b61059a600082610e32565b6104f95760405162461bcd60e51b815260040161039190611d14565b6000806105f98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f2292505050565b90506106257f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610f55565b9150505b9392505050565b60008061063b610fb5565b600085815260209190915260408120549150805b82811015610735576000610661610fb5565b60008881526020918252604080822085835260010190925220546001600160a01b0316146106d9578482036106c757610698610fb5565b600087815260209182526040808220938252600190930190915220546001600160a01b0316925061042f915050565b6106d2600183611d74565b9150610723565b6106e486600061073e565b801561071057506106f3610fb5565b600087815260209182526040808220828052600201909252205481145b1561072357610720600183611d74565b91505b61072e600182611d74565b905061064f565b50505092915050565b6000610748610e47565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b3361077d8183610dee565b6107995760405162461bcd60e51b815260040161039190611cdd565b6001600160a01b03831660009081526002602052604081206107bb9083610fbf565b9050801561040557836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b610811610fd4565b61084e5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610391565b61085781610fe0565b50565b6000610864610e47565b600084815260209182526040808220828052909252205460ff166108b45761088a610e47565b6000848152602091825260408082206001600160a01b0386168352909252205460ff16905061042f565b50600192915050565b6060816001600160401b038111156108d7576108d7611adc565b60405190808252806020026020018201604052801561090a57816020015b60608152602001906001900390816108f55790505b509050336000805b848110156107355781156109915761096f3087878481811061093657610936611d87565b90506020028101906109489190611d9d565b8660405160200161095b93929190611dea565b6040516020818303038152906040526110c7565b84828151811061098157610981611d87565b6020026020010181905250610a11565b6109f3308787848181106109a7576109a7611d87565b90506020028101906109b99190611d9d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110c792505050565b848281518110610a0557610a05611d87565b60200260200101819052505b600101610912565b600061042f81836110ec565b600080610a30610fb5565b6000848152602091909152604081205491505b81811015610a9d576000610a55610fb5565b60008681526020918252604080822085835260010190925220546001600160a01b031614610a8b57610a88600184611d74565b92505b610a96600182611d74565b9050610a43565b50610aa983600061073e565b15610abc57610ab9600183611d74565b91505b50919050565b61055261045e610e47565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610b358686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f2292505050565b90506000610b438383610f55565b90506001600160a01b0381163b15610b5f579250610629915050565b610b69838361110e565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610bc257610ba6600082610e32565b610bc25760405162461bcd60e51b815260040161039190611d14565b610bce818888886111a5565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b60608183108015610c325750610c2e6000610f18565b8211155b610c8a5760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201526263657360e81b6064820152608401610391565b6000610c968484611e0b565b9050610ca28484611e0b565b6001600160401b03811115610cb957610cb9611adc565b604051908082528060200260200182016040528015610ce2578160200160208202803683370190505b50915060005b81811015610d4157610d05610cfd8683611d74565b60009061120d565b838281518110610d1757610d17611d87565b6001600160a01b0390921660209283029190910190910152610d3a600182611d74565b9050610ce8565b505092915050565b6060610d53611219565b8054610d5e90611e1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8a90611e1e565b8015610dd75780601f10610dac57610100808354040283529160200191610dd7565b820191906000526020600020905b815481529060010190602001808311610dba57829003601f168201915b5050505050905090565b606060006106298361123d565b600080610e1b7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac84610f55565b6001600160a01b0385811691161491505092915050565b6000610629836001600160a01b038416611299565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b610e73610e47565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104f957610eae816001600160a01b031660146112e8565b610eb98360206112e8565b604051602001610eca929190611e52565b60408051601f198184030181529082905262461bcd60e51b825261039191600401611cca565b610efa8282611483565b6104f982826114ec565b610f0e82826115ab565b6104f98282611614565b600061042f825490565b60008282604051602001610f37929190611ebf565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610629565b60006103656116a3565b6000610629836001600160a01b038416611705565b6000610365813361073e565b6000610fea611219565b8054610ff590611e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461102190611e1e565b801561106e5780601f106110435761010080835404028352916020019161106e565b820191906000526020600020905b81548152906001019060200180831161105157829003601f168201915b505050505090508161107e611219565b906110899082611f34565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516110bb929190611ff3565b60405180910390a15050565b606061062983836040518060600160405280602781526020016120b9602791396117f8565b6001600160a01b03811660009081526001830160205260408120541515610629565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661042f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610391565b60405163347d5e2560e21b81526001600160a01b0385169063d1f57894906111d590869086908690600401612018565b600060405180830381600087803b1580156111ef57600080fd5b505af1158015611203573d6000803e3d6000fd5b5050505050505050565b60006106298383611870565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60608160000180548060200260200160405190810160405280929190818152602001828054801561128d57602002820191906000526020600020905b815481526020019060010190808311611279575b50505050509050919050565b60008181526001830160205260408120546112e05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561042f565b50600061042f565b606060006112f7836002612058565b611302906002611d74565b6001600160401b0381111561131957611319611adc565b6040519080825280601f01601f191660200182016040528015611343576020820181803683370190505b509050600360fc1b8160008151811061135e5761135e611d87565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061138d5761138d611d87565b60200101906001600160f81b031916908160001a90535060006113b1846002612058565b6113bc906001611d74565b90505b6001811115611434576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106113f0576113f0611d87565b1a60f81b82828151811061140657611406611d87565b60200101906001600160f81b031916908160001a90535060049490941c9361142d8161206f565b90506113bf565b5083156106295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610391565b600161148d610e47565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60006114f6610fb5565b6000848152602091909152604090205490506001611512610fb5565b6000858152602091909152604081208054909190611531908490611d74565b90915550829050611540610fb5565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b039290921691909117905580611580610fb5565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6115b58282610e6b565b6115bd610e47565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061161e610fb5565b6000848152602091825260408082206001600160a01b03861683526002019092522054905061164b610fb5565b6000848152602091825260408082208483526001019092522080546001600160a01b031916905561167a610fb5565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b60008060ff196116d460017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611e0b565b6040516020016116e691815260200190565b60408051601f1981840301815291905280516020909101201692915050565b600081815260018301602052604081205480156117ee576000611729600183611e0b565b855490915060009061173d90600190611e0b565b90508181146117a257600086600001828154811061175d5761175d611d87565b906000526020600020015490508087600001848154811061178057611780611d87565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806117b3576117b3612086565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061042f565b600091505061042f565b6060600080856001600160a01b031685604051611815919061209c565b600060405180830381855af49150503d8060008114611850576040519150601f19603f3d011682016040523d82523d6000602084013e611855565b606091505b50915091506118668683838761189a565b9695505050505050565b600082600001828154811061188757611887611d87565b9060005260206000200154905092915050565b60608315611909578251600003611902576001600160a01b0385163b6119025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610391565b5081611913565b611913838361191b565b949350505050565b81511561192b5781518083602001fd5b8060405162461bcd60e51b81526004016103919190611cca565b6020808252825182820181905260009190848201906040850190845b818110156119865783516001600160a01b031683529284019291840191600101611961565b50909695505050505050565b80356001600160a01b03811681146119a957600080fd5b919050565b600080604083850312156119c157600080fd5b6119ca83611992565b946020939093013593505050565b6000602082840312156119ea57600080fd5b61062982611992565b600060208284031215611a0557600080fd5b5035919050565b60008060408385031215611a1f57600080fd5b82359150611a2f60208401611992565b90509250929050565b600080600060408486031215611a4d57600080fd5b611a5684611992565b925060208401356001600160401b0380821115611a7257600080fd5b818601915086601f830112611a8657600080fd5b813581811115611a9557600080fd5b876020828501011115611aa757600080fd5b6020830194508093505050509250925092565b60008060408385031215611acd57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611b0457600080fd5b81356001600160401b0380821115611b1b57600080fd5b818401915084601f830112611b2f57600080fd5b813581811115611b4157611b41611adc565b604051601f8201601f19908116603f01168101908382118183101715611b6957611b69611adc565b81604052828152876020848701011115611b8257600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060208385031215611bb557600080fd5b82356001600160401b0380821115611bcc57600080fd5b818501915085601f830112611be057600080fd5b813581811115611bef57600080fd5b8660208260051b8501011115611c0457600080fd5b60209290920196919550909350505050565b60005b83811015611c31578181015183820152602001611c19565b50506000910152565b60008151808452611c52816020860160208601611c16565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611cbd57603f19888603018452611cab858351611c3a565b94509285019290850190600101611c8f565b5092979650505050505050565b6020815260006106296020830184611c3a565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042f5761042f611d5e565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611db457600080fd5b8301803591506001600160401b03821115611dce57600080fd5b602001915036819003821315611de357600080fd5b9250929050565b8284823760609190911b6001600160601b0319169101908152601401919050565b8181038181111561042f5761042f611d5e565b600181811c90821680611e3257607f821691505b602082108103610abc57634e487b7160e01b600052602260045260246000fd5b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611e82816015850160208801611c16565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611eb3816026840160208801611c16565b01602601949350505050565b6001600160a01b038316815260406020820181905260009061191390830184611c3a565b601f821115611f2f576000816000526020600020601f850160051c81016020861015611f0c5750805b601f850160051c820191505b81811015611f2b57828155600101611f18565b5050505b505050565b81516001600160401b03811115611f4d57611f4d611adc565b611f6181611f5b8454611e1e565b84611ee3565b602080601f831160018114611f965760008415611f7e5750858301515b600019600386901b1c1916600185901b178555611f2b565b600085815260208120601f198616915b82811015611fc557888601518255948401946001909101908401611fa6565b5085821015611fe35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006120066040830185611c3a565b82810360208401526106258185611c3a565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b808202811582820484141761042f5761042f611d5e565b60008161207e5761207e611d5e565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600082516120ae818460208701611c16565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a61135b53685bb0ed196dd5ad4d75bcd9d18cbd5f1c400b41cef4e22728763e164736f6c63430008170033"; -bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"60806040526004361061014b5760003560e01c806301ffc9a7146101575780630a1028c41461018c578063150b7a02146101ba5780631626ba7e146101f35780631dd756c51461021357806324d7806c146102335780633a871cdd1461025357806347e1da2a146102735780634a58db19146102955780634d44560d1461029d5780635892e236146102bd5780637dff5a79146102dd5780638b52d723146102fd578063938e3d7b1461031f578063a9082d841461033f578063ac9650d81461037e578063b0d691fe146103ab578063b61d27f6146103cd578063b76464d5146103ed578063bc197c811461040d578063c45a015514610439578063d087d2881461046d578063d1f5789414610482578063d42f2f35146104a2578063e8a3d485146104b7578063e9523c97146104d9578063f15d424e146104fb578063f23a6e611461052857600080fd5b3661015257005b600080fd5b34801561016357600080fd5b50610177610172366004612d91565b610554565b60405190151581526020015b60405180910390f35b34801561019857600080fd5b506101ac6101a7366004612e78565b61059a565b604051908152602001610183565b3480156101c657600080fd5b506101da6101d5366004612ed1565b61063e565b6040516001600160e01b03199091168152602001610183565b3480156101ff57600080fd5b506101da61020e366004612f3c565b61064f565b34801561021f57600080fd5b5061017761022e366004612f9b565b61078f565b34801561023f57600080fd5b5061017761024e366004612fe0565b610a53565b34801561025f57600080fd5b506101ac61026e366004612ffd565b610a82565b34801561027f57600080fd5b5061029361028e36600461308e565b610aa8565b005b610293610c0f565b3480156102a957600080fd5b506102936102b8366004613127565b610c77565b3480156102c957600080fd5b506102936102d8366004613194565b610cea565b3480156102e957600080fd5b506101776102f8366004612fe0565b6110a7565b34801561030957600080fd5b50610312611160565b60405161018391906132a7565b34801561032b57600080fd5b5061029361033a36600461330b565b6113a7565b34801561034b57600080fd5b5061035f61035a366004613194565b6113f8565b6040805192151583526001600160a01b03909116602083015201610183565b34801561038a57600080fd5b5061039e610399366004613353565b61144f565b60405161018391906133e4565b3480156103b757600080fd5b506103c06115b4565b604051610183919061343b565b3480156103d957600080fd5b506102936103e836600461344f565b6115fd565b3480156103f957600080fd5b50610293610408366004612fe0565b61168d565b34801561041957600080fd5b506101da61042836600461353c565b63bc197c8160e01b95945050505050565b34801561044557600080fd5b506103c07f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561047957600080fd5b506101ac6116bf565b34801561048e57600080fd5b5061029361049d3660046135e9565b61173f565b3480156104ae57600080fd5b506103126118f7565b3480156104c357600080fd5b506104cc611a68565b6040516101839190613630565b3480156104e557600080fd5b506104ee611b00565b6040516101839190613643565b34801561050757600080fd5b5061051b610516366004612fe0565b611b12565b6040516101839190613690565b34801561053457600080fd5b506101da6105433660046136a3565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061058557506001600160e01b03198216630a85bd0160e11b145b80610594575061059482611bea565b92915050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016105e0929190918252602082015260400190565b604051602081830303815290604052805190602001209050610600611c1f565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b630a85bd0160e11b5b949350505050565b60008061067c8460405160200161066891815260200190565b60405160208183030381529060405261059a565b9050600061068a8285611d46565b905061069581610a53565b156106ac5750630b135d3f60e11b91506105949050565b3360006106b7611d6a565b6001600160a01b03841660009081526006919091016020526040902090506106df8183611d8e565b8061070f57506106ee81611db0565b600114801561070f575060006107048282611dba565b6001600160a01b0316145b61076c5760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b610775836110a7565b1561078557630b135d3f60e11b94505b5050505092915050565b6000610799611d6a565b6001600160a01b0384166000908152600491909101602052604090205460ff16156107c657506001610594565b60006107d0611d6a565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b900490921690820152915061082b611d6a565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b0316118061087b575081604001516001600160801b03164210155b8061088c575061088a81611db0565b155b1561089c57600092505050610594565b60006108b36108ae606087018761370b565b611dc6565b905060006108c083611db0565b60011480156108e1575060006108d68482611dba565b6001600160a01b0316145b90506324f16c0560e11b6001600160e01b03198316016109585760008061091361090e60608a018a61370b565b611e00565b9150915082610939576109268583611d8e565b6109395760009650505050505050610594565b85518111156109515760009650505050505050610594565b5050610a46565b635c0f12eb60e11b6001600160e01b0319831601610a395760008061098861098360608a018a61370b565b611e65565b5091509150826109e85760005b82518110156109e6576109ca8382815181106109b3576109b3613751565b602002602001015187611d8e90919063ffffffff16565b6109de576000975050505050505050610594565b600101610995565b505b60005b8251811015610a3157818181518110610a0657610a06613751565b602002602001015187600001511015610a29576000975050505050505050610594565b6001016109eb565b505050610a46565b6000945050505050610594565b5060019695505050505050565b6000610a5d611d6a565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b6000610a8c611eb2565b610a968484611f1b565b9050610aa182612060565b9392505050565b610ab06115b4565b6001600160a01b0316336001600160a01b03161480610ad35750610ad333610a53565b610aef5760405162461bcd60e51b815260040161076390613767565b610af76120ad565b8481148015610b0557508483145b610b515760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e0000006044820152606401610763565b60005b85811015610c0657610bfd878783818110610b7157610b71613751565b9050602002016020810190610b869190612fe0565b868684818110610b9857610b98613751565b90506020020135858585818110610bb157610bb1613751565b9050602002810190610bc3919061370b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219392505050565b50600101610b54565b50505050505050565b610c176115b4565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610c43919061343b565b6000604051808303818588803b158015610c5c57600080fd5b505af1158015610c70573d6000803e3d6000fd5b5050505050565b610c7f612204565b610c876115b4565b6001600160a01b031663205c287883836040518363ffffffff1660e01b8152600401610cb49291906137a8565b600060405180830381600087803b158015610cce57600080fd5b505af1158015610ce2573d6000803e3d6000fd5b505050505050565b6000610cf96020850185612fe0565b905042610d0c60e0860160c087016137d8565b6001600160801b031611158015610d3b5750610d2f610100850160e086016137d8565b6001600160801b031642105b610d715760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b6044820152606401610763565b600080610d7f8686866113f8565b9150915081610db95760405162461bcd60e51b8152600401610763906020808252600490820152632173696760e01b604082015260600190565b6001610dc3611d6a565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610dff91908901908901613804565b60ff161115610e2c576000610e1a6040880160208901613804565b60ff166001149050610c068482612242565b610e3583610a53565b15610e6a5760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b6044820152606401610763565b610e7f83610e76611d6a565b60020190612317565b50604051806060016040528087606001358152602001876080016020810190610ea891906137d8565b6001600160801b03168152602001610ec660c0890160a08a016137d8565b6001600160801b03169052610ed9611d6a565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610f4f610f2e611d6a565b6001600160a01b03861660009081526006919091016020526040902061232c565b805190915060005b81811015610fb957610fa6838281518110610f7457610f74613751565b6020026020010151610f84611d6a565b6001600160a01b03891660009081526006919091016020526040902090612339565b50610fb2600182613835565b9050610f57565b50610fc76040890189613848565b9050905060005b8181101561104857611035610fe660408b018b613848565b83818110610ff657610ff6613751565b905060200201602081019061100b9190612fe0565b611013611d6a565b6001600160a01b03891660009081526006919091016020526040902090612317565b50611041600182613835565b9050610fce565b506110528861234e565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516110959190613922565b60405180910390a35050505050505050565b6000806110b2611d6a565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b90910416928101929092529091504210801590611123575080604001516001600160801b031642105b8015610aa157506000611158611137611d6a565b6001600160a01b038616600090815260069190910160205260409020611db0565b119392505050565b6060600061117761116f611d6a565b60020161232c565b80519091506000805b82811015611208576111aa84828151811061119d5761119d613751565b60200260200101516110a7565b156111c157816111b981613a0d565b9250506111f6565b60008482815181106111d5576111d5613751565b60200260200101906001600160a01b031690816001600160a01b0316815250505b611201600182613835565b9050611180565b50806001600160401b0381111561122157611221612dbb565b60405190808252806020026020018201604052801561125a57816020015b611247612d47565b81526020019060019003908161123f5790505b5093506000805b8381101561139f5760006001600160a01b031685828151811061128657611286613751565b60200260200101516001600160a01b03161461138d5760008582815181106112b0576112b0613751565b6020026020010151905060006112c4611d6a565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161132e610f2e611d6a565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b031681525088858061136d90613a0d565b96508151811061137f5761137f613751565b602002602001018190525050505b611398600182613835565b9050611261565b505050505090565b6113af6123e3565b6113ec5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610763565b6113f5816123fb565b50565b60008061140e611407866124e2565b8585612626565b9050611418611d6a565b6101008601356000908152600791909101602052604090205460ff16158015611445575061144581610a53565b9150935093915050565b6060816001600160401b0381111561146957611469612dbb565b60405190808252806020026020018201604052801561149c57816020015b60608152602001906001900390816114875790505b509050336000805b848110156115ab57811561152357611501308787848181106114c8576114c8613751565b90506020028101906114da919061370b565b866040516020016114ed93929190613a26565b604051602081830303815290604052612678565b84828151811061151357611513613751565b60200260200101819052506115a3565b6115853087878481811061153957611539613751565b905060200281019061154b919061370b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267892505050565b84828151811061159757611597613751565b60200260200101819052505b6001016114a4565b50505092915050565b6000806115bf61269d565b546001600160a01b0316905080156115d657919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b6116056115b4565b6001600160a01b0316336001600160a01b03161480611628575061162833610a53565b6116445760405162461bcd60e51b815260040161076390613767565b61164c6120ad565b610c70848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219392505050565b611695612204565b8061169e61269d565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60006116c96115b4565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190613a47565b905090565b60006117496126c1565b5460ff16905060006117596126c1565b54610100900460ff1690508015808015611776575060018360ff16105b806117955750611785306126e5565b15801561179557508260ff166001145b6117f85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b60016118026126c1565b805460ff191660ff92909216919091179055801561183b5760016118246126c1565b80549115156101000261ff00199092169190911790555b61187b8686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f492505050565b61188361269d565b60010181905550611895866001612242565b8015610ce25760006118a56126c1565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6060600061190661116f611d6a565b8051909150806001600160401b0381111561192357611923612dbb565b60405190808252806020026020018201604052801561195c57816020015b611949612d47565b8152602001906001900390816119415790505b50925060005b81811015611a6257600083828151811061197e5761197e613751565b602002602001015190506000611992611d6a565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016119fc610f2e611d6a565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250868481518110611a4157611a41613751565b60200260200101819052505050600181611a5b9190613835565b9050611962565b50505090565b6060611a72612727565b8054611a7d90613a60565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa990613a60565b8015611af65780601f10611acb57610100808354040283529160200191611af6565b820191906000526020600020905b815481529060010190602001808311611ad957829003601f168201915b5050505050905090565b606061173a611b0d611d6a565b61232c565b611b1a612d47565b6000611b24611d6a565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611baf611b8e611d6a565b6001600160a01b03871660009081526006919091016020526040902061232c565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b60006001600160e01b03198216630271189760e51b148061059457506301ffc9a760e01b6001600160e01b0319831614610594565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015611c7857507f0000000000000000000000000000000000000000000000000000000000007a6946145b15611ca257507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000806000611d55858561274b565b91509150611d6281612790565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b03811660009081526001830160205260408120541515610aa1565b6000610594825490565b6000610aa183836128d5565b60006004821015611de95760405162461bcd60e51b815260040161076390613a94565b611df7600460008486613ab3565b610aa191613add565b6000806044831015611e245760405162461bcd60e51b815260040161076390613a94565b611e32602460048587613ab3565b810190611e3f9190612fe0565b9150611e4f604460248587613ab3565b810190611e5c9190613b0d565b90509250929050565b606080806064841015611e8a5760405162461bcd60e51b815260040161076390613a94565b611e978460048188613ab3565b810190611ea49190613ba5565b919790965090945092505050565b611eba6115b4565b6001600160a01b0316336001600160a01b031614611f195760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b6044820152606401610763565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611f99611f5c61014087018761370b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611d469050565b9050611fa5818661078f565b611fb457600192505050610594565b6000611fbe611d6a565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b80156113f557604051600090339060001990849084818181858888f193505050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c70565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a547906120fb90309060040161343b565b602060405180830381865afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c9190613c8a565b6113f557806001600160a01b03166383a03f8c61215761269d565b600101546040518263ffffffff1660e01b815260040161217991815260200190565b600060405180830381600087803b158015610c5c57600080fd5b60606000846001600160a01b031684846040516121b09190613cac565b60006040518083038185875af1925050503d80600081146121ed576040519150601f19603f3d011682016040523d82523d6000602084013e6121f2565b606091505b509250905080611d6257815160208301fd5b61220d33610a53565b611f195760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b6044820152606401610763565b61224c82826128ff565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156123135780156122db577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630b61e12b836122ba61269d565b600101546040518363ffffffff1660e01b8152600401610cb49291906137a8565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639387a380836122ba61269d565b5050565b6000610aa1836001600160a01b0384166129ae565b60606000610aa1836129fd565b6000610aa1836001600160a01b038416612a59565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156113f5576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16630b61e12b6123ba6020840184612fe0565b6123c261269d565b600101546040518363ffffffff1660e01b81526004016121799291906137a8565b60006123ee33610a53565b8061173a57505030331490565b6000612405612727565b805461241090613a60565b80601f016020809104026020016040519081016040528092919081815260200182805461243c90613a60565b80156124895780601f1061245e57610100808354040283529160200191612489565b820191906000526020600020905b81548152906001019060200180831161246c57829003601f168201915b5050505050905081612499612727565b906124a49082613d15565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516124d6929190613dd4565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96125126020840184612fe0565b6125226040850160208601613804565b61252f6040860186613848565b604051602001612540929190613e02565b60408051601f198184030181529190528051602090910120606086013561256d60a08801608089016137d8565b61257d60c0890160a08a016137d8565b61258d60e08a0160c08b016137d8565b61259e6101008b0160e08c016137d8565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061064783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061267292509050612b4c565b90611d46565b6060610aa18383604051806060016040528060278152602001613ea860279139612b79565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b6001600160a01b03163b151590565b60008282604051602001612709929190613e44565b60405160208183030381529060405280519060200120905092915050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60008082516041036127815760208301516040840151606085015160001a61277587828585612bf1565b94509450505050612789565b506000905060025b9250929050565b60008160048111156127a4576127a4613e68565b036127ac5750565b60018160048111156127c0576127c0613e68565b036128085760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606401610763565b600281600481111561281c5761281c613e68565b036128695760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b600381600481111561287d5761287d613e68565b036113f55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b60008260000182815481106128ec576128ec613751565b9060005260206000200154905092915050565b80612908611d6a565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156129515761294b82612945611d6a565b90612317565b50612965565b6129638261295d611d6a565b90612339565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a11133826040516129a2911515815260200190565b60405180910390a25050565b60008181526001830160205260408120546129f557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610594565b506000610594565b606081600001805480602002602001604051908101604052809291908181526020018280548015612a4d57602002820191906000526020600020905b815481526020019060010190808311612a39575b50505050509050919050565b60008181526001830160205260408120548015612b42576000612a7d600183613e7e565b8554909150600090612a9190600190613e7e565b9050818114612af6576000866000018281548110612ab157612ab1613751565b9060005260206000200154905080876000018481548110612ad457612ad4613751565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612b0757612b07613e91565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610594565b6000915050610594565b6000610594612b59611c1f565b8360405161190160f01b8152600281019290925260228201526042902090565b6060600080856001600160a01b031685604051612b969190613cac565b600060405180830381855af49150503d8060008114612bd1576040519150601f19603f3d011682016040523d82523d6000602084013e612bd6565b606091505b5091509150612be786838387612cab565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612c1e5750600090506003612ca2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c72573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c9b57600060019250925050612ca2565b9150600090505b94509492505050565b60608315612d18578251600003612d1157612cc5856126e5565b612d115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610763565b5081610647565b6106478383815115612d2d5781518083602001fd5b8060405162461bcd60e51b81526004016107639190613630565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b600060208284031215612da357600080fd5b81356001600160e01b031981168114610aa157600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612df957612df9612dbb565b604052919050565b60006001600160401b03831115612e1a57612e1a612dbb565b612e2d601f8401601f1916602001612dd1565b9050828152838383011115612e4157600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e6957600080fd5b610aa183833560208501612e01565b600060208284031215612e8a57600080fd5b81356001600160401b03811115612ea057600080fd5b61064784828501612e58565b6001600160a01b03811681146113f557600080fd5b8035612ecc81612eac565b919050565b60008060008060808587031215612ee757600080fd5b8435612ef281612eac565b93506020850135612f0281612eac565b92506040850135915060608501356001600160401b03811115612f2457600080fd5b612f3087828801612e58565b91505092959194509250565b60008060408385031215612f4f57600080fd5b8235915060208301356001600160401b03811115612f6c57600080fd5b612f7885828601612e58565b9150509250929050565b60006101608284031215612f9557600080fd5b50919050565b60008060408385031215612fae57600080fd5b8235612fb981612eac565b915060208301356001600160401b03811115612fd457600080fd5b612f7885828601612f82565b600060208284031215612ff257600080fd5b8135610aa181612eac565b60008060006060848603121561301257600080fd5b83356001600160401b0381111561302857600080fd5b61303486828701612f82565b9660208601359650604090950135949350505050565b60008083601f84011261305c57600080fd5b5081356001600160401b0381111561307357600080fd5b6020830191508360208260051b850101111561278957600080fd5b600080600080600080606087890312156130a757600080fd5b86356001600160401b03808211156130be57600080fd5b6130ca8a838b0161304a565b909850965060208901359150808211156130e357600080fd5b6130ef8a838b0161304a565b9096509450604089013591508082111561310857600080fd5b5061311589828a0161304a565b979a9699509497509295939492505050565b6000806040838503121561313a57600080fd5b823561314581612eac565b946020939093013593505050565b60008083601f84011261316557600080fd5b5081356001600160401b0381111561317c57600080fd5b60208301915083602082850101111561278957600080fd5b6000806000604084860312156131a957600080fd5b83356001600160401b03808211156131c057600080fd5b9085019061012082880312156131d557600080fd5b909350602085013590808211156131eb57600080fd5b506131f886828701613153565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561326957855185168252948301946001929092019190830190613247565b5060408701516040890152606087015194506132886060890186613205565b6080870151945061329c6080890186613205565b979650505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156132fe57603f198886030184526132ec858351613212565b945092850192908501906001016132d0565b5092979650505050505050565b60006020828403121561331d57600080fd5b81356001600160401b0381111561333357600080fd5b8201601f8101841361334457600080fd5b61064784823560208401612e01565b6000806020838503121561336657600080fd5b82356001600160401b0381111561337c57600080fd5b6133888582860161304a565b90969095509350505050565b60005b838110156133af578181015183820152602001613397565b50506000910152565b600081518084526133d0816020860160208601613394565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156132fe57603f198886030184526134298583516133b8565b9450928501929085019060010161340d565b6001600160a01b0391909116815260200190565b6000806000806060858703121561346557600080fd5b843561347081612eac565b93506020850135925060408501356001600160401b0381111561349257600080fd5b61349e87828801613153565b95989497509550505050565b60006001600160401b038211156134c3576134c3612dbb565b5060051b60200190565b600082601f8301126134de57600080fd5b813560206134f36134ee836134aa565b612dd1565b8083825260208201915060208460051b87010193508684111561351557600080fd5b602086015b84811015613531578035835291830191830161351a565b509695505050505050565b600080600080600060a0868803121561355457600080fd5b853561355f81612eac565b9450602086013561356f81612eac565b935060408601356001600160401b038082111561358b57600080fd5b61359789838a016134cd565b945060608801359150808211156135ad57600080fd5b6135b989838a016134cd565b935060808801359150808211156135cf57600080fd5b506135dc88828901612e58565b9150509295509295909350565b6000806000604084860312156135fe57600080fd5b833561360981612eac565b925060208401356001600160401b0381111561362457600080fd5b6131f886828701613153565b602081526000610aa160208301846133b8565b6020808252825182820181905260009190848201906040850190845b818110156136845783516001600160a01b03168352928401929184019160010161365f565b50909695505050505050565b602081526000610aa16020830184613212565b600080600080600060a086880312156136bb57600080fd5b85356136c681612eac565b945060208601356136d681612eac565b9350604086013592506060860135915060808601356001600160401b038111156136ff57600080fd5b6135dc88828901612e58565b6000808335601e1984360301811261372257600080fd5b8301803591506001600160401b0382111561373c57600080fd5b60200191503681900382131561278957600080fd5b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80356001600160801b0381168114612ecc57600080fd5b6000602082840312156137ea57600080fd5b610aa1826137c1565b803560ff81168114612ecc57600080fd5b60006020828403121561381657600080fd5b610aa1826137f3565b634e487b7160e01b600052601160045260246000fd5b808201808211156105945761059461381f565b6000808335601e1984360301811261385f57600080fd5b8301803591506001600160401b0382111561387957600080fd5b6020019150600581901b360382131561278957600080fd5b6000808335601e198436030181126138a857600080fd5b83016020810192503590506001600160401b038111156138c757600080fd5b8060051b360382131561278957600080fd5b8183526000602080850194508260005b858110156139175781356138fc81612eac565b6001600160a01b0316875295820195908201906001016138e9565b509495945050505050565b602081526139436020820161393684612ec1565b6001600160a01b03169052565b6000613951602084016137f3565b60ff81166040840152506139686040840184613891565b610120806060860152613980610140860183856138d9565b925060608601356080860152613998608087016137c1565b91506139a760a0860183613205565b6139b360a087016137c1565b91506139c260c0860183613205565b6139ce60c087016137c1565b91506139dd60e0860183613205565b6139e960e087016137c1565b91506101006139fa81870184613205565b9590950135939094019290925250919050565b600060018201613a1f57613a1f61381f565b5060010190565b8284823760609190911b6001600160601b0319169101908152601401919050565b600060208284031215613a5957600080fd5b5051919050565b600181811c90821680613a7457607f821691505b602082108103612f9557634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b60008085851115613ac357600080fd5b83861115613ad057600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b055780818660040360031b1b83161692505b505092915050565b600060208284031215613b1f57600080fd5b5035919050565b600082601f830112613b3757600080fd5b81356020613b476134ee836134aa565b82815260059290921b84018101918181019086841115613b6657600080fd5b8286015b848110156135315780356001600160401b03811115613b895760008081fd5b613b978986838b0101612e58565b845250918301918301613b6a565b600080600060608486031215613bba57600080fd5b83356001600160401b0380821115613bd157600080fd5b818601915086601f830112613be557600080fd5b81356020613bf56134ee836134aa565b82815260059290921b8401810191818101908a841115613c1457600080fd5b948201945b83861015613c3b578535613c2c81612eac565b82529482019490820190613c19565b97505087013592505080821115613c5157600080fd5b613c5d878388016134cd565b93506040860135915080821115613c7357600080fd5b50613c8086828701613b26565b9150509250925092565b600060208284031215613c9c57600080fd5b81518015158114610aa157600080fd5b60008251613cbe818460208701613394565b9190910192915050565b601f821115613d10576000816000526020600020601f850160051c81016020861015613cf15750805b601f850160051c820191505b81811015610ce257828155600101613cfd565b505050565b81516001600160401b03811115613d2e57613d2e612dbb565b613d4281613d3c8454613a60565b84613cc8565b602080601f831160018114613d775760008415613d5f5750858301515b600019600386901b1c1916600185901b178555610ce2565b600085815260208120601f198616915b82811015613da657888601518255948401946001909101908401613d87565b5085821015613dc45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613de760408301856133b8565b8281036020840152613df981856133b8565b95945050505050565b60008184825b85811015613e39578135613e1b81612eac565b6001600160a01b031683526020928301929190910190600101613e08565b509095945050505050565b6001600160a01b0383168152604060208201819052600090610647908301846133b8565b634e487b7160e01b600052602160045260246000fd5b818103818111156105945761059461381f565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a031bcfe5c5246fc2b8326d1783bec18aa37ab91f19b647ed1f1162ac7b3a39f64736f6c63430008170033"; +bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101285760003560e01c806308e93d0a1461012d5780630b61e12b1461014b5780630e6254fd1461016057806311464fbe14610173578063248a9ca3146101b25780632f2ff15d146101d357806336568abe146101e657806358451f97146101f957806383a03f8c146102015780638878ed33146102145780639010d07c1461022757806391d148541461023a5780639387a3801461025d578063938e3d7b14610270578063a217fddf14610283578063a32fa5b31461028b578063a65d69d41461029e578063ac9650d8146102c5578063c3c5a547146102e5578063ca15c873146102f8578063d547741f1461030b578063d8fd8f441461031e578063e68a7c3b14610331578063e8a3d48514610344575b600080fd5b610135610359565b6040516101429190611945565b60405180910390f35b61015e6101593660046119ae565b61036a565b005b61013561016e3660046119d8565b61040b565b61019a7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b6040516001600160a01b039091168152602001610142565b6101c56101c03660046119f3565b610435565b604051908152602001610142565b61015e6101e1366004611a0c565b610453565b61015e6101f4366004611a0c565b6104fd565b6101c561055c565b61015e61020f3660046119f3565b610568565b61019a610222366004611a38565b6105b6565b61019a610235366004611aba565b610630565b61024d610248366004611a0c565b61073e565b6040519015158152602001610142565b61015e61026b3660046119ae565b610772565b61015e61027e366004611af2565b610809565b6101c5600081565b61024d610299366004611a0c565b61085a565b61019a7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102d86102d3366004611ba2565b6108bd565b6040516101429190611c66565b61024d6102f33660046119d8565b610a19565b6101c56103063660046119f3565b610a25565b61015e610319366004611a0c565b610ac2565b61019a61032c366004611a38565b610acd565b61013561033f366004611aba565b610c18565b61034c610d49565b6040516101429190611cca565b60606103656000610de1565b905090565b336103758183610dee565b61039a5760405162461bcd60e51b815260040161039190611cdd565b60405180910390fd5b6001600160a01b03831660009081526002602052604081206103bc9083610e32565b9050801561040557836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b6001600160a01b038116600090815260026020526040902060609061042f90610de1565b92915050565b600061043f610e47565b600092835260010160205250604090205490565b61047761045e610e47565b6000848152600191909101602052604090205433610e6b565b61047f610e47565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104ef5760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610391565b6104f98282610ef0565b5050565b336001600160a01b038216146105525760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610391565b6104f98282610f04565b60006103656000610f18565b336105738183610dee565b61058f5760405162461bcd60e51b815260040161039190611cdd565b61059a600082610e32565b6104f95760405162461bcd60e51b815260040161039190611d14565b6000806105f98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f2292505050565b90506106257f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610f55565b9150505b9392505050565b60008061063b610fb5565b600085815260209190915260408120549150805b82811015610735576000610661610fb5565b60008881526020918252604080822085835260010190925220546001600160a01b0316146106d9578482036106c757610698610fb5565b600087815260209182526040808220938252600190930190915220546001600160a01b0316925061042f915050565b6106d2600183611d74565b9150610723565b6106e486600061073e565b801561071057506106f3610fb5565b600087815260209182526040808220828052600201909252205481145b1561072357610720600183611d74565b91505b61072e600182611d74565b905061064f565b50505092915050565b6000610748610e47565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b3361077d8183610dee565b6107995760405162461bcd60e51b815260040161039190611cdd565b6001600160a01b03831660009081526002602052604081206107bb9083610fbf565b9050801561040557836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b610811610fd4565b61084e5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610391565b61085781610fe0565b50565b6000610864610e47565b600084815260209182526040808220828052909252205460ff166108b45761088a610e47565b6000848152602091825260408082206001600160a01b0386168352909252205460ff16905061042f565b50600192915050565b6060816001600160401b038111156108d7576108d7611adc565b60405190808252806020026020018201604052801561090a57816020015b60608152602001906001900390816108f55790505b509050336000805b848110156107355781156109915761096f3087878481811061093657610936611d87565b90506020028101906109489190611d9d565b8660405160200161095b93929190611dea565b6040516020818303038152906040526110c7565b84828151811061098157610981611d87565b6020026020010181905250610a11565b6109f3308787848181106109a7576109a7611d87565b90506020028101906109b99190611d9d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110c792505050565b848281518110610a0557610a05611d87565b60200260200101819052505b600101610912565b600061042f81836110ec565b600080610a30610fb5565b6000848152602091909152604081205491505b81811015610a9d576000610a55610fb5565b60008681526020918252604080822085835260010190925220546001600160a01b031614610a8b57610a88600184611d74565b92505b610a96600182611d74565b9050610a43565b50610aa983600061073e565b15610abc57610ab9600183611d74565b91505b50919050565b61055261045e610e47565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610b358686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f2292505050565b90506000610b438383610f55565b90506001600160a01b0381163b15610b5f579250610629915050565b610b69838361110e565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610bc257610ba6600082610e32565b610bc25760405162461bcd60e51b815260040161039190611d14565b610bce818888886111a5565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b60608183108015610c325750610c2e6000610f18565b8211155b610c8a5760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201526263657360e81b6064820152608401610391565b6000610c968484611e0b565b9050610ca28484611e0b565b6001600160401b03811115610cb957610cb9611adc565b604051908082528060200260200182016040528015610ce2578160200160208202803683370190505b50915060005b81811015610d4157610d05610cfd8683611d74565b60009061120d565b838281518110610d1757610d17611d87565b6001600160a01b0390921660209283029190910190910152610d3a600182611d74565b9050610ce8565b505092915050565b6060610d53611219565b8054610d5e90611e1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8a90611e1e565b8015610dd75780601f10610dac57610100808354040283529160200191610dd7565b820191906000526020600020905b815481529060010190602001808311610dba57829003601f168201915b5050505050905090565b606060006106298361123d565b600080610e1b7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac84610f55565b6001600160a01b0385811691161491505092915050565b6000610629836001600160a01b038416611299565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b610e73610e47565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104f957610eae816001600160a01b031660146112e8565b610eb98360206112e8565b604051602001610eca929190611e52565b60408051601f198184030181529082905262461bcd60e51b825261039191600401611cca565b610efa8282611483565b6104f982826114ec565b610f0e82826115ab565b6104f98282611614565b600061042f825490565b60008282604051602001610f37929190611ebf565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610629565b60006103656116a3565b6000610629836001600160a01b038416611705565b6000610365813361073e565b6000610fea611219565b8054610ff590611e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461102190611e1e565b801561106e5780601f106110435761010080835404028352916020019161106e565b820191906000526020600020905b81548152906001019060200180831161105157829003601f168201915b505050505090508161107e611219565b906110899082611f34565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516110bb929190611ff3565b60405180910390a15050565b606061062983836040518060600160405280602781526020016120b9602791396117f8565b6001600160a01b03811660009081526001830160205260408120541515610629565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661042f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610391565b60405163347d5e2560e21b81526001600160a01b0385169063d1f57894906111d590869086908690600401612018565b600060405180830381600087803b1580156111ef57600080fd5b505af1158015611203573d6000803e3d6000fd5b5050505050505050565b60006106298383611870565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60608160000180548060200260200160405190810160405280929190818152602001828054801561128d57602002820191906000526020600020905b815481526020019060010190808311611279575b50505050509050919050565b60008181526001830160205260408120546112e05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561042f565b50600061042f565b606060006112f7836002612058565b611302906002611d74565b6001600160401b0381111561131957611319611adc565b6040519080825280601f01601f191660200182016040528015611343576020820181803683370190505b509050600360fc1b8160008151811061135e5761135e611d87565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061138d5761138d611d87565b60200101906001600160f81b031916908160001a90535060006113b1846002612058565b6113bc906001611d74565b90505b6001811115611434576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106113f0576113f0611d87565b1a60f81b82828151811061140657611406611d87565b60200101906001600160f81b031916908160001a90535060049490941c9361142d8161206f565b90506113bf565b5083156106295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610391565b600161148d610e47565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60006114f6610fb5565b6000848152602091909152604090205490506001611512610fb5565b6000858152602091909152604081208054909190611531908490611d74565b90915550829050611540610fb5565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b039290921691909117905580611580610fb5565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6115b58282610e6b565b6115bd610e47565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061161e610fb5565b6000848152602091825260408082206001600160a01b03861683526002019092522054905061164b610fb5565b6000848152602091825260408082208483526001019092522080546001600160a01b031916905561167a610fb5565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b60008060ff196116d460017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611e0b565b6040516020016116e691815260200190565b60408051601f1981840301815291905280516020909101201692915050565b600081815260018301602052604081205480156117ee576000611729600183611e0b565b855490915060009061173d90600190611e0b565b90508181146117a257600086600001828154811061175d5761175d611d87565b906000526020600020015490508087600001848154811061178057611780611d87565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806117b3576117b3612086565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061042f565b600091505061042f565b6060600080856001600160a01b031685604051611815919061209c565b600060405180830381855af49150503d8060008114611850576040519150601f19603f3d011682016040523d82523d6000602084013e611855565b606091505b50915091506118668683838761189a565b9695505050505050565b600082600001828154811061188757611887611d87565b9060005260206000200154905092915050565b60608315611909578251600003611902576001600160a01b0385163b6119025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610391565b5081611913565b611913838361191b565b949350505050565b81511561192b5781518083602001fd5b8060405162461bcd60e51b81526004016103919190611cca565b6020808252825182820181905260009190848201906040850190845b818110156119865783516001600160a01b031683529284019291840191600101611961565b50909695505050505050565b80356001600160a01b03811681146119a957600080fd5b919050565b600080604083850312156119c157600080fd5b6119ca83611992565b946020939093013593505050565b6000602082840312156119ea57600080fd5b61062982611992565b600060208284031215611a0557600080fd5b5035919050565b60008060408385031215611a1f57600080fd5b82359150611a2f60208401611992565b90509250929050565b600080600060408486031215611a4d57600080fd5b611a5684611992565b925060208401356001600160401b0380821115611a7257600080fd5b818601915086601f830112611a8657600080fd5b813581811115611a9557600080fd5b876020828501011115611aa757600080fd5b6020830194508093505050509250925092565b60008060408385031215611acd57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611b0457600080fd5b81356001600160401b0380821115611b1b57600080fd5b818401915084601f830112611b2f57600080fd5b813581811115611b4157611b41611adc565b604051601f8201601f19908116603f01168101908382118183101715611b6957611b69611adc565b81604052828152876020848701011115611b8257600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060208385031215611bb557600080fd5b82356001600160401b0380821115611bcc57600080fd5b818501915085601f830112611be057600080fd5b813581811115611bef57600080fd5b8660208260051b8501011115611c0457600080fd5b60209290920196919550909350505050565b60005b83811015611c31578181015183820152602001611c19565b50506000910152565b60008151808452611c52816020860160208601611c16565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611cbd57603f19888603018452611cab858351611c3a565b94509285019290850190600101611c8f565b5092979650505050505050565b6020815260006106296020830184611c3a565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042f5761042f611d5e565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611db457600080fd5b8301803591506001600160401b03821115611dce57600080fd5b602001915036819003821315611de357600080fd5b9250929050565b8284823760609190911b6001600160601b0319169101908152601401919050565b8181038181111561042f5761042f611d5e565b600181811c90821680611e3257607f821691505b602082108103610abc57634e487b7160e01b600052602260045260246000fd5b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611e82816015850160208801611c16565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611eb3816026840160208801611c16565b01602601949350505050565b6001600160a01b038316815260406020820181905260009061191390830184611c3a565b601f821115611f2f576000816000526020600020601f850160051c81016020861015611f0c5750805b601f850160051c820191505b81811015611f2b57828155600101611f18565b5050505b505050565b81516001600160401b03811115611f4d57611f4d611adc565b611f6181611f5b8454611e1e565b84611ee3565b602080601f831160018114611f965760008415611f7e5750858301515b600019600386901b1c1916600185901b178555611f2b565b600085815260208120601f198616915b82811015611fc557888601518255948401946001909101908401611fa6565b5085821015611fe35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006120066040830185611c3a565b82810360208401526106258185611c3a565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b808202811582820484141761042f5761042f611d5e565b60008161207e5761207e611d5e565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600082516120ae818460208701611c16565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206d4165d1cf7ceea1ef7ae2a59f35cbdcc072abf82553dfe8d4b217752d7a1b3c64736f6c63430008170033"; +bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"60806040526004361061014b5760003560e01c806301ffc9a7146101575780630a1028c41461018c578063150b7a02146101ba5780631626ba7e146101f35780631dd756c51461021357806324d7806c146102335780633a871cdd1461025357806347e1da2a146102735780634a58db19146102955780634d44560d1461029d5780635892e236146102bd5780637dff5a79146102dd5780638b52d723146102fd578063938e3d7b1461031f578063a9082d841461033f578063ac9650d81461037e578063b0d691fe146103ab578063b61d27f6146103cd578063b76464d5146103ed578063bc197c811461040d578063c45a015514610439578063d087d2881461046d578063d1f5789414610482578063d42f2f35146104a2578063e8a3d485146104b7578063e9523c97146104d9578063f15d424e146104fb578063f23a6e611461052857600080fd5b3661015257005b600080fd5b34801561016357600080fd5b50610177610172366004612d91565b610554565b60405190151581526020015b60405180910390f35b34801561019857600080fd5b506101ac6101a7366004612e78565b61059a565b604051908152602001610183565b3480156101c657600080fd5b506101da6101d5366004612ed1565b61063e565b6040516001600160e01b03199091168152602001610183565b3480156101ff57600080fd5b506101da61020e366004612f3c565b61064f565b34801561021f57600080fd5b5061017761022e366004612f9b565b61078f565b34801561023f57600080fd5b5061017761024e366004612fe0565b610a53565b34801561025f57600080fd5b506101ac61026e366004612ffd565b610a82565b34801561027f57600080fd5b5061029361028e36600461308e565b610aa8565b005b610293610c0f565b3480156102a957600080fd5b506102936102b8366004613127565b610c77565b3480156102c957600080fd5b506102936102d8366004613194565b610cea565b3480156102e957600080fd5b506101776102f8366004612fe0565b6110a7565b34801561030957600080fd5b50610312611160565b60405161018391906132a7565b34801561032b57600080fd5b5061029361033a36600461330b565b6113a7565b34801561034b57600080fd5b5061035f61035a366004613194565b6113f8565b6040805192151583526001600160a01b03909116602083015201610183565b34801561038a57600080fd5b5061039e610399366004613353565b61144f565b60405161018391906133e4565b3480156103b757600080fd5b506103c06115b4565b604051610183919061343b565b3480156103d957600080fd5b506102936103e836600461344f565b6115fd565b3480156103f957600080fd5b50610293610408366004612fe0565b61168d565b34801561041957600080fd5b506101da61042836600461353c565b63bc197c8160e01b95945050505050565b34801561044557600080fd5b506103c07f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561047957600080fd5b506101ac6116bf565b34801561048e57600080fd5b5061029361049d3660046135e9565b61173f565b3480156104ae57600080fd5b506103126118f7565b3480156104c357600080fd5b506104cc611a68565b6040516101839190613630565b3480156104e557600080fd5b506104ee611b00565b6040516101839190613643565b34801561050757600080fd5b5061051b610516366004612fe0565b611b12565b6040516101839190613690565b34801561053457600080fd5b506101da6105433660046136a3565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061058557506001600160e01b03198216630a85bd0160e11b145b80610594575061059482611bea565b92915050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016105e0929190918252602082015260400190565b604051602081830303815290604052805190602001209050610600611c1f565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b630a85bd0160e11b5b949350505050565b60008061067c8460405160200161066891815260200190565b60405160208183030381529060405261059a565b9050600061068a8285611d46565b905061069581610a53565b156106ac5750630b135d3f60e11b91506105949050565b3360006106b7611d6a565b6001600160a01b03841660009081526006919091016020526040902090506106df8183611d8e565b8061070f57506106ee81611db0565b600114801561070f575060006107048282611dba565b6001600160a01b0316145b61076c5760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b610775836110a7565b1561078557630b135d3f60e11b94505b5050505092915050565b6000610799611d6a565b6001600160a01b0384166000908152600491909101602052604090205460ff16156107c657506001610594565b60006107d0611d6a565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b900490921690820152915061082b611d6a565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b0316118061087b575081604001516001600160801b03164210155b8061088c575061088a81611db0565b155b1561089c57600092505050610594565b60006108b36108ae606087018761370b565b611dc6565b905060006108c083611db0565b60011480156108e1575060006108d68482611dba565b6001600160a01b0316145b90506324f16c0560e11b6001600160e01b03198316016109585760008061091361090e60608a018a61370b565b611e00565b9150915082610939576109268583611d8e565b6109395760009650505050505050610594565b85518111156109515760009650505050505050610594565b5050610a46565b635c0f12eb60e11b6001600160e01b0319831601610a395760008061098861098360608a018a61370b565b611e65565b5091509150826109e85760005b82518110156109e6576109ca8382815181106109b3576109b3613751565b602002602001015187611d8e90919063ffffffff16565b6109de576000975050505050505050610594565b600101610995565b505b60005b8251811015610a3157818181518110610a0657610a06613751565b602002602001015187600001511015610a29576000975050505050505050610594565b6001016109eb565b505050610a46565b6000945050505050610594565b5060019695505050505050565b6000610a5d611d6a565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b6000610a8c611eb2565b610a968484611f1b565b9050610aa182612060565b9392505050565b610ab06115b4565b6001600160a01b0316336001600160a01b03161480610ad35750610ad333610a53565b610aef5760405162461bcd60e51b815260040161076390613767565b610af76120ad565b8481148015610b0557508483145b610b515760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e0000006044820152606401610763565b60005b85811015610c0657610bfd878783818110610b7157610b71613751565b9050602002016020810190610b869190612fe0565b868684818110610b9857610b98613751565b90506020020135858585818110610bb157610bb1613751565b9050602002810190610bc3919061370b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219392505050565b50600101610b54565b50505050505050565b610c176115b4565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610c43919061343b565b6000604051808303818588803b158015610c5c57600080fd5b505af1158015610c70573d6000803e3d6000fd5b5050505050565b610c7f612204565b610c876115b4565b6001600160a01b031663205c287883836040518363ffffffff1660e01b8152600401610cb49291906137a8565b600060405180830381600087803b158015610cce57600080fd5b505af1158015610ce2573d6000803e3d6000fd5b505050505050565b6000610cf96020850185612fe0565b905042610d0c60e0860160c087016137d8565b6001600160801b031611158015610d3b5750610d2f610100850160e086016137d8565b6001600160801b031642105b610d715760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b6044820152606401610763565b600080610d7f8686866113f8565b9150915081610db95760405162461bcd60e51b8152600401610763906020808252600490820152632173696760e01b604082015260600190565b6001610dc3611d6a565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610dff91908901908901613804565b60ff161115610e2c576000610e1a6040880160208901613804565b60ff166001149050610c068482612242565b610e3583610a53565b15610e6a5760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b6044820152606401610763565b610e7f83610e76611d6a565b60020190612317565b50604051806060016040528087606001358152602001876080016020810190610ea891906137d8565b6001600160801b03168152602001610ec660c0890160a08a016137d8565b6001600160801b03169052610ed9611d6a565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610f4f610f2e611d6a565b6001600160a01b03861660009081526006919091016020526040902061232c565b805190915060005b81811015610fb957610fa6838281518110610f7457610f74613751565b6020026020010151610f84611d6a565b6001600160a01b03891660009081526006919091016020526040902090612339565b50610fb2600182613835565b9050610f57565b50610fc76040890189613848565b9050905060005b8181101561104857611035610fe660408b018b613848565b83818110610ff657610ff6613751565b905060200201602081019061100b9190612fe0565b611013611d6a565b6001600160a01b03891660009081526006919091016020526040902090612317565b50611041600182613835565b9050610fce565b506110528861234e565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516110959190613922565b60405180910390a35050505050505050565b6000806110b2611d6a565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b90910416928101929092529091504210801590611123575080604001516001600160801b031642105b8015610aa157506000611158611137611d6a565b6001600160a01b038616600090815260069190910160205260409020611db0565b119392505050565b6060600061117761116f611d6a565b60020161232c565b80519091506000805b82811015611208576111aa84828151811061119d5761119d613751565b60200260200101516110a7565b156111c157816111b981613a0d565b9250506111f6565b60008482815181106111d5576111d5613751565b60200260200101906001600160a01b031690816001600160a01b0316815250505b611201600182613835565b9050611180565b50806001600160401b0381111561122157611221612dbb565b60405190808252806020026020018201604052801561125a57816020015b611247612d47565b81526020019060019003908161123f5790505b5093506000805b8381101561139f5760006001600160a01b031685828151811061128657611286613751565b60200260200101516001600160a01b03161461138d5760008582815181106112b0576112b0613751565b6020026020010151905060006112c4611d6a565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161132e610f2e611d6a565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b031681525088858061136d90613a0d565b96508151811061137f5761137f613751565b602002602001018190525050505b611398600182613835565b9050611261565b505050505090565b6113af6123e3565b6113ec5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610763565b6113f5816123fb565b50565b60008061140e611407866124e2565b8585612626565b9050611418611d6a565b6101008601356000908152600791909101602052604090205460ff16158015611445575061144581610a53565b9150935093915050565b6060816001600160401b0381111561146957611469612dbb565b60405190808252806020026020018201604052801561149c57816020015b60608152602001906001900390816114875790505b509050336000805b848110156115ab57811561152357611501308787848181106114c8576114c8613751565b90506020028101906114da919061370b565b866040516020016114ed93929190613a26565b604051602081830303815290604052612678565b84828151811061151357611513613751565b60200260200101819052506115a3565b6115853087878481811061153957611539613751565b905060200281019061154b919061370b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267892505050565b84828151811061159757611597613751565b60200260200101819052505b6001016114a4565b50505092915050565b6000806115bf61269d565b546001600160a01b0316905080156115d657919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b6116056115b4565b6001600160a01b0316336001600160a01b03161480611628575061162833610a53565b6116445760405162461bcd60e51b815260040161076390613767565b61164c6120ad565b610c70848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219392505050565b611695612204565b8061169e61269d565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60006116c96115b4565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190613a47565b905090565b60006117496126c1565b5460ff16905060006117596126c1565b54610100900460ff1690508015808015611776575060018360ff16105b806117955750611785306126e5565b15801561179557508260ff166001145b6117f85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b60016118026126c1565b805460ff191660ff92909216919091179055801561183b5760016118246126c1565b80549115156101000261ff00199092169190911790555b61187b8686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f492505050565b61188361269d565b60010181905550611895866001612242565b8015610ce25760006118a56126c1565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6060600061190661116f611d6a565b8051909150806001600160401b0381111561192357611923612dbb565b60405190808252806020026020018201604052801561195c57816020015b611949612d47565b8152602001906001900390816119415790505b50925060005b81811015611a6257600083828151811061197e5761197e613751565b602002602001015190506000611992611d6a565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016119fc610f2e611d6a565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250868481518110611a4157611a41613751565b60200260200101819052505050600181611a5b9190613835565b9050611962565b50505090565b6060611a72612727565b8054611a7d90613a60565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa990613a60565b8015611af65780601f10611acb57610100808354040283529160200191611af6565b820191906000526020600020905b815481529060010190602001808311611ad957829003601f168201915b5050505050905090565b606061173a611b0d611d6a565b61232c565b611b1a612d47565b6000611b24611d6a565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611baf611b8e611d6a565b6001600160a01b03871660009081526006919091016020526040902061232c565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b60006001600160e01b03198216630271189760e51b148061059457506301ffc9a760e01b6001600160e01b0319831614610594565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015611c7857507f0000000000000000000000000000000000000000000000000000000000007a6946145b15611ca257507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000806000611d55858561274b565b91509150611d6281612790565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b03811660009081526001830160205260408120541515610aa1565b6000610594825490565b6000610aa183836128d5565b60006004821015611de95760405162461bcd60e51b815260040161076390613a94565b611df7600460008486613ab3565b610aa191613add565b6000806044831015611e245760405162461bcd60e51b815260040161076390613a94565b611e32602460048587613ab3565b810190611e3f9190612fe0565b9150611e4f604460248587613ab3565b810190611e5c9190613b0d565b90509250929050565b606080806064841015611e8a5760405162461bcd60e51b815260040161076390613a94565b611e978460048188613ab3565b810190611ea49190613ba5565b919790965090945092505050565b611eba6115b4565b6001600160a01b0316336001600160a01b031614611f195760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b6044820152606401610763565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611f99611f5c61014087018761370b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611d469050565b9050611fa5818661078f565b611fb457600192505050610594565b6000611fbe611d6a565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b80156113f557604051600090339060001990849084818181858888f193505050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c70565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a547906120fb90309060040161343b565b602060405180830381865afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c9190613c8a565b6113f557806001600160a01b03166383a03f8c61215761269d565b600101546040518263ffffffff1660e01b815260040161217991815260200190565b600060405180830381600087803b158015610c5c57600080fd5b60606000846001600160a01b031684846040516121b09190613cac565b60006040518083038185875af1925050503d80600081146121ed576040519150601f19603f3d011682016040523d82523d6000602084013e6121f2565b606091505b509250905080611d6257815160208301fd5b61220d33610a53565b611f195760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b6044820152606401610763565b61224c82826128ff565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156123135780156122db577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630b61e12b836122ba61269d565b600101546040518363ffffffff1660e01b8152600401610cb49291906137a8565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639387a380836122ba61269d565b5050565b6000610aa1836001600160a01b0384166129ae565b60606000610aa1836129fd565b6000610aa1836001600160a01b038416612a59565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156113f5576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16630b61e12b6123ba6020840184612fe0565b6123c261269d565b600101546040518363ffffffff1660e01b81526004016121799291906137a8565b60006123ee33610a53565b8061173a57505030331490565b6000612405612727565b805461241090613a60565b80601f016020809104026020016040519081016040528092919081815260200182805461243c90613a60565b80156124895780601f1061245e57610100808354040283529160200191612489565b820191906000526020600020905b81548152906001019060200180831161246c57829003601f168201915b5050505050905081612499612727565b906124a49082613d15565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516124d6929190613dd4565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96125126020840184612fe0565b6125226040850160208601613804565b61252f6040860186613848565b604051602001612540929190613e02565b60408051601f198184030181529190528051602090910120606086013561256d60a08801608089016137d8565b61257d60c0890160a08a016137d8565b61258d60e08a0160c08b016137d8565b61259e6101008b0160e08c016137d8565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061064783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061267292509050612b4c565b90611d46565b6060610aa18383604051806060016040528060278152602001613ea860279139612b79565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b6001600160a01b03163b151590565b60008282604051602001612709929190613e44565b60405160208183030381529060405280519060200120905092915050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60008082516041036127815760208301516040840151606085015160001a61277587828585612bf1565b94509450505050612789565b506000905060025b9250929050565b60008160048111156127a4576127a4613e68565b036127ac5750565b60018160048111156127c0576127c0613e68565b036128085760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606401610763565b600281600481111561281c5761281c613e68565b036128695760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b600381600481111561287d5761287d613e68565b036113f55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b60008260000182815481106128ec576128ec613751565b9060005260206000200154905092915050565b80612908611d6a565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156129515761294b82612945611d6a565b90612317565b50612965565b6129638261295d611d6a565b90612339565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a11133826040516129a2911515815260200190565b60405180910390a25050565b60008181526001830160205260408120546129f557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610594565b506000610594565b606081600001805480602002602001604051908101604052809291908181526020018280548015612a4d57602002820191906000526020600020905b815481526020019060010190808311612a39575b50505050509050919050565b60008181526001830160205260408120548015612b42576000612a7d600183613e7e565b8554909150600090612a9190600190613e7e565b9050818114612af6576000866000018281548110612ab157612ab1613751565b9060005260206000200154905080876000018481548110612ad457612ad4613751565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612b0757612b07613e91565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610594565b6000915050610594565b6000610594612b59611c1f565b8360405161190160f01b8152600281019290925260228201526042902090565b6060600080856001600160a01b031685604051612b969190613cac565b600060405180830381855af49150503d8060008114612bd1576040519150601f19603f3d011682016040523d82523d6000602084013e612bd6565b606091505b5091509150612be786838387612cab565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612c1e5750600090506003612ca2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c72573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c9b57600060019250925050612ca2565b9150600090505b94509492505050565b60608315612d18578251600003612d1157612cc5856126e5565b612d115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610763565b5081610647565b6106478383815115612d2d5781518083602001fd5b8060405162461bcd60e51b81526004016107639190613630565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b600060208284031215612da357600080fd5b81356001600160e01b031981168114610aa157600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612df957612df9612dbb565b604052919050565b60006001600160401b03831115612e1a57612e1a612dbb565b612e2d601f8401601f1916602001612dd1565b9050828152838383011115612e4157600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e6957600080fd5b610aa183833560208501612e01565b600060208284031215612e8a57600080fd5b81356001600160401b03811115612ea057600080fd5b61064784828501612e58565b6001600160a01b03811681146113f557600080fd5b8035612ecc81612eac565b919050565b60008060008060808587031215612ee757600080fd5b8435612ef281612eac565b93506020850135612f0281612eac565b92506040850135915060608501356001600160401b03811115612f2457600080fd5b612f3087828801612e58565b91505092959194509250565b60008060408385031215612f4f57600080fd5b8235915060208301356001600160401b03811115612f6c57600080fd5b612f7885828601612e58565b9150509250929050565b60006101608284031215612f9557600080fd5b50919050565b60008060408385031215612fae57600080fd5b8235612fb981612eac565b915060208301356001600160401b03811115612fd457600080fd5b612f7885828601612f82565b600060208284031215612ff257600080fd5b8135610aa181612eac565b60008060006060848603121561301257600080fd5b83356001600160401b0381111561302857600080fd5b61303486828701612f82565b9660208601359650604090950135949350505050565b60008083601f84011261305c57600080fd5b5081356001600160401b0381111561307357600080fd5b6020830191508360208260051b850101111561278957600080fd5b600080600080600080606087890312156130a757600080fd5b86356001600160401b03808211156130be57600080fd5b6130ca8a838b0161304a565b909850965060208901359150808211156130e357600080fd5b6130ef8a838b0161304a565b9096509450604089013591508082111561310857600080fd5b5061311589828a0161304a565b979a9699509497509295939492505050565b6000806040838503121561313a57600080fd5b823561314581612eac565b946020939093013593505050565b60008083601f84011261316557600080fd5b5081356001600160401b0381111561317c57600080fd5b60208301915083602082850101111561278957600080fd5b6000806000604084860312156131a957600080fd5b83356001600160401b03808211156131c057600080fd5b9085019061012082880312156131d557600080fd5b909350602085013590808211156131eb57600080fd5b506131f886828701613153565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561326957855185168252948301946001929092019190830190613247565b5060408701516040890152606087015194506132886060890186613205565b6080870151945061329c6080890186613205565b979650505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156132fe57603f198886030184526132ec858351613212565b945092850192908501906001016132d0565b5092979650505050505050565b60006020828403121561331d57600080fd5b81356001600160401b0381111561333357600080fd5b8201601f8101841361334457600080fd5b61064784823560208401612e01565b6000806020838503121561336657600080fd5b82356001600160401b0381111561337c57600080fd5b6133888582860161304a565b90969095509350505050565b60005b838110156133af578181015183820152602001613397565b50506000910152565b600081518084526133d0816020860160208601613394565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156132fe57603f198886030184526134298583516133b8565b9450928501929085019060010161340d565b6001600160a01b0391909116815260200190565b6000806000806060858703121561346557600080fd5b843561347081612eac565b93506020850135925060408501356001600160401b0381111561349257600080fd5b61349e87828801613153565b95989497509550505050565b60006001600160401b038211156134c3576134c3612dbb565b5060051b60200190565b600082601f8301126134de57600080fd5b813560206134f36134ee836134aa565b612dd1565b8083825260208201915060208460051b87010193508684111561351557600080fd5b602086015b84811015613531578035835291830191830161351a565b509695505050505050565b600080600080600060a0868803121561355457600080fd5b853561355f81612eac565b9450602086013561356f81612eac565b935060408601356001600160401b038082111561358b57600080fd5b61359789838a016134cd565b945060608801359150808211156135ad57600080fd5b6135b989838a016134cd565b935060808801359150808211156135cf57600080fd5b506135dc88828901612e58565b9150509295509295909350565b6000806000604084860312156135fe57600080fd5b833561360981612eac565b925060208401356001600160401b0381111561362457600080fd5b6131f886828701613153565b602081526000610aa160208301846133b8565b6020808252825182820181905260009190848201906040850190845b818110156136845783516001600160a01b03168352928401929184019160010161365f565b50909695505050505050565b602081526000610aa16020830184613212565b600080600080600060a086880312156136bb57600080fd5b85356136c681612eac565b945060208601356136d681612eac565b9350604086013592506060860135915060808601356001600160401b038111156136ff57600080fd5b6135dc88828901612e58565b6000808335601e1984360301811261372257600080fd5b8301803591506001600160401b0382111561373c57600080fd5b60200191503681900382131561278957600080fd5b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80356001600160801b0381168114612ecc57600080fd5b6000602082840312156137ea57600080fd5b610aa1826137c1565b803560ff81168114612ecc57600080fd5b60006020828403121561381657600080fd5b610aa1826137f3565b634e487b7160e01b600052601160045260246000fd5b808201808211156105945761059461381f565b6000808335601e1984360301811261385f57600080fd5b8301803591506001600160401b0382111561387957600080fd5b6020019150600581901b360382131561278957600080fd5b6000808335601e198436030181126138a857600080fd5b83016020810192503590506001600160401b038111156138c757600080fd5b8060051b360382131561278957600080fd5b8183526000602080850194508260005b858110156139175781356138fc81612eac565b6001600160a01b0316875295820195908201906001016138e9565b509495945050505050565b602081526139436020820161393684612ec1565b6001600160a01b03169052565b6000613951602084016137f3565b60ff81166040840152506139686040840184613891565b610120806060860152613980610140860183856138d9565b925060608601356080860152613998608087016137c1565b91506139a760a0860183613205565b6139b360a087016137c1565b91506139c260c0860183613205565b6139ce60c087016137c1565b91506139dd60e0860183613205565b6139e960e087016137c1565b91506101006139fa81870184613205565b9590950135939094019290925250919050565b600060018201613a1f57613a1f61381f565b5060010190565b8284823760609190911b6001600160601b0319169101908152601401919050565b600060208284031215613a5957600080fd5b5051919050565b600181811c90821680613a7457607f821691505b602082108103612f9557634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b60008085851115613ac357600080fd5b83861115613ad057600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b055780818660040360031b1b83161692505b505092915050565b600060208284031215613b1f57600080fd5b5035919050565b600082601f830112613b3757600080fd5b81356020613b476134ee836134aa565b82815260059290921b84018101918181019086841115613b6657600080fd5b8286015b848110156135315780356001600160401b03811115613b895760008081fd5b613b978986838b0101612e58565b845250918301918301613b6a565b600080600060608486031215613bba57600080fd5b83356001600160401b0380821115613bd157600080fd5b818601915086601f830112613be557600080fd5b81356020613bf56134ee836134aa565b82815260059290921b8401810191818101908a841115613c1457600080fd5b948201945b83861015613c3b578535613c2c81612eac565b82529482019490820190613c19565b97505087013592505080821115613c5157600080fd5b613c5d878388016134cd565b93506040860135915080821115613c7357600080fd5b50613c8086828701613b26565b9150509250925092565b600060208284031215613c9c57600080fd5b81518015158114610aa157600080fd5b60008251613cbe818460208701613394565b9190910192915050565b601f821115613d10576000816000526020600020601f850160051c81016020861015613cf15750805b601f850160051c820191505b81811015610ce257828155600101613cfd565b505050565b81516001600160401b03811115613d2e57613d2e612dbb565b613d4281613d3c8454613a60565b84613cc8565b602080601f831160018114613d775760008415613d5f5750858301515b600019600386901b1c1916600185901b178555610ce2565b600085815260208120601f198616915b82811015613da657888601518255948401946001909101908401613d87565b5085821015613dc45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613de760408301856133b8565b8281036020840152613df981856133b8565b95945050505050565b60008184825b85811015613e39578135613e1b81612eac565b6001600160a01b031683526020928301929190910190600101613e08565b509095945050505050565b6001600160a01b0383168152604060208201819052600090610647908301846133b8565b634e487b7160e01b600052602160045260246000fd5b818103818111156105945761059461381f565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019cc7525a78289009afc67e3df01d951420e7390ef0e5a1ac3e7ae9c26de3c6564736f6c63430008170033"; diff --git a/src/test/token/TokenERC1155.t.sol b/src/test/token/TokenERC1155.t.sol index ced59d548..ad7dbcaf8 100644 --- a/src/test/token/TokenERC1155.t.sol +++ b/src/test/token/TokenERC1155.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { TokenERC1155, IPlatformFee } from "contracts/prebuilts/token/TokenERC1155.sol"; +import { TokenERC1155, IPlatformFee, NFTMetadata } from "contracts/prebuilts/token/TokenERC1155.sol"; // Test imports @@ -920,7 +920,7 @@ contract TokenERC1155Test is BaseTest { function test_setTokenURI_revert_NotAuthorized() public { string memory uri = "uri_string"; - vm.expectRevert("NFTMetadata: not authorized to set metadata."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataUnauthorized.selector)); vm.prank(address(0x1)); tokenContract.setTokenURI(0, uri); } @@ -931,7 +931,7 @@ contract TokenERC1155Test is BaseTest { vm.startPrank(deployerSigner); tokenContract.freezeMetadata(); - vm.expectRevert("NFTMetadata: metadata is frozen."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataFrozen.selector, 0)); tokenContract.setTokenURI(0, uri); } } diff --git a/src/test/token/TokenERC721.t.sol b/src/test/token/TokenERC721.t.sol index 41732cff6..bd9c0519a 100644 --- a/src/test/token/TokenERC721.t.sol +++ b/src/test/token/TokenERC721.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import { TokenERC721 } from "contracts/prebuilts/token/TokenERC721.sol"; +import { TokenERC721, NFTMetadata } from "contracts/prebuilts/token/TokenERC721.sol"; // Test imports @@ -675,7 +675,7 @@ contract TokenERC721Test is BaseTest { function test_setTokenURI_revert_NotAuthorized() public { string memory uri = "uri_string"; - vm.expectRevert("NFTMetadata: not authorized to set metadata."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataUnauthorized.selector)); vm.prank(address(0x1)); tokenContract.setTokenURI(0, uri); } @@ -686,7 +686,7 @@ contract TokenERC721Test is BaseTest { vm.startPrank(deployerSigner); tokenContract.freezeMetadata(); - vm.expectRevert("NFTMetadata: metadata is frozen."); + vm.expectRevert(abi.encodeWithSelector(NFTMetadata.NFTMetadataFrozen.selector, 0)); tokenContract.setTokenURI(0, uri); } } diff --git a/src/test/utils/BaseTest.sol b/src/test/utils/BaseTest.sol index 9b89c55e5..454ea8235 100644 --- a/src/test/utils/BaseTest.sol +++ b/src/test/utils/BaseTest.sol @@ -118,7 +118,7 @@ abstract contract BaseTest is DSTest, Test { eoaForwarder = address(new ForwarderEOAOnly()); registry = address(new TWRegistry(forwarder)); factory = address(new TWFactory(forwarder, registry)); - contractPublisher = address(new ContractPublisher(forwarder, new MockContractPublisher())); + contractPublisher = address(new ContractPublisher(factoryAdmin, forwarder, new MockContractPublisher())); linkToken = address(new Link()); vrfV2Wrapper = address(new VRFV2Wrapper()); TWRegistry(registry).grantRole(TWRegistry(registry).OPERATOR_ROLE(), factory); @@ -148,7 +148,7 @@ abstract contract BaseTest is DSTest, Test { TWFactory(factory).addImplementation( address(new PackVRFDirect(address(weth), eoaForwarder, linkToken, vrfV2Wrapper)) ); - TWFactory(factory).addImplementation(address(new Pack(address(weth), eoaForwarder))); + TWFactory(factory).addImplementation(address(new Pack(address(weth)))); TWFactory(factory).addImplementation(address(new VoteERC20())); TWFactory(factory).addImplementation(address(new MockContract(bytes32("NFTStake"), 1))); TWFactory(factory).addImplementation(address(new NFTStake(address(weth)))); From ad8e7129507fb618be25e11c1e6e34bdcf106ecc Mon Sep 17 00:00:00 2001 From: Yash <72552910+kumaryash90@users.noreply.github.com> Date: Tue, 27 Feb 2024 02:09:16 +0530 Subject: [PATCH 11/11] Clean up (#621) fix import --- contracts/infra/ContractPublisher.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/infra/ContractPublisher.sol b/contracts/infra/ContractPublisher.sol index 01c01d91e..a69ed5c05 100644 --- a/contracts/infra/ContractPublisher.sol +++ b/contracts/infra/ContractPublisher.sol @@ -16,7 +16,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/metatx/ERC2771Context.sol"; import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import "@openzeppelin/contracts/utils/Multicall.sol"; +import "../extension/Multicall.sol"; // ========== Internal imports ========== import { IContractPublisher } from "./interface/IContractPublisher.sol"; @@ -257,7 +257,7 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE } /// @dev ERC2771Context overrides - function _msgSender() internal view virtual override(Context, ERC2771Context) returns (address sender) { + function _msgSender() internal view virtual override(Context, ERC2771Context, Multicall) returns (address sender) { return ERC2771Context._msgSender(); }