diff --git a/.github/workflows/taikoon.yml b/.github/workflows/taikoon.yml index 87f0eb680ad..5f3443c2d80 100644 --- a/.github/workflows/taikoon.yml +++ b/.github/workflows/taikoon.yml @@ -24,9 +24,7 @@ jobs: submodules: recursive - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly-2cb875799419c907cc3709e586ece2559e6b340e + uses: foundry-rs/foundry-toolchain@v1.2.0 - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies @@ -35,6 +33,10 @@ jobs: working-directory: ./packages/taikoon run: forge fmt --check + - name: Solidity compilation + working-directory: ./packages/taikoon + run: pnpm compile + - name: Unit Tests working-directory: ./packages/taikoon - run: pnpm clean && pnpm test + run: pnpm test diff --git a/packages/taikoon/.env.example b/packages/taikoon/.env.example new file mode 100644 index 00000000000..6ec6170c7d7 --- /dev/null +++ b/packages/taikoon/.env.example @@ -0,0 +1,11 @@ +LOCALHOST_PRIVATE_KEY= +LOCALHOST_ADDRESS= +HOLESKY_PRIVATE_KEY= +HOLESKY_ADDRESS= +DEVNET_PRIVATE_KEY= +DEVNET_ADDRESS= +SEPOLIA_PRIVATE_KEY= +SEPOLIA_ADDRESS= +KATLA_PRIVATE_KEY= +KATLA_ADDRESS= +IPFS_BASE_URI= diff --git a/packages/taikoon/.gitignore b/packages/taikoon/.gitignore index c99ed87a51c..f62d06b7447 100644 --- a/packages/taikoon/.gitignore +++ b/packages/taikoon/.gitignore @@ -31,3 +31,13 @@ broadcast #coverage lcov.info + +# Custom +broadcast +.states +coverage +data/original +data/images +data/metadata +lcov.info +lib diff --git a/packages/taikoon/contracts/MerkleWhitelist.sol b/packages/taikoon/contracts/MerkleWhitelist.sol new file mode 100644 index 00000000000..86ac55dbd18 --- /dev/null +++ b/packages/taikoon/contracts/MerkleWhitelist.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; +import { ContextUpgradeable } from + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; + +/// @title MerkleWhitelist +/// @dev Merkle Tree Whitelist +/// @custom:security-contact security@taiko.xyz +contract MerkleWhitelist is ContextUpgradeable { + event RootUpdated(bytes32 _root); + event MintConsumed(address _minter, uint256 _mintAmount); + + error MINTS_EXCEEDED(); + error INVALID_PROOF(); + error INVALID_TOKEN_AMOUNT(); + + /// @notice Merkle Tree Root + bytes32 public root; + /// @notice Tracker for minted leaves + mapping(bytes32 leaf => bool hasMinted) public minted; + + uint256[48] private __gap; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /// @notice Contract initializer + /// @param _root Merkle Tree root + function initialize(bytes32 _root) external initializer { + __Context_init(); + root = _root; + } + + /// @notice Check if a wallet can free mint + /// @param _minter Address of the minter + /// @param _maxMints Max amount of free mints + /// @return Whether the wallet can mint + function canMint(address _minter, uint256 _maxMints) public view returns (bool) { + bytes32 _leaf = leaf(_minter, _maxMints); + return !minted[_leaf]; + } + + /// @notice Generate a leaf from the minter and mint counts + /// @param _minter Address of the minter + /// @param _maxMints Max amount of free mints + /// @return The leaf hash + function leaf(address _minter, uint256 _maxMints) public pure returns (bytes32) { + return keccak256(bytes.concat(keccak256(abi.encode(_minter, _maxMints)))); + } + + /// @notice Internal initializer + /// @param _root Merkle Tree root + function __MerkleWhitelist_init(bytes32 _root) internal initializer { + __Context_init(); + root = _root; + } + + /// @notice Update the merkle tree's root + /// @param _root The new root + function _updateRoot(bytes32 _root) internal { + root = _root; + emit RootUpdated(_root); + } + + /// @notice Permanently consume mints from the minter + /// @param _proof Merkle proof + /// @param _maxMints Max amount of free mints + function _consumeMint(bytes32[] calldata _proof, uint256 _maxMints) internal { + if (!canMint(_msgSender(), _maxMints)) revert MINTS_EXCEEDED(); + bytes32 _leaf = leaf(_msgSender(), _maxMints); + if (!MerkleProof.verify(_proof, root, _leaf)) revert INVALID_PROOF(); + minted[_leaf] = true; + emit MintConsumed(_msgSender(), _maxMints); + } +} diff --git a/packages/taikoon/contracts/TaikoonToken.sol b/packages/taikoon/contracts/TaikoonToken.sol index 93771511ad0..439045c4ed4 100644 --- a/packages/taikoon/contracts/TaikoonToken.sol +++ b/packages/taikoon/contracts/TaikoonToken.sol @@ -1,4 +1,118 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.24; +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; -contract TaikoonToken { } +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { ERC721EnumerableUpgradeable } from + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +import { MerkleWhitelist } from "./MerkleWhitelist.sol"; + +/// @title TaikoonToken +/// @dev The Taikoons ERC-721 token +/// @custom:security-contact security@taiko.xyz +contract TaikoonToken is + ERC721EnumerableUpgradeable, + UUPSUpgradeable, + Ownable2StepUpgradeable, + MerkleWhitelist +{ + /// @notice The current supply + uint256 private _totalSupply; + // Base URI required to interact with IPFS + string private _baseURIExtended; + + uint256[48] private __gap; + + error MAX_MINTS_EXCEEDED(); + error MAX_SUPPLY_REACHED(); + error MINTER_NOT_WHITELISTED(); + error TOKEN_NOT_MINTED(); + + /// @notice Contract initializer + /// @param _rootURI Base URI for the token metadata + /// @param _merkleRoot Merkle tree root for the whitelist + function initialize(string memory _rootURI, bytes32 _merkleRoot) external initializer { + __ERC721_init("Taikoon", "TKOON"); + __Ownable_init(_msgSender()); + __MerkleWhitelist_init(_merkleRoot); + _baseURIExtended = _rootURI; + } + + /// @notice Update the whitelist's merkle root + /// @param _root New merkle root + function updateRoot(bytes32 _root) external onlyOwner { + _updateRoot(_root); + } + + /// @notice Mint a token, handling the free vs paid internally + /// @param _proof Merkle proof validating the minter + /// @param _maxMints The amount of tokens to mint + /// @return tokenIds The minted token ids + function mint( + bytes32[] calldata _proof, + uint256 _maxMints + ) + external + returns (uint256[] memory) + { + if (!canMint(_msgSender(), _maxMints)) revert MINTER_NOT_WHITELISTED(); + + _consumeMint(_proof, _maxMints); + return _batchMint(_msgSender(), _maxMints); + } + + /// @notice Mint method for the owner + /// @param _to The address to mint to + /// @param _amount The amount of tokens to mint + /// @return tokenIds The minted token ids + function mint(address _to, uint256 _amount) external onlyOwner returns (uint256[] memory) { + return _batchMint(_to, _amount); + } + + /// @notice Get the tokenURI of a particular tokenId + /// @param _tokenId The token ID + /// @return The token URI + function tokenURI(uint256 _tokenId) public view override returns (string memory) { + if (_tokenId > _totalSupply) revert TOKEN_NOT_MINTED(); + return string.concat(_baseURI(), "/", Strings.toString(_tokenId), ".json"); + } + + /// @notice Get the current total supply + /// @return The total supply + function totalSupply() public view override returns (uint256) { + return _totalSupply; + } + + /// @notice Get the max supply of Taikoons + /// @return The max supply + function maxSupply() public pure returns (uint256) { + return 888; + } + /// @notice Calculate the amount of free and paid mints + /// @return The base URI for the token metadata + + function _baseURI() internal view override returns (string memory) { + return _baseURIExtended; + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } + + /// @notice Internal method to batch mint tokens + /// @param _to The address to mint to + /// @param _amount The amount of tokens to mint + /// @return tokenIds The minted token ids + function _batchMint(address _to, uint256 _amount) private returns (uint256[] memory tokenIds) { + if (_totalSupply + _amount > maxSupply()) revert MAX_SUPPLY_REACHED(); + tokenIds = new uint256[](_amount); + + for (uint256 i; i < _amount; ++i) { + tokenIds[i] = ++_totalSupply; + _mint(_to, tokenIds[i]); + } + } +} diff --git a/packages/taikoon/data/taikoons-32.json b/packages/taikoon/data/taikoons-32.json new file mode 100644 index 00000000000..02a87889505 --- /dev/null +++ b/packages/taikoon/data/taikoons-32.json @@ -0,0 +1,14 @@ +{ + "blobs": [ + "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" + ] +} diff --git a/packages/taikoon/data/whitelist/hardhat.csv b/packages/taikoon/data/whitelist/hardhat.csv new file mode 100644 index 00000000000..08b25dee507 --- /dev/null +++ b/packages/taikoon/data/whitelist/hardhat.csv @@ -0,0 +1,6 @@ +freeMints,address +100,0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 +100,0x70997970C51812dc3A010C7d01b50e0d17dc79C8 +100,0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC +100,0x90F79bf6EB2c4f870365E785982E1f101E93b906 +100,0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 diff --git a/packages/taikoon/data/whitelist/hardhat.json b/packages/taikoon/data/whitelist/hardhat.json new file mode 100644 index 00000000000..c7f5f9ab73f --- /dev/null +++ b/packages/taikoon/data/whitelist/hardhat.json @@ -0,0 +1,38 @@ +{ + "format": "standard-v1", + "tree": [ + "0x1c3b504b4d5640d26ad1aa3b57a9df9ec034f19239768e734b849c306d10b110", + "0x4cf915673e85b4e9ccf29a222e38d5bf700e621f8d1fa1b9dc32c5eb518e3ee9", + "0xf81b4a0419e54333847754d4d8f75b5debd786bc934fcd9a75e6a84324fcd262", + "0xb96d191e2b17e998f580dda00f309f35a73c7aa7de560cbf9512536c3bec5400", + "0xfa31eb8d65ff2307b7026df667a06a19aade0151ed701ed2307295ae4fa48364", + "0xd564c879701263dc95ed8b12a3ccc0068725c20abe9b3f974d37039d3502004a", + "0xcfa52795847379e100e5fe363a62abec587da5ae587614c82afb0af917d037c6", + "0x6a9ce9822687cfc256f353882a96be5fe95f4de311b84f737ad8a5e184a0dd4f", + "0x216e60a5ff1ea005e332f4ff55613abd29e314ea5de98b3c27162aad1428f5f4" + ], + "values": [ + { + "value": ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "100"], + "treeIndex": 8 + }, + { + "value": ["0x70997970C51812dc3A010C7d01b50e0d17dc79C8", "100"], + "treeIndex": 7 + }, + { + "value": ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", "100"], + "treeIndex": 4 + }, + { + "value": ["0x90F79bf6EB2c4f870365E785982E1f101E93b906", "100"], + "treeIndex": 6 + }, + { + "value": ["0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", "100"], + "treeIndex": 5 + } + ], + "leafEncoding": ["address", "uint256"], + "root": "0x1c3b504b4d5640d26ad1aa3b57a9df9ec034f19239768e734b849c306d10b110" +} diff --git a/packages/taikoon/data/whitelist/holesky.csv b/packages/taikoon/data/whitelist/holesky.csv new file mode 100644 index 00000000000..ca071f2c783 --- /dev/null +++ b/packages/taikoon/data/whitelist/holesky.csv @@ -0,0 +1,7 @@ +freeMints,address +10,0x8f63e3cD0D14cAef993E59B4e01e3D404cF3c1B7 +10,0x2E2989015f5818A256EB967940454EfE8a0B4b5d +10,0x927a146e18294efb36edCacC99D9aCEA6aB16b95 +10,0x4757D97449acA795510b9f3152C6a9019A3545c3 +10,0x424bFb32f78731252a6BCeDc828E38e2701DAAEf +10,0xC66fAdfFeb6DA3b9A7FA3C71130F881e3a9B13fb diff --git a/packages/taikoon/foundry.toml b/packages/taikoon/foundry.toml index fdbe124480a..c20bc4d5458 100644 --- a/packages/taikoon/foundry.toml +++ b/packages/taikoon/foundry.toml @@ -11,13 +11,17 @@ ffi = true memory_limit = 2_073_741_824 solc_version = "0.8.24" evm_version = "cancun" +ast=true remappings = [ "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", "solady/=node_modules/solady/", - "forge-std/=node_modules/forge-std/", + "forge-std/=node_modules/forge-std/src/", "ds-test/=node_modules/ds-test/src/", "p256-verifier/=node_modules/p256-verifier/", + "murky/=node_modules/murky/src/", + "@openzeppelin/foundry-upgrades/=node_modules/@openzeppelin/foundry-upgrades/src/", + "solidity-stringutils/=node_modules/solidity-stringutils/", ] # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. @@ -27,15 +31,17 @@ block_gas_limit = 80_000_000 fs_permissions = [ { access = "read", path = "./out" }, - { access = "read-write", path = "./deployments" }, + { access = "read-write", path = "./deployments/" }, { access = "read", path = "./test" }, { access = "read", path = "./genesis" }, + {access = "read", path="./data/"}, ] # 2394: Transient storage warning # 3860: Contract initcode size is xxx bytes and exceeds 49152 bytes # 5574: Contract code size is xxx bytes and exceeds 24576 byte ignored_error_codes = [2394, 3860, 5574] +libs = ["node_modules", "lib"] [fuzz] runs = 200 diff --git a/packages/taikoon/package.json b/packages/taikoon/package.json index 064e963835c..b324343c68c 100644 --- a/packages/taikoon/package.json +++ b/packages/taikoon/package.json @@ -8,7 +8,12 @@ "eslint": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts .", "fmt:sol": "forge fmt", "lint:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", - "test": "forge test -vvv --match-path test/*.t.sol" + "test": "pnpm clean && pnpm compile && forge test --match-path 'test/*.t.sol' -vvv", + "node": "anvil", + "merkle": "node script/js/generate-merkle-tree.js", + "deploy:localhost": "forge clean && pnpm compile && forge script script/sol/Deploy.s.sol --rpc-url http://localhost:8545 --broadcast", + "deploy:holesky": "forge clean && pnpm compile && forge script script/sol/Deploy.s.sol --rpc-url https://l1rpc.hekla.taiko.xyz/ --broadcast --gas-estimate-multiplier 200", + "deploy:ipfs": "rm -rf data/metadata/* && node script/js/resize-images.js && node script/js/add-images-ipfs.js && echo 'IPFS Base URI:' && ipfs add -r ./data/metadata/ && echo 'Update your .env file with the new IPFS URI'" }, "devDependencies": { "@types/node": "^20.11.20", @@ -28,12 +33,19 @@ "typescript": "^5.2.2" }, "dependencies": { - "@openzeppelin/contracts": "4.9.6", - "@openzeppelin/contracts-upgradeable": "4.9.6", + "@openzeppelin/contracts": "5.0.2", + "@openzeppelin/contracts-upgradeable": "5.0.2", + "@openzeppelin/foundry-upgrades": "github:OpenZeppelin/openzeppelin-foundry-upgrades", + "@openzeppelin/merkle-tree": "^1.0.6", + "convert-csv-to-json": "^2.46.0", "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", - "forge-std": "github:foundry-rs/forge-std#v1.7.5", + "forge-std": "github:foundry-rs/forge-std", + "ipfs-http-client": "^60.0.1", "merkletreejs": "^0.3.11", + "murky": "github:dmfxyz/murky", "p256-verifier": "github:taikoxyz/p256-verifier#v0.1.0", - "solady": "github:Vectorized/solady#v0.0.167" + "sharp": "^0.33.3", + "solady": "github:Vectorized/solady#v0.0.167", + "solidity-stringutils": "github:Arachnid/solidity-stringutils" } } diff --git a/packages/taikoon/script/js/add-images-ipfs.js b/packages/taikoon/script/js/add-images-ipfs.js new file mode 100644 index 00000000000..620de6725e9 --- /dev/null +++ b/packages/taikoon/script/js/add-images-ipfs.js @@ -0,0 +1,95 @@ +const path = require('path') +const fs = require('fs') +const fsPromises = fs.promises + +// Helper function to form the metadata JSON object +function populateNFTMetadata(name, description, CID) { + return { + name, + description, + image: CID, + } +} + +async function main() { + console.log(`Configuring the IPFS instance...`) + const { create } = await import('ipfs-http-client') + const ipfs = create() + const endpointConfig = await ipfs.getEndpointConfig() + console.log(`IPFS configured to connect via: `) + console.debug(endpointConfig) + console.log(` `) + + // Get the images to upload from the local filesystem (/images) + console.log(`Importing images from the images/ directory...`) + const imgDirPath = path.join(path.resolve(__dirname, '../../data'), 'images') + const filesName = await fsPromises.readdir(imgDirPath, (err) => { + if (err) { + console.log('Import from directory failed: ', err) + } + }) + const imagesName = filesName.filter((fileName) => fileName.includes('.png')) + let imagesData = [] + for await (const imageName of imagesName) { + let imageFilePath = path.join(path.resolve(__dirname, '../../data'), 'images', imageName) + let imageData = await fsPromises.readFile(imageFilePath) + imagesData.push(imageData) + } + console.log(`Imported images as buffered data\n`) + + // Uploading images to IPFS + console.log(`Uploading image data to IPFS...`) + let imageCIDs = [] + let imagesSummary = [] + let imageCount = 1 + for await (const imageData of imagesData) { + let { cid: imageCID } = await ipfs.add({ + content: imageData, + }) + imageCIDs.push(imageCID) + imagesSummary.push({ imageCID, imageCount }) + console.log(`Image added to IPFS with CID of ${imageCID}`) + imageCount++ + } + console.log(` `) + + + + // Add the metadata to IPFS + console.log(`Adding metadata to IPFS...`); + let metadataCIDs = []; + let taikoonId = 0 + for await (const imageCID of imageCIDs) { + taikoonId++ + const {cid: metadataCID} = await ipfs.add({ + // NOTE: You can implement different name & descriptions for each metadata + content: JSON.stringify(populateNFTMetadata(`Taikoon ${taikoonId}`, "A Taikoon", imageCID.toString())) + }) + + // write into a file + fs.writeFileSync( + path.join(path.resolve(__dirname, '../../data'), 'metadata', `${taikoonId}.json`), + JSON.stringify(populateNFTMetadata(`Taikoon ${taikoonId}`, "A Taikoon", imageCID.toString())) + ) + + + console.log(path.join(path.resolve(__dirname, '../../data'), 'metadata', `${taikoonId}.json`)) + metadataCIDs.push(metadataCID); + for (let i = 0; i < imagesSummary.length; i ++) { + if (imagesSummary[i].imageCID == imageCID) { + imagesSummary[i].metadataCID = metadataCID + } + }; + //console.log(`Metadata with image CID ${imageCID} added to IPFS with CID of ${metadataCID}`); + } + console.log(` `); + + fs.writeFileSync( + path.join(path.resolve(__dirname, '../../data'), 'metadata', 'summary.json'), + JSON.stringify({imagesSummary}) + ) + + +} + +main() diff --git a/packages/taikoon/script/js/generate-merkle-tree.js b/packages/taikoon/script/js/generate-merkle-tree.js new file mode 100644 index 00000000000..08d8d19ada4 --- /dev/null +++ b/packages/taikoon/script/js/generate-merkle-tree.js @@ -0,0 +1,34 @@ +const { StandardMerkleTree } = require('@openzeppelin/merkle-tree') +const path = require('path') +const fs = require('fs') +const ConvertCsvToJson = require('convert-csv-to-json'); + +async function main(network) { + const inputFile = path.join(__dirname, `../../data/whitelist/${network}.csv`) + const outputFile = path.join(__dirname, `../../data/whitelist/${network}.json`) + const rawJson = ConvertCsvToJson.fieldDelimiter(',').getJsonFromCsv(inputFile); + + const values = rawJson.map((entry) => { + return [ + entry.address, + entry.freeMints, + ] + }) + + const tree = StandardMerkleTree.of( + values, + ["address", "uint256"] + ) + + fs.writeFileSync( + outputFile, + JSON.stringify( + {...tree.dump(), + root: tree.root + }, null, 2) + ) + + console.log('Merkle Root:', tree.root) +} + +main('hardhat') diff --git a/packages/taikoon/script/js/resize-images.js b/packages/taikoon/script/js/resize-images.js new file mode 100644 index 00000000000..578281607a0 --- /dev/null +++ b/packages/taikoon/script/js/resize-images.js @@ -0,0 +1,59 @@ +const fs = require('fs') +const path = require('path') +const sharp = require('sharp'); + +function shuffleArray(array) { + return array /* + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array;*/ + } + +async function main(){ + const taikoonsDir = path.join(__dirname, '../../data/original/') + + const blobs = [] + // iterate over files in the directory + fs.readdir(taikoonsDir, async (err, rawFiles) => { + if (err) { + console.error(err) + return + } + + const files = shuffleArray(rawFiles) + + const finalImageSize = 32 + + for (const file of files) { + if (!file.endsWith('.png')) continue + const fileIndex = file.split('.')[0] + const sourceFilePath = path.join(taikoonsDir, file) + const destinationFilePath = path.join(__dirname, '../../data/images/', file) + + const sharpImage = sharp(sourceFilePath).resize( + finalImageSize, + finalImageSize, + { + kernel: sharp.kernel.nearest + } + ).png({compressionLevel: 9}) + + + const contents = await sharpImage.toBuffer() + await sharpImage.toFile(destinationFilePath) + + console.log(`Converted ${file} to 32x32 PNG.`) + + } + console.log(`Converted ${blobs.length} Taikoon PNG files to 32x32 base64.`) + + // fs.writeFileSync(path.join(__dirname, '../../data/taikoons-32.json'), JSON.stringify({blobs}, null, 2)) + + }) + +} + + +main() diff --git a/packages/taikoon/script/sol/CsvParser.sol b/packages/taikoon/script/sol/CsvParser.sol new file mode 100644 index 00000000000..cda5f415b5a --- /dev/null +++ b/packages/taikoon/script/sol/CsvParser.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +library CSVParser { + function parseLine(string memory csvLine) external pure returns (uint256, address) { + // Split the CSV line into an array of strings + string[] memory values = _splitCSVLine(csvLine); + + // Convert the first and second values to uint256 + uint256 value1 = _stringToUint(values[0]); + + // Convert the third value to address + address value2 = _stringToAddress(values[1]); + + return (value1, value2); + } + + function _splitCSVLine(string memory line) private pure returns (string[] memory) { + // Split the line using comma (,) as delimiter + return _split(line, ","); + } + + function _split( + string memory _string, + string memory _delimiter + ) + private + pure + returns (string[] memory) + { + bytes memory byteArray = bytes(_string); + bytes memory delimiter = bytes(_delimiter); + + uint256 delimiterCount = 1; + for (uint256 i = 0; i < byteArray.length; i++) { + if (byteArray[i] == delimiter[0]) { + delimiterCount++; + } + } + + string[] memory parts = new string[](delimiterCount); + uint256 partIndex = 0; + uint256 lastIndex = 0; + + for (uint256 i = 0; i < byteArray.length; i++) { + if (byteArray[i] == delimiter[0]) { + parts[partIndex] = _substring(_string, lastIndex, i); + partIndex++; + lastIndex = i + 1; + } + } + parts[partIndex] = _substring(_string, lastIndex, byteArray.length); + + return parts; + } + + function _substring( + string memory _str, + uint256 _startIndex, + uint256 _endIndex + ) + private + pure + returns (string memory) + { + bytes memory byteArray = bytes(_str); + bytes memory result = new bytes(_endIndex - _startIndex); + for (uint256 i = _startIndex; i < _endIndex; i++) { + result[i - _startIndex] = byteArray[i]; + } + return string(result); + } + + function _stringToUint(string memory _str) private pure returns (uint256) { + uint256 result = 0; + bytes memory b = bytes(_str); + for (uint256 i = 0; i < b.length; i++) { + if (uint8(b[i]) >= 48 && uint8(b[i]) <= 57) { + result = result * 10 + (uint8(b[i]) - 48); + } + } + return result; + } + + function _stringToAddress(string memory _str) private pure returns (address) { + bytes memory data = bytes(_str); + uint160 result = 0; + for (uint8 i = 0; i < data.length; i++) { + result *= 16; + if (uint8(data[i]) >= 48 && uint8(data[i]) <= 57) { + result += uint8(data[i]) - 48; + } + if (uint8(data[i]) >= 65 && uint8(data[i]) <= 70) { + result += uint8(data[i]) - 55; + } + if (uint8(data[i]) >= 97 && uint8(data[i]) <= 102) { + result += uint8(data[i]) - 87; + } + } + return address(uint160(result)); + } +} diff --git a/packages/taikoon/script/sol/Deploy.s.sol b/packages/taikoon/script/sol/Deploy.s.sol new file mode 100644 index 00000000000..1ed48f580a3 --- /dev/null +++ b/packages/taikoon/script/sol/Deploy.s.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/Script.sol"; +import { MerkleMintersScript } from "./MerkleMinters.s.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { Upgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; + +import { TaikoonToken } from "../../contracts/TaikoonToken.sol"; + +contract DeployScript is Script { + UtilsScript public utils; + MerkleMintersScript public merkleMinters = new MerkleMintersScript(); + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + + merkleMinters.setUp(); + } + + function run() public { + string memory jsonRoot = "root"; + + vm.startBroadcast(deployerPrivateKey); + + bytes32 root = merkleMinters.root(); + + string memory baseURI = utils.getIpfsBaseURI(); + + // deploy token with empty root + address proxy = Upgrades.deployUUPSProxy( + "TaikoonToken.sol", abi.encodeCall(TaikoonToken.initialize, (baseURI, root)) + ); + + TaikoonToken token = TaikoonToken(proxy); + + console.log("Token Base URI:", baseURI); + console.log("Deployed TaikoonToken to:", address(token)); + + vm.serializeBytes32(jsonRoot, "MerkleRoot", root); + + string memory finalJson = vm.serializeAddress(jsonRoot, "TaikoonToken", address(token)); + vm.writeJson(finalJson, jsonLocation); + + vm.stopBroadcast(); + } +} diff --git a/packages/taikoon/script/sol/MerkleMinters.s.sol b/packages/taikoon/script/sol/MerkleMinters.s.sol new file mode 100644 index 00000000000..eb88dbc0bb5 --- /dev/null +++ b/packages/taikoon/script/sol/MerkleMinters.s.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Script, console } from "forge-std/Script.sol"; +import "forge-std/StdJson.sol"; +import { UtilsScript } from "./Utils.s.sol"; +import { Merkle } from "murky/Merkle.sol"; +import "./CsvParser.sol"; +import { MerkleWhitelist } from "../../contracts/MerkleWhitelist.sol"; +import { TaikoonToken } from "../../contracts/TaikoonToken.sol"; + +contract MerkleMintersScript is Script { + using stdJson for string; + + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + bytes32[] public leaves; + + bytes32 public root; + + function setUp() public { + string memory treeJson = + vm.readFile(string.concat(vm.projectRoot(), "/data/whitelist/hardhat.json")); + bytes memory treeRaw = treeJson.parseRaw(".tree"); + leaves = abi.decode(treeRaw, (bytes32[])); + + bytes memory rootRaw = treeJson.parseRaw(".root"); + root = abi.decode(rootRaw, (bytes32)); + } + /* + function getHoleskyCsvMinters() + public + view + returns (uint256[] memory freeMints, address[] memory minters) + { + string memory csvPath = './data/whitelist/holesky.csv'; + string memory line = vm.readLine(csvPath); + // extract header + line = vm.readLine(csvPath); + + freeMints = new uint256[](10); + minters = new address[](10); + + // read the csv lines + bool linesLeft = true; + uint256 lineCount = 0; + while (linesLeft) { + (uint256 _freeMints, address _minter) = CSVParser.parseLine(line); + + freeMints[lineCount] = _freeMints; + minters[lineCount] = _minter; + + console.log( + 'Free mints: %s, Paid mints: %s, Minter: %s', + freeMints[lineCount], + minters[lineCount] + ); + + lineCount++; + + line = vm.readLine(csvPath); + linesLeft = bytes(line).length >= 27; + } + + return (freeMints, minters); + } + + */ + + function getHardhatCsvMinters() + public + view + returns (uint256[] memory freeMints, address[] memory minters, bytes32[] memory) + { + uint256 minterCount = 5; + string memory csvPath = "./data/whitelist/hardhat.csv"; + string memory line = vm.readLine(csvPath); + // extract header + line = vm.readLine(csvPath); + + freeMints = new uint256[](minterCount); + minters = new address[](minterCount); + + // read the csv lines + bool linesLeft = true; + uint256 lineCount = 0; + while (linesLeft) { + (uint256 _freeMints, address _minter) = CSVParser.parseLine(line); + + freeMints[lineCount] = _freeMints; + minters[lineCount] = _minter; + + console.log("Free mints: %s, Minter: %s", freeMints[lineCount], minters[lineCount]); + + lineCount++; + + line = vm.readLine(csvPath); + linesLeft = bytes(line).length >= 27; + } + + return (freeMints, minters, leaves); + } + + function getMerkleData() + public + view + returns (uint256[] memory freeMints, address[] memory minters, bytes32[] memory) + { + uint256 chainId = block.chainid; + + if (chainId == 31_337) { + return getHardhatCsvMinters(); + } /*else if (chainId == 17000) { + return getHoleskyCsvMinters(); + }*/ else { + revert("Unsupported chainId"); + } + } + + function getMerkleInfo() public view returns (bytes32, bytes32[] memory) { + return (root, leaves); + } + + function run() public { + UtilsScript utils = new UtilsScript(); + utils.setUp(); + + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + vm.startBroadcast(deployerPrivateKey); + + string memory path = utils.getContractJsonLocation(); + string memory json = vm.readFile(path); + + // TaikoonToken + bytes memory addressRaw = json.parseRaw(".TaikoonToken"); + address tokenAddress = abi.decode(addressRaw, (address)); + TaikoonToken token = TaikoonToken(tokenAddress); + + Merkle tree = new Merkle(); + + root = tree.getRoot(leaves); + + token.updateRoot(root); + + vm.stopBroadcast(); + } +} diff --git a/packages/taikoon/script/sol/Utils.s.sol b/packages/taikoon/script/sol/Utils.s.sol new file mode 100644 index 00000000000..dd9b033837a --- /dev/null +++ b/packages/taikoon/script/sol/Utils.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Script, console } from "forge-std/Script.sol"; +import "forge-std/StdJson.sol"; + +contract UtilsScript is Script { + using stdJson for string; + + address public nounsTokenAddress; + + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else { + revert("Unsupported chainId"); + } + } + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getAddress() public view returns (address) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_ADDRESS"); + return vm.envAddress(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return string.concat(root, "/deployments/", lowercaseNetworkKey, ".json"); + } + + function getIpfsBaseURI() public view returns (string memory) { + return vm.envString("IPFS_BASE_URI"); + } + + function run() public { } +} diff --git a/packages/taikoon/test/MerkleWhitelist.t.sol b/packages/taikoon/test/MerkleWhitelist.t.sol new file mode 100644 index 00000000000..01c2db0a780 --- /dev/null +++ b/packages/taikoon/test/MerkleWhitelist.t.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test, console } from "forge-std/Test.sol"; +import "forge-std/StdJson.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { MerkleWhitelist } from "../contracts/MerkleWhitelist.sol"; +import { Upgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; + +import { MerkleWhitelistTestWrapper } from "./MerkleWhitelistTestWrapper.sol"; + +contract MerkleWhitelistTest is Test { + Merkle tree; + + using stdJson for string; + + bytes32[] leaves; + + address public owner = vm.addr(0x5); + + MerkleWhitelistTestWrapper whitelist; + + uint256 constant MAX_MINTS = 5; + + function createLeaf(address _minter, uint256 _freeMints) public pure returns (bytes32) { + return keccak256(bytes.concat(keccak256(abi.encode(_minter, _freeMints)))); + } + + address[3] minters = [address(0x1), address(0x2), address(0x3)]; + + function setUp() public { + vm.startBroadcast(owner); + + tree = new Merkle(); + + leaves = new bytes32[](2); + + leaves[0] = createLeaf(minters[0], MAX_MINTS); + leaves[1] = createLeaf(minters[1], MAX_MINTS); + + bytes32 root = tree.getRoot(leaves); + + address transparentProxy = Upgrades.deployTransparentProxy( + "MerkleWhitelist.sol", owner, abi.encodeCall(MerkleWhitelist.initialize, (root)) + ); + + Upgrades.upgradeProxy(transparentProxy, "MerkleWhitelistTestWrapper.sol", ""); + + whitelist = MerkleWhitelistTestWrapper(transparentProxy); + + vm.stopBroadcast(); + } + + function test_canFreeMint() public { + uint256 leafIndex = 0; + bytes32[] memory proof = tree.getProof(leaves, leafIndex); + bool initialCanMint = whitelist.canMint(minters[leafIndex], MAX_MINTS); + assertEq(initialCanMint, true); + + vm.startPrank(minters[leafIndex]); + + whitelist.consumeMint(proof, MAX_MINTS); + + vm.stopPrank(); + bool finalCanMint = whitelist.canMint(minters[leafIndex], MAX_MINTS); + assertEq(finalCanMint, false); + } + + function test_updateRoot() public { + tree = new Merkle(); + + uint256 leafIndex = 2; + + leaves = new bytes32[](3); + + leaves[0] = createLeaf(minters[0], MAX_MINTS); + leaves[1] = createLeaf(minters[1], MAX_MINTS); + leaves[2] = createLeaf(minters[2], MAX_MINTS); + + bytes32 root = tree.getRoot(leaves); + + whitelist.updateRoot(root); + assertEq(whitelist.root(), root); + + bool canMint = whitelist.canMint(minters[leafIndex], MAX_MINTS); + assertEq(canMint, true); + } + + function test_revert_freeMintsExceeded() public { + uint256 leafIndex = 0; + bytes32[] memory proof = tree.getProof(leaves, leafIndex); + + vm.startPrank(minters[leafIndex]); + + whitelist.consumeMint(proof, MAX_MINTS); + + vm.stopPrank(); + + bool canMint = whitelist.canMint(minters[leafIndex], MAX_MINTS); + assertEq(canMint, false); + + vm.startBroadcast(minters[leafIndex]); + vm.expectRevert(); + whitelist.consumeMint(proof, MAX_MINTS); + + vm.stopBroadcast(); + } +} diff --git a/packages/taikoon/test/MerkleWhitelistTestWrapper.sol b/packages/taikoon/test/MerkleWhitelistTestWrapper.sol new file mode 100644 index 00000000000..6080f5dcff4 --- /dev/null +++ b/packages/taikoon/test/MerkleWhitelistTestWrapper.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { MerkleWhitelist } from "../contracts/MerkleWhitelist.sol"; + +/// @custom:oz-upgrades-from MerkleWhitelist +contract MerkleWhitelistTestWrapper is MerkleWhitelist { + /* + function initialize(bytes32 _root) external { + __MerkleWhitelist_init(_root); + }*/ + + function updateRoot(bytes32 _root) external { + _updateRoot(_root); + } + + function consumeMint(bytes32[] calldata _proof, uint256 _freeMints) external { + _consumeMint(_proof, _freeMints); + } +} diff --git a/packages/taikoon/test/TaikoonToken.t.sol b/packages/taikoon/test/TaikoonToken.t.sol new file mode 100644 index 00000000000..16d3a8c6b54 --- /dev/null +++ b/packages/taikoon/test/TaikoonToken.t.sol @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/Test.sol"; +import { TaikoonToken } from "../contracts/TaikoonToken.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { Upgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; + +contract TaikoonTokenTest is Test { + TaikoonToken public token; + + address public owner = vm.addr(0x5); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + bytes32[] public leaves = new bytes32[](minters.length); + + uint256 constant MAX_MINTS = 5; + + Merkle tree = new Merkle(); + + function setUp() public { + // create whitelist merkle tree + vm.startBroadcast(owner); + bytes32 root = tree.getRoot(leaves); + + // deploy token with empty root + address proxy = Upgrades.deployUUPSProxy( + "TaikoonToken.sol", abi.encodeCall(TaikoonToken.initialize, ("ipfs://", root)) + ); + + token = TaikoonToken(proxy); + // use the token to calculate leaves + for (uint256 i = 0; i < minters.length; i++) { + leaves[i] = token.leaf(minters[i], MAX_MINTS); + } + // update the root + root = tree.getRoot(leaves); + token.updateRoot(root); + vm.stopBroadcast(); + } + + function test_metadata() public view { + assertEq(token.name(), "Taikoon"); + assertEq(token.symbol(), "TKOON"); + assertEq(token.totalSupply(), 0); + assertEq(token.maxSupply(), 888); + } + + function test_mint() public { + address user = minters[0]; + + bytes32[] memory proof = tree.getProof(leaves, 0); + + bool canMint = token.canMint(user, MAX_MINTS); + assertEq(canMint, true); + + vm.startPrank(user); + uint256[] memory tokenIds = token.mint(proof, MAX_MINTS); + vm.stopPrank(); + + assertEq(token.balanceOf(user), MAX_MINTS); + assertEq(tokenIds.length, MAX_MINTS); + assertFalse(token.canMint(user, MAX_MINTS)); + + string memory tokenURI = token.tokenURI(tokenIds[0]); + assertEq(tokenURI, "ipfs:///1.json"); + } + + function test_updateRoot() public { + uint256 leafIndex = 2; + bytes32[] memory _leaves = new bytes32[](3); + + _leaves[0] = token.leaf(minters[0], MAX_MINTS); + _leaves[1] = token.leaf(minters[1], MAX_MINTS); + _leaves[2] = token.leaf(minters[2], MAX_MINTS); + + Merkle _tree = new Merkle(); + bytes32 root = _tree.getRoot(_leaves); + vm.startPrank(owner); + token.updateRoot(root); + vm.stopPrank(); + assertEq(token.root(), root); + + bool canMint = token.canMint(minters[leafIndex], MAX_MINTS); + assertEq(canMint, true); + } + + function test_mintOwner() public { + vm.startPrank(owner); + uint256[] memory tokenIds = token.mint(owner, 5); + vm.stopPrank(); + + assertEq(token.balanceOf(owner), 5); + assertEq(tokenIds.length, 5); + } +} diff --git a/packages/taikoon/test/Upgradeable.t.sol b/packages/taikoon/test/Upgradeable.t.sol new file mode 100644 index 00000000000..ceefe3fc952 --- /dev/null +++ b/packages/taikoon/test/Upgradeable.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test, console } from "forge-std/Test.sol"; +import { TaikoonToken } from "../contracts/TaikoonToken.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { MerkleMintersScript } from "../script/sol/MerkleMinters.s.sol"; +import "forge-std/StdJson.sol"; + +import { Upgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; + +contract UpgradeableTest is Test { + using stdJson for string; + + TaikoonToken public token; + + address public owner = vm.addr(0x5); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + bytes32[] public leaves = new bytes32[](minters.length); + + MerkleMintersScript merkleMinters = new MerkleMintersScript(); + + uint256 constant FREE_MINTS = 5; + + Merkle tree = new Merkle(); + + function setUp() public { + // create whitelist merkle tree + vm.startPrank(owner); + bytes32 root = tree.getRoot(leaves); + + // deploy token with empty root + address proxy = Upgrades.deployUUPSProxy( + "TaikoonToken.sol", abi.encodeCall(TaikoonToken.initialize, ("ipfs://", root)) + ); + + token = TaikoonToken(proxy); + // use the token to calculate leaves + for (uint256 i = 0; i < minters.length; i++) { + leaves[i] = token.leaf(minters[i], FREE_MINTS); + } + // update the root + root = tree.getRoot(leaves); + token.updateRoot(root); + vm.stopPrank(); + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac03f62e752..67ebe5b64b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -267,7 +267,7 @@ importers: specifier: ^1.5.0 version: 1.5.0 - packages/supplementary-contracts: + packages/protocol: dependencies: '@openzeppelin/contracts': specifier: 4.9.6 @@ -296,31 +296,31 @@ importers: version: 20.11.20 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.4.0(@typescript-eslint/parser@7.7.0)(eslint@8.56.0)(typescript@5.4.3) + version: 7.4.0(@typescript-eslint/parser@7.7.0)(eslint@8.55.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) + version: 7.7.0(eslint@8.55.0)(typescript@5.4.3) eslint: specifier: ^8.51.0 - version: 8.56.0 + version: 8.55.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.56.0) + version: 9.1.0(eslint@8.55.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) + version: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.55.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.0(@typescript-eslint/parser@7.7.0)(eslint@8.56.0) + version: 2.29.0(@typescript-eslint/parser@7.7.0)(eslint@8.55.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.56.0) + version: 11.1.0(eslint@8.55.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5) + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.55.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.56.0) + version: 6.1.1(eslint@8.55.0) ethers: specifier: ^5.7.2 version: 5.7.2 @@ -337,7 +337,9 @@ importers: specifier: ^5.2.2 version: 5.4.3 - packages/protocol: + packages/relayer: {} + + packages/supplementary-contracts: dependencies: '@openzeppelin/contracts': specifier: 4.9.6 @@ -366,31 +368,31 @@ importers: version: 20.11.20 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.4.0(@typescript-eslint/parser@7.7.0)(eslint@8.55.0)(typescript@5.4.3) + version: 7.4.0(@typescript-eslint/parser@7.7.0)(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.7.0(eslint@8.55.0)(typescript@5.4.3) + version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) eslint: specifier: ^8.51.0 - version: 8.55.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.55.0) + version: 9.1.0(eslint@8.56.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.55.0) + version: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.0(@typescript-eslint/parser@7.7.0)(eslint@8.55.0) + version: 2.29.0(@typescript-eslint/parser@7.7.0)(eslint@8.56.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.55.0) + version: 11.1.0(eslint@8.56.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.55.0)(prettier@3.2.5) + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.55.0) + version: 6.1.1(eslint@8.56.0) ethers: specifier: ^5.7.2 version: 5.7.2 @@ -407,31 +409,50 @@ importers: specifier: ^5.2.2 version: 5.4.3 - packages/relayer: {} - packages/taikoon: dependencies: '@openzeppelin/contracts': - specifier: 4.9.6 - version: 4.9.6 + specifier: 5.0.2 + version: 5.0.2 '@openzeppelin/contracts-upgradeable': - specifier: 4.9.6 - version: 4.9.6 + specifier: 5.0.2 + version: 5.0.2(@openzeppelin/contracts@5.0.2) + '@openzeppelin/foundry-upgrades': + specifier: github:OpenZeppelin/openzeppelin-foundry-upgrades + version: github.com/OpenZeppelin/openzeppelin-foundry-upgrades/332bd3306242e09520df2685b2edb99ebd7f5d37 + '@openzeppelin/merkle-tree': + specifier: ^1.0.6 + version: 1.0.6 + convert-csv-to-json: + specifier: ^2.46.0 + version: 2.46.0 ds-test: specifier: github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0 version: github.com/dapphub/ds-test/e282159d5170298eb2455a6c05280ab5a73a4ef0 forge-std: - specifier: github:foundry-rs/forge-std#v1.7.5 - version: github.com/foundry-rs/forge-std/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3 + specifier: github:foundry-rs/forge-std + version: github.com/foundry-rs/forge-std/93340e7e6127c817e276bc956b4f4ed13d173449 + ipfs-http-client: + specifier: ^60.0.1 + version: 60.0.1 merkletreejs: specifier: ^0.3.11 version: 0.3.11 + murky: + specifier: github:dmfxyz/murky + version: github.com/dmfxyz/murky/5feccd1253d7da820f7cccccdedf64471025455d p256-verifier: specifier: github:taikoxyz/p256-verifier#v0.1.0 version: github.com/taikoxyz/p256-verifier/6ef45b117642786b08a37b4c37c6a6ce151166da + sharp: + specifier: ^0.33.3 + version: 0.33.3 solady: specifier: github:Vectorized/solady#v0.0.167 version: github.com/Vectorized/solady/de0f336d2033d04e0f77c923d639c7fbffd48b6d + solidity-stringutils: + specifier: github:Arachnid/solidity-stringutils + version: github.com/Arachnid/solidity-stringutils/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461 devDependencies: '@types/node': specifier: ^20.11.20 @@ -1916,6 +1937,16 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@chainsafe/is-ip@2.0.2: + resolution: {integrity: sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==} + dev: false + + /@chainsafe/netmask@2.0.0: + resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} + dependencies: + '@chainsafe/is-ip': 2.0.2 + dev: false + /@coinbase/wallet-sdk@3.9.1: resolution: {integrity: sha512-cGUE8wm1/cMI8irRMVOqbFWYcnNugqCtuy2lnnHfgloBg+GRLs9RsrkOUDMdv/StfUeeKhCDyYudsXXvcL1xIA==} dependencies: @@ -1957,6 +1988,14 @@ packages: postcss-selector-parser: 6.0.15 dev: true + /@emnapi/runtime@1.1.1: + resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: @@ -2549,7 +2588,6 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true /@ethersproject/abstract-provider@5.7.0: resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} @@ -2561,7 +2599,6 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - dev: true /@ethersproject/abstract-signer@5.7.0: resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} @@ -2571,7 +2608,6 @@ packages: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 - dev: true /@ethersproject/address@5.7.0: resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} @@ -2581,13 +2617,11 @@ packages: '@ethersproject/keccak256': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 - dev: true /@ethersproject/base64@5.7.0: resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} dependencies: '@ethersproject/bytes': 5.7.0 - dev: true /@ethersproject/basex@5.7.0: resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} @@ -2602,19 +2636,16 @@ packages: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 - dev: true /@ethersproject/bytes@5.7.0: resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: '@ethersproject/logger': 5.7.0 - dev: true /@ethersproject/constants@5.7.0: resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: '@ethersproject/bignumber': 5.7.0 - dev: true /@ethersproject/contracts@5.7.0: resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} @@ -2643,7 +2674,6 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true /@ethersproject/hdnode@5.7.0: resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} @@ -2685,17 +2715,14 @@ packages: dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 - dev: true /@ethersproject/logger@5.7.0: resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - dev: true /@ethersproject/networks@5.7.1: resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} dependencies: '@ethersproject/logger': 5.7.0 - dev: true /@ethersproject/pbkdf2@5.7.0: resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} @@ -2708,7 +2735,6 @@ packages: resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} dependencies: '@ethersproject/logger': 5.7.0 - dev: true /@ethersproject/providers@5.7.2: resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} @@ -2750,7 +2776,6 @@ packages: dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true /@ethersproject/sha2@5.7.0: resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} @@ -2769,7 +2794,6 @@ packages: bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 - dev: true /@ethersproject/solidity@5.7.0: resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} @@ -2788,7 +2812,6 @@ packages: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true /@ethersproject/transactions@5.7.0: resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} @@ -2802,7 +2825,6 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 - dev: true /@ethersproject/units@5.7.0: resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} @@ -2840,7 +2862,6 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true /@ethersproject/wordlists@5.7.0: resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} @@ -2855,7 +2876,6 @@ packages: /@fastify/busboy@2.1.0: resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} engines: {node: '>=14'} - dev: true /@formatjs/ecma402-abstract@1.11.4: resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} @@ -2970,10 +2990,221 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true + /@img/sharp-darwin-arm64@0.33.3: + resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.3: + resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.2: + resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.2: + resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.2: + resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.2: + resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.2: + resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.2: + resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.2: + resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.2: + resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.3: + resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.3: + resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.3: + resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.3: + resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.3: + resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.3: + resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.3: + resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.1.1 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.3: + resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.3: + resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false + /@ipld/dag-cbor@9.2.0: + resolution: {integrity: sha512-N14oMy0q4gM6OuZkIpisKe0JBSjf1Jb39VI+7jMLiWX9124u1Z3Fdj/Tag1NA0cVxxqWDh0CqsjcVfOKtelPDA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 4.2.0 + multiformats: 13.1.0 + dev: false + + /@ipld/dag-json@10.2.0: + resolution: {integrity: sha512-O9YLUrl3d3WbVz7v1WkajFkyfOLEe2Fep+wor4fgVe0ywxzrivrj437NiPcVyB+2EDdFn/Q7tCHFf8YVhDf8ZA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 4.2.0 + multiformats: 13.1.0 + dev: false + + /@ipld/dag-pb@4.1.0: + resolution: {integrity: sha512-LJU451Drqs5zjFm7jI4Hs3kHlilOqkjcSfPiQgVsZnWaYb2C7YdfhnclrVn/X+ucKejlU9BL3+gXFCZUXkMuCg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 13.1.0 + dev: false + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3099,6 +3330,94 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@leichtgewicht/ip-codec@2.0.5: + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + dev: false + + /@libp2p/interface-connection@4.0.0: + resolution: {integrity: sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@libp2p/interface-peer-id': 2.0.2 + '@libp2p/interfaces': 3.3.2 + '@multiformats/multiaddr': 12.2.1 + it-stream-types: 1.0.5 + uint8arraylist: 2.4.8 + dev: false + + /@libp2p/interface-keychain@2.0.5: + resolution: {integrity: sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@libp2p/interface-peer-id': 2.0.2 + multiformats: 11.0.2 + dev: false + + /@libp2p/interface-peer-id@2.0.2: + resolution: {integrity: sha512-9pZp9zhTDoVwzRmp0Wtxw0Yfa//Yc0GqBCJi3EznBDE6HGIAVvppR91wSh2knt/0eYg0AQj7Y35VSesUTzMCUg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 11.0.2 + dev: false + + /@libp2p/interface-peer-info@1.0.10: + resolution: {integrity: sha512-HQlo8NwQjMyamCHJrnILEZz+YwEOXCB2sIIw3slIrhVUYeYlTaia1R6d9umaAeLHa255Zmdm4qGH8rJLRqhCcg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@libp2p/interface-peer-id': 2.0.2 + '@multiformats/multiaddr': 12.2.1 + dev: false + + /@libp2p/interface-pubsub@3.0.7: + resolution: {integrity: sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@libp2p/interface-connection': 4.0.0 + '@libp2p/interface-peer-id': 2.0.2 + '@libp2p/interfaces': 3.3.2 + it-pushable: 3.2.3 + uint8arraylist: 2.4.8 + dev: false + + /@libp2p/interface@1.3.0: + resolution: {integrity: sha512-K72Km0Co1Z+pXpggWuoAvUUbvwZYvjCcywrHj2Ym3jt2anTE3hzL4rlZrrkzA0YhNTRFRiZ04dnu6WMXT5/4+A==} + dependencies: + '@multiformats/multiaddr': 12.2.1 + it-pushable: 3.2.3 + it-stream-types: 2.0.1 + multiformats: 13.1.0 + progress-events: 1.0.0 + uint8arraylist: 2.4.8 + dev: false + + /@libp2p/interfaces@3.3.2: + resolution: {integrity: sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /@libp2p/logger@2.1.1: + resolution: {integrity: sha512-2UbzDPctg3cPupF6jrv6abQnAUTrbLybNOj0rmmrdGm1cN2HJ1o/hBu0sXuq4KF9P1h/eVRn1HIRbVIEKnEJrA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@libp2p/interface-peer-id': 2.0.2 + '@multiformats/multiaddr': 12.2.1 + debug: 4.3.4 + interface-datastore: 8.2.11 + multiformats: 11.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@libp2p/peer-id@2.0.4: + resolution: {integrity: sha512-gcOsN8Fbhj6izIK+ejiWsqiqKeJ2yWPapi/m55VjOvDa52/ptQzZszxQP8jUk93u36de92ATFXDfZR/Bi6eeUQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@libp2p/interface-peer-id': 2.0.2 + '@libp2p/interfaces': 3.3.2 + multiformats: 11.0.2 + uint8arrays: 4.0.10 + dev: false + /@lit-labs/ssr-dom-shim@1.2.0: resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} dev: false @@ -3370,6 +3689,50 @@ packages: tslib: 2.6.2 dev: false + /@multiformats/dns@1.0.6: + resolution: {integrity: sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==} + dependencies: + '@types/dns-packet': 5.6.5 + buffer: 6.0.3 + dns-packet: 5.6.1 + hashlru: 2.3.0 + p-queue: 8.0.1 + progress-events: 1.0.0 + uint8arrays: 5.0.3 + dev: false + + /@multiformats/multiaddr-to-uri@9.0.8: + resolution: {integrity: sha512-4eiN5iEiQfy2A98BxekUfW410L/ivg0sgjYSgSqmklnrBhK+QyMz4yqgfkub8xDTXOc7O5jp4+LVyM3ZqMeWNw==} + dependencies: + '@multiformats/multiaddr': 12.2.1 + dev: false + + /@multiformats/multiaddr@11.6.1: + resolution: {integrity: sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@chainsafe/is-ip': 2.0.2 + dns-over-http-resolver: 2.1.3 + err-code: 3.0.1 + multiformats: 11.0.2 + uint8arrays: 4.0.10 + varint: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@multiformats/multiaddr@12.2.1: + resolution: {integrity: sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==} + dependencies: + '@chainsafe/is-ip': 2.0.2 + '@chainsafe/netmask': 2.0.0 + '@libp2p/interface': 1.3.0 + '@multiformats/dns': 1.0.6 + multiformats: 13.1.0 + uint8-varint: 2.0.4 + uint8arrays: 5.0.3 + dev: false + /@noble/curves@1.1.0: resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} dependencies: @@ -3387,6 +3750,10 @@ packages: '@noble/hashes': 1.3.3 dev: false + /@noble/hashes@1.2.0: + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + dev: false + /@noble/hashes@1.3.1: resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} engines: {node: '>= 16'} @@ -3400,6 +3767,10 @@ packages: resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} engines: {node: '>= 16'} + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -3425,10 +3796,29 @@ packages: resolution: {integrity: sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==} dev: false + /@openzeppelin/contracts-upgradeable@5.0.2(@openzeppelin/contracts@5.0.2): + resolution: {integrity: sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ==} + peerDependencies: + '@openzeppelin/contracts': 5.0.2 + dependencies: + '@openzeppelin/contracts': 5.0.2 + dev: false + /@openzeppelin/contracts@4.9.6: resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} dev: false + /@openzeppelin/contracts@5.0.2: + resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} + dev: false + + /@openzeppelin/merkle-tree@1.0.6: + resolution: {integrity: sha512-cGWOb2WBWbJhqvupzxjnKAwGLxxAEYPg51sk76yZ5nVe5D03mw7Vx5yo8llaIEqYhP5O39M8QlrNWclgLfKVrA==} + dependencies: + '@ethersproject/abi': 5.7.0 + ethereum-cryptography: 1.2.0 + dev: false + /@parcel/watcher-android-arm64@2.4.0: resolution: {integrity: sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==} engines: {node: '>= 10.0.0'} @@ -3623,6 +4013,49 @@ packages: resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} dev: true + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + /@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4): resolution: {integrity: sha512-b5KD010iiZnot86RbAaHpLuHwmPW2qA3SSN/OSZhd1kBoINEQEVBuv+uFtcaTxAhX27bT0wd13GOb2IOSDUXSA==} peerDependencies: @@ -4111,6 +4544,14 @@ packages: /@scure/base@1.1.5: resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} + /@scure/bip32@1.1.5: + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.5 + dev: false + /@scure/bip32@1.3.1: resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} dependencies: @@ -4129,8 +4570,15 @@ packages: /@scure/bip32@1.3.3: resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 + dev: false + + /@scure/bip39@1.1.1: + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + dependencies: + '@noble/hashes': 1.2.0 '@scure/base': 1.1.5 dev: false @@ -4529,6 +4977,12 @@ packages: dependencies: '@types/ms': 0.7.34 + /@types/dns-packet@5.6.5: + resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} + dependencies: + '@types/node': 20.11.20 + dev: false + /@types/dom-screen-wake-lock@1.0.3: resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} dev: false @@ -4577,9 +5031,19 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: false + /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + /@types/node@18.19.31: + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + dependencies: + undici-types: 5.26.5 + dev: false + /@types/node@20.11.20: resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} dependencies: @@ -5837,6 +6301,9 @@ packages: resolution: {integrity: sha512-GBryCiyl+taz5DPq0expxzfMVcrpKjWvEBSAqT1tPUSthnzOWnVF77XlUAYgFZqzPsEu9lQ1dHCdqZx7WWMCXA==} peerDependencies: '@web3modal/wallet': 4.1.1 + peerDependenciesMeta: + '@web3modal/siwe': + optional: true dependencies: '@web3modal/common': 4.1.1 '@web3modal/core': 4.1.1(react@18.2.0) @@ -5877,6 +6344,15 @@ packages: '@wagmi/connectors': '>=4.0.0' '@wagmi/core': '>=2.0.0' viem: '>=2.0.0' + peerDependenciesMeta: + '@web3modal/siwe': + optional: true + react: + optional: true + react-dom: + optional: true + vue: + optional: true dependencies: '@wagmi/connectors': 4.1.18(@wagmi/core@2.6.9)(react-dom@18.2.0)(react-native@0.73.4)(react@18.2.0)(typescript@5.4.3)(viem@2.7.11) '@wagmi/core': 2.6.9(react@18.2.0)(typescript@5.4.3)(viem@2.7.11) @@ -6088,6 +6564,10 @@ packages: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true + /any-signal@3.0.1: + resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==} + dev: false + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -6371,6 +6851,12 @@ packages: readable-stream: 3.6.2 dev: true + /blob-to-it@2.0.6: + resolution: {integrity: sha512-xveo/z3QNilIJgCZAjzvx2uWWVHE4JzOy7eMp45zkuBsmwZMgjfhn2h/+BsZPaByVFa3u1W/OBUleNiqgMtVpQ==} + dependencies: + browser-readablestream-to-it: 2.0.6 + dev: false + /bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} dev: false @@ -6413,6 +6899,14 @@ packages: /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + /browser-readablestream-to-it@1.0.3: + resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} + dev: false + + /browser-readablestream-to-it@2.0.6: + resolution: {integrity: sha512-csJm66U/gTC6VHjeaOaziK6Y6ENdrzlNLdXnsdnvGX+3hGvedkxTyiMk2WbgKR8F15ACxDLJhDuE/cmovLPBQQ==} + dev: false + /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -6584,6 +7078,11 @@ packages: upper-case-first: 2.0.2 dev: true + /cborg@4.2.0: + resolution: {integrity: sha512-q6cFW5m3KxfP/9xGI3yGLaC1l5DP6DWM9IvjiJojnIwohL5CQDl02EXViPV852mOfQo+7PJGPN01MI87vFGzyA==} + hasBin: true + dev: false + /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -6803,6 +7302,21 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + /colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} dev: false @@ -6900,6 +7414,10 @@ packages: upper-case: 2.0.2 dev: true + /convert-csv-to-json@2.46.0: + resolution: {integrity: sha512-Q7PjRjhECa5nBUEGbsKXvB8YaygVUesF/sYnaoCPTWoiwJEDCbLd2CcFDE1y80Q347IaTQukCQSCP2fR5IW+5g==} + dev: false + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: false @@ -7057,6 +7575,13 @@ packages: type: 1.2.0 dev: false + /dag-jose@4.0.0: + resolution: {integrity: sha512-tw595L3UYoOUT9dSJPbBEG/qpRpw24kRZxa5SLRnlnr+g5L7O8oEs1d3W5TiVA1oJZbthVsf0Vi3zFN66qcEBA==} + dependencies: + '@ipld/dag-cbor': 9.2.0 + multiformats: 11.0.2 + dev: false + /daisyui@4.10.1(postcss@8.4.38): resolution: {integrity: sha512-Ds0Z0Fv+Xf6ZEqV4Q5JIOeKfg83xxnww0Lzid0V94vPtlQ0yYmucEa33zSctsX2VEgBALtmk5zVEqd59pnUbuQ==} engines: {node: '>=16.9.0'} @@ -7292,6 +7817,11 @@ packages: hasBin: true dev: false + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: false + /devalue@4.3.2: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} dev: true @@ -7325,6 +7855,24 @@ packages: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true + /dns-over-http-resolver@2.1.3: + resolution: {integrity: sha512-zjRYFhq+CsxPAouQWzOsxNMvEN+SHisjzhX8EMxd2Y0EG3thvn6wXQgMJLnTDImkhe4jhLbOQpXtL10nALBOSA==} + dependencies: + debug: 4.3.4 + native-fetch: 4.0.2(undici@5.28.3) + receptacle: 1.3.2 + undici: 5.28.3 + transitivePeerDependencies: + - supports-color + dev: false + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + dev: false + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -7381,6 +7929,13 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false + /electron-fetch@1.9.1: + resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} + engines: {node: '>=6'} + dependencies: + encoding: 0.1.13 + dev: false + /electron-to-chromium@1.4.676: resolution: {integrity: sha512-uHt4FB8SeYdhcOsj2ix/C39S7sPSNFJpzShjxGOm1KdF4MHyGqGi389+T5cErsodsijojXilYaHIKKqJfqh7uQ==} @@ -7411,6 +7966,12 @@ packages: engines: {node: '>= 0.8'} dev: false + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + dependencies: + iconv-lite: 0.6.3 + dev: false + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -7446,6 +8007,10 @@ packages: hasBin: true dev: false + /err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + dev: false + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -8334,6 +8899,15 @@ packages: js-sha3: 0.8.0 dev: false + /ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + dev: false + /ethereum-cryptography@2.1.2: resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} dependencies: @@ -8491,6 +9065,10 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -8777,6 +9355,10 @@ packages: has-symbols: 1.0.3 hasown: 2.0.1 + /get-iterator@1.0.2: + resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} + dev: false + /get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} dev: false @@ -8987,6 +9569,10 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 + /hashlru@2.3.0: + resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} + dev: false + /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -9146,7 +9732,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: true /idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} @@ -9209,6 +9794,31 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true + /interface-datastore@7.0.4: + resolution: {integrity: sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + interface-store: 3.0.4 + nanoid: 4.0.2 + uint8arrays: 4.0.10 + dev: false + + /interface-datastore@8.2.11: + resolution: {integrity: sha512-9E0iXehfp/j0UbZ2mvlYB4K9pP7uQBCppfuy8WHs1EHF6wLQrM9+zwyX+8Qt6HnH4GKZRyXX/CNXm6oD4+QYgA==} + dependencies: + interface-store: 5.1.8 + uint8arrays: 5.0.3 + dev: false + + /interface-store@3.0.4: + resolution: {integrity: sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /interface-store@5.1.8: + resolution: {integrity: sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w==} + dev: false + /internal-slot@1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} @@ -9263,6 +9873,116 @@ packages: resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} dev: false + /ipfs-core-types@0.14.1: + resolution: {integrity: sha512-4ujF8NlM9bYi2I6AIqPP9wfGGX0x/gRCkMoFdOQfxxrFg6HcAdfS+0/irK8mp4e7znOHWReOHeWqCGw+dAPwsw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + '@ipld/dag-pb': 4.1.0 + '@libp2p/interface-keychain': 2.0.5 + '@libp2p/interface-peer-id': 2.0.2 + '@libp2p/interface-peer-info': 1.0.10 + '@libp2p/interface-pubsub': 3.0.7 + '@multiformats/multiaddr': 11.6.1 + '@types/node': 18.19.31 + interface-datastore: 7.0.4 + ipfs-unixfs: 9.0.1 + multiformats: 11.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /ipfs-core-utils@0.18.1: + resolution: {integrity: sha512-P7jTpdfvlyBG3JR4o+Th3QJADlmXmwMxbkjszXry6VAjfSfLIIqXsdeYPoVRkV69GFEeQozuz2k/jR+U8cUH/Q==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + '@libp2p/logger': 2.1.1 + '@multiformats/multiaddr': 11.6.1 + '@multiformats/multiaddr-to-uri': 9.0.8 + any-signal: 3.0.1 + blob-to-it: 2.0.6 + browser-readablestream-to-it: 2.0.6 + err-code: 3.0.1 + ipfs-core-types: 0.14.1 + ipfs-unixfs: 9.0.1 + ipfs-utils: 9.0.14 + it-all: 2.0.1 + it-map: 2.0.1 + it-peekable: 2.0.1 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + multiformats: 11.0.2 + nanoid: 4.0.2 + parse-duration: 1.1.0 + timeout-abort-controller: 3.0.0 + uint8arrays: 4.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /ipfs-http-client@60.0.1: + resolution: {integrity: sha512-amwM5TNuf077J+/q27jPHfatC05vJuIbX6ZnlYLjc2QsjOCKsORNBqV3brNw7l+fPrijV1yrwEDLG3JEnKsfMw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + '@ipld/dag-cbor': 9.2.0 + '@ipld/dag-json': 10.2.0 + '@ipld/dag-pb': 4.1.0 + '@libp2p/logger': 2.1.1 + '@libp2p/peer-id': 2.0.4 + '@multiformats/multiaddr': 11.6.1 + any-signal: 3.0.1 + dag-jose: 4.0.0 + err-code: 3.0.1 + ipfs-core-types: 0.14.1 + ipfs-core-utils: 0.18.1 + ipfs-utils: 9.0.14 + it-first: 2.0.1 + it-last: 2.0.1 + merge-options: 3.0.4 + multiformats: 11.0.2 + parse-duration: 1.1.0 + stream-to-it: 0.2.4 + uint8arrays: 4.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /ipfs-unixfs@9.0.1: + resolution: {integrity: sha512-jh2CbXyxID+v3jLml9CqMwjdSS9ZRnsGfQGGPOfem0/hT/L48xUeTPvh7qLFWkZcIMhZtG+fnS1teei8x5uGBg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + err-code: 3.0.1 + protobufjs: 7.2.6 + dev: false + + /ipfs-utils@9.0.14: + resolution: {integrity: sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + any-signal: 3.0.1 + browser-readablestream-to-it: 1.0.3 + buffer: 6.0.3 + electron-fetch: 1.9.1 + err-code: 3.0.1 + is-electron: 2.2.2 + iso-url: 1.2.1 + it-all: 1.0.6 + it-glob: 1.0.2 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + nanoid: 3.3.7 + native-fetch: 3.0.0(node-fetch@2.7.0) + node-fetch: 2.7.0 + react-native-fetch-api: 3.0.0 + stream-to-it: 0.2.4 + transitivePeerDependencies: + - encoding + dev: false + /iron-webcrypto@1.0.0: resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} dev: false @@ -9286,6 +10006,10 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -9344,6 +10068,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + /is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + dev: false + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -9532,6 +10260,11 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /iso-url@1.2.1: + resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} + engines: {node: '>=12'} + dev: false + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} @@ -9586,6 +10319,69 @@ packages: istanbul-lib-report: 3.0.1 dev: true + /it-all@1.0.6: + resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} + dev: false + + /it-all@2.0.1: + resolution: {integrity: sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-first@2.0.1: + resolution: {integrity: sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-glob@1.0.2: + resolution: {integrity: sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==} + dependencies: + '@types/minimatch': 3.0.5 + minimatch: 3.1.2 + dev: false + + /it-last@2.0.1: + resolution: {integrity: sha512-uVMedYW0wa2Cx0TAmcOCLbfuLLII7+vyURmhKa8Zovpd+aBTMsmINtsta2n364wJ5qsEDBH+akY1sUtAkaYBlg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-map@2.0.1: + resolution: {integrity: sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-peekable@2.0.1: + resolution: {integrity: sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-pushable@3.2.3: + resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} + dependencies: + p-defer: 4.0.1 + dev: false + + /it-stream-types@1.0.5: + resolution: {integrity: sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-stream-types@2.0.1: + resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /it-to-stream@1.0.0: + resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} + dependencies: + buffer: 6.0.3 + fast-fifo: 1.3.2 + get-iterator: 1.0.2 + p-defer: 3.0.0 + p-fifo: 1.0.0 + readable-stream: 3.6.2 + dev: false + /jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -10218,6 +11014,10 @@ packages: resolution: {integrity: sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q==} dev: true + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -10760,6 +11560,20 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /multiformats@11.0.2: + resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /multiformats@12.1.3: + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /multiformats@13.1.0: + resolution: {integrity: sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==} + dev: false + /multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} dev: false @@ -10777,10 +11591,32 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + dev: false + /napi-wasm@1.1.0: resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} dev: false + /native-fetch@3.0.0(node-fetch@2.7.0): + resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} + peerDependencies: + node-fetch: '*' + dependencies: + node-fetch: 2.7.0 + dev: false + + /native-fetch@4.0.2(undici@5.28.3): + resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} + peerDependencies: + undici: '*' + dependencies: + undici: 5.28.3 + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -11118,6 +11954,23 @@ packages: engines: {node: '>=12.20'} dev: true + /p-defer@3.0.0: + resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} + engines: {node: '>=8'} + dev: false + + /p-defer@4.0.1: + resolution: {integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==} + engines: {node: '>=12'} + dev: false + + /p-fifo@1.0.0: + resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} + dependencies: + fast-fifo: 1.3.2 + p-defer: 3.0.0 + dev: false + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -11172,6 +12025,19 @@ packages: p-limit: 4.0.0 dev: true + /p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + engines: {node: '>=18'} + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.2 + dev: false + + /p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + dev: false + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -11200,6 +12066,10 @@ packages: dependencies: callsites: 3.1.0 + /parse-duration@1.1.0: + resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} + dev: false + /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -11623,6 +12493,11 @@ packages: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} dev: false + /progress-events@1.0.0: + resolution: {integrity: sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: @@ -11649,6 +12524,25 @@ packages: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true + /protobufjs@7.2.6: + resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.11.20 + long: 5.2.3 + dev: false + /proxy-compare@2.5.1: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} requiresBuild: true @@ -11811,6 +12705,12 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-native-fetch-api@3.0.0: + resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} + dependencies: + p-defer: 3.0.0 + dev: false + /react-native-webview@11.26.1(react-native@0.73.4)(react@18.2.0): resolution: {integrity: sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw==} peerDependencies: @@ -11963,6 +12863,12 @@ packages: tslib: 2.6.2 dev: false + /receptacle@1.3.2: + resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} + dependencies: + ms: 2.1.3 + dev: false + /redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -12113,6 +13019,10 @@ packages: signal-exit: 3.0.7 dev: true + /retimer@3.0.0: + resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -12240,7 +13150,6 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true /sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} @@ -12393,6 +13302,36 @@ packages: kind-of: 6.0.3 dev: false + /sharp@0.33.3: + resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} + engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.0 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.3 + '@img/sharp-darwin-x64': 0.33.3 + '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-linux-arm': 0.33.3 + '@img/sharp-linux-arm64': 0.33.3 + '@img/sharp-linux-s390x': 0.33.3 + '@img/sharp-linux-x64': 0.33.3 + '@img/sharp-linuxmusl-arm64': 0.33.3 + '@img/sharp-linuxmusl-x64': 0.33.3 + '@img/sharp-wasm32': 0.33.3 + '@img/sharp-win32-ia32': 0.33.3 + '@img/sharp-win32-x64': 0.33.3 + dev: false + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -12426,6 +13365,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -12649,6 +13594,12 @@ packages: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: false + /stream-to-it@0.2.4: + resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} + dependencies: + get-iterator: 1.0.2 + dev: false + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -13236,6 +14187,12 @@ packages: xtend: 4.0.2 dev: false + /timeout-abort-controller@3.0.0: + resolution: {integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==} + dependencies: + retimer: 3.0.0 + dev: false + /timers-ext@0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: @@ -13505,12 +14462,37 @@ packages: /ufo@1.4.0: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + /uint8-varint@2.0.4: + resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} + dependencies: + uint8arraylist: 2.4.8 + uint8arrays: 5.0.3 + dev: false + + /uint8arraylist@2.4.8: + resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + dependencies: + uint8arrays: 5.0.3 + dev: false + /uint8arrays@3.1.1: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} dependencies: multiformats: 9.9.0 dev: false + /uint8arrays@4.0.10: + resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==} + dependencies: + multiformats: 12.1.3 + dev: false + + /uint8arrays@5.0.3: + resolution: {integrity: sha512-6LBuKji28kHjgPJMkQ6GDaBb1lRwIhyOYq6pDGwYMoDPfImE9SkuYENVmR0yu9yGgs2clHUSY9fKDukR+AXfqQ==} + dependencies: + multiformats: 13.1.0 + dev: false + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -13532,7 +14514,6 @@ packages: engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.0 - dev: true /unenv@1.9.0: resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} @@ -13774,6 +14755,10 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false + /varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: false + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -14523,6 +15508,18 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false + github.com/Arachnid/solidity-stringutils/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461: + resolution: {tarball: https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461} + name: solidity-stringutils + version: 0.0.0 + dev: false + + github.com/OpenZeppelin/openzeppelin-foundry-upgrades/332bd3306242e09520df2685b2edb99ebd7f5d37: + resolution: {tarball: https://codeload.github.com/OpenZeppelin/openzeppelin-foundry-upgrades/tar.gz/332bd3306242e09520df2685b2edb99ebd7f5d37} + name: openzeppelin-foundry-upgrades + version: 0.0.0 + dev: false + github.com/Vectorized/solady/de0f336d2033d04e0f77c923d639c7fbffd48b6d: resolution: {tarball: https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d} name: solady @@ -14535,12 +15532,24 @@ packages: version: 1.0.0 dev: false + github.com/dmfxyz/murky/5feccd1253d7da820f7cccccdedf64471025455d: + resolution: {tarball: https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d} + name: murky + version: 0.0.0 + dev: false + github.com/foundry-rs/forge-std/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3: resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3} name: forge-std version: 1.7.5 dev: false + github.com/foundry-rs/forge-std/93340e7e6127c817e276bc956b4f4ed13d173449: + resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/93340e7e6127c817e276bc956b4f4ed13d173449} + name: forge-std + version: 1.7.6 + dev: false + github.com/taikoxyz/p256-verifier/6ef45b117642786b08a37b4c37c6a6ce151166da: resolution: {tarball: https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da} name: p256-verifier#v0.1.0