diff --git a/.gitignore b/.gitignore index d0342aa8..b4fc8595 100644 --- a/.gitignore +++ b/.gitignore @@ -12,11 +12,12 @@ out/ # Ignore Environment Variables! .env -.env.prod +.env.* # IDEs (JetBrains and VSCode) .idea/ .vscode/ +.history/ # Ignore flattened files flattened.txt diff --git a/.hintrc b/.hintrc new file mode 100644 index 00000000..1f143282 --- /dev/null +++ b/.hintrc @@ -0,0 +1,8 @@ +{ + "extends": [ + "development" + ], + "hints": { + "typescript-config/consistent-casing": "off" + } +} \ No newline at end of file diff --git a/.solhint.json b/.solhint.json index 06aa3c04..f061088a 100644 --- a/.solhint.json +++ b/.solhint.json @@ -1,7 +1,7 @@ { "extends": "solhint:default", "rules": { - "max-line-length": ["error", 140], + "max-line-length": ["error", 140], "func-name-mixedcase": "off" } } diff --git a/README.md b/README.md index 89903fbc..a1daab4c 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,15 @@ For more details about the internal architecture of the repository, see [CONTRIB ## Governance +- there is no onchain governance for now + ### Maintainers -- Mathieu Bour <[mathieu.bour@pooky.gg](mailto:mathieu.bour@pooky.gg)>, Blockchain Engineer, Pooky Labs +- Claudiu Micu <[claudiu.micu@pooky.gg](mailto:claudiu.micu@pooky.gg)>, Software Engineer, Pooky Labs ### Contributors -- Claudiu Micu <[claudiu.micu@pooky.gg](mailto:claudiu.micu@pooky.gg)>, Software Engineer, Pooky Labs +- Mathieu Bour <[mathieu.bour@pooky.gg](mailto:mathieu.bour@pooky.gg)>, Blockchain Engineer, Pooky Labs - Dusan Zdravkovic <[duxxud@gmail.com](mailto:duxxud@gmail.com)>, Former Blockchain Engineer, Pooky Labs ### On-chain maintenance @@ -47,11 +49,3 @@ We mainly use the following permission contracts: - [solady/auth/Ownable.sol](https://github.com/Vectorized/solady/blob/main/src/auth/Ownable.sol) - [solady/auth/OwnableRoles.sol](https://github.com/Vectorized/solady/blob/main/src/auth/OwnableRoles.sol) - [openzeppelin/access/IAccessControl.sol](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/17c1a3a4584e2cbbca4131f2f1d16168c92f2310/contracts/access/AccessControl.sol) - -The administrative privilege of granting/revoking roles is handled by a multi-signature wallet owned by multiple -engineers of Pooky Labs. -The address of the current multi-signature admin wallet is [`0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5`](https://polygonscan.com/address/0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5). - -The Pooky dApp [pooky.gg](https://pooky.gg/app) serves as reference to the "official" Pooky smart contracts, effectively serving as smart-contracts proxy. -Pooky Labs may switch the contract implementations at any time on the app. -In this scenario of a token upgrades, Pooky Labs commits to airdrop the tokens to their owners in the new implementation. diff --git a/docs/chains/amoy.md b/docs/chains/amoy.md new file mode 100644 index 00000000..93e40379 --- /dev/null +++ b/docs/chains/amoy.md @@ -0,0 +1,8 @@ +## Chain info: + +- Network Name: `Polygon Amoy Testnet` +- New RPC URL: [`https://80002.rpc.thirdweb.com`](https://80002.rpc.thirdweb.com) +- Chain ID: `80002` +- Currency Symbol: `MATIC` +- Block Explorer URL: [`https://www.oklink.com/amoy`](https://www.oklink.com/amoy) +- Faucet: [`https://faucet.polygon.technology/`](https://faucet.polygon.technology/) diff --git a/docs/chains/mainnet.md b/docs/chains/mainnet.md new file mode 100644 index 00000000..d56e9777 --- /dev/null +++ b/docs/chains/mainnet.md @@ -0,0 +1,8 @@ +## Chain info: + +- Network Name: `Polygon Mainnet` +- New RPC URL: [`https://polygon-rpc.com`](https://polygon-rpc.com) +- Chain ID: `137` +- Currency Symbol: `MATIC` +- Block Explorer URL: [`https://polygonscan.com`](https://polygonscan.com) +- Faucet: [`https://faucet.polygon.technology/`](https://faucet.polygon.technology/) diff --git a/docs/stickers.md b/docs/stickers.md index 4a0dec82..b084e9c9 100644 --- a/docs/stickers.md +++ b/docs/stickers.md @@ -8,12 +8,12 @@ Please refer to the [Pooky whitepaper](https://whitepaper.pooky.gg/stickers) for ## Contracts list -### [`Stickers.sol`](../src/tokens/Stickers.sol) +### [`Stickers.sol`](../src/stickers/Stickers.sol) Stickers smart contract follows the ERC-721 specification and take advantage of the [ERC721A implementation](https://github.com/chiru-labs/ERC721A#readme). ERC721A allows to save hug amounts of gas when minting multiple stickers at the same time. -The Stickers contract is based on our [`BaseERC721A.sol`](../src/base/BaseERC721A.sol) contract that implements: +The Stickers contract is based on our [`BaseERC721A.sol`](../src/common/BaseERC721A.sol) contract that implements: - ERC721 NFT standard - ERC2891 royalties standard @@ -22,7 +22,7 @@ The Stickers contract is based on our [`BaseERC721A.sol`](../src/base/BaseERC721 Minting stickers is only possible via the `mint` function. This function will automatically call the Chainlink VRF cooridinator and request the seeds for the newly minted Stickers. -### [`StickersController.sol`](../src/game/StickersController.sol) +### [`StickersController.sol`](../src/stickers/StickersController.sol) The `StickersController` is in charge of the Pookyballs <=> Stickers association. It is not supposed to run any check if a Sticker can be attached to a Pookyball or not. @@ -49,7 +49,7 @@ To ensure that: Attaching a Sticker to a Pookyball transfers the Stickers from the sender inventory to the `StickersController` itself. -### [`StickersManager.sol`](../src/game/StickersManager.sol) +### [`StickersManager.sol`](../src/stickers/StickersManager.sol) `StickersManager` can be seen at the Stickers game implementation that uses the `StickersController` primitives. It is likely to be replaced in the future by a new contract that will implement new rules. @@ -59,10 +59,10 @@ Currently, the `StickersManager`: - controls how much slots are available on Pookyballs depending on their level and rarities (`StickersManager.slots`) - ensure that a sticker can be attach to a Pookyball only if the Pookyball has a free slot slot -### [`StickersLevelUp.sol`](../src/game/StickersLevelUp.sol) +### [`StickersLevelUp.sol`](../src/stickers/StickersLevelUp.sol) Stickers can be leveled up using the `StickersLevelUp` contract. -`StickersLevelUp` is based on our [`LevelUpContract`](../src/base/LevelUp.sol). +`StickersLevelUp` is based on our [`LevelUpContract`](../src/common/LevelUp.sol). Since the we don't store the Stickers PXP on chain to save gas, users will have to query the back-end to get a signature that certify the PXP amount they pass to the `levelUp` function. @@ -72,6 +72,6 @@ function levelUp(uint256 tokenId, uint256 increase, uint256 currentPXP, bytes ca Applications may listen to the `LevelChanged` event of the `Stickers` contract to follow the changes of the Stickers levels. -### [`StickersSale.sol`](../src/mint/StickersSale.sol) +### [`StickersSale.sol`](../src/stickers/StickersSale.sol) The Stickers can be minted in batch via the `StickersSale` contract. diff --git a/docs/wallet.md b/docs/wallet.md new file mode 100644 index 00000000..169829fa --- /dev/null +++ b/docs/wallet.md @@ -0,0 +1,32 @@ +# Production environment + +The administrative privilege of granting/revoking roles is handled by a multi-signature wallet owned by multiple engineers of Pooky Labs. + +- polygon scan address [`0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5`](https://polygonscan.com/address/0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5). + +- safe wallet URL is [`https://app.safe.global/home?safe=matic:0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5`](https://app.safe.global/home?safe=matic:0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5) + +The Pooky dApp [pooky.gg](https://pooky.gg/app) serves as reference to the "official" Pooky smart contracts +Pooky Labs may switch to other smart contract at any time on the app. +In this scenario, Pooky Labs commits to airdrop the tokens to their owners in the new smart contracts. + +# Wallets + +- deployer - is the address from which all smart contracts are deployed +- admin - is the owner of each smart contract +- backend - is another wallet that is used to sign backend payloads +- treasury - is the wallet where the funds are stored on each network + +## Wallets Polygon mainnet network + +- Deployer - [`0xC0DE54132cA2B4BAce7C02AF31Aa9d3c1905f379`](https://polygonscan.com/address/0xC0DE54132cA2B4BAce7C02AF31Aa9d3c1905f379). +- Admin - [`0xF00Db2f08D1F6b3f6089573085B5826Bb358e319`](https://polygonscan.com/address/0xF00Db2f08D1F6b3f6089573085B5826Bb358e319). +- Backend - [`0xCAFE3e690bf74Ec274210E1c448130c1f8228513`](https://polygonscan.com/address/0xCAFE3e690bf74Ec274210E1c448130c1f8228513). +- Treasury - [`0xBABA035d2e22073C3a2AadA404dae4f6A9D57BD7`](https://polygonscan.com/address/0xBABA035d2e22073C3a2AadA404dae4f6A9D57BD7). + +## Wallets Polygon mainnet network + +- Deployer - [`0xC0DE54132cA2B4BAce7C02AF31Aa9d3c1905f379`](https://www.oklink.com/amoy/address/0xC0DE54132cA2B4BAce7C02AF31Aa9d3c1905f379). +- Admin - [`0xF00Db2f08D1F6b3f6089573085B5826Bb358e319`](https://www.oklink.com/amoy/address/0xF00Db2f08D1F6b3f6089573085B5826Bb358e319). +- Backend - [`0xCAFE3e690bf74Ec274210E1c448130c1f8228513`](https://www.oklink.com/amoy/address/0xCAFE3e690bf74Ec274210E1c448130c1f8228513). +- Treasury - [`0xBABA035d2e22073C3a2AadA404dae4f6A9D57BD7`](https://www.oklink.com/amoy/address/0xBABA035d2e22073C3a2AadA404dae4f6A9D57BD7). diff --git a/foundry.toml b/foundry.toml index 115cf9b8..81736106 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,13 +1,29 @@ # Foundry config reference: https://github.com/foundry-rs/foundry/tree/master/config [profile.default] -src = "src" -out = "artifacts" -libs = ["lib"] -solc = "0.8.22" -evm_version = "paris" bytecode_hash = "none" cbor_metadata = false +evm_version = "paris" fs_permissions = [{ access = "read", path = "./test/datasets" }] +libs = ["lib"] +optimizer = true +optimizer_runs = 200 +out = "artifacts" +solc = "0.8.22" +src = "src" +remappings = [ + 'ERC721A/=lib/ERC721A/contracts/', + 'chainlink/=lib/chainlink/contracts/src/v0.8/', + 'ds-test/=lib/forge-std/lib/ds-test/src/', + 'erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/', + 'forge-std/=lib/forge-std/src/', + 'openzeppelin-contracts/=lib/openzeppelin-contracts/', + 'openzeppelin/=lib/openzeppelin-contracts/contracts/', + 'operator-filter-registry/=lib/operator-filter-registry/src/', + 'solady/=lib/solady/src/', + '@/=src/', + '@test/=test/', + '@script/=script/', +] [profile.default.fuzz] runs = 256 @@ -16,14 +32,18 @@ runs = 256 runs = 5_000 [rpc_endpoints] +amoy = "${AMOY_RPC_URL}" polygon = "${POLYGON_RPC_URL}" -mumbai = "${MUMBAI_RPC_URL}" [etherscan] +amoy = { key = "${POLYGONSCAN_API_KEY}" } polygon = { key = "${POLYGONSCAN_API_KEY}" } -mumbai = { key = "${POLYGONSCAN_API_KEY}" } [fmt] +bracket_spacing = true line_length = 100 tab_width = 2 -bracket_spacing = true + +[profile.ci] +verbosity = 4 + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..7c785e4a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2058 @@ +{ + "name": "smart-contracts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "smart-contracts", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "fast-glob": "^3.2.12", + "lefthook": "^1.4.1", + "rimraf": "^5.0.1", + "solhint": "^3.4.1", + "tsx": "^3.14.0", + "typescript": "^5.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.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/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/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@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/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "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/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-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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/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/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/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/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/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/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/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/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/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/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/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/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/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "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.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "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/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-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/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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-tsconfig": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "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/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-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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "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-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/lefthook": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.6.7.tgz", + "integrity": "sha512-glQisTn0oMXfWv58MBE54wOPez8T06dqcEGrfz73RlvOi/kvbu59oockEvMYs4RfvowQirF0ncp+JHWJbDMRgQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "lefthook": "bin/index.js" + }, + "optionalDependencies": { + "lefthook-darwin-arm64": "1.6.7", + "lefthook-darwin-x64": "1.6.7", + "lefthook-freebsd-arm64": "1.6.7", + "lefthook-freebsd-x64": "1.6.7", + "lefthook-linux-arm64": "1.6.7", + "lefthook-linux-x64": "1.6.7", + "lefthook-windows-arm64": "1.6.7", + "lefthook-windows-x64": "1.6.7" + } + }, + "node_modules/lefthook-darwin-arm64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.7.tgz", + "integrity": "sha512-/Li1ssZd8WYpBMq2Aqs7AZGWtKpJQJkWkfrEzT6ke7gjNngBurRkVJcEpoiRJpzhk6J+HZTk3Pimh8XaYI0KHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook-darwin-x64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.7.tgz", + "integrity": "sha512-ZKRUFea0j/pco3NoypOHlzmSaYx5UYq47qywiqMUDmXz/38sjRlt8apKSNS3rlsPyPw+9g1c+pWwi+mQiHOnDg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook-freebsd-arm64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.7.tgz", + "integrity": "sha512-kY1/+SqxGg4xyKCXOZG9tSmBSHr1m7IoGy4G4FlbmLcZeq4n1JUlhPz/05rbIemR7HXOwA5CAGyjooxT4hNfyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook-freebsd-x64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.7.tgz", + "integrity": "sha512-rC9/G6WPKWyxNB68HsUxngOdcTAHTux04LgDgC0j6OOFgpo8cEYHSNTHv4ERz79FxCPBmNe4Cg+mIXHYg8b8RQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook-linux-arm64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.7.tgz", + "integrity": "sha512-3MAfA/cAgA7716C04XkSoyfMDXkOZDx9k2BkZdOwt35TBjxz6fkinYeeOvszGBSfeOFNQHIYYFgHazEaFVzrjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook-linux-x64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.6.7.tgz", + "integrity": "sha512-VzgNM0bJyzakrhjFZbTYrwli0L6bY1bk6SKhyFAYToH8/rI6pjlinSgu1VTAamXhxmA7YaRB8/5OJEjhvb0aKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook-windows-arm64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.7.tgz", + "integrity": "sha512-naV4612JbrOCRZSWVS0Y1BzREHDLyCWC9eHqDG8XTGC1NJ/vM3ip2j9hHHF/GPSceazs82Tog2rSpJ9q8JZ0IQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/lefthook-windows-x64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.6.7.tgz", + "integrity": "sha512-U0jwO5CTya9yo1G+946ULBhH3Nl6j+WOqYz7rWJQIIFNe0mvethmAv+aLKMNrAWgOZ+gX0A7++cqdUOl9LoVwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "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/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.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/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "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/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/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-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-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "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/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/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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/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/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "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": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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/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/solhint/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/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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/string-width-cjs/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/string-width-cjs/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-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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/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.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "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/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/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/table/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/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/table/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/table/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/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/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/tsx": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz", + "integrity": "sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "get-tsconfig": "^4.7.2", + "source-map-support": "^0.5.21" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "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/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/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/package.json b/package.json index ad3a07f5..ade6a042 100644 --- a/package.json +++ b/package.json @@ -7,14 +7,16 @@ "artifacts": "tsx script/artifacts.ts", "test": "forge test", "coverage": "forge coverage --report lcov --report summary", - "lint": "solhint '{src,test}/**/*.sol'" + "lint": "solhint '{src,test}/**/*.sol'", + "node": "anvil" }, "keywords": [], "maintainers": [ - "Mathieu Bour " + "Claudiu Micu " ], "contributors": [ - "Claudiu Micu " + "Mathieu Bour ", + "Dusan Zdravkovic " ], "license": "MIT", "type": "module", diff --git a/script/amoy/01_POK.s.sol b/script/amoy/01_POK.s.sol new file mode 100644 index 00000000..baa86a29 --- /dev/null +++ b/script/amoy/01_POK.s.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.21; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { POK } from "@/tokens/POK.sol"; + +contract DeployPOK is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + + function run() public { + // ================ Deploy POK ================ + vm.startBroadcast(deployerPK); + + POK deployed = new POK{ salt: salt }(adminAddress); + + console.log("POK deployed at:", address(deployed)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/02_Energy.s.sol b/script/amoy/02_Energy.s.sol new file mode 100644 index 00000000..ba85f758 --- /dev/null +++ b/script/amoy/02_Energy.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.21; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { Energy } from "@/common/Energy.sol"; + +contract DeployEnergy is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address operatorAddress = vm.envAddress("OPERATOR_ADDRESS"); + address treasuryAddress = vm.envAddress("TREASURY_ADDRESS"); + + function run() public { + // ================ Deploy Energy ================ + vm.startBroadcast(deployerPK); + + address[] memory operators = new address[](1); + operators[0] = operatorAddress; + + Energy deployed = new Energy{ salt: salt }(adminAddress, operators, treasuryAddress, 5.88 ether); + + console.log("Energy deployed at:", address(deployed)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/03_NonceRegistry.s.sol b/script/amoy/03_NonceRegistry.s.sol new file mode 100644 index 00000000..9b042742 --- /dev/null +++ b/script/amoy/03_NonceRegistry.s.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.21; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { NonceRegistry } from "@/common/NonceRegistry.sol"; + +contract DeployNonceRegistry is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + address deployerAddress = vm.envAddress("DEPLOYER_ADDRESS"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address treasuryAddress = vm.envAddress("TREASURY_ADDRESS"); + + function run() public { + // ================ Admin grant roles ================ + vm.startBroadcast(deployerPK); + + address[] memory admins = new address[](2); + admins[0] = deployerAddress; + admins[1] = adminAddress; + + address[] memory operators = new address[](1); + operators[0] = deployerAddress; + + NonceRegistry deployed = new NonceRegistry{ salt: salt }(admins, operators); + + console.log("NonceRegistry deployed at:", address(deployed)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/04_BoostPXP.s.sol b/script/amoy/04_BoostPXP.s.sol new file mode 100644 index 00000000..e5a7f8ac --- /dev/null +++ b/script/amoy/04_BoostPXP.s.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.21; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { BoostPXP } from "@/common/BoostPXP.sol"; +import { NonceRegistry } from "@/common/NonceRegistry.sol"; + +contract DeployBoostPXP is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address signerAddress = vm.envAddress("BACKEND_ADDRESS"); + address treasuryAddress = vm.envAddress("TREASURY_ADDRESS"); + + NonceRegistry nonces = NonceRegistry(vm.envAddress("CONTRACT_NONCE_REGISTRY_ADDRESS")); + + function run() public { + // ================ Admin grant roles ================ + vm.startBroadcast(deployerPK); + + BoostPXP boostPXP = + new BoostPXP{ salt: salt }(nonces, adminAddress, signerAddress, treasuryAddress); + + console.log("BoostPXP deployed at:", address(boostPXP)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + nonces.grantRole(nonces.OPERATOR(), address(boostPXP)); + vm.stopBroadcast(); + } +} diff --git a/script/amoy/05_Pookyball.s.sol b/script/amoy/05_Pookyball.s.sol new file mode 100644 index 00000000..39cd6a30 --- /dev/null +++ b/script/amoy/05_Pookyball.s.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.21; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { BoostPXP } from "@/common/BoostPXP.sol"; +import { NonceRegistry } from "@/common/NonceRegistry.sol"; +import { Pookyball } from "@/pookyball/Pookyball.sol"; + +contract DeployPookyball is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + + string baseURI = vm.envString("POOKYBALL_BASE_URI"); + string contractURI = vm.envString("POOKYBALL_CONTRACT_URI"); + + address royaltyReceiverAddress = vm.envAddress("ROYALTY_RECEIVER_ADDRESS"); + address vrfCoordinatorAddress = vm.envAddress("VRF_COORDINATOR_ADDRESS"); + bytes32 vrfKeyHash = vm.envBytes32("VRF_KEY_HASH"); + uint64 vrfSubId = uint64(vm.envUint("VRF_SUB_ID")); + uint16 vrfMinimumRequestConfirmations = uint16(vm.envUint("VRF_MINIMUM_REQUEST_CONFIRMATIONS")); + uint32 vrfCallbackGasLimit = uint32(vm.envUint("VRF_CALLBACK_GAS_LIMIT")); + + function run() public { + // ================ Deploy Pookyball ================ + vm.startBroadcast(deployerPK); + + Pookyball deployed = new Pookyball{ salt: salt }( + baseURI, + contractURI, + adminAddress, + royaltyReceiverAddress, + vrfCoordinatorAddress, + vrfKeyHash, + vrfSubId, + vrfMinimumRequestConfirmations, + vrfCallbackGasLimit + ); + + console.log("Pookyball deployed at:", address(deployed)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/06_PookyballLevelUp.s.sol b/script/amoy/06_PookyballLevelUp.s.sol new file mode 100644 index 00000000..b6dae590 --- /dev/null +++ b/script/amoy/06_PookyballLevelUp.s.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { Pookyball } from "@/pookyball/Pookyball.sol"; +import { PookyballLevelUp } from "@/pookyball/PookyballLevelUp.sol"; +import { POK } from "@/tokens/POK.sol"; + +contract DeployPookyballLevelUp is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address signerAddress = vm.envAddress("BACKEND_ADDRESS"); + address treasuryAddress = vm.envAddress("TREASURY_ADDRESS"); + + Pookyball pookyball = Pookyball(vm.envAddress("CONTRACT_POOKYBALL_ADDRESS")); + POK pok = POK(vm.envAddress("CONTRACT_POK_ADDRESS")); + + function run() public { + vm.startBroadcast(deployerPK); + + PookyballLevelUp pookyballLevelUp = new PookyballLevelUp{ salt: salt }( + pookyball, pok, adminAddress, signerAddress, treasuryAddress + ); + + console.log("PookyballLevelUp deployed at:", address(pookyballLevelUp)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + console.log("POK grant roles for PookyballLevelUp"); + + pookyball.grantRole(pookyball.GAME(), address(pookyballLevelUp)); + pok.grantRole(pok.BURNER(), address(pookyballLevelUp)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/07_PookyballReroll.s.sol b/script/amoy/07_PookyballReroll.s.sol new file mode 100644 index 00000000..0825eb43 --- /dev/null +++ b/script/amoy/07_PookyballReroll.s.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.21; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { NonceRegistry } from "@/common/NonceRegistry.sol"; +import { IPookyball } from "@/pookyball/IPookyball.sol"; +import { PookyballReroll } from "@/pookyball/PookyballReroll.sol"; + +contract DeployPookyballReroll is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address signerAddress = vm.envAddress("BACKEND_ADDRESS"); + address treasuryAddress = vm.envAddress("TREASURY_ADDRESS"); + + NonceRegistry nonces = NonceRegistry(vm.envAddress("CONTRACT_NONCE_REGISTRY_ADDRESS")); + IPookyball pookyball = IPookyball(vm.envAddress("CONTRACT_POOKYBALL_ADDRESS")); + + function run() public { + // ================ Deploy PookyballReroll ================ + vm.startBroadcast(deployerPK); + + PookyballReroll reroll = new PookyballReroll{ salt: salt }( + pookyball, nonces, adminAddress, signerAddress, treasuryAddress + ); + + console.log("PookyballReroll deployed at:", address(reroll)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + nonces.grantRole(nonces.OPERATOR(), address(reroll)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/08_PookyballAscension.s.sol b/script/amoy/08_PookyballAscension.s.sol new file mode 100644 index 00000000..ceccbc9e --- /dev/null +++ b/script/amoy/08_PookyballAscension.s.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { Pookyball } from "@/pookyball/Pookyball.sol"; +import { PookyballAscension } from "@/pookyball/PookyballAscension.sol"; +import { Script } from "forge-std/Script.sol"; +import { StickersController } from "@/stickers/StickersController.sol"; + +contract DeployPookyballAscension is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address signerAddress = vm.envAddress("BACKEND_ADDRESS"); + address treasuryAddress = vm.envAddress("TREASURY_ADDRESS"); + + address stickersControllerAddress = vm.envAddress("CONTRACT_STICKERS_CONTROLLER_ADDRESS"); + StickersController controller = StickersController(stickersControllerAddress); + Pookyball pookyball = Pookyball(vm.envAddress("CONTRACT_POOKYBALL_ADDRESS")); + + function run() public { + // ================ Deploy PookyballAscension ================ + vm.startBroadcast(deployerPK); + + PookyballAscension pookyballAscension = new PookyballAscension{ salt: salt }( + pookyball, controller, adminAddress, signerAddress, treasuryAddress + ); + + console.log("PookyballAscension deployed at:", address(pookyballAscension)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + console.log("Pookyball grant roles for PookyballAscension"); + pookyball.grantRole(pookyball.MINTER(), address(pookyballAscension)); + + console.log("StickersController grant roles for PookyballAscension"); + controller.grantRoles(address(pookyballAscension), controller.REMOVER()); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/09_Stickers.s.sol b/script/amoy/09_Stickers.s.sol new file mode 100644 index 00000000..20546634 --- /dev/null +++ b/script/amoy/09_Stickers.s.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { Stickers } from "@/stickers/Stickers.sol"; +import { VRFConfig } from "@/types/VRFConfig.sol"; +import { VRFCoordinatorV2Interface } from "chainlink/interfaces/VRFCoordinatorV2Interface.sol"; + +contract DeployStickers is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + + address vrfCoordinatorAddress = vm.envAddress("VRF_COORDINATOR_ADDRESS"); + bytes32 vrfKeyHash = vm.envBytes32("VRF_KEY_HASH"); + uint64 vrfSubId = uint64(vm.envUint("VRF_SUB_ID")); + uint16 vrfMinimumRequestConfirmations = uint16(vm.envUint("VRF_MINIMUM_REQUEST_CONFIRMATIONS")); + uint32 vrfCallbackGasLimit = uint32(vm.envUint("VRF_CALLBACK_GAS_LIMIT")); + + address royaltyReceiverAddress = vm.envAddress("ROYALTY_RECEIVER_ADDRESS"); + + VRFConfig vrf = VRFConfig({ + coordinator: VRFCoordinatorV2Interface(vrfCoordinatorAddress), + keyHash: vrfKeyHash, + subcriptionId: vrfSubId, + minimumRequestConfirmations: vrfMinimumRequestConfirmations, + callbackGasLimit: vrfCallbackGasLimit + }); + + function run() external { + // ================ Deploy Stickers ================ + vm.startBroadcast(deployerPK); + + Stickers stickers = new Stickers{ salt: salt }(adminAddress, royaltyReceiverAddress, vrf); + console.log("Stickers deployed at:", address(stickers)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + console.log("Add the Stickers consumer to VRF Coordinator"); + vrf.coordinator.addConsumer(vrf.subcriptionId, address(stickers)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/10_StickersLevelUp.s.sol b/script/amoy/10_StickersLevelUp.s.sol new file mode 100644 index 00000000..507abc64 --- /dev/null +++ b/script/amoy/10_StickersLevelUp.s.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { IStickers } from "@/stickers/Stickers.sol"; +import { POK } from "@/tokens/POK.sol"; +import { Script } from "forge-std/Script.sol"; +import { Stickers } from "@/stickers/Stickers.sol"; +import { StickersLevelUp } from "@/stickers/StickersLevelUp.sol"; + +contract DeployStickersLevelUp is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address signerAddress = vm.envAddress("BACKEND_ADDRESS"); + + address royaltyReceiverAddress = vm.envAddress("ROYALTY_RECEIVER_ADDRESS"); + address stickersAddress = vm.envAddress("CONTRACT_STICKERS_ADDRESS"); + POK pok = POK(vm.envAddress("CONTRACT_POK_ADDRESS")); + + function run() external { + // ================ Deploy StickersLevelUp ================ + vm.startBroadcast(deployerPK); + + StickersLevelUp stickersLevelUp = new StickersLevelUp{ salt: salt }( + IStickers(stickersAddress), pok, adminAddress, signerAddress, royaltyReceiverAddress + ); + + console.log("StickersLevelUp deployed at:", address(stickersLevelUp)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + console.log("POK grant roles for StickersLevelUp"); + pok.grantRole(pok.BURNER(), address(stickersLevelUp)); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/11_StickersSale.s.sol b/script/amoy/11_StickersSale.s.sol new file mode 100644 index 00000000..f7855e87 --- /dev/null +++ b/script/amoy/11_StickersSale.s.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { Stickers } from "@/stickers/Stickers.sol"; +import { StickersSale, Pack, PackContent } from "@/stickers/StickersSale.sol"; + +contract DeployStickersSale is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + + address royaltyReceiverAddress = vm.envAddress("ROYALTY_RECEIVER_ADDRESS"); + address stickersAddress = vm.envAddress("CONTRACT_STICKERS_ADDRESS"); + Stickers stickers = Stickers(stickersAddress); + + function run() external { + Pack[] memory stickersPacks = new Pack[](4); + stickersPacks[0] = Pack({ + price: 8 ether / 1e6, + supply: 45, + minted: 0, + totalSupply: 45, + content: PackContent({ common: 2, rare: 0, epic: 0, legendary: 0 }) + }); + stickersPacks[1] = Pack({ + price: 28 ether / 1e6, + supply: 40, + minted: 0, + totalSupply: 40, + content: PackContent({ common: 3, rare: 1, epic: 0, legendary: 0 }) + }); + stickersPacks[2] = Pack({ + price: 112 ether / 1e6, + supply: 12, + minted: 0, + totalSupply: 12, + content: PackContent({ common: 8, rare: 1, epic: 1, legendary: 0 }) + }); + stickersPacks[3] = Pack({ + price: 416 ether / 1e6, + supply: 3, + minted: 0, + totalSupply: 3, + content: PackContent({ common: 16, rare: 2, epic: 1, legendary: 1 }) + }); + + // ================ Deploy StickersSale ================ + vm.startBroadcast(deployerPK); + + StickersSale stickersSale = + new StickersSale{ salt: salt }(stickers, adminAddress, royaltyReceiverAddress, stickersPacks); + + console.log("StickersSale deployed at:", address(stickersSale)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + console.log("Stickers grant roles for StickerSale"); + stickers.grantRoles(address(stickersSale), stickers.MINTER()); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/12_StickersController.s.sol b/script/amoy/12_StickersController.s.sol new file mode 100644 index 00000000..1bb54ad8 --- /dev/null +++ b/script/amoy/12_StickersController.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { IPookyball } from "@/pookyball/IPookyball.sol"; +import { IStickers } from "@/stickers/Stickers.sol"; +import { Script } from "forge-std/Script.sol"; +import { StickersController } from "@/stickers/StickersController.sol"; + +contract DeployStickersController is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + + address pookyballAddress = vm.envAddress("CONTRACT_POOKYBALL_ADDRESS"); + address stickersAddress = vm.envAddress("CONTRACT_STICKERS_ADDRESS"); + + function run() external { + // ================ Deploy StickersController ================ + vm.startBroadcast(deployerPK); + + StickersController controller = new StickersController{ salt: salt }( + IPookyball(pookyballAddress), IStickers(stickersAddress), adminAddress + ); + + console.log("StickersController deployed at:", address(controller)); + } +} diff --git a/script/amoy/13_StickersManager.s.sol b/script/amoy/13_StickersManager.s.sol new file mode 100644 index 00000000..2b6e6e8f --- /dev/null +++ b/script/amoy/13_StickersManager.s.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { StickersController } from "@/stickers/StickersController.sol"; +import { StickersManager } from "@/stickers/StickersManager.sol"; + +contract DeployStickersManager is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + + address stickersControllerAddress = vm.envAddress("CONTRACT_STICKERS_CONTROLLER_ADDRESS"); + StickersController controller = StickersController(stickersControllerAddress); + + function run() external { + // ================ Deploy StickersManager ================ + vm.startBroadcast(deployerPK); + + StickersManager manager = new StickersManager{ salt: salt }(controller); + + console.log("StickersManager deployed at:", address(manager)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + console.log("StickerController grant roles for StickerManager"); + controller.grantRoles(address(manager), controller.LINKER() | controller.REPLACER()); + + vm.stopBroadcast(); + } +} diff --git a/script/amoy/14_StickersAscension.s.sol b/script/amoy/14_StickersAscension.s.sol new file mode 100644 index 00000000..ca0d6544 --- /dev/null +++ b/script/amoy/14_StickersAscension.s.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { Stickers } from "@/stickers/Stickers.sol"; +import { StickersController } from "@/stickers/StickersController.sol"; +import { StickersAscension } from "@/stickers/StickersAscension.sol"; + +contract DeployStickersAscension is Script { + bytes32 salt = keccak256(bytes(vm.envString("SALT"))); + uint256 deployerPK = vm.envUint("DEPLOYER_PK"); + uint256 adminPK = vm.envUint("ADMIN_PK"); + address adminAddress = vm.envAddress("ADMIN_ADDRESS"); + address signerAddress = vm.envAddress("BACKEND_ADDRESS"); + + address stickersAddress = vm.envAddress("CONTRACT_STICKERS_ADDRESS"); + address stickersControllerAddress = vm.envAddress("CONTRACT_STICKERS_CONTROLLER_ADDRESS"); + StickersController controller = StickersController(stickersControllerAddress); + Stickers stickers = Stickers(stickersAddress); + + function run() public { + // ================ Deploy StickersAscension ================ + vm.startBroadcast(deployerPK); + + StickersAscension ascension = + new StickersAscension{ salt: salt }(controller, adminAddress, signerAddress); + console.log("StickersAscension deployed at:", address(ascension)); + + vm.stopBroadcast(); + + // ================ Admin grant roles ================ + vm.startBroadcast(adminPK); + + console.log("StickersController grant roles for StickersAscension"); + + controller.grantRoles(address(ascension), controller.REMOVER()); + + console.log("Stickers grant roles for StickersAscension"); + stickers.grantRoles(address(ascension), stickers.MINTER()); + + vm.stopBroadcast(); + } +} diff --git a/script/mumbai/01_Stickers.s.sol b/script/mumbai/01_Stickers.s.sol deleted file mode 100644 index 4329637c..00000000 --- a/script/mumbai/01_Stickers.s.sol +++ /dev/null @@ -1,181 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.21; - -import { VRFCoordinatorV2Interface } from "chainlink/interfaces/VRFCoordinatorV2Interface.sol"; -import { Script } from "forge-std/Script.sol"; -import { INonceRegistry } from "@/common/INonceRegistry.sol"; -import { IPookyball } from "@/pookyball/IPookyball.sol"; -import { Stickers } from "@/stickers/Stickers.sol"; -import { StickersController } from "@/stickers/StickersController.sol"; -import { StickersLevelUp } from "@/stickers/StickersLevelUp.sol"; -import { StickersManager } from "@/stickers/StickersManager.sol"; -import { StickersSale, Pack, PackContent } from "@/stickers/StickersSale.sol"; -import { POK } from "@/tokens/POK.sol"; -import { VRFConfig } from "@/types/VRFConfig.sol"; - -struct StickersConfig { - VRFConfig vrf; - Pack[] packs; - address tSale; - address tERC2981; - address tLevelUp; -} - -struct Config { - IPookyball pookyball; - POK pok; - address admin; - address signer; - StickersConfig st; -} - -/// @dev This is a temporary script to speed up the deployments on Mumbai. -/// This code should not be used on production in any way. -/// -/// Usage: -/// SALT=uranium forge script ./script/deploy/01_Stickers.s.sol --rpc-url mumbai --broadcast --verify -contract DeployStickers is Script { - function mumbai() internal pure returns (Config memory) { - Pack[] memory packs = new Pack[](4); - packs[0] = Pack({ - price: 8 ether / 1e6, - supply: 45, - minted: 0, - totalSupply: 45, - content: PackContent({ common: 2, rare: 0, epic: 0, legendary: 0 }) - }); - packs[1] = Pack({ - price: 28 ether / 1e6, - supply: 40, - minted: 0, - totalSupply: 40, - content: PackContent({ common: 3, rare: 1, epic: 0, legendary: 0 }) - }); - packs[2] = Pack({ - price: 112 ether / 1e6, - supply: 12, - minted: 0, - totalSupply: 12, - content: PackContent({ common: 8, rare: 1, epic: 1, legendary: 0 }) - }); - packs[3] = Pack({ - price: 416 ether / 1e6, - supply: 3, - minted: 0, - totalSupply: 3, - content: PackContent({ common: 16, rare: 2, epic: 1, legendary: 1 }) - }); - - return Config({ - pookyball: IPookyball(0x3f64DD5BE5E19dD34744EFcC74c1935004aeB270), - pok: POK(0x3aaB86a3FF752530BbE21a5b5a6A73005f11E348), - admin: 0xF00Db2f08D1F6b3f6089573085B5826Bb358e319, - signer: 0xCAFE3e690bf74Ec274210E1c448130c1f8228513, - st: StickersConfig({ - vrf: VRFConfig({ - coordinator: VRFCoordinatorV2Interface(0x7a1BaC17Ccc5b313516C5E16fb24f7659aA5ebed), - keyHash: 0x4b09e658ed251bcafeebbc69400383d49f344ace09b9576fe248bb02c003fe9f, - subcriptionId: 2307, - minimumRequestConfirmations: 10, - callbackGasLimit: 2500000 - }), - packs: packs, - tSale: 0x2dfCa6e357a73D180B8e6aa8f7690A315a4395F7, - tERC2981: 0x2dfCa6e357a73D180B8e6aa8f7690A315a4395F7, - tLevelUp: 0x2dfCa6e357a73D180B8e6aa8f7690A315a4395F7 - }) - }); - } - - function polygon() internal pure returns (Config memory) { - Pack[] memory packs = new Pack[](4); - packs[0] = Pack({ - price: 14 ether, - supply: 0, - minted: 0, - totalSupply: 0, - content: PackContent({ common: 2, rare: 0, epic: 0, legendary: 0 }) - }); - packs[1] = Pack({ - price: 49 ether, - supply: 0, - minted: 0, - totalSupply: 0, - content: PackContent({ common: 3, rare: 1, epic: 0, legendary: 0 }) - }); - packs[2] = Pack({ - price: 196, - supply: 0, - minted: 0, - totalSupply: 0, - content: PackContent({ common: 8, rare: 1, epic: 1, legendary: 0 }) - }); - packs[3] = Pack({ - price: 749, - supply: 0, - minted: 0, - totalSupply: 0, - content: PackContent({ common: 15, rare: 3, epic: 1, legendary: 1 }) - }); - - return Config({ - pookyball: IPookyball(0xb4859acd9B0A65CA4897c31e5cb5160D9Ff32C0A), - pok: POK(0x7b7E3B03f34b17d70C276C4886467D58867Bbc94), - admin: 0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5, - signer: 0xCAFE3e690bf74Ec274210E1c448130c1f8228513, - st: StickersConfig({ - vrf: VRFConfig({ - coordinator: VRFCoordinatorV2Interface(0xAE975071Be8F8eE67addBC1A82488F1C24858067), - keyHash: 0xcc294a196eeeb44da2888d17c0625cc88d70d9760a69d58d853ba6581a9ab0cd, - subcriptionId: 586, - minimumRequestConfirmations: 10, - callbackGasLimit: 2500000 - }), - packs: packs, - tSale: 0x96224B6a800294F40c547f7Ec0952eA222526040, - tERC2981: 0x598895F50951186eFdCB160764a538f353894027, - tLevelUp: 0x703662853D7F9ad9D8c44128222266a736741437 - }) - }); - } - - function run() external { - bytes32 salt = keccak256(bytes(vm.envString("SALT"))); - uint256 deployerPK = vm.envUint("DEPLOYER_PK"); - - vm.startBroadcast(deployerPK); - Config memory c = mumbai(); - - Stickers stickers = new Stickers{salt: salt}(c.admin, c.st.tERC2981, c.st.vrf); - StickersController controller = - new StickersController{salt: salt}(c.pookyball, stickers, c.admin); - StickersManager manager = new StickersManager{salt: salt}(controller); - StickersLevelUp stickersLevelUp = - new StickersLevelUp{salt: salt}(stickers, c.pok, c.admin, c.signer, c.st.tLevelUp); - - StickersSale stickersSale = - new StickersSale{salt: salt}(stickers, c.admin, c.st.tSale, c.st.packs); - vm.stopBroadcast(); - - // Admin actions (mumbai only) - uint256 adminPK = 0; - adminPK = vm.envOr("ADMIN_PK", adminPK); - if (adminPK == 0) { - return; - } - - vm.startBroadcast(adminPK); - // Stickers - c.st.vrf.coordinator.addConsumer(c.st.vrf.subcriptionId, address(stickers)); - - // StickersManager - controller.grantRoles(address(manager), controller.LINKER() | controller.REPLACER()); - - // StickersSale - stickers.grantRoles(address(stickersSale), stickers.MINTER()); - - // StickersLevelUp - c.pok.grantRole(c.pok.BURNER(), address(stickersLevelUp)); - vm.stopBroadcast(); - } -} diff --git a/script/mumbai/02_PookyballAscension.s.sol b/script/mumbai/02_PookyballAscension.s.sol deleted file mode 100644 index 920d6174..00000000 --- a/script/mumbai/02_PookyballAscension.s.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { Script } from "forge-std/Script.sol"; -import { NonceRegistry } from "@/common/NonceRegistry.sol"; -import { Rewards } from "@/common/Rewards.sol"; -import { Pookyball } from "@/pookyball/Pookyball.sol"; -import { PookyballAscension } from "@/pookyball/PookyballAscension.sol"; -import { StickersController } from "@/stickers/StickersController.sol"; - -contract DeployPookyballAscension is Script { - Pookyball pookyball = Pookyball(0x3f64DD5BE5E19dD34744EFcC74c1935004aeB270); - StickersController controller = StickersController(0x430288ee1c16B4e8b6B5DD6a76d24cA4d1Dfe8C7); - - address signer = 0xCAFE3e690bf74Ec274210E1c448130c1f8228513; - address treasury = 0x2dfCa6e357a73D180B8e6aa8f7690A315a4395F7; - - function run() public { - bytes32 salt = keccak256(bytes(vm.envString("SALT"))); - uint256 deployerPK = vm.envUint("DEPLOYER_PK"); - uint256 adminPK = vm.envUint("ADMIN_PK"); - address admin = vm.addr(adminPK); - - vm.startBroadcast(deployerPK); - PookyballAscension pookyballAscension = - new PookyballAscension{salt: salt}(pookyball, controller, admin, signer, treasury); - vm.stopBroadcast(); - - vm.startBroadcast(adminPK); - pookyball.grantRole(pookyball.MINTER(), address(pookyballAscension)); - controller.grantRoles(address(pookyballAscension), controller.REMOVER()); - vm.stopBroadcast(); - } -} diff --git a/script/mumbai/03_Energy.s.sol b/script/mumbai/03_Energy.s.sol deleted file mode 100644 index bd2d4e3d..00000000 --- a/script/mumbai/03_Energy.s.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.21; - -import { Script } from "forge-std/Script.sol"; -import { Energy } from "@/common/Energy.sol"; - -contract DeployEnergy is Script { - // address admin = 0xF00Db2f08D1F6b3f6089573085B5826Bb358e319; - // address treasury = 0x2dfCa6e357a73D180B8e6aa8f7690A315a4395F7; - address admin = 0x3CC4F4372F83ad3C577eD6e1Aae3D244A1b955D5; // Mainnet - address treasury = 0x96224B6a800294F40c547f7Ec0952eA222526040; // Mainnet - - function run() public { - bytes32 salt = keccak256(bytes(vm.envString("SALT"))); - uint256 deployerPK = vm.envUint("DEPLOYER_PK"); - - vm.startBroadcast(deployerPK); - address[] memory operators = new address[](1); - operators[0] = 0x481074326aC46C7BC52f0b25D2F7Aaf40f586472; - new Energy{salt: salt}(admin, operators, treasury, 5.88 ether); - vm.stopBroadcast(); - } -} diff --git a/script/mumbai/04_PookyballReroll.s.sol b/script/mumbai/04_PookyballReroll.s.sol deleted file mode 100644 index adea9e32..00000000 --- a/script/mumbai/04_PookyballReroll.s.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.21; - -import { Script } from "forge-std/Script.sol"; -import { NonceRegistry } from "@/common/NonceRegistry.sol"; -import { IPookyball } from "@/pookyball/IPookyball.sol"; -import { PookyballReroll } from "@/pookyball/PookyballReroll.sol"; - -contract DeployPookyballReroll is Script { - NonceRegistry nonces = NonceRegistry(0xCD6d1949be58A4165718bD87EC35b0Ab8B956f55); - IPookyball pookyball = IPookyball(0x3f64DD5BE5E19dD34744EFcC74c1935004aeB270); - address signer = 0xCAFE3e690bf74Ec274210E1c448130c1f8228513; - address treasury = 0x2dfCa6e357a73D180B8e6aa8f7690A315a4395F7; - - function run() public { - bytes32 salt = keccak256(bytes(vm.envString("SALT"))); - uint256 deployerPK = vm.envUint("DEPLOYER_PK"); - uint256 adminPK = vm.envUint("ADMIN_PK"); - address admin = vm.addr(adminPK); - - vm.startBroadcast(deployerPK); - PookyballReroll reroll = - new PookyballReroll{salt: salt}(pookyball, nonces, admin, signer, treasury); - vm.stopBroadcast(); - - vm.startBroadcast(adminPK); - nonces.grantRole(nonces.OPERATOR(), address(reroll)); - vm.stopBroadcast(); - } -} diff --git a/script/mumbai/05_BoostPXP.s.sol b/script/mumbai/05_BoostPXP.s.sol deleted file mode 100644 index 195c8f53..00000000 --- a/script/mumbai/05_BoostPXP.s.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.21; - -import { Script } from "forge-std/Script.sol"; -import { BoostPXP } from "@/common/BoostPXP.sol"; -import { NonceRegistry } from "@/common/NonceRegistry.sol"; -import { IPookyball } from "@/pookyball/IPookyball.sol"; - -contract DeployBoostPXP is Script { - NonceRegistry nonces = NonceRegistry(0xCD6d1949be58A4165718bD87EC35b0Ab8B956f55); - address signer = 0xCAFE3e690bf74Ec274210E1c448130c1f8228513; - address treasury = 0x2dfCa6e357a73D180B8e6aa8f7690A315a4395F7; - - function run() public { - bytes32 salt = keccak256(bytes(vm.envString("SALT"))); - uint256 deployerPK = vm.envUint("DEPLOYER_PK"); - uint256 adminPK = vm.envUint("ADMIN_PK"); - address admin = vm.addr(adminPK); - - vm.startBroadcast(deployerPK); - BoostPXP reroll = new BoostPXP{salt: salt}(nonces, admin, signer, treasury); - vm.stopBroadcast(); - - vm.startBroadcast(adminPK); - nonces.grantRole(nonces.OPERATOR(), address(reroll)); - vm.stopBroadcast(); - } -} diff --git a/script/mumbai/06_StickersAscension.s.sol b/script/mumbai/06_StickersAscension.s.sol deleted file mode 100644 index 9eed8e57..00000000 --- a/script/mumbai/06_StickersAscension.s.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { Script } from "forge-std/Script.sol"; -import { Stickers } from "@/stickers/Stickers.sol"; -import { StickersController } from "@/stickers/StickersController.sol"; -import { StickersAscension } from "@/stickers/StickersAscension.sol"; - -contract DeployPookyballAscension is Script { - StickersController controller = StickersController(0x430288ee1c16B4e8b6B5DD6a76d24cA4d1Dfe8C7); - Stickers stickers = Stickers(address(controller.stickers())); - - address signer = 0xCAFE3e690bf74Ec274210E1c448130c1f8228513; - - function run() public { - bytes32 salt = keccak256(bytes(vm.envString("SALT"))); - uint256 deployerPK = vm.envUint("DEPLOYER_PK"); - uint256 adminPK = vm.envUint("ADMIN_PK"); - address admin = vm.addr(adminPK); - - vm.startBroadcast(deployerPK); - StickersAscension ascension = new StickersAscension{salt: salt}(controller, admin, signer); - vm.stopBroadcast(); - - vm.startBroadcast(adminPK); - stickers.grantRoles(address(ascension), stickers.MINTER()); - controller.grantRoles(address(ascension), controller.REMOVER()); - vm.stopBroadcast(); - } -} diff --git a/script/shell/deploy.sh b/script/shell/deploy.sh new file mode 100644 index 00000000..218f8de0 --- /dev/null +++ b/script/shell/deploy.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +NETWORK="$1" +CONTRACT_NAME="$2" + +# Dynamically determine the list of allowed contracts by scanning for .s.sol files +# Assuming all contract files are in the script/amoy folder and follow the naming convention *_.s.sol +# ALLOWED_CONTRACTS=($(find script/amoy -type f -name "*.s.sol" | sed -E 's|script/amoy/.*_([^.]+)\.s\.sol|\1|')) +ALLOWED_CONTRACTS=( + "POK" + "Energy" + "NonceRegistry" + "BoostPXP" + "Pookyball" + "PookyballLevelUp" + "PookyballReroll" + "PookyballAscension" + "Stickers" + "StickersController" + "StickersManager" + "StickersLevelUp" + "StickersSale" + "StickersAscension" +) + +# Define the networks +NETWORKS=("local" "amoy" "mainnet") + +# Usage message +function usage { + echo "Usage: $0 {network} {ContractName}" + echo "Networks: ${NETWORKS[*]}" + echo "Allowed contracts: ${ALLOWED_CONTRACTS[*]}" + echo "Examples:" + # Iterate over each contract + for contract in "${ALLOWED_CONTRACTS[@]}"; do + # Display the example usage for the current contract on the current network + echo "$0 local $contract" + done + exit 1 +} + +# Check if two arguments were provided +if [ "$#" -ne 2 ]; then + usage +fi + +# Check if the contract name is allowed +if [[ ! " ${ALLOWED_CONTRACTS[@]} " =~ " ${CONTRACT_NAME} " ]]; then + echo "Invalid contract name: ${CONTRACT_NAME}" + echo "Allowed contracts are: ${ALLOWED_CONTRACTS[*]}" + exit 2 +fi + +ENV_FILE=".env.${NETWORK}" + +# Execute the command +export $(cat $ENV_FILE | sed 's/\r$//' | xargs) + +# Assuming $RPC_URL is set in the environment variables for amoy and mainnet +# and possibly a different URL for local (e.g., http://localhost:8545) +if [[ "$NETWORK" == "local" ]]; then + DEPLOYMENT_SCRIPTS="script/amoy" + RPC_URL_ARG="--fork-url $RPC_URL" +else + DEPLOYMENT_SCRIPTS="script/$NETWORK" + RPC_URL_ARG="--verify --rpc-url $RPC_URL" +fi + +# Dynamically find the contract file +CONTRACT_FILE=$(find $DEPLOYMENT_SCRIPTS -type f -name "*_${CONTRACT_NAME}.s.sol") + +if [ -z "$CONTRACT_FILE" ]; then + echo "Contract file for ${CONTRACT_NAME} not found." + exit 4 +fi + +# Execute the forge script +forge script $CONTRACT_FILE --tc Deploy$CONTRACT_NAME $RPC_URL_ARG --broadcast diff --git a/src/pookyball/Pookyball.sol b/src/pookyball/Pookyball.sol index e868c0c9..db003a76 100644 --- a/src/pookyball/Pookyball.sol +++ b/src/pookyball/Pookyball.sol @@ -67,6 +67,7 @@ contract Pookyball is constructor( string memory _baseURI, string memory _contractURI, + address _admin, address _receiver, address _vrfCoordinator, bytes32 _vrfKeyHash, @@ -84,7 +85,7 @@ contract Pookyball is vrfCallbackGasLimit = _vrfCallbackGasLimit; _setDefaultRoyalty(_receiver, ROYALTY); - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(DEFAULT_ADMIN_ROLE, _admin); } /// @notice Set the URI of the contract-level metadata. diff --git a/src/tokens/POK.sol b/src/tokens/POK.sol index 4f7d7864..eaa0c813 100644 --- a/src/tokens/POK.sol +++ b/src/tokens/POK.sol @@ -25,8 +25,8 @@ contract POK is IPOK, ERC20, AccessControl { /// Thrown when a POK transfer is attempted. error Soulbounded(); - constructor() ERC20("POK", "POK") { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + constructor(address _admin) ERC20("POK", "POK") { + _grantRole(DEFAULT_ADMIN_ROLE, _admin); } /// @notice Mint an arbitrary amount of $POK to an account. diff --git a/test/setup/POKSetup.sol b/test/setup/POKSetup.sol index 529b786d..3b0cc1e0 100644 --- a/test/setup/POKSetup.sol +++ b/test/setup/POKSetup.sol @@ -8,8 +8,9 @@ abstract contract POKSetup is BaseTest { POK public pok; constructor() { - vm.startPrank(makeAddr("admin")); - pok = new POK(); + address admin = makeAddr("admin"); + vm.startPrank(admin); + pok = new POK(admin); pok.grantRole(pok.MINTER(), makeAddr("minter")); vm.stopPrank(); } diff --git a/test/setup/PookyballSetup.sol b/test/setup/PookyballSetup.sol index 648529ce..c34874c5 100644 --- a/test/setup/PookyballSetup.sol +++ b/test/setup/PookyballSetup.sol @@ -17,6 +17,7 @@ abstract contract PookyballSetup is BaseTest, VRFCoordinatorV2Setup { pookyball = new Pookyball( "https://metadata.pooky.gg/pookyballs/", "https://metadata.pooky.gg/contracts/Pookyball", + admin, makeAddr("treasury"), address(vrf), keccak256("foobar"),