From e125ff972e7b2721f425701c893736705a94b3fd Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 13:41:16 +0100 Subject: [PATCH 01/32] build: update node dependencies --- package.json | 26 +-- yarn.lock | 437 ++++++++++++++++++++++++++------------------------- 2 files changed, 239 insertions(+), 224 deletions(-) diff --git a/package.json b/package.json index 4ef3cb848..c0d1e87c3 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "engines": { "node": ">=20" }, - "packageManager": "yarn@4.4.1", + "packageManager": "yarn@4.5.0", "scripts": { "compile": "hardhat compile", "lint:sol": "solhint 'contracts/**/*.sol'", @@ -46,30 +46,30 @@ ] }, "devDependencies": { - "@commitlint/cli": "^19.4.1", - "@commitlint/config-conventional": "^19.4.1", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", "@eslint/compat": "^1.1.1", - "@eslint/js": "^9.9.1", - "@nomicfoundation/hardhat-chai-matchers": "^2.0.7", + "@eslint/js": "^9.11.0", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", "@nomicfoundation/hardhat-ethers": "^3.0.8", "@nomicfoundation/hardhat-ignition": "^0.15.5", "@nomicfoundation/hardhat-ignition-ethers": "^0.15.5", - "@nomicfoundation/hardhat-network-helpers": "^1.0.11", + "@nomicfoundation/hardhat-network-helpers": "^1.0.12", "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.10", + "@nomicfoundation/hardhat-verify": "^2.0.11", "@nomicfoundation/ignition-core": "^0.15.5", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.3.19", "@types/eslint": "^9.6.1", "@types/eslint__js": "^8.42.3", - "@types/mocha": "10.0.7", - "@types/node": "20.16.3", + "@types/mocha": "10.0.8", + "@types/node": "20.16.5", "bigint-conversion": "^2.4.3", "chai": "^4.5.0", "chalk": "^4.1.2", "dotenv": "^16.4.5", - "eslint": "^9.9.1", + "eslint": "^9.11.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-prettier": "^5.2.1", @@ -84,7 +84,7 @@ "hardhat-ignore-warnings": "^0.2.11", "hardhat-tracer": "3.1.0", "hardhat-watcher": "2.5.0", - "husky": "^9.1.5", + "husky": "^9.1.6", "lint-staged": "^15.2.10", "prettier": "^3.3.3", "prettier-plugin-solidity": "^1.4.1", @@ -94,8 +94,8 @@ "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typechain": "^8.3.2", - "typescript": "^5.5.4", - "typescript-eslint": "^8.3.0" + "typescript": "^5.6.2", + "typescript-eslint": "^8.6.0" }, "dependencies": { "@aragon/apps-agent": "2.1.0", diff --git a/yarn.lock b/yarn.lock index e56dacd6e..a3c85b51d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -286,195 +286,194 @@ __metadata: languageName: node linkType: hard -"@commitlint/cli@npm:^19.4.1": - version: 19.4.1 - resolution: "@commitlint/cli@npm:19.4.1" - dependencies: - "@commitlint/format": "npm:^19.3.0" - "@commitlint/lint": "npm:^19.4.1" - "@commitlint/load": "npm:^19.4.0" - "@commitlint/read": "npm:^19.4.0" - "@commitlint/types": "npm:^19.0.3" - execa: "npm:^8.0.1" +"@commitlint/cli@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/cli@npm:19.5.0" + dependencies: + "@commitlint/format": "npm:^19.5.0" + "@commitlint/lint": "npm:^19.5.0" + "@commitlint/load": "npm:^19.5.0" + "@commitlint/read": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" + tinyexec: "npm:^0.3.0" yargs: "npm:^17.0.0" bin: commitlint: cli.js - checksum: 10c0/a829b91e690b3dd44fab9661d7defdb3bd2556f014e122a004b3ffaf25673f2c0916a112db651a9af3168f8ebdc91828d1ee4db7a1f3cef7e7f4ff9b9699aabf + checksum: 10c0/a9fb05f3de2634764a7f36f693f39e90594dfc9174e6293a43c582c6a9181f69b346094790e3268e3482d7bb0d1d29c64e15785fb50278c8628f73750214a398 languageName: node linkType: hard -"@commitlint/config-conventional@npm:^19.4.1": - version: 19.4.1 - resolution: "@commitlint/config-conventional@npm:19.4.1" +"@commitlint/config-conventional@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/config-conventional@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" conventional-changelog-conventionalcommits: "npm:^7.0.2" - checksum: 10c0/aece8757a2263735d9a131b6b2eeeeff2c30106a902b74b0f6de13c1b3724594ed3b94986c1d4bd5ad70b7ba1569ed8b8441ac171dc0343b4d45f733b397011c + checksum: 10c0/a7dc6c0d23a8bc521c8f1083a4a04d605de35485786c9d0953610f85d23411f672676d1c77b4a1bb7c86a974f915df31ac0c95f2bcb02f5efa3a5b897a77a897 languageName: node linkType: hard -"@commitlint/config-validator@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/config-validator@npm:19.0.3" +"@commitlint/config-validator@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/config-validator@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" ajv: "npm:^8.11.0" - checksum: 10c0/7a0d55837fb88b1f05892fed67a9582669331a452de96e4caec0c9a397cd6083701265b066e6e32a259b43737187cd31b15ab02b0459c817ea9e7b75602db3c7 + checksum: 10c0/f04b8c66448c9a4f335d1ac9625393d471d2bcc864adc834eeec52ce19939c25475bf90677504df03ab88869e883b4ebfddff68f99f7652900d6b297ef586643 languageName: node linkType: hard -"@commitlint/ensure@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/ensure@npm:19.0.3" +"@commitlint/ensure@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/ensure@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" lodash.camelcase: "npm:^4.3.0" lodash.kebabcase: "npm:^4.1.1" lodash.snakecase: "npm:^4.1.1" lodash.startcase: "npm:^4.4.0" lodash.upperfirst: "npm:^4.3.1" - checksum: 10c0/66785aeddec70e26766f6bb11b1f78892cabdb97b0b77fb97ca6457578e663188903933d5f64559205dd54754e8c2c4a902e73e1749e34cbe07a4b296e374d72 + checksum: 10c0/94955d424da36a4e9390dfb6e128160d1dcd3ffa20b835a9b6fdd92af46bf8897851f19cbeb9d12a70e9b9c36a993d3a48a60893e74f32fe1b601e1e68484d71 languageName: node linkType: hard -"@commitlint/execute-rule@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/execute-rule@npm:19.0.0" - checksum: 10c0/70d37f25a9af0a6adcd9ae7cadd4a917e8d219d316798469e2957608288d7cab8a3b03f7b132f1229a5ee545bbba139dc801d0006a7df3b756354b3890b9c1bb +"@commitlint/execute-rule@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/execute-rule@npm:19.5.0" + checksum: 10c0/966dfc09ae3fe609527fb49c7773ae210ade9d14a802a92a57ab251900a77d2968aed08df6b34f175bf4ae9bf5d675b52b346e7b10b717e8a635499e4cf42267 languageName: node linkType: hard -"@commitlint/format@npm:^19.3.0": - version: 19.3.0 - resolution: "@commitlint/format@npm:19.3.0" +"@commitlint/format@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/format@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" chalk: "npm:^5.3.0" - checksum: 10c0/857a1784481edad9013514cbcc9ec93af33acc8bd491f5d23625c53fb93841566ce110e3004ecaab7f4f89c9331940fe63b83922a4a81f419e67b70e0dc90e41 + checksum: 10c0/209a3d530d028d483886ea2337d6ec8a95b61119f53f7f1db167b13fd8a204bdcbcd704e649406a0b2285e8424b3bac9e1e6856d2a78f45e176976b9efb76e45 languageName: node linkType: hard -"@commitlint/is-ignored@npm:^19.2.2": - version: 19.2.2 - resolution: "@commitlint/is-ignored@npm:19.2.2" +"@commitlint/is-ignored@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/is-ignored@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" semver: "npm:^7.6.0" - checksum: 10c0/8e416edbf24ec386f6211d4879c002cf82fdebfd1f69556ae2ad62f6ae9b705aa20ea3108529fd44e7d246526c6133851905ee826a83efc81b2f11443a7d03c3 + checksum: 10c0/ac74cd00c45e9054366969d986a952b681283987af09995c369cab29fef693fe2c23d02f15883622759faf1787744828f832096a213992eefb9cfb16785ee02e languageName: node linkType: hard -"@commitlint/lint@npm:^19.4.1": - version: 19.4.1 - resolution: "@commitlint/lint@npm:19.4.1" +"@commitlint/lint@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/lint@npm:19.5.0" dependencies: - "@commitlint/is-ignored": "npm:^19.2.2" - "@commitlint/parse": "npm:^19.0.3" - "@commitlint/rules": "npm:^19.4.1" - "@commitlint/types": "npm:^19.0.3" - checksum: 10c0/d3b455c23480f64fb4939eb78266eee687048a5e3c4203207fb25f6b7bd1f369a8529c659018db20765a6a57f6c161d3f80a01422ca7883b1a4405cd064d8fd6 + "@commitlint/is-ignored": "npm:^19.5.0" + "@commitlint/parse": "npm:^19.5.0" + "@commitlint/rules": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" + checksum: 10c0/8db4d5ca3173949368ed8626316c54554dc6ca0a8eed5c636d043974e1f628e41ddf52119e2251ad402a82ee30d3db20e8a9734452bda9ac7f724b2a152e0a7f languageName: node linkType: hard -"@commitlint/load@npm:^19.4.0": - version: 19.4.0 - resolution: "@commitlint/load@npm:19.4.0" +"@commitlint/load@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/load@npm:19.5.0" dependencies: - "@commitlint/config-validator": "npm:^19.0.3" - "@commitlint/execute-rule": "npm:^19.0.0" - "@commitlint/resolve-extends": "npm:^19.1.0" - "@commitlint/types": "npm:^19.0.3" + "@commitlint/config-validator": "npm:^19.5.0" + "@commitlint/execute-rule": "npm:^19.5.0" + "@commitlint/resolve-extends": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" chalk: "npm:^5.3.0" cosmiconfig: "npm:^9.0.0" cosmiconfig-typescript-loader: "npm:^5.0.0" lodash.isplainobject: "npm:^4.0.6" lodash.merge: "npm:^4.6.2" lodash.uniq: "npm:^4.5.0" - checksum: 10c0/805fd80b1f0e127a03b89405c60535dd89fd6676c749ef86e4a41af787f3c9cae0c18c5d5ce906bd6620f566b37d19a4edff63d21539da4212414fd741e19c72 + checksum: 10c0/72fb5f3b2299cb40374181e4fb630658c7faf0cca775bd15338e9a49f9571134ef25529319b453ed0d68917346949abf88c44f73a132f89d8965d6b3e7347d0b languageName: node linkType: hard -"@commitlint/message@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/message@npm:19.0.0" - checksum: 10c0/753bf18838ebde4464e8f4b346d04d3367fbb90b542db6a54da08aa241497b4050a6ecd09dba4f37f6348855fa86e6625350d596fe5dea7a8dd4faee49ab76a7 +"@commitlint/message@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/message@npm:19.5.0" + checksum: 10c0/72b990ba8c3c41441bff2126f4ea536a635c9768dee7000b4951770ac82c5e0bb4c2d408cf28cadbf51a0abbdb7a09ddd36e0968af0997fcc166596d4c3866a7 languageName: node linkType: hard -"@commitlint/parse@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/parse@npm:19.0.3" +"@commitlint/parse@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/parse@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" conventional-changelog-angular: "npm:^7.0.0" conventional-commits-parser: "npm:^5.0.0" - checksum: 10c0/ede8d5bfb37520337ea7836a68f280cdb4b9788d0586b8be676394b3dd8a7a9626391178c4f94d334c5b8d95ea75c73939c40c8c9d81c372cf7743f5bff3d0e1 + checksum: 10c0/63655cedcf48b29613ef959155ee83f49942406abe40ee6b64ad989a169a0582451dcf15a9c9b69a66011ae451ab2e086fb80c1823cc7ddf275705ff627660b1 languageName: node linkType: hard -"@commitlint/read@npm:^19.4.0": - version: 19.4.0 - resolution: "@commitlint/read@npm:19.4.0" +"@commitlint/read@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/read@npm:19.5.0" dependencies: - "@commitlint/top-level": "npm:^19.0.0" - "@commitlint/types": "npm:^19.0.3" - execa: "npm:^8.0.1" + "@commitlint/top-level": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" git-raw-commits: "npm:^4.0.0" minimist: "npm:^1.2.8" - checksum: 10c0/b0243feeb903fe4bb15bc352b10116451ac280fffbf2220a684e0f01ce4583e558b944ff8a6901f8a70faa0ec6020fa720da70328fb110747dbd4a7162695125 + tinyexec: "npm:^0.3.0" + checksum: 10c0/c2d6f958930e815337a4994779ca1dfcbbb6b81b8f3098cc7380e2cc5ddeae69ebd839b48fecd08950e565d43bc42c479915c578eaf57b3877706bca1fad6b8a languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^19.1.0": - version: 19.1.0 - resolution: "@commitlint/resolve-extends@npm:19.1.0" +"@commitlint/resolve-extends@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/resolve-extends@npm:19.5.0" dependencies: - "@commitlint/config-validator": "npm:^19.0.3" - "@commitlint/types": "npm:^19.0.3" + "@commitlint/config-validator": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" global-directory: "npm:^4.0.1" import-meta-resolve: "npm:^4.0.0" lodash.mergewith: "npm:^4.6.2" resolve-from: "npm:^5.0.0" - checksum: 10c0/5b4c69694ddf63f15499a940f99a39bdf0ae1943eb4731c7ea10572e416e44d6d57280faa8011801f4dc64aa70e55eb3b510c86c8e2b76820dcfe88b421afd4a + checksum: 10c0/10569a46036b7aa93c77dc5001a67bc9f36b340b97b2fd39b5ee95b0efc5e35335c61f86d4ba0bb5a8e6dd49ccf956990cce9ee29cfea9ba567e02668be01841 languageName: node linkType: hard -"@commitlint/rules@npm:^19.4.1": - version: 19.4.1 - resolution: "@commitlint/rules@npm:19.4.1" +"@commitlint/rules@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/rules@npm:19.5.0" dependencies: - "@commitlint/ensure": "npm:^19.0.3" - "@commitlint/message": "npm:^19.0.0" - "@commitlint/to-lines": "npm:^19.0.0" - "@commitlint/types": "npm:^19.0.3" - execa: "npm:^8.0.1" - checksum: 10c0/d2052d193dc04b6fc0588ea57eab8490c408bd725f8c4bdb8aa274dc3b5a6ba45d23b718675c6e69304c4fe6c8e92e45b6d6c9de9a5fef266a50e7a71cf3058a + "@commitlint/ensure": "npm:^19.5.0" + "@commitlint/message": "npm:^19.5.0" + "@commitlint/to-lines": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" + checksum: 10c0/8dc5a6e8277b78e9010f3bbc3aa3af6ac044d82501fb4df91f4edf14214a7dccb9bc9a85f7396872e197726edb506c8301e8b10d9c92e35fb44fe6423a5eeb23 languageName: node linkType: hard -"@commitlint/to-lines@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/to-lines@npm:19.0.0" - checksum: 10c0/9e8836668d176f4ddfa30bd6619cba9764223c5e0a76473c470b373069785ae2eb7af17db67e0e11ff30d8db997d0dd06a148bd8053c71fea1d03fc2278f0e8b +"@commitlint/to-lines@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/to-lines@npm:19.5.0" + checksum: 10c0/7674b4b6887c09e84728b9fa9c986ab77db400bf53ec83aaae84e03e0f3ed33088d450d1f67135f0f7a4cbc1121181775199779e1ca162fe604c902987e3008f languageName: node linkType: hard -"@commitlint/top-level@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/top-level@npm:19.0.0" +"@commitlint/top-level@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/top-level@npm:19.5.0" dependencies: find-up: "npm:^7.0.0" - checksum: 10c0/27ee2797f8d3d75aec3e9bf151b48fdbe4c362effbc2e7a11e6326342af06a29983fea5ad8756587e285c035b5ec45d4c4bc28cd698b62db31ca326db46efb64 + checksum: 10c0/8c1edc513c8d6655606e52d160d31ccd4b13234400ca67d21782798ab66701780b1ec21a7bb411fe8270db7735f10d39d3b0a3e52f3ddd1109b80741eb512bb4 languageName: node linkType: hard -"@commitlint/types@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/types@npm:19.0.3" +"@commitlint/types@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/types@npm:19.5.0" dependencies: "@types/conventional-commits-parser": "npm:^5.0.0" chalk: "npm:^5.3.0" - checksum: 10c0/279454409771097432cb3ecd4930b8f10e99e150b9306e931b69e4e80011a4251f326523bfaba59fcf9a9db7978c76073b7c7c07fbad6b90e045cb0fa2b70047 + checksum: 10c0/f4a93992f43b23cd5af200c69bb73227fdc0f78a6f7ebcda73dad10d558c1ac66ff164aa6dc3c2ddb322c9ed8b1a89b05f458e40d7c440a0358f435d2d71c2df languageName: node linkType: hard @@ -540,10 +539,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.9.1, @eslint/js@npm:^9.9.1": - version: 9.9.1 - resolution: "@eslint/js@npm:9.9.1" - checksum: 10c0/a3a91de2ce78469f7c4eee78c1eba77360706e1d0fa0ace2e19102079bcf237b851217c85ea501dc92c4c3719d60d9df966977abc8554d4c38e3638c1f53dcb2 +"@eslint/js@npm:9.11.0, @eslint/js@npm:^9.11.0": + version: 9.11.0 + resolution: "@eslint/js@npm:9.11.0" + checksum: 10c0/7403aeba28ba9cae3470d149b334a51375eb7fd850f167555c81cc72fe98e5cc5ac3059ccdbe68eb255a49d7498a7288d25429af0c7d20afeb4b3c0748349bb4 languageName: node linkType: hard @@ -554,6 +553,15 @@ __metadata: languageName: node linkType: hard +"@eslint/plugin-kit@npm:^0.2.0": + version: 0.2.0 + resolution: "@eslint/plugin-kit@npm:0.2.0" + dependencies: + levn: "npm:^0.4.1" + checksum: 10c0/00b92bc52ad09b0e2bbbb30591c02a895f0bec3376759562590e8a57a13d096b22f8c8773b6bf791a7cf2ea614123b3d592fd006c51ac5fd0edbb90ea6d8760c + languageName: node + linkType: hard + "@ethereumjs/common@npm:^2.4.0, @ethereumjs/common@npm:^2.6.4": version: 2.6.5 resolution: "@ethereumjs/common@npm:2.6.5" @@ -1321,9 +1329,9 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-chai-matchers@npm:^2.0.7": - version: 2.0.7 - resolution: "@nomicfoundation/hardhat-chai-matchers@npm:2.0.7" +"@nomicfoundation/hardhat-chai-matchers@npm:^2.0.8": + version: 2.0.8 + resolution: "@nomicfoundation/hardhat-chai-matchers@npm:2.0.8" dependencies: "@types/chai-as-promised": "npm:^7.1.3" chai-as-promised: "npm:^7.1.1" @@ -1334,7 +1342,7 @@ __metadata: chai: ^4.2.0 ethers: ^6.1.0 hardhat: ^2.9.4 - checksum: 10c0/bf31afae01d82ca59b15d7452ab4a5f3de793c49a0f21b112abb118dc48f7e78fd3b63a3fb4578c796041b5bd9002228807a1f3f499ca2b6655d807793b9d414 + checksum: 10c0/51e3ee9ff17319180a5f45108514b33437c004b724c591dc6d7d2e9842e24e2d793aaf94ce5316117475021e67c88228283d20c9f45fb0693dd8f6b61674b4ff languageName: node linkType: hard @@ -1381,14 +1389,14 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-network-helpers@npm:^1.0.11": - version: 1.0.11 - resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.11" +"@nomicfoundation/hardhat-network-helpers@npm:^1.0.12": + version: 1.0.12 + resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.12" dependencies: ethereumjs-util: "npm:^7.1.4" peerDependencies: hardhat: ^2.9.5 - checksum: 10c0/67ca879a7fbb5866e9739ee3d4301d7169733f8f4c70affed1a4f15a8da0e8c80e76b1460e9fd4bd713c054714837bf2c3c01da215302609d7ac777033861fe1 + checksum: 10c0/93df80bb824fb9146c354f71637d6deee4b7ba19527eee94b4f79064ccbb8e4e45e14d8e558f6e5c2be17d64429faaef07ac8fe12ef11395c549f7b5fc540722 languageName: node linkType: hard @@ -1418,9 +1426,9 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-verify@npm:^2.0.10": - version: 2.0.10 - resolution: "@nomicfoundation/hardhat-verify@npm:2.0.10" +"@nomicfoundation/hardhat-verify@npm:^2.0.11": + version: 2.0.11 + resolution: "@nomicfoundation/hardhat-verify@npm:2.0.11" dependencies: "@ethersproject/abi": "npm:^5.1.2" "@ethersproject/address": "npm:^5.0.2" @@ -1433,7 +1441,7 @@ __metadata: undici: "npm:^5.14.0" peerDependencies: hardhat: ^2.0.4 - checksum: 10c0/c5b8e214f2dcdda0530dbb338f65e01bbb6e6b0f96930a88c01b1d1cf2def3f470e0bdb362807bb9a7dbe8216f937b55d14ab251d3cccd2208d6b60cebf2c358 + checksum: 10c0/a0a8892027298c13ff3cd39ba1a8e96f98707909b9d7a8d0b1e2bb115a5c4ea4139f730950303c785a92ba5ab9f5e0d4389bb76d69f3ac0689f1a24b408cb177 languageName: node linkType: hard @@ -2124,10 +2132,10 @@ __metadata: languageName: node linkType: hard -"@types/mocha@npm:10.0.7": - version: 10.0.7 - resolution: "@types/mocha@npm:10.0.7" - checksum: 10c0/48a2df4dd02b6e66a11129dca6a23cf0cc3995faf8525286eb851043685bd8b7444780f4bb29a1c42df7559ed63294e5308bfce3a6b862ad2e0359cb21c21329 +"@types/mocha@npm:10.0.8": + version: 10.0.8 + resolution: "@types/mocha@npm:10.0.8" + checksum: 10c0/af01f70cf2888762e79e91219dcc28b5d82c85d9a1c8ba4606d3ae30748be7e2cb9f06d680ad36112c78f5e568d0423a65ba8b7c53d02d37b193787bbc03d088 languageName: node linkType: hard @@ -2147,12 +2155,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:20.16.3": - version: 20.16.3 - resolution: "@types/node@npm:20.16.3" +"@types/node@npm:20.16.5": + version: 20.16.5 + resolution: "@types/node@npm:20.16.5" dependencies: undici-types: "npm:~6.19.2" - checksum: 10c0/907c01d58ae36695fbed0b101e7a14cc2e0c5b9b2ba7904ef21cef093e4aac0649ac2a7a283fc94e19311dd0551d778445dd45fcf2d8bd45c494c9ecd802de69 + checksum: 10c0/6af7994129815010bcbc4cf8221865559c8116ff43e74a6549525c2108267596fc2d18aff5d5ecfe089fb60a119f975631343e2c65c52bfa0955ed9dc56733d6 languageName: node linkType: hard @@ -2202,15 +2210,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.3.0" +"@typescript-eslint/eslint-plugin@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.6.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.3.0" - "@typescript-eslint/type-utils": "npm:8.3.0" - "@typescript-eslint/utils": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" + "@typescript-eslint/scope-manager": "npm:8.6.0" + "@typescript-eslint/type-utils": "npm:8.6.0" + "@typescript-eslint/utils": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -2221,66 +2229,66 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/d5242b16b8602ab5817cf04b35ac7208b6bee530730eeed6eab886667d1f2c5fac1537b3e33c453393090a1c6fcd50f727c07f5168985a00e7d23d1f99576988 + checksum: 10c0/c777f01535b896d3092f9886a67ccf9e50bf9e0f581ffab607c5e95dbf3092299b0d9f3e6041b134d69059a6fa5691785940b81015f73bb9a0e9d1605f6442ea languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/parser@npm:8.3.0" +"@typescript-eslint/parser@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/parser@npm:8.6.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.3.0" - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/typescript-estree": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" + "@typescript-eslint/scope-manager": "npm:8.6.0" + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/typescript-estree": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/8185e7f1f570cded8719cfb1e8147fcbbc5b8796de628d68024d2929ce6fb02d1f6101b741161229e877be1c30c720701e1e1f7c4313dba33d4bb1190a85f705 + checksum: 10c0/3f280d289b486359194d422d89df9896b3f10a6d45cdf851d1d5f3200489271a31ab503c127cb5656f9b0ad6d795dd708b960f21fb105750aac19f41f8f815d1 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/scope-manager@npm:8.3.0" +"@typescript-eslint/scope-manager@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/scope-manager@npm:8.6.0" dependencies: - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" - checksum: 10c0/24d093505d444a07db88f9ab44af04eb738ce523ac3f98b0a641cf3a3ee38d18aff9f72bbf2b2e2d9f45e57c973f31016f1e224cd8ab773f6e7c3477c5a09ad3 + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" + checksum: 10c0/37092ef70171c06854ac67ebfb2255063890c1c6133654e6b15b6adb6d2ab83de4feafd1599f4d02ed71a018226fcb3a389021758ec045e1904fb1798e90b4fe languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/type-utils@npm:8.3.0" +"@typescript-eslint/type-utils@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/type-utils@npm:8.6.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.3.0" - "@typescript-eslint/utils": "npm:8.3.0" + "@typescript-eslint/typescript-estree": "npm:8.6.0" + "@typescript-eslint/utils": "npm:8.6.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/0e4b42ff2bfcd1727893bb7fe5fcf1aa808b45b5f690c249c68ce7aff68ddfba3d8b1565de2f08972915df23fa7ab114c09f507668e9b0b63faf1e34a5091706 + checksum: 10c0/914b4637caa40c102117655a9b4451e0db611a61309ed39d6c57522655463c059f4dfd4e2d7ffdefcc9ab7533be21fb877b740c58f5be11f3530aa29f3d2cb62 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/types@npm:8.3.0" - checksum: 10c0/5cd733af7ffa0cdaa5842f6c5e275b3a5c9b98dc49bf1bb9df1f0b51d346bef2a10a827d886f60492d502218a272e935cef50b4f7c69100217d5b10a2499c7b1 +"@typescript-eslint/types@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/types@npm:8.6.0" + checksum: 10c0/e7051d212252f7d1905b5527b211e335db4ec5bb1d3a52d73c8d2de6ddf5cbc981f2c92ca9ffcef35f7447bda635ea1ccce5f884ade7f243d14f2a254982c698 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.3.0" +"@typescript-eslint/typescript-estree@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.6.0" dependencies: - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -2290,31 +2298,31 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/dd73aa1a9d7b5c7e6238e766e6ecdb6d87a9b28a24815258b7bbdc59c49fb525d3fe15d9b7c672e2220678f9d5fabdd9615e4cd5ee97a102fd46023ec0735d50 + checksum: 10c0/33ab8c03221a797865301f09d1d198c67f8b0e3dbf0d13e41f699dc2740242303a9fcfd7b38302cef318541fdedd832fd6e8ba34a5041a57e9114fa134045385 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/utils@npm:8.3.0" +"@typescript-eslint/utils@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/utils@npm:8.6.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.3.0" - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/typescript-estree": "npm:8.3.0" + "@typescript-eslint/scope-manager": "npm:8.6.0" + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/typescript-estree": "npm:8.6.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/e4e9e820cf4b4775bb66b2293a2a827897edaba88577b63df317b50752a01d542be521cc4842976fbbd93e08b9e273ce9d20e23768d06de68a83d68cc0f68a93 + checksum: 10c0/5b615106342dfdf09f5a73e2554cc0c4d979c262a9a4548eb76ec7045768e0ff0bf0316cf8a5eb5404689cd476fcd335fc84f90eb985557559e42aeee33d687e languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.3.0" +"@typescript-eslint/visitor-keys@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.6.0" dependencies: - "@typescript-eslint/types": "npm:8.3.0" + "@typescript-eslint/types": "npm:8.6.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/4c19216636f2cc25026fe20d2832d857f05c262eba78bc4159121c696199e44cac68443565959f9336372f7686a14b452867300cf4deb3c0507b8dbde88ac0e6 + checksum: 10c0/9bd5d5daee9de7e009fdd1b64b1eca685a699d1b2639373bc279c97e25e769fff56fffef708ef66a2b19bc8bb201d36daf9e7084f0e0872178bfcf9d923b41f3 languageName: node linkType: hard @@ -5090,15 +5098,16 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.9.1": - version: 9.9.1 - resolution: "eslint@npm:9.9.1" +"eslint@npm:^9.11.0": + version: 9.11.0 + resolution: "eslint@npm:9.11.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.11.0" "@eslint/config-array": "npm:^0.18.0" "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:9.9.1" + "@eslint/js": "npm:9.11.0" + "@eslint/plugin-kit": "npm:^0.2.0" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.3.0" "@nodelib/fs.walk": "npm:^1.2.8" @@ -5121,7 +5130,6 @@ __metadata: is-glob: "npm:^4.0.0" is-path-inside: "npm:^3.0.3" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" @@ -5135,7 +5143,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/5e71efda7c0a14ee95436d5cdfed04ee61dfb1d89d7a32b50a424de2e680af82849628ea6581950c2e0726491f786a3cfd0032ce013c1c5093786e475cfdfb33 + checksum: 10c0/3438a78172bc667dc87bc4ad864671bd93231c82c9d366899ea3a77fc3444c8cdd158e7fe3ca1cfe4cb566045b1b36c0ccae9fc20efeb4b187f1a534075a1177 languageName: node linkType: hard @@ -5698,7 +5706,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^8.0.1, execa@npm:~8.0.1": +"execa@npm:~8.0.1": version: 8.0.1 resolution: "execa@npm:8.0.1" dependencies: @@ -6939,12 +6947,12 @@ __metadata: languageName: node linkType: hard -"husky@npm:^9.1.5": - version: 9.1.5 - resolution: "husky@npm:9.1.5" +"husky@npm:^9.1.6": + version: 9.1.6 + resolution: "husky@npm:9.1.6" bin: husky: bin.js - checksum: 10c0/f42efb95a026303eb880898760f802d88409780dd72f17781d2dfc302177d4f80b641cf1f1694f53f6d97c536c7397684133d8c8fe4a4426f7460186a7d1c6b8 + checksum: 10c0/705673db4a247c1febd9c5df5f6a3519106cf0335845027bb50a15fba9b1f542cb2610932ede96fd08008f6d9f49db0f15560509861808b0031cdc0e7c798bac languageName: node linkType: hard @@ -7950,17 +7958,17 @@ __metadata: "@aragon/id": "npm:2.1.1" "@aragon/minime": "npm:1.0.0" "@aragon/os": "npm:4.4.0" - "@commitlint/cli": "npm:^19.4.1" - "@commitlint/config-conventional": "npm:^19.4.1" + "@commitlint/cli": "npm:^19.5.0" + "@commitlint/config-conventional": "npm:^19.5.0" "@eslint/compat": "npm:^1.1.1" - "@eslint/js": "npm:^9.9.1" - "@nomicfoundation/hardhat-chai-matchers": "npm:^2.0.7" + "@eslint/js": "npm:^9.11.0" + "@nomicfoundation/hardhat-chai-matchers": "npm:^2.0.8" "@nomicfoundation/hardhat-ethers": "npm:^3.0.8" "@nomicfoundation/hardhat-ignition": "npm:^0.15.5" "@nomicfoundation/hardhat-ignition-ethers": "npm:^0.15.5" - "@nomicfoundation/hardhat-network-helpers": "npm:^1.0.11" + "@nomicfoundation/hardhat-network-helpers": "npm:^1.0.12" "@nomicfoundation/hardhat-toolbox": "npm:^5.0.0" - "@nomicfoundation/hardhat-verify": "npm:^2.0.10" + "@nomicfoundation/hardhat-verify": "npm:^2.0.11" "@nomicfoundation/ignition-core": "npm:^0.15.5" "@openzeppelin/contracts": "npm:3.4.0" "@openzeppelin/contracts-v4.4": "npm:@openzeppelin/contracts@4.4.1" @@ -7969,13 +7977,13 @@ __metadata: "@types/chai": "npm:^4.3.19" "@types/eslint": "npm:^9.6.1" "@types/eslint__js": "npm:^8.42.3" - "@types/mocha": "npm:10.0.7" - "@types/node": "npm:20.16.3" + "@types/mocha": "npm:10.0.8" + "@types/node": "npm:20.16.5" bigint-conversion: "npm:^2.4.3" chai: "npm:^4.5.0" chalk: "npm:^4.1.2" dotenv: "npm:^16.4.5" - eslint: "npm:^9.9.1" + eslint: "npm:^9.11.0" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-no-only-tests: "npm:^3.3.0" eslint-plugin-prettier: "npm:^5.2.1" @@ -7990,7 +7998,7 @@ __metadata: hardhat-ignore-warnings: "npm:^0.2.11" hardhat-tracer: "npm:3.1.0" hardhat-watcher: "npm:2.5.0" - husky: "npm:^9.1.5" + husky: "npm:^9.1.6" lint-staged: "npm:^15.2.10" openzeppelin-solidity: "npm:2.0.0" prettier: "npm:^3.3.3" @@ -8001,8 +8009,8 @@ __metadata: ts-node: "npm:^10.9.2" tsconfig-paths: "npm:^4.2.0" typechain: "npm:^8.3.2" - typescript: "npm:^5.5.4" - typescript-eslint: "npm:^8.3.0" + typescript: "npm:^5.6.2" + typescript-eslint: "npm:^8.6.0" languageName: unknown linkType: soft @@ -11232,6 +11240,13 @@ __metadata: languageName: node linkType: hard +"tinyexec@npm:^0.3.0": + version: 0.3.0 + resolution: "tinyexec@npm:0.3.0" + checksum: 10c0/138a4f4241aea6b6312559508468ab275a31955e66e2f57ed206e0aaabecee622624f208c5740345f0a66e33478fd065e359ed1eb1269eb6fd4fa25d44d0ba3b + languageName: node + linkType: hard + "tmp@npm:0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -11600,37 +11615,37 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.3.0": - version: 8.3.0 - resolution: "typescript-eslint@npm:8.3.0" +"typescript-eslint@npm:^8.6.0": + version: 8.6.0 + resolution: "typescript-eslint@npm:8.6.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.3.0" - "@typescript-eslint/parser": "npm:8.3.0" - "@typescript-eslint/utils": "npm:8.3.0" + "@typescript-eslint/eslint-plugin": "npm:8.6.0" + "@typescript-eslint/parser": "npm:8.6.0" + "@typescript-eslint/utils": "npm:8.6.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/90134b4b601d6fa582a95c9bee23c254f6ac2ca38aed07986d0a3bb75e1ddfdceeb9650c8647b34148696115d5fe0ce281413e4a8ec001e1e928356242a1756d + checksum: 10c0/d009170af1cffece3a63784c3f6d6f5074fd42d198540f3140dd0fed4f37b1888d59abb5992624099834cae2ea4863b6c526b5f11ecbfd105f41a87e300305db languageName: node linkType: hard -"typescript@npm:^5.5.4": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" +"typescript@npm:^5.6.2": + version: 5.6.2 + resolution: "typescript@npm:5.6.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/422be60f89e661eab29ac488c974b6cc0a660fb2228003b297c3d10c32c90f3bcffc1009b43876a082515a3c376b1eefcce823d6e78982e6878408b9a923199c + checksum: 10c0/3ed8297a8c7c56b7fec282532503d1ac795239d06e7c4966b42d4330c6cf433a170b53bcf93a130a7f14ccc5235de5560df4f1045eb7f3550b46ebed16d3c5e5 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.5.4#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" +"typescript@patch:typescript@npm%3A^5.6.2#optional!builtin": + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=8c6c40" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/73409d7b9196a5a1217b3aaad929bf76294d3ce7d6e9766dd880ece296ee91cf7d7db6b16c6c6c630ee5096eccde726c0ef17c7dfa52b01a243e57ae1f09ef07 + checksum: 10c0/94eb47e130d3edd964b76da85975601dcb3604b0c848a36f63ac448d0104e93819d94c8bdf6b07c00120f2ce9c05256b8b6092d23cf5cf1c6fa911159e4d572f languageName: node linkType: hard From 4eed5ed19bf0ac6628c29611752a8bf1027bcd3b Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 13:42:39 +0100 Subject: [PATCH 02/32] build: update poetry dependencies --- poetry.lock | 767 +++++++++++++++++++++++++++------------------------- 1 file changed, 394 insertions(+), 373 deletions(-) diff --git a/poetry.lock b/poetry.lock index a277c6e25..d7b3cfb7a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -961,15 +961,18 @@ test = ["eth-utils (>=1.0.1,<3)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>= [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "jsonschema" version = "4.23.0" @@ -1101,101 +1104,103 @@ test = ["pytest"] [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, ] [[package]] @@ -1242,22 +1247,22 @@ tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] [[package]] name = "protobuf" -version = "5.28.0" +version = "5.28.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.28.0-cp310-abi3-win32.whl", hash = "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0"}, - {file = "protobuf-5.28.0-cp310-abi3-win_amd64.whl", hash = "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6"}, - {file = "protobuf-5.28.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:532627e8fdd825cf8767a2d2b94d77e874d5ddb0adefb04b237f7cc296748681"}, - {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:018db9056b9d75eb93d12a9d35120f97a84d9a919bcab11ed56ad2d399d6e8dd"}, - {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:6206afcb2d90181ae8722798dcb56dc76675ab67458ac24c0dd7d75d632ac9bd"}, - {file = "protobuf-5.28.0-cp38-cp38-win32.whl", hash = "sha256:eef7a8a2f4318e2cb2dee8666d26e58eaf437c14788f3a2911d0c3da40405ae8"}, - {file = "protobuf-5.28.0-cp38-cp38-win_amd64.whl", hash = "sha256:d001a73c8bc2bf5b5c1360d59dd7573744e163b3607fa92788b7f3d5fefbd9a5"}, - {file = "protobuf-5.28.0-cp39-cp39-win32.whl", hash = "sha256:dde9fcaa24e7a9654f4baf2a55250b13a5ea701493d904c54069776b99a8216b"}, - {file = "protobuf-5.28.0-cp39-cp39-win_amd64.whl", hash = "sha256:853db610214e77ee817ecf0514e0d1d052dff7f63a0c157aa6eabae98db8a8de"}, - {file = "protobuf-5.28.0-py3-none-any.whl", hash = "sha256:510ed78cd0980f6d3218099e874714cdf0d8a95582e7b059b06cabad855ed0a0"}, - {file = "protobuf-5.28.0.tar.gz", hash = "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add"}, + {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"}, + {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"}, + {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"}, + {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"}, + {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"}, + {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"}, + {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"}, + {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"}, + {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"}, ] [[package]] @@ -1303,12 +1308,13 @@ files = [ [[package]] name = "pyunormalize" -version = "15.1.0" -description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent from the Python core Unicode database." +version = "16.0.0" +description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent of the Python core Unicode database." optional = false python-versions = ">=3.6" files = [ - {file = "pyunormalize-15.1.0.tar.gz", hash = "sha256:cf4a87451a0f1cb76911aa97f432f4579e1f564a2f0c84ce488c73a73901b6c1"}, + {file = "pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152"}, + {file = "pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7"}, ] [[package]] @@ -1351,90 +1357,105 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.7.24" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, - {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, - {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, - {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, - {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, - {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, - {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, - {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, - {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, - {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, - {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] @@ -1685,13 +1706,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1748,198 +1769,198 @@ tester = ["eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0. [[package]] name = "websockets" -version = "13.0.1" +version = "13.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.8" files = [ - {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1841c9082a3ba4a05ea824cf6d99570a6a2d8849ef0db16e9c826acb28089e8f"}, - {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c5870b4a11b77e4caa3937142b650fbbc0914a3e07a0cf3131f35c0587489c1c"}, - {file = "websockets-13.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f1d3d1f2eb79fe7b0fb02e599b2bf76a7619c79300fc55f0b5e2d382881d4f7f"}, - {file = "websockets-13.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15c7d62ee071fa94a2fc52c2b472fed4af258d43f9030479d9c4a2de885fd543"}, - {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6724b554b70d6195ba19650fef5759ef11346f946c07dbbe390e039bcaa7cc3d"}, - {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a952fa2ae57a42ba7951e6b2605e08a24801a4931b5644dfc68939e041bc7f"}, - {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17118647c0ea14796364299e942c330d72acc4b248e07e639d34b75067b3cdd8"}, - {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64a11aae1de4c178fa653b07d90f2fb1a2ed31919a5ea2361a38760192e1858b"}, - {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0617fd0b1d14309c7eab6ba5deae8a7179959861846cbc5cb528a7531c249448"}, - {file = "websockets-13.0.1-cp310-cp310-win32.whl", hash = "sha256:11f9976ecbc530248cf162e359a92f37b7b282de88d1d194f2167b5e7ad80ce3"}, - {file = "websockets-13.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c3c493d0e5141ec055a7d6809a28ac2b88d5b878bb22df8c621ebe79a61123d0"}, - {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:699ba9dd6a926f82a277063603fc8d586b89f4cb128efc353b749b641fcddda7"}, - {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf2fae6d85e5dc384bf846f8243ddaa9197f3a1a70044f59399af001fd1f51d4"}, - {file = "websockets-13.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:52aed6ef21a0f1a2a5e310fb5c42d7555e9c5855476bbd7173c3aa3d8a0302f2"}, - {file = "websockets-13.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb2b9a318542153674c6e377eb8cb9ca0fc011c04475110d3477862f15d29f0"}, - {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5df891c86fe68b2c38da55b7aea7095beca105933c697d719f3f45f4220a5e0e"}, - {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac2d146ff30d9dd2fcf917e5d147db037a5c573f0446c564f16f1f94cf87462"}, - {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8ac5b46fd798bbbf2ac6620e0437c36a202b08e1f827832c4bf050da081b501"}, - {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:46af561eba6f9b0848b2c9d2427086cabadf14e0abdd9fde9d72d447df268418"}, - {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b5a06d7f60bc2fc378a333978470dfc4e1415ee52f5f0fce4f7853eb10c1e9df"}, - {file = "websockets-13.0.1-cp311-cp311-win32.whl", hash = "sha256:556e70e4f69be1082e6ef26dcb70efcd08d1850f5d6c5f4f2bcb4e397e68f01f"}, - {file = "websockets-13.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:67494e95d6565bf395476e9d040037ff69c8b3fa356a886b21d8422ad86ae075"}, - {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f9c9e258e3d5efe199ec23903f5da0eeaad58cf6fccb3547b74fd4750e5ac47a"}, - {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6b41a1b3b561f1cba8321fb32987552a024a8f67f0d05f06fcf29f0090a1b956"}, - {file = "websockets-13.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f73e676a46b0fe9426612ce8caeca54c9073191a77c3e9d5c94697aef99296af"}, - {file = "websockets-13.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f613289f4a94142f914aafad6c6c87903de78eae1e140fa769a7385fb232fdf"}, - {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f52504023b1480d458adf496dc1c9e9811df4ba4752f0bc1f89ae92f4f07d0c"}, - {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:139add0f98206cb74109faf3611b7783ceafc928529c62b389917a037d4cfdf4"}, - {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47236c13be337ef36546004ce8c5580f4b1150d9538b27bf8a5ad8edf23ccfab"}, - {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c44ca9ade59b2e376612df34e837013e2b273e6c92d7ed6636d0556b6f4db93d"}, - {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237"}, - {file = "websockets-13.0.1-cp312-cp312-win32.whl", hash = "sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185"}, - {file = "websockets-13.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99"}, - {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa"}, - {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231"}, - {file = "websockets-13.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9"}, - {file = "websockets-13.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75"}, - {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553"}, - {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920"}, - {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329"}, - {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7"}, - {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2"}, - {file = "websockets-13.0.1-cp313-cp313-win32.whl", hash = "sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb"}, - {file = "websockets-13.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b"}, - {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b74593e9acf18ea5469c3edaa6b27fa7ecf97b30e9dabd5a94c4c940637ab96e"}, - {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132511bfd42e77d152c919147078460c88a795af16b50e42a0bd14f0ad71ddd2"}, - {file = "websockets-13.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:165bedf13556f985a2aa064309baa01462aa79bf6112fbd068ae38993a0e1f1b"}, - {file = "websockets-13.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e801ca2f448850685417d723ec70298feff3ce4ff687c6f20922c7474b4746ae"}, - {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30d3a1f041360f029765d8704eae606781e673e8918e6b2c792e0775de51352f"}, - {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67648f5e50231b5a7f6d83b32f9c525e319f0ddc841be0de64f24928cd75a603"}, - {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4f0426d51c8f0926a4879390f53c7f5a855e42d68df95fff6032c82c888b5f36"}, - {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ef48e4137e8799998a343706531e656fdec6797b80efd029117edacb74b0a10a"}, - {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:249aab278810bee585cd0d4de2f08cfd67eed4fc75bde623be163798ed4db2eb"}, - {file = "websockets-13.0.1-cp38-cp38-win32.whl", hash = "sha256:06c0a667e466fcb56a0886d924b5f29a7f0886199102f0a0e1c60a02a3751cb4"}, - {file = "websockets-13.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1f3cf6d6ec1142412d4535adabc6bd72a63f5f148c43fe559f06298bc21953c9"}, - {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fa082ea38d5de51dd409434edc27c0dcbd5fed2b09b9be982deb6f0508d25bc"}, - {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a365bcb7be554e6e1f9f3ed64016e67e2fa03d7b027a33e436aecf194febb63"}, - {file = "websockets-13.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10a0dc7242215d794fb1918f69c6bb235f1f627aaf19e77f05336d147fce7c37"}, - {file = "websockets-13.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59197afd478545b1f73367620407b0083303569c5f2d043afe5363676f2697c9"}, - {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d20516990d8ad557b5abeb48127b8b779b0b7e6771a265fa3e91767596d7d97"}, - {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1a2e272d067030048e1fe41aa1ec8cfbbaabce733b3d634304fa2b19e5c897f"}, - {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad327ac80ba7ee61da85383ca8822ff808ab5ada0e4a030d66703cc025b021c4"}, - {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:518f90e6dd089d34eaade01101fd8a990921c3ba18ebbe9b0165b46ebff947f0"}, - {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68264802399aed6fe9652e89761031acc734fc4c653137a5911c2bfa995d6d6d"}, - {file = "websockets-13.0.1-cp39-cp39-win32.whl", hash = "sha256:a5dc0c42ded1557cc7c3f0240b24129aefbad88af4f09346164349391dea8e58"}, - {file = "websockets-13.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b448a0690ef43db5ef31b3a0d9aea79043882b4632cfc3eaab20105edecf6097"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f55b36d17ac50aa8a171b771e15fbe1561217510c8768af3d546f56c7576cdc"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b9c006cac63772b31abbcd3e3abb6228233eec966bf062e89e7fa7ae0b7333"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b79915a1179a91f6c5f04ece1e592e2e8a6bd245a0e45d12fd56b2b59e559a32"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f40de079779acbcdbb6ed4c65af9f018f8b77c5ec4e17a4b737c05c2db554491"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80e4ba642fc87fa532bac07e5ed7e19d56940b6af6a8c61d4429be48718a380f"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a02b0161c43cc9e0232711eff846569fad6ec836a7acab16b3cf97b2344c060"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aa74a45d4cdc028561a7d6ab3272c8b3018e23723100b12e58be9dfa5a24491"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00fd961943b6c10ee6f0b1130753e50ac5dcd906130dcd77b0003c3ab797d026"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d93572720d781331fb10d3da9ca1067817d84ad1e7c31466e9f5e59965618096"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:71e6e5a3a3728886caee9ab8752e8113670936a193284be9d6ad2176a137f376"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c4a6343e3b0714e80da0b0893543bf9a5b5fa71b846ae640e56e9abc6fbc4c83"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a678532018e435396e37422a95e3ab87f75028ac79570ad11f5bf23cd2a7d8c"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6716c087e4aa0b9260c4e579bb82e068f84faddb9bfba9906cb87726fa2e870"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e33505534f3f673270dd67f81e73550b11de5b538c56fe04435d63c02c3f26b5"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acab3539a027a85d568c2573291e864333ec9d912675107d6efceb7e2be5d980"}, - {file = "websockets-13.0.1-py3-none-any.whl", hash = "sha256:b80f0c51681c517604152eb6a572f5a9378f877763231fddb883ba2f968e8817"}, - {file = "websockets-13.0.1.tar.gz", hash = "sha256:4d6ece65099411cfd9a48d13701d7438d9c34f479046b34c50ff60bb8834e43e"}, + {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, + {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, + {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, + {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, + {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, + {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, + {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, + {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, + {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, + {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, + {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, + {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, + {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, + {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, + {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, + {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, + {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, + {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, + {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, + {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, + {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, + {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, + {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, + {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, + {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, ] [[package]] name = "yarl" -version = "1.11.0" +version = "1.11.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a657db1b9982f3dac0e360614d0e8945d2873da6e681fb7fca23ef1c3eb37f8"}, - {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65a1a05efca52b102691e64db5fcf973030a1c88fee393804ff91f99c95a6e74"}, - {file = "yarl-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4cb417d380e2d77961eecec75aaaf6f7ab14e6de26eb3a498f498029a6556a1"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8aee7c8378c6aa3103b99d1eb9995268ef730fa9f88ea68b9eee4341e204eec9"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84624db40e2358cfd5cf2558b1aaffd93366d27ee32228a97785f2ec87d44a17"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a596bb15e036952549871a4ccd2205679902dc7f241e3ced6b2ab2e44c55795"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d4d2cc4b076c8ad0175a15ee9482a387b3303c97d4b71062db7356b2ac04c7"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f8bc849004122591104793a576e9c747b0e5d9486d6a30225521b817255748"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e38176a559edde0cfff4b663791a007a5f9f90c73aee1d6f7ddbcf6bfb7287b3"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:706ac0f77b45e9e0278ec6c98929764e119d3ce3136792b6475e7ae961da53ec"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:48bac099586cf75ae5837b0ac17a674450d01f451f38afcb02acfc940110b60b"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:540fd5f62fe21f3d1d9efe8af5c4d9dbbb184ce03ce95acb0289500e46215dd2"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05ab59db0bb64e847972373c5cda8924e6605480f6b13cc04573fa0d87bfc637"}, - {file = "yarl-1.11.0-cp310-cp310-win32.whl", hash = "sha256:ddab47748933ac9cf5f29d6e9e2e2060cff40b2751d02c55129661ea4e577152"}, - {file = "yarl-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:976d02274e6d88b24c7131e7b26a083412b2592f2bbcef53d3b00b2508cad26c"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:39e3087e1ef70862de81e22af9eb299faee580f41673ef92829949022791b521"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7fd535cc41b81a566ad347081b671ab5c7e5f5b6a15526d85b4e748baf065cf0"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f7cc02d8e9a612174869f4b983f159e87659096f7e2dc1fe9effd9902e408739"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f391ccf4b1b1e0ba4880075ba337d41a619a5350f67053927f67ebe764bf44"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c19a0d95943bb2c914b4e71043803be34bc75c08c4a6ca232bdc649a1e9ef1b"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ead4d89eade0e09b8ef97877664abb0e2e8704787db5564f83658fdee5c36497"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:195f7791bc23d5f2480efe53f935daf8a61661000dfbfbdd70dbd06397594fff"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a7905e662665ca8e058635377522bc3c98bdb873be761ff42c86eb72b03914"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53c80b1927b75aed208d7fd965a3a705dc8c1db4d50b9112418fa0f7784363e6"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:11af21bbf807688d49b7d4915bb28cbc2e3aa028a2ee194738477eabcc413c65"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:732d56da00ea7a5da4f0d15adbbd22dcb37da7825510aafde40112e53f6baa52"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7bd54d79025b59d1dc5fb26a09734d6a9cc651a04bc381966ed264b28331a168"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aacd62ff67efd54cb18cea2aa7ae4fb83cfbca19a07055d4777266b70561defe"}, - {file = "yarl-1.11.0-cp311-cp311-win32.whl", hash = "sha256:68e14ae71e5b51c8282ae5db53ccb3baffc40e1551370a8a2361f1c1d8a0bf8c"}, - {file = "yarl-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:3ade2265716667b6bd4123d6f684b5f7cf4a8d83dcf1d5581ac44643466bb00a"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6e73dab98e3c3b5441720153e72a5f28e717aac2d22f1ec4b08ef33417d9987e"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4a0d090d296ced05edfe29c6ff34869412fa6a97d0928c12b00939c4842884cd"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d29e446cfb0a82d3df7745968b9fa286665a9be8b4d68de46bcc32d917cb218e"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8dc0efcf8266ecfe057b95e01f43eb62516196a4bbf3918fd1dcb8d0dc0dff"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:202f5ec49ff163dcc767426deb55020a28078e61d6bbe1f80331d92bca53b236"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8055b0d78ce1cafa657c4b455e22661e8d3b2834de66a0753c3567da47fcc4aa"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60ed3c7f64e820959d7f682ec2f559b4f4df723dc09df619d269853a4214a4b4"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2371510367d39d74997acfdcd1dead17938c79c99365482821627f7838a8eba0"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e24bb6a8be89ccc3ce8c47e8940fdfcb7429e9efbf65ce6fa3e7d122fcf0bcf0"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:18ec42da256cfcb9b4cd5d253e04c291f69911a5228d1438a7d431c15ba0ae40"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:418eeb8f228ea36c368bf6782ebd6016ecebfb1a8b90145ef6726ffcbba65ef8"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:07e8cfb1dd7669a129f8fd5df1da65efa73aea77582bde2a3a837412e2863543"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c458483711d393dad51340505c3fab3194748fd06bab311d2f8b5b7a7349e9a"}, - {file = "yarl-1.11.0-cp312-cp312-win32.whl", hash = "sha256:5b008c3127382503e7a1e12b4c3a3236e3dd833a4c62a066f4a0fbd650c655d2"}, - {file = "yarl-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc94be7472b9f88d7441340534a3ecae05c86ccfec7ba75ce5b6e4778b2bfc6e"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a45e51ba3777031e0b20c1e7ab59114ed4e1884b3c1db48962c1d8d08aefb418"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:765128029218eade3a01187cdd7f375977cc827505ed31828196c8ae9b622928"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2516e238daf0339c8ac4dfab9d7cda9afad652ff073517f200d653d5d8371f7e"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10be62bee117f05b1ad75a6c2538ca9e5367342dc8a4f3c206c87dadbc1189c"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50ceaeda771ee3e382291168c90c7ede62b63ecf3e181024bcfeb35c0ea6c84f"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a601c99fc20fd0eea84e7bc0dc9e7f196f55a0ded67242d724988c754295538"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42ff79371614764fc0a4ab8eaba9adb493bf9ad856e2a4664f6c754fc907a903"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93fca4c9f88c17ead902b3f3285b2d039fc8f26d117e1441973ba64315109b54"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e7dddf5f41395c84fc59e0ed5493b24bfeb39fb04823e880b52c8c55085d4695"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ea501ea07e14ba6364ff2621bfc8b2381e5b1e10353927fa9a607057fd2b98e5"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a4f7e470f2c9c8b8774a5bda72adfb8e9dc4ec32311fe9bdaa4921e36cf6659b"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:361fdb3993431157302b7104d525092b5df4d7d346df5a5ffeee2d1ca8e0d15b"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e300eaf5e0329ad31b3d53e2f3d26b4b6dff1217207c6ab1d4212967b54b2185"}, - {file = "yarl-1.11.0-cp313-cp313-win32.whl", hash = "sha256:f1e2d4ce72e06e38a16da3e9c24a0520dbc19018a69ef6ed57b6b38527cb275c"}, - {file = "yarl-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:fa9de2f87be58f714a230bd1f3ef3aad1ed65c9931146e3fc55f85fcbe6bacc3"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:24da0b38274727fe9266d09229987e7f0efdb97beb94c0bb2d327d65f112e78d"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0310eb2e63872de66047e05ad9982f2e53ad6405dc42fa60d7cc670bf6ca8aa8"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:52433604340a4ab3d1f32281c6eb9ad9b47c99435b4212f763121bf7348c8c00"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e2eb182d59f0845a79434003f94b4f61cd69465248f9388c2e5bf2191c9f7f"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dd10f0fe0e0f659926c1da791de5bef05fd48974ad74618c9168e302e2b7cc"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:121d3798e4bb35a4321b2422cb887f80ea39f94bf52f0eb5cb2c168bb0043c9b"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8bbac56c80610dd659ace534765d7bcd2488f6600023f6984f35108b2b3f4f0"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79d420399f0e82e302236a762d8b8ceec89761ce3b30c83ac1d4d6e29f811444"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a726fb50588307dfe1d233b67535d493fb0bb157bdbfda6bb34e04189f2f57"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9057f5de2fade7440e6db358913bc7ae8de43ba72c83cf95420a1fc1a6c6b59e"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6471d747d0ac8059895e66d32ca8630c8db5b572ca7763150d0927eaa257df67"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d97cb22ad380850754fa16ef8d490d9340d8573d81f73429f3975e8e87db0586"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fe78dec8caeda1e7b353cbd8aa0cc5a5bc182b22998d64ec8fa9ee59c898ab3b"}, - {file = "yarl-1.11.0-cp38-cp38-win32.whl", hash = "sha256:7ff371002fbbb79613269d76a2932c99979dac15fac30107064ef70d25f35474"}, - {file = "yarl-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:4fa9d762eee63eed767895d68b994c58e29f809292a4d0fca483e9cc6fdc22c8"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4ae63bc65e5bf8843bd1eca46e75eaa9eb157e0312fb362123181512892daad8"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d1bd3262e00043907e0a6d7d4f7b7a4815281acc25699a2384552870c79f1f0"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c58656c2e0b41b5d325130b8da4f8e216aad10029e7de5c523a6be25faa9fe8"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9425c333575fce5e0fb414b766492c6ba4aa335ef910a7540dbdefe58a78232e"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dc66e2420e1e282105071934883bbb9c37c16901b5b8aa0a8aee370b477eac6"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2949067359d1ef5bf3228c7f1deb102c209832a13df5419239f99449bc1d3fa9"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006fe73f851cf20b9986b3b4cc15239795bd5da9c3fda76bb3e043da5bec4ff"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:969ad4ee3892e893471b6572bbf2bbb091f93e7c81de25d6b3a5c0a5126e5ccb"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c9fbe9dc6ee8bfe1af34137e3add6f0e49799dd5467dd6af189d27616879161e"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69a45c711fea9b783b592a75f26f6dc59b2e4a923b97bf6eec357566fcb1d922"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1a29b82c42a7791ffe53ee6dfbf29acc61ea7ec05643dcacc50510ed6187b897"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ed0c090f00c3fc024f7b0799cab9dd7c419fcd8f1a00634d1f9952bab7e7bfb2"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:31df9d9b3fe6e15decee629fc7976a5fb21eaa39e290f60e57e1d422827194c6"}, - {file = "yarl-1.11.0-cp39-cp39-win32.whl", hash = "sha256:fcb7c36ba8b663a5900e6d40533f0e698ba0f38f744aad5410d4e38129e41a70"}, - {file = "yarl-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c6c0d640bad721834a737e25267fb71d296684ada21ca7d5ad2e63da7b73f1b7"}, - {file = "yarl-1.11.0-py3-none-any.whl", hash = "sha256:03717a6627e55934b2a1d9caf24f299b461a2e8d048a90920f42ad5c20ae1b82"}, - {file = "yarl-1.11.0.tar.gz", hash = "sha256:f86f4f4a57a29ef08fa70c4667d04c5e3ba513500da95586208b285437cb9592"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, + {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, + {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, + {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, + {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, + {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, + {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, + {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, + {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, + {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, + {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, + {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, + {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, + {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, + {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, ] [package.dependencies] From caf4241ed27917eb2cd9f59224460421caf67034 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 16:03:40 +0100 Subject: [PATCH 03/32] docs: update contributions guide --- CONTRIBUTING.md | 341 +++++++++--------- ...ccounting.ts => accounting.integration.ts} | 0 ...n-shares.ts => burn-shares.integration.ts} | 2 +- ....ts => protocol-happy-path.integration.ts} | 2 +- 4 files changed, 174 insertions(+), 171 deletions(-) rename test/integration/{accounting.ts => accounting.integration.ts} (100%) rename test/integration/{burn-shares.ts => burn-shares.integration.ts} (98%) rename test/integration/{protocol-happy-path.ts => protocol-happy-path.integration.ts} (99%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ae9af8064..745725e49 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,36 +8,40 @@ improving the documentation, your contribution is valuable and your effort to ma ### Opening an Issue +> [!IMPORTANT] +> For bugs in contracts and protocol vulnerabilities, please refer to the [Bug Bounty](/README.md#bug-bounty) program! + Issues are a great way to contribute to the project by reporting bugs or suggesting enhancements. -- **Bug Reports**. If you encounter a bug, please report it using the GitHub issues feature. Check first to ensure the - bug hasn't already been reported. If it has, you can contribute further by adding more detail to the existing report. - _Note that this only relates to off-chain code (tests, scripts, etc.), for bugs in contracts and protocol - vulnerabilities, please refer to [Bug Bounty](/README.md#bug-bounty)_. +- **Bug Reports**: If you encounter a bug, please report it using the GitHub issues feature. Before submitting, check if + the bug has already been reported. If it has, you can contribute by adding more details to the existing report. This + only applies to off-chain code (tests, scripts, etc.). For on-chain code, please refer to + the [Bug Bounty](/README.md#bug-bounty) program. - **Feature Requests**: Have an idea for a new feature or an improvement to an existing one? Submit a feature request - through the GitHub issues, detailing your proposed enhancements and how they would benefit the Lido Finance Core. + through GitHub issues, detailing your proposed enhancements and how they would benefit the Lido Finance Core. ### Improving Documentation -Good documentation is crucial for any project. If you have suggestions for improving the documentation, or if you've -noticed an omission or error, making these corrections is a significant contribution. Whether it's a typo, additional -examples, or clearer explanations, your help in making the documentation more accessible and understandable is highly -appreciated. +Good documentation is crucial for any project. If you notice areas where the documentation can be improved, whether it's +fixing typos, adding examples, or clarifying explanations, your contributions are highly valued. These improvements help +make the project more accessible and understandable for everyone. + +For more extensive documentation, visit the [Lido Docs repository](https://github.com/lidofinance/docs). -For expansive documentation, visit the [Lido Docs repo](https://github.com/lidofinance/docs). +### Contributing to the Codebase -### Contributing to the codebase +Resolving open issues is a valuable way to contribute to the project. Browse through existing issues to find something +that interests you or matches your expertise. Don't hesitate to ask for more information or clarification before you +start working on an issue. -Contributing by resolving open issues is a valuable way to help improve the project. Look through the existing issues -for something that interests you or matches your expertise. Don't hesitate to ask for more information or clarification -if needed before starting. If you're interested in improving tooling and CI in this repository, consider opening a -feature request issue first to discuss it with the community of contributors. +If you're interested in improving tooling and CI in this repository, consider opening a feature request issue first to +discuss your ideas with the community of contributors. -If you have a bigger idea on how to improve the protocol, consider publishing your proposal -to [Lido Forum](https://research.lido.fi/). +For larger ideas on how to improve the protocol, consider publishing your proposal in +the [Lido Forum](https://research.lido.fi/). -## Getting started +## Getting Started ### Requirements @@ -47,7 +51,7 @@ to [Lido Forum](https://research.lido.fi/). > [!NOTE] > On macOS with Homebrew, it is recommended to install Node.js using [`n`](https://github.com/tj/n) -> or [`nvm`](https://github.com/nvm-sh/nvm) version managers. +> or [`nvm`](https://github.com/nvm-sh/nvm) version managers. > Example setup process using `n` package manager for zsh users: > > ```bash @@ -64,231 +68,230 @@ to [Lido Forum](https://research.lido.fi/). > Installation is local and doesn't require root privileges. -Install dependencies +To set up the project: + +#### Clone the Repository ```bash -yarn install +git clone https://github.com/lidofinance/core.git lido-core +cd lido-core ``` -### Test +#### Install Project Dependencies + +```bash +yarn install +``` -Run Hardhat tests +#### Verify Setup with Tests (Optional) ```bash yarn test ``` -See `package.json` for more commands. +If you encounter any issues during setup, please open an issue on GitHub. -## Local deployment +## Repository Structure -WIP +### Contracts -## Conventions +Production contracts are located in the `/contracts` directory at the root of the project. Subdirectory names indicate the +Solidity version of the contracts they contain. For example, contracts in `/contracts/0.4.24` are written in Solidity v0.4.24. +Common interfaces and libraries shared by contracts of different versions are located in the `/contracts/common` subdirectory. -All contributions must follow the established conventions: +### Tests -1. All Solidity code must be autoformatted using Solhint. Contracts largely follow - the [Official Solidity Guide](https://docs.soliditylang.org/en/latest/style-guide.html) with some exceptions. When - writing contracts, refer to existing contracts for conventions, naming patterns, formatting, etc. -2. All TypeScript code must be autoformatted using ESLint. When writing tests and scripts, please refer to existing - codebase. -3. Commit messages must follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format. +This repository uses both Hardhat and Foundry for testing: -The repository includes a commit hook that checks your code and commit messages, resolve any issues before submitting a -pull request. +- Hardhat offers greater flexibility for writing complex tests. +- Foundry's fuzzing capabilities provide better coverage of edge cases. -## Branches +All tests are all located in `/tests` at the root of the project. +Each subdirectory name corresponds to the version of the contract being tested, mirroring the `/contracts` directory +structure. Integration, regression, and other non-unit tests are placed into corresponding subdirectories, +e.g. `/tests/integration`, `/tests/regression`, etc. -### `master` +For creating mocks or harness contracts for external dependencies, refer to the [Mocking and Harnessing Contracts](#mocking-and-harnessing-contracts) section for guidance. -The production branch of the protocol and the default branch of the repository. -The [deployed protocol contracts](https://docs.lido.fi/deployed-contracts/) must match what is stored in -the `/contracts` directory. Pull requests to `master` must originate from the `develop` branch and have at least one -approving review before merging. +#### Unit Tests -### `develop` +Unit tests are crucial for ensuring the functionality of individual contracts and their components. These tests should be written using Hardhat and placed in the `/tests` directory. Each subdirectory should correspond to the version of the contract being tested, mirroring the structure of the `/contracts` directory. -The development branch. All pull requests to `master` must be submitted to `develop` first for peer review. If -appropriate, delete the feature branch after merging to `develop`. +Follow the naming convention `*.test.ts` for unit test files, such as `myContract.test.ts`. This convention aids in the easy identification and organization of tests. -## Repository structure +##### Coverage -### Contracts +The project utilizes the `hardhat-coverage` plugin to generate coverage reports. Note that Foundry tests are not included in the coverage. -All production contracts are located in `/contracts` at the root of the project. The subdirectory names indicate the -Solidity version of the contracts inside, e.g. the contracts in `/contracts/0.4.24` are all written in Solidity v0.4.24. -Common interfaces and libraries shared by contracts with different versions are located in `/contracts/common` -subdirectory. +#### Integration Tests -### Tests +Integration tests are located in the `/tests/integration` directory at the root of the project. These tests verify the interaction between different contracts and their behavior in real-world scenarios. The naming convention for integration tests follows the `*.integration.ts` postfix, for example, `myScenario.integration.ts`. -This repository features a Hardhat-Foundry dual setup: +To run integration tests, ensure you have a `.env` file in the root of the project. You can use the `.env.example` file as a template. -- Hardhat gives much more flexibility when writing complex tests; -- The Foundry's fuzzing capabilities enable better coverage of edge cases. +#### Fuzzing and Invariant Tests -#### Hardhat +Foundry's Solidity tests are specifically used for fuzzing library contracts or functions that perform complex calculations +or byte manipulation. These Solidity tests are located under `/tests` and organized into appropriate subdirectories. The naming conventions follow Foundry's [documentation](https://book.getfoundry.sh/tutorials/best-practices#general-test-guidance): -Hardhat tests are all located in `/tests` at the root of the project. -Each subdirectory name corresponds to the version of the contract being tested, mirroring the `/contracts` directory -structure. Integration, regression, and other non-unit tests are placed into corresponding subdirectories, -e.g. `/tests/integration/`, ` /tests/regression`, etc. +- For tests, use the `.t.sol` postfix (e.g., `MyContract.t.sol`). +- For scripts, use the `.s.sol` postfix (e.g., `MyScript.s.sol`). +- For helpers, use the `.h.sol` postfix (e.g., `MyHelper.h.sol`). -##### Tracing +It is crucial to follow these naming conventions to distinguish Hardhat test files from Foundry-related files, ensuring the +proper execution of Hardhat tests. -During Hardhat tests, the `hardhat-tracer` is used to trace contract calls and state changes. -Full-scale transaction tracing is disabled by default because it can significantly slow down the tests. +#### Mocking and Harnessing Contracts -> [!NOTE] -> Tracing is ONLY supported in Hardhat unit tests and integration tests using Hardhat mainnet fork (see below). +The `/tests` directory also contains contract mocks and helpers, which are placed in the `.../contracts` subdirectory, +e.g., `/tests/0.4.24/contracts`. Mocks and helpers do not need to be written using the same version of Solidity as the +contract being tested. For example, it is acceptable to have a mock contract written in Solidity v0.8.9 +in `/tests/0.4.24/contracts`. -To enable tracing, you need to wrap the code you want to trace with the `Tracer.enable()` and `Tracer.disable()` -functions and run the tests with the appropriate command postfix, e.g. `yarn test:trace`. +- Use the `__Harness` postfix for wrappers that expose private functions of a contract and may include test-specific + actions. For example, `MyContract__Harness.sol` or `MyContract__HarnessForAnotherContract.sol`. +- Use the `__Mock` postfix for contracts that simulate the behavior of the target contract. For example, + `MyContract__Mock.sol` or `MyContract__MockForAnotherContract.sol`. -```typescript -import { Tracer } from "test/suite"; +### Library -describe("MyContract", () => { - it("should do something", async () => { - Tracer.enable(); - // code to trace - Tracer.disable(); - }); -}); -``` +TypeScript utilities and helpers are located in the `/lib` directory at the root of the project. When adding a new file to this directory, ensure you re-export all new modules from the `/lib/index.ts` file to maintain clean and organized import statements. -##### Unit tests +### Typechain Types -Unit tests are located in `/tests` at the root of the project. -These tests are designed to verify the behavior of individual contracts and functions. -Naming conventions follow utilizes the `*.test.ts` postfix, e.g. `myContract.test.ts`. +The Typechain types are located in the `/typechain-types` directory at the root of the project. -If you require mocks or wrappers for external contracts, please place them in the appropriate subdirectories, such as -`/tests/0.4.24/contracts` and adhere to the naming conventions: +> [!WARNING] +> Do not manually edit any files in this directory, as they are autogenerated with each compilation. -- Use the `Mock` postfix for self-established contracts that simulate the behavior of the target contract. For example, - `MyContract_Mock.sol` or `MyContract_MockForAnotherContract.sol`. -- Use the `Harness` postfix for a wrapper that exposes private functions of a contract and may include test-specific - actions. For example, `MyContract_Wrapper.sol` or `MyContract_WrapperForAnotherContract.sol`. +If you encounter issues with your IDE not properly indexing this directory and causing import errors, try the following solutions: -You can run unit tests in multiple ways: +- Open the `/typechain-types/index.ts` file to prompt the IDE to index it. +- Delete the `/typechain-types` directory and recompile the project using `yarn hardhat compile --force`. -```bash -yarn test # Run all tests in parallel -yarn test:sequential # Run all tests sequentially -yarn test:trace # Run all tests with trace logging (calls only) -yarn test:fulltrace # Run all tests with full trace logging (calls and storage ops) -yarn test:watch # Run all tests in watch mode -``` +### Configuration Files -##### Integration tests +All configuration files can be found in the root directory of the project. This includes files for environment variables, build settings, and other project-specific configurations. -Integration tests are located in `/tests/integration` at the root of the project. -These tests are used to verify the interaction between different contracts and their behavior in a real-world scenario. -Naming conventions follow the `*.int.ts` postfix, e.g. `myScenario.int.ts`. +## Conventions -You can run integration tests in multiple ways, but for all of them, you need to have a `.env` file in the root of -the project (you can use `.env.example` as a template). +All contributions must adhere to the following established conventions. -###### Hardhat Mainnet Fork +### Solidity Code -This is the most common way to run integration tests. It uses instance of Hardhat Network that forks mainnet -environment. Requires `MAINNET_FORKING_URL` to be set in the `.env` file along with some `MAINNET_*` env variables (see -`.env.example`). +- Must be autoformatted using Solhint +- Generally follows the [Official Solidity Style Guide](https://docs.soliditylang.org/en/latest/style-guide.html), with + some project-specific exceptions +- When writing new contracts, refer to existing ones for project-specific conventions, naming patterns, and formatting -```bash -yarn test:integration # Run all integration tests -yarn test:integration:trace # Run all integration tests with trace logging (calls only) -yarn test:integration:fulltrace # Run all integration tests with full trace logging (calls and storage ops) -``` +### TypeScript Code -###### Hardhat Scratch Deploy Fork +- Must be autoformatted using ESLint +- Follow patterns and conventions established in the existing codebase for tests and scripts -This method is used to run integration tests against a Hardhat local scratch deployment instead of the mainnet fork. -Requires `DEPLOYER`, `GENESIS_TIME`, `GAS_PRIORITY_FEE` and `GAS_MAX_FEE` to be set in the `.env` file. +### Commit Messages -```bash -yarn test:integration:scratch # Run all integration tests -yarn test:integration:scratch:trace # Run all integration tests with trace logging (calls only) -yarn test:integration:scratch:fulltrace # Run all integration tests with full trace logging (calls and storage ops) -``` +- Must follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format -###### Any Mainnet Fork +### Code Quality -This method is used to run integration tests against any fork. Requires `MAINNET_*` env variables to be set in the -`.env` file and a fork to be running on port `8545`. +- The repository includes a pre-commit hook that checks code formatting and commit message structure +- Resolve any issues flagged by the pre-commit hook before submitting a pull request -```bash -yarn test:integration:fork:mainnet -``` +### Documentation -###### Any Scratch Deploy Fork +- Keep inline comments and documentation up-to-date with code changes +- For significant changes, update relevant sections of the project documentation -This method is used to run integration tests against a local scratch deployment -(see [scratch-deploy.md](./docs/scratch-deploy.md)). -Requires a local deployment to be running on port `8555` and `deployed-local.json` with the deployed addresses -(automatically generated during the scratch deployment). +### Testing -```bash -yarn test:integration:fork:local -``` +- Write appropriate tests (unit tests, integration tests, and fuzzing tests) for new features or bug fixes +- Ensure all tests pass before submitting a pull request -#### Foundry tests +Distinguishing Hardhat test files from Foundry-related files is crucial for proper test execution and maintaining code consistency. For any questions, contact the maintainers. -Foundry's Solidity tests are used only for fuzzing library contracts or functions performing complex calculations -or byte juggling. Solidity tests are located under ` / tests` and in the appropriate subdirectories. Naming conventions -follow the Foundry's [documentation](https://book.getfoundry.sh/tutorials/best-practices#general-test-guidance): +## Branches -- for tests, postfix `.t.sol` is used (e.g., `MyContract.t.sol`) -- for scripts, postfix `.s.sol` is used (e.g., `MyScript.s.sol`) -- for helpers, postfix `.h.sol` is used (e.g., `MyHelper.h.sol`). +### `master` -Following the convention of distinguishing Hardhat test files from Foundry-related files is essential to ensure the -proper execution of Hardhat tests. +This is the production branch and the default branch of the repository. +The [deployed protocol contracts](https://docs.lido.fi/deployed-contracts/) must match the contracts stored in the +`/contracts` directory. All pull requests to `master` must originate from the `develop` branch and require at least +one approving review before merging. -```bash -yarn test:foundry # Run all Foundry tests -``` +### `develop` -#### Coverage +This is the main development branch. All pull requests to `master` should be submitted to `develop` first +for peer review. -The project uses the `hardhat-coverage` plugin to generate coverage reports. -Foundry tests are not included in the coverage. +## Local deployment -To generate coverage reports, run the following command: +WIP -```bash -yarn test:coverage -``` +## CI/CD Integration -#### Mocks +To integrate the core repository's integration tests into other repositories using GitHub Actions, you can follow the example workflow below. This workflow demonstrates how to set up and run integration tests from the core repository in another repository. -The `/tests` directory also contains contract mocks and helpers which are placed in the `.../contracts` subdirectory, -e.g. `/tests/0.4.24/contracts`. Mocks and helpers **DO NOT** have to be written using the version of Solidity of the -contract being tested. For example, it is okay to have a mock contract written in Solidity v0.8.9 -in `/tests/0.4.24/contracts`. +By default, the workflow will run the integration tests against the latest version of the deployed protocol on Ethereum Mainnet utilizing contract addresses from [deployed protocol contracts](https://docs.lido.fi/deployed-contracts/). -### Library +
+Example GitHub Actions workflow file + +```yaml +name: Run Lido Core Integration Tests + +on: ... + +jobs: + run-core-integration-tests: + runs-on: ubuntu-latest + timeout-minutes: 120 -TypeScript utilities and helpers are located in `/lib` at the root of the project. When adding a new file to this -directory, please re-export everything from the `/lib/index.ts` file to keep the import statement clean. + services: + mainnet-fork: + image: hardhat/hardhat:2.22.8 # note: this is an example image, choose the appropriate one for your needs + ports: + - 8545:8545 + env: + ETH_RPC_URL: ${{ secrets.ETH_RPC_URL }} -### Typechain types + steps: + ### steps to update the deployed protocol (optional) ### -All the Typechain types are placed in `/typechain-types` at the root of the project. DO NOT manually edit in this -directory. -These types are autogenerated on each compilation. + - uses: actions/checkout@v4 + with: + repository: lidofinance/core + ref: master + path: core -There have been issues with IDEs failing to properly index this directory resulting in import errors. If you are -experiencing similar issues, the solutions above should resolve them: + - name: Enable corepack + shell: bash + run: corepack enable -- open the `/typechain-types/index.ts` file to force the IDE to index it; -- delete the directory and re-compile `yarn hardhat compile --force`. + - uses: actions/setup-node@v4 + with: + node-version-file: ./core/.nvmrc + cache: yarn -### Config files + - name: Install dependencies + working-directory: core + shell: bash + run: yarn install + + - name: Set env + working-directory: core + shell: bash + run: cp .env.example .env + + - name: Run integration tests + working-directory: core + shell: bash + run: yarn test:integration:fork:mainnet + env: + LOG_LEVEL: debug # optional +``` -All configuration files are located at the root of the project. +
## Code of Conduct diff --git a/test/integration/accounting.ts b/test/integration/accounting.integration.ts similarity index 100% rename from test/integration/accounting.ts rename to test/integration/accounting.integration.ts diff --git a/test/integration/burn-shares.ts b/test/integration/burn-shares.integration.ts similarity index 98% rename from test/integration/burn-shares.ts rename to test/integration/burn-shares.integration.ts index 5f5821cdd..b8d7b6c55 100644 --- a/test/integration/burn-shares.ts +++ b/test/integration/burn-shares.integration.ts @@ -10,7 +10,7 @@ import { finalizeWithdrawalQueue, handleOracleReport } from "lib/protocol/helper import { Snapshot } from "test/suite"; -describe("Burn Shares", () => { +describe("Burn Shares integration", () => { let ctx: ProtocolContext; let snapshot: string; diff --git a/test/integration/protocol-happy-path.ts b/test/integration/protocol-happy-path.integration.ts similarity index 99% rename from test/integration/protocol-happy-path.ts rename to test/integration/protocol-happy-path.integration.ts index e798eb4a9..f907a890c 100644 --- a/test/integration/protocol-happy-path.ts +++ b/test/integration/protocol-happy-path.integration.ts @@ -23,7 +23,7 @@ const SIMPLE_DVT_MODULE_ID = 2n; const ZERO_HASH = new Uint8Array(32).fill(0); -describe("Happy Path", () => { +describe("Protocol happy path integration", () => { let ctx: ProtocolContext; let snapshot: string; From ebc8d28d2b54281317d11fd8d1172ae01b2434bb Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 17:02:52 +0100 Subject: [PATCH 04/32] docs: improve test running section --- CONTRIBUTING.md | 172 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 150 insertions(+), 22 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 745725e49..db86b3e5e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -95,9 +95,10 @@ If you encounter any issues during setup, please open an issue on GitHub. ### Contracts -Production contracts are located in the `/contracts` directory at the root of the project. Subdirectory names indicate the -Solidity version of the contracts they contain. For example, contracts in `/contracts/0.4.24` are written in Solidity v0.4.24. -Common interfaces and libraries shared by contracts of different versions are located in the `/contracts/common` subdirectory. +Production contracts are located in the `/contracts` directory at the root of the project. Subdirectory names indicate +the Solidity version of the contracts they contain. For example, contracts in `/contracts/0.4.24` are written in +Solidity v0.4.24. Common interfaces and libraries shared by contracts of different versions are located in the +`/contracts/common` subdirectory. ### Tests @@ -111,35 +112,45 @@ Each subdirectory name corresponds to the version of the contract being tested, structure. Integration, regression, and other non-unit tests are placed into corresponding subdirectories, e.g. `/tests/integration`, `/tests/regression`, etc. -For creating mocks or harness contracts for external dependencies, refer to the [Mocking and Harnessing Contracts](#mocking-and-harnessing-contracts) section for guidance. +For creating mocks or harness contracts for external dependencies, refer to +the [Mocking and Harnessing Contracts](#mocking-and-harnessing-contracts) section for guidance. #### Unit Tests -Unit tests are crucial for ensuring the functionality of individual contracts and their components. These tests should be written using Hardhat and placed in the `/tests` directory. Each subdirectory should correspond to the version of the contract being tested, mirroring the structure of the `/contracts` directory. +Unit tests are crucial for ensuring the functionality of individual contracts and their components. These tests should +be written using Hardhat and placed in the `/tests` directory. Each subdirectory should correspond to the version of the +contract being tested, mirroring the structure of the `/contracts` directory. -Follow the naming convention `*.test.ts` for unit test files, such as `myContract.test.ts`. This convention aids in the easy identification and organization of tests. +Follow the naming convention `*.test.ts` for unit test files, such as `myContract.test.ts`. This convention aids in the +easy identification and organization of tests. ##### Coverage -The project utilizes the `hardhat-coverage` plugin to generate coverage reports. Note that Foundry tests are not included in the coverage. +The project utilizes the `hardhat-coverage` plugin to generate coverage reports. Note that Foundry tests are not +included in the coverage. #### Integration Tests -Integration tests are located in the `/tests/integration` directory at the root of the project. These tests verify the interaction between different contracts and their behavior in real-world scenarios. The naming convention for integration tests follows the `*.integration.ts` postfix, for example, `myScenario.integration.ts`. +Integration tests are located in the `/tests/integration` directory at the root of the project. These tests verify the +interaction between different contracts and their behavior in real-world scenarios. The naming convention for +integration tests follows the `*.integration.ts` postfix, for example, `myScenario.integration.ts`. -To run integration tests, ensure you have a `.env` file in the root of the project. You can use the `.env.example` file as a template. +To run integration tests, ensure you have a `.env` file in the root of the project. You can use the `.env.example` file +as a template. #### Fuzzing and Invariant Tests -Foundry's Solidity tests are specifically used for fuzzing library contracts or functions that perform complex calculations -or byte manipulation. These Solidity tests are located under `/tests` and organized into appropriate subdirectories. The naming conventions follow Foundry's [documentation](https://book.getfoundry.sh/tutorials/best-practices#general-test-guidance): +Foundry's Solidity tests are specifically used for fuzzing library contracts or functions that perform complex +calculations or byte manipulation. These Solidity tests are located under `/tests` and organized into appropriate +subdirectories. The naming conventions follow +Foundry's [documentation](https://book.getfoundry.sh/tutorials/best-practices#general-test-guidance): - For tests, use the `.t.sol` postfix (e.g., `MyContract.t.sol`). - For scripts, use the `.s.sol` postfix (e.g., `MyScript.s.sol`). - For helpers, use the `.h.sol` postfix (e.g., `MyHelper.h.sol`). -It is crucial to follow these naming conventions to distinguish Hardhat test files from Foundry-related files, ensuring the -proper execution of Hardhat tests. +It is crucial to follow these naming conventions to distinguish Hardhat test files from Foundry-related files, ensuring +the proper execution of Hardhat tests. #### Mocking and Harnessing Contracts @@ -155,7 +166,9 @@ in `/tests/0.4.24/contracts`. ### Library -TypeScript utilities and helpers are located in the `/lib` directory at the root of the project. When adding a new file to this directory, ensure you re-export all new modules from the `/lib/index.ts` file to maintain clean and organized import statements. +TypeScript utilities and helpers are located in the `/lib` directory at the root of the project. When adding a new file +to this directory, ensure you re-export all new modules from the `/lib/index.ts` file to maintain clean and organized +import statements. ### Typechain Types @@ -164,14 +177,16 @@ The Typechain types are located in the `/typechain-types` directory at the root > [!WARNING] > Do not manually edit any files in this directory, as they are autogenerated with each compilation. -If you encounter issues with your IDE not properly indexing this directory and causing import errors, try the following solutions: +If you encounter issues with your IDE not properly indexing this directory and causing import errors, try the following +solutions: - Open the `/typechain-types/index.ts` file to prompt the IDE to index it. - Delete the `/typechain-types` directory and recompile the project using `yarn hardhat compile --force`. ### Configuration Files -All configuration files can be found in the root directory of the project. This includes files for environment variables, build settings, and other project-specific configurations. +All configuration files can be found in the root directory of the project. This includes files for environment +variables, build settings, and other project-specific configurations. ## Conventions @@ -179,14 +194,14 @@ All contributions must adhere to the following established conventions. ### Solidity Code -- Must be autoformatted using Solhint +- Must be auto-formatted using Solhint - Generally follows the [Official Solidity Style Guide](https://docs.soliditylang.org/en/latest/style-guide.html), with some project-specific exceptions - When writing new contracts, refer to existing ones for project-specific conventions, naming patterns, and formatting ### TypeScript Code -- Must be autoformatted using ESLint +- Must be auto-formatted using ESLint - Follow patterns and conventions established in the existing codebase for tests and scripts ### Commit Messages @@ -208,7 +223,8 @@ All contributions must adhere to the following established conventions. - Write appropriate tests (unit tests, integration tests, and fuzzing tests) for new features or bug fixes - Ensure all tests pass before submitting a pull request -Distinguishing Hardhat test files from Foundry-related files is crucial for proper test execution and maintaining code consistency. For any questions, contact the maintainers. +Distinguishing Hardhat test files from Foundry-related files is crucial for proper test execution and maintaining code +consistency. For any questions, contact the maintainers. ## Branches @@ -228,11 +244,123 @@ for peer review. WIP -## CI/CD Integration +## Tests -To integrate the core repository's integration tests into other repositories using GitHub Actions, you can follow the example workflow below. This workflow demonstrates how to set up and run integration tests from the core repository in another repository. +### Tracing -By default, the workflow will run the integration tests against the latest version of the deployed protocol on Ethereum Mainnet utilizing contract addresses from [deployed protocol contracts](https://docs.lido.fi/deployed-contracts/). +The `hardhat-tracer` tool is utilized during Hardhat tests to trace contract calls and state changes. +Full-scale transaction tracing is disabled by default to prevent tests from slowing down. + +> [!NOTE] +> Tracing is supported ONLY in Hardhat unit and integration tests using the Hardhat mainnet fork (see below). + +To enable tracing, wrap the code intended for tracing with the `Tracer.enable()` and `Tracer.disable()` functions, and +execute +the tests with the appropriate command postfix, such as `yarn test:trace`. + +```typescript +import { Tracer } from "test/suite"; + +describe("MyContract", () => { + it("should do something", async () => { + Tracer.enable(); + // code to trace + Tracer.disable(); + }); +}); +``` + +### Running Unit Tests + +You can run unit tests in multiple ways: + +```bash +# Unit Tests +yarn test # Run all unit tests in parallel +yarn test:sequential # Run all unit tests sequentially +yarn test:trace # Run all unit tests with trace logging (calls only) +yarn test:fulltrace # Run all unit tests with full trace logging (calls and storage ops) +yarn test:watch # Run all unit tests in watch mode (useful for development; use .only to run specific tests, supports tracing) +yarn test:coverage # Run all unit tests and generate a coverage report +``` + +### Running Fuzzing and Invariant Tests + +```bash +yarn test:foundry # Run all Foundry-based fuzzing and invariant tests +``` + +### Running Integration Tests + +To run integration tests, ensure you have a `.env` file in the root of the project. You can use the `.env.example` file. +There are several ways to run integration tests, please choose the most appropriate one. + +#### On Mainnet Fork via Hardhat Network (with Tracing) + +By default, integration tests are executed on a Hardhat Network (mainnet-fork). This method is the most common for +running integration tests as it utilizes an instance of the Hardhat Network that forks the mainnet environment and +allows running integration tests with trace logging. + +> [!NOTE] +> Ensure that `MAINNET_FORKING_URL` and other `MAINNET_*` environment variables are set in the `.env` file (refer to +> `.env.example` for guidance). + +```bash +yarn test:integration # Run all integration tests +yarn test:integration:trace # Run all integration tests with trace logging (calls only) +yarn test:integration:fulltrace # Run all integration tests with full trace logging (calls and storage ops) +``` + +#### On Mainnet Fork Using Separate Ethereum Development Environment (without Tracing) + +This method is for running tests on a separate Ethereum development environment, such as a local Anvil instance. + +> [!NOTE] +> Ensure that `MAINNET_RPC_URL` and other `MAINNET_*` environment variables are configured in the `.env` file. + +```bash +yarn test:integration:fork:mainnet +``` + +#### On Scratch Deployment of Protocol via Hardhat Network (with Tracing) + +Consult the [Scratch Deploy](./docs/scratch-deploy.md) documentation for more details. +This method allows running integration tests against a scratch deployment on the Hardhat Network. The necessary +deployment scripts will be automatically provisioned. + +> [!NOTE] +> This approach runs integration tests against a local Hardhat scratch deployment instead of a mainnet fork. +> Ensure that `DEPLOYER`, `GENESIS_TIME`, `GAS_PRIORITY_FEE`, and `GAS_MAX_FEE` are set in the `.env` file. + +```bash +yarn test:integration:scratch # Run all integration tests +yarn test:integration:scratch:trace # Run all integration tests with trace logging (calls only) +yarn test:integration:scratch:fulltrace # Run all integration tests with full trace logging (calls and storage ops) +``` + +#### On Scratch Deployment of Protocol via Local Ethereum Development Environment (e.g., Anvil, Hardhat Network, Ganache) (without Tracing) + +This method enables running integration tests against a local deployment using alternative Ethereum nodes such as Anvil, +Hardhat Network, or Ganache. + +> [!NOTE] +> Ensure that a local deployment is running on port `8555` and that the `deployed-local.json` file with the deployed +> addresses is available. This file is automatically generated during the scratch deployment process. Refer +> to [scratch-deploy.md](./docs/scratch-deploy.md) for more details. This setup is controlled by the `LOCAL_RPC_URL` and +> `LOCAL_*` environment variables. + +```bash +yarn test:integration:fork:local +``` + +## Adding CI/CD Integration Tests Workflow to Other Repositories + +To integrate the core repository's integration tests into other repositories using GitHub Actions, you can follow the +example workflow below. This workflow demonstrates how to set up and run integration tests from the core repository in +another repository. + +By default, the workflow will run the integration tests against the latest version of the deployed protocol on Ethereum +Mainnet utilizing contract addresses from [deployed protocol contracts](https://docs.lido.fi/deployed-contracts/).
Example GitHub Actions workflow file From 42677fa6e21dde328ea6dce161f4b8b89d080362 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 17:14:22 +0100 Subject: [PATCH 05/32] docs: some word juggling --- CONTRIBUTING.md | 100 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 31 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index db86b3e5e..69986917a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -248,15 +248,20 @@ WIP ### Tracing -The `hardhat-tracer` tool is utilized during Hardhat tests to trace contract calls and state changes. -Full-scale transaction tracing is disabled by default to prevent tests from slowing down. +During Hardhat tests, the `hardhat-tracer` tool can trace contract calls and state changes, which is helpful for +debugging and analyzing contract interactions. However, full-scale transaction tracing is disabled by default to +maintain optimal test performance. > [!NOTE] -> Tracing is supported ONLY in Hardhat unit and integration tests using the Hardhat mainnet fork (see below). +> Tracing is supported only in Hardhat unit and integration tests using the Hardhat mainnet fork (see below for +> details). -To enable tracing, wrap the code intended for tracing with the `Tracer.enable()` and `Tracer.disable()` functions, and -execute -the tests with the appropriate command postfix, such as `yarn test:trace`. +To enable tracing: + +- Wrap the code you want to trace with `Tracer.enable()` and `Tracer.disable()` functions. +- Run the tests with the appropriate command that enables tracing (e.g., `yarn test:trace`). + +Here's an example: ```typescript import { Tracer } from "test/suite"; @@ -272,76 +277,108 @@ describe("MyContract", () => { ### Running Unit Tests -You can run unit tests in multiple ways: +Unit tests can be run in multiple ways, depending on your needs: ```bash -# Unit Tests -yarn test # Run all unit tests in parallel -yarn test:sequential # Run all unit tests sequentially -yarn test:trace # Run all unit tests with trace logging (calls only) -yarn test:fulltrace # Run all unit tests with full trace logging (calls and storage ops) -yarn test:watch # Run all unit tests in watch mode (useful for development; use .only to run specific tests, supports tracing) -yarn test:coverage # Run all unit tests and generate a coverage report +# Run all unit tests in parallel +yarn test + +# Run all unit tests sequentially +yarn test:sequential + +# Run all unit tests with trace logging (calls only) +yarn test:trace + +# Run all unit tests with full trace logging (calls and storage operations) +yarn test:fulltrace + +# Run all unit tests in watch mode (useful during development) +# Supports tracing; use .only in your test files to focus on specific tests +yarn test:watch + +# Run all unit tests and generate a coverage report +yarn test:coverage ``` +> [!NOTE] +> The best way to run single test or test suite is to use `.only` in the test file and run any test command except the +> parallel one. + ### Running Fuzzing and Invariant Tests +Fuzzing and invariant tests help ensure that your contracts behave correctly under a wide range of inputs and +conditions. These tests are crucial for catching edge cases and potential vulnerabilities. + ```bash yarn test:foundry # Run all Foundry-based fuzzing and invariant tests ``` ### Running Integration Tests -To run integration tests, ensure you have a `.env` file in the root of the project. You can use the `.env.example` file. -There are several ways to run integration tests, please choose the most appropriate one. +Before running integration tests, ensure you have a `.env` file in the root of the project with the necessary +environment variables configured. You can use the `.env.example` file as a template. + +There are several ways to run integration tests; choose the one that best fits your requirements. #### On Mainnet Fork via Hardhat Network (with Tracing) -By default, integration tests are executed on a Hardhat Network (mainnet-fork). This method is the most common for -running integration tests as it utilizes an instance of the Hardhat Network that forks the mainnet environment and -allows running integration tests with trace logging. +This is the most common method for running integration tests. It uses an instance of the Hardhat Network that forks the +mainnet environment, allowing you to run integration tests with trace logging. > [!NOTE] > Ensure that `MAINNET_FORKING_URL` and other `MAINNET_*` environment variables are set in the `.env` file (refer to > `.env.example` for guidance). ```bash -yarn test:integration # Run all integration tests -yarn test:integration:trace # Run all integration tests with trace logging (calls only) -yarn test:integration:fulltrace # Run all integration tests with full trace logging (calls and storage ops) +# Run all integration tests +yarn test:integration + +# Run all integration tests with trace logging (calls only) +yarn test:integration:trace + +# Run all integration tests with full trace logging (calls and storage operations) +yarn test:integration:fulltrace ``` #### On Mainnet Fork Using Separate Ethereum Development Environment (without Tracing) -This method is for running tests on a separate Ethereum development environment, such as a local Anvil instance. +This method is suitable for running integration tests on a local mainnet fork using an alternative Ethereum node, such +as Anvil. Tracing is not supported in this setup. > [!NOTE] > Ensure that `MAINNET_RPC_URL` and other `MAINNET_*` environment variables are configured in the `.env` file. ```bash +# Run integration tests on a local mainnet fork yarn test:integration:fork:mainnet ``` #### On Scratch Deployment of Protocol via Hardhat Network (with Tracing) -Consult the [Scratch Deploy](./docs/scratch-deploy.md) documentation for more details. -This method allows running integration tests against a scratch deployment on the Hardhat Network. The necessary -deployment scripts will be automatically provisioned. +This method allows you to run integration tests against a scratch deployment on the Hardhat Network. Deployment scripts +will be automatically executed. > [!NOTE] > This approach runs integration tests against a local Hardhat scratch deployment instead of a mainnet fork. > Ensure that `DEPLOYER`, `GENESIS_TIME`, `GAS_PRIORITY_FEE`, and `GAS_MAX_FEE` are set in the `.env` file. +For more details, refer to the [Scratch Deploy](./docs/scratch-deploy.md) documentation. + ```bash -yarn test:integration:scratch # Run all integration tests -yarn test:integration:scratch:trace # Run all integration tests with trace logging (calls only) -yarn test:integration:scratch:fulltrace # Run all integration tests with full trace logging (calls and storage ops) +# Run all integration tests against a scratch deployment +yarn test:integration:scratch + +# Run all integration tests with trace logging (calls only) +yarn test:integration:scratch:trace + +# Run all integration tests with full trace logging (calls and storage operations) +yarn test:integration:scratch:fulltrace ``` #### On Scratch Deployment of Protocol via Local Ethereum Development Environment (e.g., Anvil, Hardhat Network, Ganache) (without Tracing) -This method enables running integration tests against a local deployment using alternative Ethereum nodes such as Anvil, -Hardhat Network, or Ganache. +This method enables you to run integration tests against a local deployment using alternative Ethereum nodes like Anvil, +Hardhat Network, or Ganache. Tracing is not supported in this setup. > [!NOTE] > Ensure that a local deployment is running on port `8555` and that the `deployed-local.json` file with the deployed @@ -350,6 +387,7 @@ Hardhat Network, or Ganache. > `LOCAL_*` environment variables. ```bash +# Run integration tests against a local deployment yarn test:integration:fork:local ``` From 0426b002b879b1a01788ff03891b57b14e239f09 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 17:40:02 +0100 Subject: [PATCH 06/32] chore: test naming --- test/integration/accounting.integration.ts | 2 +- test/integration/burn-shares.integration.ts | 2 +- test/integration/protocol-happy-path.integration.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/accounting.integration.ts b/test/integration/accounting.integration.ts index 21d37677c..ef47c7c68 100644 --- a/test/integration/accounting.integration.ts +++ b/test/integration/accounting.integration.ts @@ -29,7 +29,7 @@ const SIMPLE_DVT_MODULE_ID = 2n; const ZERO_HASH = new Uint8Array(32).fill(0); -describe("Accounting integration", () => { +describe("Accounting", () => { let ctx: ProtocolContext; let ethHolder: HardhatEthersSigner; diff --git a/test/integration/burn-shares.integration.ts b/test/integration/burn-shares.integration.ts index b8d7b6c55..5f5821cdd 100644 --- a/test/integration/burn-shares.integration.ts +++ b/test/integration/burn-shares.integration.ts @@ -10,7 +10,7 @@ import { finalizeWithdrawalQueue, handleOracleReport } from "lib/protocol/helper import { Snapshot } from "test/suite"; -describe("Burn Shares integration", () => { +describe("Burn Shares", () => { let ctx: ProtocolContext; let snapshot: string; diff --git a/test/integration/protocol-happy-path.integration.ts b/test/integration/protocol-happy-path.integration.ts index f907a890c..7ed7353d2 100644 --- a/test/integration/protocol-happy-path.integration.ts +++ b/test/integration/protocol-happy-path.integration.ts @@ -23,7 +23,7 @@ const SIMPLE_DVT_MODULE_ID = 2n; const ZERO_HASH = new Uint8Array(32).fill(0); -describe("Protocol happy path integration", () => { +describe("Protocol Happy Path", () => { let ctx: ProtocolContext; let snapshot: string; From f0ad8eeeec4f5d2bbf8e027c65421a8afbdd8202 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 18:14:59 +0100 Subject: [PATCH 07/32] chore: fix some typos --- CONTRIBUTING.md | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 69986917a..9bb9f8adf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ improving the documentation, your contribution is valuable and your effort to ma ### Opening an Issue -> [!IMPORTANT] +> [!CAUTION] > For bugs in contracts and protocol vulnerabilities, please refer to the [Bug Bounty](/README.md#bug-bounty) program! Issues are a great way to contribute to the project by reporting bugs or suggesting enhancements. @@ -17,7 +17,6 @@ Issues are a great way to contribute to the project by reporting bugs or suggest the bug has already been reported. If it has, you can contribute by adding more details to the existing report. This only applies to off-chain code (tests, scripts, etc.). For on-chain code, please refer to the [Bug Bounty](/README.md#bug-bounty) program. - - **Feature Requests**: Have an idea for a new feature or an improvement to an existing one? Submit a feature request through GitHub issues, detailing your proposed enhancements and how they would benefit the Lido Finance Core. @@ -49,9 +48,9 @@ the [Lido Forum](https://research.lido.fi/). - [Yarn](https://yarnpkg.com/) installed via corepack (see below) - [Foundry](https://book.getfoundry.sh/) latest available version -> [!NOTE] -> On macOS with Homebrew, it is recommended to install Node.js using [`n`](https://github.com/tj/n) -> or [`nvm`](https://github.com/nvm-sh/nvm) version managers. +> [!TIP] +> On macOS with Homebrew, it is recommended to install Node.js using [`n`](https://github.com/tj/n) or [ +> `nvm`](https://github.com/nvm-sh/nvm) version managers. > Example setup process using `n` package manager for zsh users: > > ```bash @@ -107,10 +106,9 @@ This repository uses both Hardhat and Foundry for testing: - Hardhat offers greater flexibility for writing complex tests. - Foundry's fuzzing capabilities provide better coverage of edge cases. -All tests are all located in `/tests` at the root of the project. -Each subdirectory name corresponds to the version of the contract being tested, mirroring the `/contracts` directory -structure. Integration, regression, and other non-unit tests are placed into corresponding subdirectories, -e.g. `/tests/integration`, `/tests/regression`, etc. +All tests are located in `/tests` at the root of the project. Each subdirectory name corresponds to the version of the +contract being tested, mirroring the `/contracts` directory structure. Integration, regression, and other non-unit tests +are placed into corresponding subdirectories, e.g., `/tests/integration`, `/tests/regression`, etc. For creating mocks or harness contracts for external dependencies, refer to the [Mocking and Harnessing Contracts](#mocking-and-harnessing-contracts) section for guidance. @@ -124,10 +122,9 @@ contract being tested, mirroring the structure of the `/contracts` directory. Follow the naming convention `*.test.ts` for unit test files, such as `myContract.test.ts`. This convention aids in the easy identification and organization of tests. -##### Coverage - -The project utilizes the `hardhat-coverage` plugin to generate coverage reports. Note that Foundry tests are not -included in the coverage. +> [!NOTE] +> The project utilizes the `hardhat-coverage` plugin to generate coverage reports. Foundry-based tests are not included +> in the coverage. #### Integration Tests @@ -135,8 +132,9 @@ Integration tests are located in the `/tests/integration` directory at the root interaction between different contracts and their behavior in real-world scenarios. The naming convention for integration tests follows the `*.integration.ts` postfix, for example, `myScenario.integration.ts`. -To run integration tests, ensure you have a `.env` file in the root of the project. You can use the `.env.example` file -as a template. +> [!IMPORTANT] +> To run integration tests, ensure you have a `.env` file in the root of the project. You can use the `.env.example` +> file as a template. #### Fuzzing and Invariant Tests @@ -156,8 +154,8 @@ the proper execution of Hardhat tests. The `/tests` directory also contains contract mocks and helpers, which are placed in the `.../contracts` subdirectory, e.g., `/tests/0.4.24/contracts`. Mocks and helpers do not need to be written using the same version of Solidity as the -contract being tested. For example, it is acceptable to have a mock contract written in Solidity v0.8.9 -in `/tests/0.4.24/contracts`. +contract being tested. For example, it is acceptable to have a mock contract written in Solidity v0.8.9 in +`/tests/0.4.24/contracts`. - Use the `__Harness` postfix for wrappers that expose private functions of a contract and may include test-specific actions. For example, `MyContract__Harness.sol` or `MyContract__HarnessForAnotherContract.sol`. @@ -232,15 +230,15 @@ consistency. For any questions, contact the maintainers. This is the production branch and the default branch of the repository. The [deployed protocol contracts](https://docs.lido.fi/deployed-contracts/) must match the contracts stored in the -`/contracts` directory. All pull requests to `master` must originate from the `develop` branch and require at least -one approving review before merging. +`/contracts` directory. All pull requests to `master` must originate from the `develop` branch and require at least one +approving review before merging. ### `develop` -This is the main development branch. All pull requests to `master` should be submitted to `develop` first -for peer review. +This is the main development branch. All pull requests to `master` should be submitted to `develop` first for peer +review. -## Local deployment +## Local Deployment WIP @@ -300,8 +298,8 @@ yarn test:watch yarn test:coverage ``` -> [!NOTE] -> The best way to run single test or test suite is to use `.only` in the test file and run any test command except the +> [!TIP] +> The best way to run a single test or test suite is to use `.only` in the test file and run any test command except the > parallel one. ### Running Fuzzing and Invariant Tests @@ -359,8 +357,8 @@ This method allows you to run integration tests against a scratch deployment on will be automatically executed. > [!NOTE] -> This approach runs integration tests against a local Hardhat scratch deployment instead of a mainnet fork. -> Ensure that `DEPLOYER`, `GENESIS_TIME`, `GAS_PRIORITY_FEE`, and `GAS_MAX_FEE` are set in the `.env` file. +> This approach runs integration tests against a local Hardhat scratch deployment instead of a mainnet fork. Ensure that +> `DEPLOYER`, `GENESIS_TIME`, `GAS_PRIORITY_FEE`, and `GAS_MAX_FEE` are set in the `.env` file. For more details, refer to the [Scratch Deploy](./docs/scratch-deploy.md) documentation. From 555d42faab08ca4f340240422cc283662e511221 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 18:40:46 +0100 Subject: [PATCH 08/32] chore: update scratch deploy --- docs/scratch-deploy.md | 147 +++++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 71 deletions(-) diff --git a/docs/scratch-deploy.md b/docs/scratch-deploy.md index d9b0edf7c..da68faba8 100644 --- a/docs/scratch-deploy.md +++ b/docs/scratch-deploy.md @@ -1,71 +1,73 @@ -# Deploy Lido protocol from scratch +# Deploy Lido Protocol from Scratch -## Disclaimer: WIP! +> [!NOTE] +> Work in progress. The document is a draft and may contain inaccuracies. -This scratch deployment manual is partially outdated and is a subject of further refinement. - -## TLDR: local deployment - -Do +## TL;DR ```shell +# Start a local Ethereum node anvil -p 8555 --base-fee 0 --gas-price 0 -``` - -and -```shell +# In a separate terminal, run the deployment script bash scripts/dao-local-deploy.sh ``` ## Requirements -- same as for the rest of the repo +Same as for the rest of the repo, see [CONTRIBUTING.md](../CONTRIBUTING.md). + +## General Information + +The repository contains bash scripts for deploying the DAO across various environments: -## General info +- Local Node Deployment - `scripts/dao-local-deploy.sh` (Supports Ganache, Anvil, Hardhat Network, and other local + Ethereum nodes) +- Holešky Testnet Deployment – `scripts/dao-holesky-deploy.sh` -The repo contains bash scripts for deployment of the DAO under multiple environments: +The protocol requires configuration of numerous parameters for a scratch deployment. The default configurations are +stored in JSON files named `deployed--defaults.json`, where `` represents the target +environment. Currently, a single default configuration file exists: `deployed-testnet-defaults.json`, which is tailored +for testnet deployments. This configuration differs from the mainnet setup, featuring shorter vote durations and more +frequent oracle report cycles, among other adjustments. -- local node (ganache, anvil, hardhat network) `scripts/dao-local-deploy.sh` -- holesky testnet - `scripts/dao-holesky-deploy.sh` +> [!NOTE] +> Some parameters in the default configuration file are intentionally set to `null`, indicating that they require +> further specification during the deployment process. -The protocol has a bunch of parameters to configure for the scratch deployment. The default configuration is stored in -files `deployed--defaults.json`, where `` is the target environment. Currently, there is a -single default configuration, `deployed-testnet-defaults.json`, suitable for testnet deployments. Compared to the -mainnet configuration, it has lower vote durations, more frequent oracle report cycles, etc. Part of the parameters -require further specification -- they are marked with `null` values. -During the deployment, the "default" configuration is copied to `deployed-.json`, where `` -is the name of a network configuration defined in `hardhat.config.js`. The file `deployed-.json` gets -populated with the contract addresses and transaction hashes during the deployment process. +The deployment script performs the following steps regarding configuration: -These are the deployment setups, supported currently: +1. Copies the appropriate default configuration file (e.g., `deployed-testnet-defaults.json`) to a new file named + `deployed-.json`, where `` corresponds to a network configuration defined in + `hardhat.config.js`. -- local (basically any node at http://127.0.0.1:8545); -- Holešky testnet. +2. Populates the `deployed-.json` file with specific contract addresses and transaction hashes as the + deployment progresses. -Each is described in the details in the sections below. +Detailed information for each setup is provided in the sections below. -> NB: Aragon UI for Lido DAO is to be deprecated and replaced by a custom solution, thus not included in the deployment +> [!NOTE] +> Aragon UI for Lido DAO is to be deprecated and replaced by a custom solution, thus not included in the deployment > script, see https://research.lido.fi/t/discontinuation-of-aragon-ui-use/7992. -### Deploy steps +### Deployment Steps -A brief description of what's going on under the hood in the deploy script. +A detailed overview of the deployment script's process: - Prepare `deployed-.json` file - - It is copied from `deployed-testnet-defaults.json` - - and expended by env variables values, e. g. `DEPLOYER`. - - It gets filled with the deployed contracts info from step to step. -- (optional) Deploy DepositContract. - - The step is skipped if the DepositContract address is specified + - Copied from `deployed-testnet-defaults.json` + - Enhanced with environment variable values, e.g., `DEPLOYER` + - Progressively updated with deployed contract information +- (optional) Deploy DepositContract + - Skipped if DepositContract address is pre-specified - (optional) Deploy ENS - - The step is skipped if the ENS Registry address is specified + - Skipped if ENS Registry address is pre-specified - Deploy Aragon framework environment -- Deploy standard Aragon apps contracts (like `Agent`, `Voting`) +- Deploy standard Aragon apps contracts (e.g., `Agent`, `Voting`) - Deploy `LidoTemplate` contract - - This is an auxiliary deploy contract which performs DAO configuration -- Deploy Lido custom Aragon apps implementations (aka bases), namely for `Lido`, `LegacyOracle`, `NodeOperatorsRegistry` -- Registry Lido APM name in ENS + - Auxiliary contract for DAO configuration +- Deploy Lido custom Aragon apps implementations (bases) for `Lido`, `LegacyOracle`, `NodeOperatorsRegistry` +- Register Lido APM name in ENS - Deploy Aragon package manager contract `APMRegistry` (via `LidoTemplate`) - Deploy Lido custom Aragon apps repo contracts (via `LidoTemplate`) - Deploy Lido DAO (via `LidoTemplate`) @@ -73,52 +75,56 @@ A brief description of what's going on under the hood in the deploy script. - Deploy non-Aragon Lido contracts: `OracleDaemonConfig`, `LidoLocator`, `OracleReportSanityChecker`, `EIP712StETH`, `WstETH`, `WithdrawalQueueERC721`, `WithdrawalVault`, `LidoExecutionLayerRewardsVault`, `StakingRouter`, `DepositSecurityModule`, `AccountingOracle`, `HashConsensus` for AccountingOracle, `ValidatorsExitBusOracle`, - `HashConsensus` for ValidatorsExitBusOracle, `Burner`. -- Finalize Lido DAO deployment: issue unvested LDO tokens, set Aragon permissions, register Lido DAO name in Aragon ID ( - via `LidoTemplate`) + `HashConsensus` for ValidatorsExitBusOracle, `Burner` +- Finalize Lido DAO deployment: issue unvested LDO tokens, set Aragon permissions, register Lido DAO name in Aragon ID + (via `LidoTemplate`) - Initialize non-Aragon Lido contracts - Set parameters of `OracleDaemonConfig` - Setup non-Aragon permissions - Plug NodeOperatorsRegistry as Curated staking module - Transfer all admin roles from deployer to `Agent` - - OZ admin roles: `Burner`, `HashConsensus` for `AccountingOracle`, `HashConsensus` for `ValidatorsExitBusOracle`, + - OpenZeppelin admin roles: `Burner`, `HashConsensus` for `AccountingOracle`, `HashConsensus` for + `ValidatorsExitBusOracle`, `StakingRouter`, `AccountingOracle`, `ValidatorsExitBusOracle`, `WithdrawalQueueERC721`, `OracleDaemonConfig` - - OssifiableProxy admins: : `LidoLocator`, `StakingRouter`, `AccountingOracle`, `ValidatorsExitBusOracle`, + - OssifiableProxy admin roles: `LidoLocator`, `StakingRouter`, `AccountingOracle`, `ValidatorsExitBusOracle`, `WithdrawalQueueERC721` - `DepositSecurityModule` owner -## Local deployment +## Deployment Environments -Deploys the DAO to local (http://127.0.0.1:8555) dev node (anvil, hardhat, ganache). -The deployment is done from the default test account `0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266` derived from the -default mnemonic. -Thus the node must be configured with the default test accounts derived from the mnemonic -`test test test test test test test test test test test junk`. +### Local Deployment + +This section describes how to deploy the DAO to a local development node (such as Anvil, Hardhat, or Ganache) running +at http://127.0.0.1:8555. + +The deployment process utilizes the default test account `0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266`, which is derived +from the standard mnemonic phrase: `test test test test test test test test test test test junk` + +To ensure a successful deployment, configure your local node with the default test accounts associated with this +mnemonic. + +Follow these steps for local deployment: 1. Run `yarn install` (get sure repo dependencies are installed) 2. Run the node on port 8555 (for the commands, see subsections below) 3. Run the deploy script `bash scripts/dao-local-deploy.sh` from root repo directory 4. Check out the deploy artifacts in `deployed-local.json` -### Anvil +#### Supported Local Nodes -Run the node with the command: +##### Anvil ```shell -anvil -p 8555 --mnemonic "test test test test test test test test test test test junk" +anvil -p 8555 --mnemonic "test test test test test test test test test test test junk" --base-fee 0 --gas-price 0 ``` -### Hardhat node - -> NB: Hardhat node configuration is set in `hardhat.config.js` under `hardhat: { `. - -To run hardhat node execute: +##### Hardhat Node ```shell yarn hardhat node ``` -## Holešky deployment +### Holešky Testnet Deployment To do Holešky deployment, the following parameters must be set up via env variables: @@ -146,15 +152,15 @@ bash scripts/scratch/dao-holesky-deploy.sh Deploy artifacts information will be stored in `deployed-holesky.json`. -## Publishing sources to Etherscan +## Post-Deployment Tasks -After the deployment run +### Publishing Sources to Etherscan ```shell -NETWORK= RPC_URL= bash ./scripts/scratch/verify-contracts-code.sh +NETWORK= RPC_URL= bash ./scripts/verify-contracts-code.sh ``` -### Issues with verification of part of the contracts deployed from factories +#### Issues with verification of part of the contracts deployed from factories There are some contracts deployed from other contracts for which automatic hardhat etherscan verification fails: @@ -175,9 +181,7 @@ NB, that some contracts require additional auxiliary contract to be deployed. Na `Kernel` contract, which must return the implementation by call `kernel().getApp(KERNEL_APP_BASES_NAMESPACE, _appId)`. See `@aragon/os/contracts/apps/AppProxyBase.sol` for the details. -## Post deploy initialization - -### Initialization up to the fully operational state +### Initialization to Fully Operational State In order to make the protocol fully operational, the additional steps are required: @@ -192,8 +196,9 @@ In order to make the protocol fully operational, the additional steps are requir - add validator keys to the Node Operators: `NodeOperatorsRegistry.addSigningKeys`; - set staking limits for the Node Operators: `NodeOperatorsRegistry.setNodeOperatorStakingLimit`. -NB, that part of the actions require prior granting of the required roles, e.g. `STAKING_MODULE_MANAGE_ROLE` for -`StakingRouter.addStakingModule`: +> [!NOTE] +> That part of the actions require prior granting of the required roles, e.g. `STAKING_MODULE_MANAGE_ROLE` for +> `StakingRouter.addStakingModule`: ```js await stakingRouter.grantRole(STAKING_MODULE_MANAGE_ROLE, agent.address, { from: agent.address }); @@ -208,7 +213,7 @@ await stakingRouter.addStakingModule( await stakingRouter.renounceRole(STAKING_MODULE_MANAGE_ROLE, agent.address, { from: agent.address }); ``` -## Protocol parameters +## Protocol Parameters This section describes part of the parameters and their values used at the deployment. The values are specified in `deployed-testnet-defaults.json`. From 26d5e96129e69bf8b4f159d148389f6a32e3762e Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 22:08:33 +0200 Subject: [PATCH 09/32] fix: apply suggestions from code review Co-authored-by: Eugene Mamin --- CONTRIBUTING.md | 6 +++--- docs/scratch-deploy.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9bb9f8adf..3d81910e2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,7 +18,7 @@ Issues are a great way to contribute to the project by reporting bugs or suggest only applies to off-chain code (tests, scripts, etc.). For on-chain code, please refer to the [Bug Bounty](/README.md#bug-bounty) program. - **Feature Requests**: Have an idea for a new feature or an improvement to an existing one? Submit a feature request - through GitHub issues, detailing your proposed enhancements and how they would benefit the Lido Finance Core. + through GitHub issues, detailing your proposed enhancements and how they would benefit the Lido protocol middleware. ### Improving Documentation @@ -26,7 +26,7 @@ Good documentation is crucial for any project. If you notice areas where the doc fixing typos, adding examples, or clarifying explanations, your contributions are highly valued. These improvements help make the project more accessible and understandable for everyone. -For more extensive documentation, visit the [Lido Docs repository](https://github.com/lidofinance/docs). +For more extensive documentation, visit the [Lido Docs repository](https://github.com/lidofinance/docs) deployed at [docs.lido.fi](https://docs.lido.fi). ### Contributing to the Codebase @@ -38,7 +38,7 @@ If you're interested in improving tooling and CI in this repository, consider op discuss your ideas with the community of contributors. For larger ideas on how to improve the protocol, consider publishing your proposal in -the [Lido Forum](https://research.lido.fi/). +the [Lido Research Forum](https://research.lido.fi/). ## Getting Started diff --git a/docs/scratch-deploy.md b/docs/scratch-deploy.md index da68faba8..a58fac886 100644 --- a/docs/scratch-deploy.md +++ b/docs/scratch-deploy.md @@ -1,4 +1,4 @@ -# Deploy Lido Protocol from Scratch +# Deploy Lido protocol middleware from scratch > [!NOTE] > Work in progress. The document is a draft and may contain inaccuracies. From e20a363cacc84c0391e5453faa43577d5fc004cf Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Mon, 23 Sep 2024 21:17:49 +0100 Subject: [PATCH 10/32] fix: apply review suggestions --- CONTRIBUTING.md | 9 +++++---- docs/scratch-deploy.md | 3 --- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3d81910e2..fcd9c9941 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,8 @@ Good documentation is crucial for any project. If you notice areas where the doc fixing typos, adding examples, or clarifying explanations, your contributions are highly valued. These improvements help make the project more accessible and understandable for everyone. -For more extensive documentation, visit the [Lido Docs repository](https://github.com/lidofinance/docs) deployed at [docs.lido.fi](https://docs.lido.fi). +For more extensive documentation, visit the [Lido Docs repository](https://github.com/lidofinance/docs) deployed +at [docs.lido.fi](https://docs.lido.fi). ### Contributing to the Codebase @@ -49,8 +50,7 @@ the [Lido Research Forum](https://research.lido.fi/). - [Foundry](https://book.getfoundry.sh/) latest available version > [!TIP] -> On macOS with Homebrew, it is recommended to install Node.js using [`n`](https://github.com/tj/n) or [ -> `nvm`](https://github.com/nvm-sh/nvm) version managers. +> On macOS with Homebrew, it is recommended to install Node.js using [`n`](https://github.com/tj/n) or [ > `nvm`](https://github.com/nvm-sh/nvm) version managers. > Example setup process using `n` package manager for zsh users: > > ```bash @@ -240,7 +240,8 @@ review. ## Local Deployment -WIP +For local deployment instructions, please refer to the [Scratch Deploy](./docs/scratch-deploy.md) documentation. This +guide provides detailed steps for setting up and deploying the project in a local environment. ## Tests diff --git a/docs/scratch-deploy.md b/docs/scratch-deploy.md index a58fac886..e100fc075 100644 --- a/docs/scratch-deploy.md +++ b/docs/scratch-deploy.md @@ -1,8 +1,5 @@ # Deploy Lido protocol middleware from scratch -> [!NOTE] -> Work in progress. The document is a draft and may contain inaccuracies. - ## TL;DR ```shell From 47f4ab2dcb7300118ad0dc53e9db2adc91e6dc28 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Tue, 24 Sep 2024 14:44:42 +0100 Subject: [PATCH 11/32] ci: try to use lidofinance/hardhat-node --- .../workflows/tests-integration-mainnet.yml | 2 +- package.json | 10 +- yarn.lock | 205 +++++++++++------- 3 files changed, 129 insertions(+), 88 deletions(-) diff --git a/.github/workflows/tests-integration-mainnet.yml b/.github/workflows/tests-integration-mainnet.yml index 4d79ded8c..c74b2480e 100644 --- a/.github/workflows/tests-integration-mainnet.yml +++ b/.github/workflows/tests-integration-mainnet.yml @@ -10,7 +10,7 @@ jobs: services: hardhat-node: - image: feofanov/hardhat-node:2.22.9 + image: ghcr.io/lidofinance/hardhat-node:2.22.11 ports: - 8545:8545 env: diff --git a/package.json b/package.json index c0d1e87c3..65c4b78fb 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", "@eslint/compat": "^1.1.1", - "@eslint/js": "^9.11.0", + "@eslint/js": "^9.11.1", "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", "@nomicfoundation/hardhat-ethers": "^3.0.8", "@nomicfoundation/hardhat-ignition": "^0.15.5", @@ -64,12 +64,12 @@ "@types/eslint": "^9.6.1", "@types/eslint__js": "^8.42.3", "@types/mocha": "10.0.8", - "@types/node": "20.16.5", + "@types/node": "20.16.6", "bigint-conversion": "^2.4.3", "chai": "^4.5.0", "chalk": "^4.1.2", "dotenv": "^16.4.5", - "eslint": "^9.11.0", + "eslint": "^9.11.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-prettier": "^5.2.1", @@ -78,7 +78,7 @@ "ethers": "^6.13.2", "glob": "^11.0.0", "globals": "^15.9.0", - "hardhat": "^2.22.9", + "hardhat": "^2.22.11", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.10", "hardhat-ignore-warnings": "^0.2.11", @@ -95,7 +95,7 @@ "tsconfig-paths": "^4.2.0", "typechain": "^8.3.2", "typescript": "^5.6.2", - "typescript-eslint": "^8.6.0" + "typescript-eslint": "^8.7.0" }, "dependencies": { "@aragon/apps-agent": "2.1.0", diff --git a/yarn.lock b/yarn.lock index a3c85b51d..27f1f586f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -522,6 +522,13 @@ __metadata: languageName: node linkType: hard +"@eslint/core@npm:^0.6.0": + version: 0.6.0 + resolution: "@eslint/core@npm:0.6.0" + checksum: 10c0/fffdb3046ad6420f8cb9204b6466fdd8632a9baeebdaf2a97d458a4eac0e16653ba50d82d61835d7d771f6ced0ec942ec482b2fbccc300e45f2cbf784537f240 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^3.1.0": version: 3.1.0 resolution: "@eslint/eslintrc@npm:3.1.0" @@ -539,10 +546,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.11.0, @eslint/js@npm:^9.11.0": - version: 9.11.0 - resolution: "@eslint/js@npm:9.11.0" - checksum: 10c0/7403aeba28ba9cae3470d149b334a51375eb7fd850f167555c81cc72fe98e5cc5ac3059ccdbe68eb255a49d7498a7288d25429af0c7d20afeb4b3c0748349bb4 +"@eslint/js@npm:9.11.1, @eslint/js@npm:^9.11.1": + version: 9.11.1 + resolution: "@eslint/js@npm:9.11.1" + checksum: 10c0/22916ef7b09c6f60c62635d897c66e1e3e38d90b5a5cf5e62769033472ecbcfb6ec7c886090a4b32fe65d6ce371da54384e46c26a899e38184dfc152c6152f7b languageName: node linkType: hard @@ -2085,6 +2092,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + "@types/form-data@npm:0.0.33": version: 0.0.33 resolution: "@types/form-data@npm:0.0.33" @@ -2111,7 +2125,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -2155,12 +2169,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:20.16.5": - version: 20.16.5 - resolution: "@types/node@npm:20.16.5" +"@types/node@npm:20.16.6": + version: 20.16.6 + resolution: "@types/node@npm:20.16.6" dependencies: undici-types: "npm:~6.19.2" - checksum: 10c0/6af7994129815010bcbc4cf8221865559c8116ff43e74a6549525c2108267596fc2d18aff5d5ecfe089fb60a119f975631343e2c65c52bfa0955ed9dc56733d6 + checksum: 10c0/a3bd104b4061451625ed3b320c88e01e1261d41dbcaa7248d376f60a1a831e1cbc4362eef5be3445ccc1ea2d0a9178fc1ddd5e55a4f5df571dce78e5d91375a8 languageName: node linkType: hard @@ -2210,15 +2224,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.6.0" +"@typescript-eslint/eslint-plugin@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.7.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.6.0" - "@typescript-eslint/type-utils": "npm:8.6.0" - "@typescript-eslint/utils": "npm:8.6.0" - "@typescript-eslint/visitor-keys": "npm:8.6.0" + "@typescript-eslint/scope-manager": "npm:8.7.0" + "@typescript-eslint/type-utils": "npm:8.7.0" + "@typescript-eslint/utils": "npm:8.7.0" + "@typescript-eslint/visitor-keys": "npm:8.7.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -2229,66 +2243,66 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/c777f01535b896d3092f9886a67ccf9e50bf9e0f581ffab607c5e95dbf3092299b0d9f3e6041b134d69059a6fa5691785940b81015f73bb9a0e9d1605f6442ea + checksum: 10c0/f04d6fa6a30e32d51feba0f08789f75ca77b6b67cfe494bdbd9aafa241871edc918fa8b344dc9d13dd59ae055d42c3920f0e542534f929afbfdca653dae598fa languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/parser@npm:8.6.0" +"@typescript-eslint/parser@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/parser@npm:8.7.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.6.0" - "@typescript-eslint/types": "npm:8.6.0" - "@typescript-eslint/typescript-estree": "npm:8.6.0" - "@typescript-eslint/visitor-keys": "npm:8.6.0" + "@typescript-eslint/scope-manager": "npm:8.7.0" + "@typescript-eslint/types": "npm:8.7.0" + "@typescript-eslint/typescript-estree": "npm:8.7.0" + "@typescript-eslint/visitor-keys": "npm:8.7.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/3f280d289b486359194d422d89df9896b3f10a6d45cdf851d1d5f3200489271a31ab503c127cb5656f9b0ad6d795dd708b960f21fb105750aac19f41f8f815d1 + checksum: 10c0/1d5020ff1f5d3eb726bc6034d23f0a71e8fe7a713756479a0a0b639215326f71c0b44e2c25cc290b4e7c144bd3c958f1405199711c41601f0ea9174068714a64 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/scope-manager@npm:8.6.0" +"@typescript-eslint/scope-manager@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/scope-manager@npm:8.7.0" dependencies: - "@typescript-eslint/types": "npm:8.6.0" - "@typescript-eslint/visitor-keys": "npm:8.6.0" - checksum: 10c0/37092ef70171c06854ac67ebfb2255063890c1c6133654e6b15b6adb6d2ab83de4feafd1599f4d02ed71a018226fcb3a389021758ec045e1904fb1798e90b4fe + "@typescript-eslint/types": "npm:8.7.0" + "@typescript-eslint/visitor-keys": "npm:8.7.0" + checksum: 10c0/8b731a0d0bd3e8f6a322b3b25006f56879b5d2aad86625070fa438b803cf938cb8d5c597758bfa0d65d6e142b204dc6f363fa239bc44280a74e25aa427408eda languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/type-utils@npm:8.6.0" +"@typescript-eslint/type-utils@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/type-utils@npm:8.7.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.6.0" - "@typescript-eslint/utils": "npm:8.6.0" + "@typescript-eslint/typescript-estree": "npm:8.7.0" + "@typescript-eslint/utils": "npm:8.7.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/914b4637caa40c102117655a9b4451e0db611a61309ed39d6c57522655463c059f4dfd4e2d7ffdefcc9ab7533be21fb877b740c58f5be11f3530aa29f3d2cb62 + checksum: 10c0/2bd9fb93a50ff1c060af41528e39c775ae93b09dd71450defdb42a13c68990dd388460ae4e81fb2f4a49c38dc12152c515d43e845eca6198c44b14aab66733bc languageName: node linkType: hard -"@typescript-eslint/types@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/types@npm:8.6.0" - checksum: 10c0/e7051d212252f7d1905b5527b211e335db4ec5bb1d3a52d73c8d2de6ddf5cbc981f2c92ca9ffcef35f7447bda635ea1ccce5f884ade7f243d14f2a254982c698 +"@typescript-eslint/types@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/types@npm:8.7.0" + checksum: 10c0/f7529eaea4ecc0f5e2d94ea656db8f930f6d1c1e65a3ffcb2f6bec87361173de2ea981405c2c483a35a927b3bdafb606319a1d0395a6feb1284448c8ba74c31e languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.6.0" +"@typescript-eslint/typescript-estree@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.7.0" dependencies: - "@typescript-eslint/types": "npm:8.6.0" - "@typescript-eslint/visitor-keys": "npm:8.6.0" + "@typescript-eslint/types": "npm:8.7.0" + "@typescript-eslint/visitor-keys": "npm:8.7.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -2298,31 +2312,31 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/33ab8c03221a797865301f09d1d198c67f8b0e3dbf0d13e41f699dc2740242303a9fcfd7b38302cef318541fdedd832fd6e8ba34a5041a57e9114fa134045385 + checksum: 10c0/d714605b6920a9631ab1511b569c1c158b1681c09005ab240125c442a63e906048064151a61ce5eb5f8fe75cea861ce5ae1d87be9d7296b012e4ab6d88755e8b languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/utils@npm:8.6.0" +"@typescript-eslint/utils@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/utils@npm:8.7.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.6.0" - "@typescript-eslint/types": "npm:8.6.0" - "@typescript-eslint/typescript-estree": "npm:8.6.0" + "@typescript-eslint/scope-manager": "npm:8.7.0" + "@typescript-eslint/types": "npm:8.7.0" + "@typescript-eslint/typescript-estree": "npm:8.7.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/5b615106342dfdf09f5a73e2554cc0c4d979c262a9a4548eb76ec7045768e0ff0bf0316cf8a5eb5404689cd476fcd335fc84f90eb985557559e42aeee33d687e + checksum: 10c0/7355b754ce2fc118773ed27a3e02b7dfae270eec73c2d896738835ecf842e8309544dfd22c5105aba6cae2787bfdd84129bbc42f4b514f57909dc7f6890b8eba languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.6.0": - version: 8.6.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.6.0" +"@typescript-eslint/visitor-keys@npm:8.7.0": + version: 8.7.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.7.0" dependencies: - "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/types": "npm:8.7.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/9bd5d5daee9de7e009fdd1b64b1eca685a699d1b2639373bc279c97e25e769fff56fffef708ef66a2b19bc8bb201d36daf9e7084f0e0872178bfcf9d923b41f3 + checksum: 10c0/1240da13c15f9f875644b933b0ad73713ef12f1db5715236824c1ec359e6ef082ce52dd9b2186d40e28be6a816a208c226e6e9af96e5baeb24b4399fe786ae7c languageName: node linkType: hard @@ -3967,7 +3981,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.0, chokidar@npm:^3.5.3": +"chokidar@npm:^3.5.3": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -3986,6 +4000,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.0": + version: 4.0.1 + resolution: "chokidar@npm:4.0.1" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10c0/4bb7a3adc304059810bb6c420c43261a15bb44f610d77c35547addc84faa0374265c3adc67f25d06f363d9a4571962b02679268c40de07676d260de1986efea9 + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -5098,19 +5121,22 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.11.0": - version: 9.11.0 - resolution: "eslint@npm:9.11.0" +"eslint@npm:^9.11.1": + version: 9.11.1 + resolution: "eslint@npm:9.11.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.11.0" "@eslint/config-array": "npm:^0.18.0" + "@eslint/core": "npm:^0.6.0" "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:9.11.0" + "@eslint/js": "npm:9.11.1" "@eslint/plugin-kit": "npm:^0.2.0" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.3.0" "@nodelib/fs.walk": "npm:^1.2.8" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" @@ -5143,7 +5169,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/3438a78172bc667dc87bc4ad864671bd93231c82c9d366899ea3a77fc3444c8cdd158e7fe3ca1cfe4cb566045b1b36c0ccae9fc20efeb4b187f1a534075a1177 + checksum: 10c0/fc9afc31155fef8c27fc4fd00669aeafa4b89ce5abfbf6f60e05482c03d7ff1d5e7546e416aa47bf0f28c9a56597a94663fd0264c2c42a1890f53cac49189f24 languageName: node linkType: hard @@ -6623,9 +6649,9 @@ __metadata: languageName: node linkType: hard -"hardhat@npm:^2.22.9": - version: 2.22.9 - resolution: "hardhat@npm:2.22.9" +"hardhat@npm:^2.22.11": + version: 2.22.11 + resolution: "hardhat@npm:2.22.11" dependencies: "@ethersproject/abi": "npm:^5.1.2" "@metamask/eth-sig-util": "npm:^4.0.0" @@ -6642,7 +6668,7 @@ __metadata: ansi-escapes: "npm:^4.3.0" boxen: "npm:^5.1.2" chalk: "npm:^2.4.2" - chokidar: "npm:^3.4.0" + chokidar: "npm:^4.0.0" ci-info: "npm:^2.0.0" debug: "npm:^4.1.1" enquirer: "npm:^2.3.0" @@ -6655,6 +6681,7 @@ __metadata: glob: "npm:7.2.0" immutable: "npm:^4.0.0-rc.12" io-ts: "npm:1.10.4" + json-stream-stringify: "npm:^3.1.4" keccak: "npm:^3.0.2" lodash: "npm:^4.17.11" mnemonist: "npm:^0.38.0" @@ -6680,7 +6707,7 @@ __metadata: optional: true bin: hardhat: internal/cli/bootstrap.js - checksum: 10c0/172a0ecab081c76b6da68f84297ccf24e5ad9e9ba3372b5c456d848f3de96d92ecbae7d0e80d9dfeca9a17773e30dc208ea45d5855594605db42bf915b749174 + checksum: 10c0/d04987b1243964cb64ffd23cadf20bc1862df4e5fa1b6a9826a6152bcadd3d6080fe4b3b1f1e9bf8268de0d55ee8c4c2759184f7ed84dc5f3238631e39045640 languageName: node linkType: hard @@ -7705,6 +7732,13 @@ __metadata: languageName: node linkType: hard +"json-stream-stringify@npm:^3.1.4": + version: 3.1.4 + resolution: "json-stream-stringify@npm:3.1.4" + checksum: 10c0/ee5653d8b7829ac11311f732dbbc73f80a93bc6893553954266f28e76f340c5f0d24993480abe7b06f5b2166d3e0766f74b7d3170b85c347aece2b3bbb867fda + languageName: node + linkType: hard + "json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -7961,7 +7995,7 @@ __metadata: "@commitlint/cli": "npm:^19.5.0" "@commitlint/config-conventional": "npm:^19.5.0" "@eslint/compat": "npm:^1.1.1" - "@eslint/js": "npm:^9.11.0" + "@eslint/js": "npm:^9.11.1" "@nomicfoundation/hardhat-chai-matchers": "npm:^2.0.8" "@nomicfoundation/hardhat-ethers": "npm:^3.0.8" "@nomicfoundation/hardhat-ignition": "npm:^0.15.5" @@ -7978,12 +8012,12 @@ __metadata: "@types/eslint": "npm:^9.6.1" "@types/eslint__js": "npm:^8.42.3" "@types/mocha": "npm:10.0.8" - "@types/node": "npm:20.16.5" + "@types/node": "npm:20.16.6" bigint-conversion: "npm:^2.4.3" chai: "npm:^4.5.0" chalk: "npm:^4.1.2" dotenv: "npm:^16.4.5" - eslint: "npm:^9.11.0" + eslint: "npm:^9.11.1" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-no-only-tests: "npm:^3.3.0" eslint-plugin-prettier: "npm:^5.2.1" @@ -7992,7 +8026,7 @@ __metadata: ethers: "npm:^6.13.2" glob: "npm:^11.0.0" globals: "npm:^15.9.0" - hardhat: "npm:^2.22.9" + hardhat: "npm:^2.22.11" hardhat-contract-sizer: "npm:^2.10.0" hardhat-gas-reporter: "npm:^1.0.10" hardhat-ignore-warnings: "npm:^0.2.11" @@ -8010,7 +8044,7 @@ __metadata: tsconfig-paths: "npm:^4.2.0" typechain: "npm:^8.3.2" typescript: "npm:^5.6.2" - typescript-eslint: "npm:^8.6.0" + typescript-eslint: "npm:^8.7.0" languageName: unknown linkType: soft @@ -9724,6 +9758,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.0.1 + resolution: "readdirp@npm:4.0.1" + checksum: 10c0/e5a0b547015f68ecc918f115b62b75b2b840611480a9240cb3317090a0ddac01bb9b40315a8fa08acdf52a43eea17b808c89b645263cba3ab64dc557d7f801f1 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -11615,17 +11656,17 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.6.0": - version: 8.6.0 - resolution: "typescript-eslint@npm:8.6.0" +"typescript-eslint@npm:^8.7.0": + version: 8.7.0 + resolution: "typescript-eslint@npm:8.7.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.6.0" - "@typescript-eslint/parser": "npm:8.6.0" - "@typescript-eslint/utils": "npm:8.6.0" + "@typescript-eslint/eslint-plugin": "npm:8.7.0" + "@typescript-eslint/parser": "npm:8.7.0" + "@typescript-eslint/utils": "npm:8.7.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/d009170af1cffece3a63784c3f6d6f5074fd42d198540f3140dd0fed4f37b1888d59abb5992624099834cae2ea4863b6c526b5f11ecbfd105f41a87e300305db + checksum: 10c0/c0c3f909227c664f193d11a912851d6144a7cfcc0ac5e57f695c3e50679ef02bb491cc330ad9787e00170ce3be3a3b8c80bb81d5e20a40c1b3ee713ec3b0955a languageName: node linkType: hard From e3feffd61eb1df31695bd29a8bec938c4ceb6c43 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Tue, 24 Sep 2024 14:57:54 +0100 Subject: [PATCH 12/32] ci: use lidofinance/hardhat-node for scratch --- .github/workflows/tests-integration-scratch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests-integration-scratch.yml b/.github/workflows/tests-integration-scratch.yml index fd1729986..0bf4bcd57 100644 --- a/.github/workflows/tests-integration-scratch.yml +++ b/.github/workflows/tests-integration-scratch.yml @@ -10,7 +10,7 @@ jobs: services: hardhat-node: - image: feofanov/hardhat-node:2.22.9-scratch + image: ghcr.io/lidofinance/hardhat-node:2.22.11-scratch ports: - 8555:8545 From 3902bd218c70d44d06cbe361e6fd146fd8314350 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Tue, 24 Sep 2024 15:08:15 +0100 Subject: [PATCH 13/32] chore: updates from the lido-dao main branch --- contracts/COMPILERS.md | 9 +-------- .../common/interfaces/IGateSealFactory.sol | 20 +++++++++++++++++++ .../AccountingOracle__MockForLegacyOracle.sol | 1 + 3 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 contracts/common/interfaces/IGateSealFactory.sol diff --git a/contracts/COMPILERS.md b/contracts/COMPILERS.md index 6d1825937..bd07c67ee 100644 --- a/contracts/COMPILERS.md +++ b/contracts/COMPILERS.md @@ -2,17 +2,10 @@ For Lido project coordination, governance and funds management we use [Aragon](https://aragon.org/dao), a well-developed and proven DAO Framework. The current stable release of its Kernel, [4.4.0](https://github.com/aragon/aragonOS/tree/v4.4.0) is fixed on the specific compiler version - [solc 0.4.24](https://solidity.readthedocs.io/en/v0.4.24/), that is currently outdated. Keeping security and consistency in mind, we decided to stay on an older yet proven combination - for all the contracts under Aragon management (`Lido`, `stETH`, `LegacyOracle`) we use solc 0.4.24 release. -cstETH token, that acts as autonomous wrapper and not governed by Aragon, was inherited from OpenZeppelin's library, using one of its stable releases [3.1.0](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v3.1.0). +For the other contracts the newer compiler versions are used. # How to compile -Separately: - -```bash -yarn compile:4 -yarn compile:6 -``` - All at once: ```bash diff --git a/contracts/common/interfaces/IGateSealFactory.sol b/contracts/common/interfaces/IGateSealFactory.sol new file mode 100644 index 000000000..b2ffaaec5 --- /dev/null +++ b/contracts/common/interfaces/IGateSealFactory.sol @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2023 Lido +// SPDX-License-Identifier: GPL-3.0 + +// See contracts/COMPILERS.md +// solhint-disable-next-line +pragma solidity >=0.4.24 <0.9.0; + +// https://github.com/lidofinance/gate-seals/blob/main/contracts/GateSealFactory.vy +interface IGateSealFactory { + + event GateSealCreated(address gate_seal); + + function create_gate_seal( + address _sealing_committee, + uint256 _seal_duration_seconds, + address[] memory _sealables, + uint256 _expiry_timestamp + ) external; + +} diff --git a/test/0.4.24/contracts/AccountingOracle__MockForLegacyOracle.sol b/test/0.4.24/contracts/AccountingOracle__MockForLegacyOracle.sol index 6361bf3c2..b74eaebde 100644 --- a/test/0.4.24/contracts/AccountingOracle__MockForLegacyOracle.sol +++ b/test/0.4.24/contracts/AccountingOracle__MockForLegacyOracle.sol @@ -31,6 +31,7 @@ contract AccountingOracle__MockForLegacyOracle { } function submitReportData(AccountingOracle.ReportData calldata data, uint256 /* contractVersion */) external { + require(data.refSlot >= _lastRefSlot, "refSlot less than _lastRefSlot"); uint256 slotsElapsed = data.refSlot - _lastRefSlot; _lastRefSlot = data.refSlot; From e4a6ae47ab83d53e521a57e16bd31b04ac0ba17b Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Tue, 24 Sep 2024 15:23:50 +0100 Subject: [PATCH 14/32] docs: improve texts --- contracts/COMPILERS.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/contracts/COMPILERS.md b/contracts/COMPILERS.md index bd07c67ee..5f6c23764 100644 --- a/contracts/COMPILERS.md +++ b/contracts/COMPILERS.md @@ -1,12 +1,17 @@ -# Why we use different compilers +# Compiler Versions Used in Lido Project -For Lido project coordination, governance and funds management we use [Aragon](https://aragon.org/dao), a well-developed and proven DAO Framework. The current stable release of its Kernel, [4.4.0](https://github.com/aragon/aragonOS/tree/v4.4.0) is fixed on the specific compiler version - [solc 0.4.24](https://solidity.readthedocs.io/en/v0.4.24/), that is currently outdated. Keeping security and consistency in mind, we decided to stay on an older yet proven combination - for all the contracts under Aragon management (`Lido`, `stETH`, `LegacyOracle`) we use solc 0.4.24 release. +For Lido project coordination, governance, and funds management, we use [Aragon](https://aragon.org/dao), a +well-developed and proven DAO Framework. The current stable release of its +Kernel, [4.4.0](https://github.com/aragon/aragonOS/tree/v4.4.0), is fixed on a specific compiler +version - [solc 0.4.24](https://solidity.readthedocs.io/en/v0.4.24/), which is currently outdated. Keeping security and +consistency in mind, we decided to stay on an older yet proven combination. Therefore, for all the contracts under +Aragon management (`Lido`, `stETH`, `LegacyOracle`), we use the `solc 0.4.24` release. -For the other contracts the newer compiler versions are used. +For the `wstETH` contract, we use `solc 0.6.12`, as it is non-upgradeable and bound to this version. -# How to compile +For the other contracts, newer compiler versions are used. -All at once: +# Compilation Instructions ```bash yarn compile From 6e1df1b507b6d7bd78e8a46e152d3e186b2a57ea Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Tue, 24 Sep 2024 15:36:21 +0100 Subject: [PATCH 15/32] chore: upgrade hardhat --- .../workflows/tests-integration-mainnet.yml | 2 +- .../workflows/tests-integration-scratch.yml | 2 +- package.json | 2 +- yarn.lock | 90 +++++++++---------- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/.github/workflows/tests-integration-mainnet.yml b/.github/workflows/tests-integration-mainnet.yml index c74b2480e..37986f198 100644 --- a/.github/workflows/tests-integration-mainnet.yml +++ b/.github/workflows/tests-integration-mainnet.yml @@ -10,7 +10,7 @@ jobs: services: hardhat-node: - image: ghcr.io/lidofinance/hardhat-node:2.22.11 + image: ghcr.io/lidofinance/hardhat-node:2.22.12 ports: - 8545:8545 env: diff --git a/.github/workflows/tests-integration-scratch.yml b/.github/workflows/tests-integration-scratch.yml index 0bf4bcd57..08f679ec6 100644 --- a/.github/workflows/tests-integration-scratch.yml +++ b/.github/workflows/tests-integration-scratch.yml @@ -10,7 +10,7 @@ jobs: services: hardhat-node: - image: ghcr.io/lidofinance/hardhat-node:2.22.11-scratch + image: ghcr.io/lidofinance/hardhat-node:2.22.12-scratch ports: - 8555:8545 diff --git a/package.json b/package.json index 65c4b78fb..eadf1cb0e 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "ethers": "^6.13.2", "glob": "^11.0.0", "globals": "^15.9.0", - "hardhat": "^2.22.11", + "hardhat": "^2.22.12", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.10", "hardhat-ignore-warnings": "^0.2.11", diff --git a/yarn.lock b/yarn.lock index 27f1f586f..bde1829fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1222,67 +1222,67 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/edr-darwin-arm64@npm:0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.5.2" - checksum: 10c0/c7f5fa10c2758dfd7d7ad0308cc78ed662838ae21236d76315a2bb9f2b49288ef37c385ab79642f02adde12ddc6d65ab6510ecd068bd450602411cedc4cc491e +"@nomicfoundation/edr-darwin-arm64@npm:0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.6.1" + checksum: 10c0/9e81f15f2f781aa36fd3d61a931b53793b6882483cc518f4e0a04dafdca884cd74094100185d77734ce0b0619866ad00cfc7e4c7de498dd216abb190979993ca languageName: node linkType: hard -"@nomicfoundation/edr-darwin-x64@npm:0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr-darwin-x64@npm:0.5.2" - checksum: 10c0/9e744022b735d7152cc4a9ba26809b8cd81a9b4ece7d4593c8aab8b0850ce930e63fb6992d90d4fb147afe336a698d469a7c77b253bb1d0bff078d2ff388b9d3 +"@nomicfoundation/edr-darwin-x64@npm:0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr-darwin-x64@npm:0.6.1" + checksum: 10c0/d26d848e53d5ae2517a09f1098fcc8bd2a26384375078b7de5b7bda7f530bfcf207118e13c62b8d75bb9ac89d90e85b58f7977623ece613f97b6d1696d9bdb39 languageName: node linkType: hard -"@nomicfoundation/edr-linux-arm64-gnu@npm:0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.5.2" - checksum: 10c0/1cdeb360ce2f450585697ed063102df928bf60ec890619d92590f176b14d72a3f525426bb67ff651611aa95db97f93867a391a2f47ffba123bbcdf83e723b295 +"@nomicfoundation/edr-linux-arm64-gnu@npm:0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.6.1" + checksum: 10c0/3fe06c4c1830f5eec20a336117fd589a83e61f67a65777986a832181f88146bcb8ce26f97d6501e04ad03bd924ce137038d44ff4b20e6da2ba4fc6d2b3b7a94e languageName: node linkType: hard -"@nomicfoundation/edr-linux-arm64-musl@npm:0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.5.2" - checksum: 10c0/71983a2c0a55103306d29c40d5996d30c5bf652c50615424fd0552689a551c8501dc4e9e07be935d81d1d51121e25a9fb6860e12dbeee6d8c921ab1ae71f250d +"@nomicfoundation/edr-linux-arm64-musl@npm:0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.6.1" + checksum: 10c0/01936e5c608405ea9c0fb7b0c1313d73eaa94a5f8e61395216a26c6f98c6e5901eb3c0f2ef1947f9024e243b9d2ffdfc885eeca2c788ab8b7d6d707e6855e9c5 languageName: node linkType: hard -"@nomicfoundation/edr-linux-x64-gnu@npm:0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.5.2" - checksum: 10c0/68bef3df581a534df291b894c782e8cd9af117b8ea2560063c35e4419f2c98be811164b196ea6cb52674f7837152506d82c96b3c70166c59d700423b69891fb6 +"@nomicfoundation/edr-linux-x64-gnu@npm:0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.6.1" + checksum: 10c0/479da02ee51e58cf53c4aa8795657238b67840213f1db0e21226b9ffb0ad6c53fa295b9978cc1a20739424f82eedfedbcc59e5f042d070de7e18b4b9d179c467 languageName: node linkType: hard -"@nomicfoundation/edr-linux-x64-musl@npm:0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.5.2" - checksum: 10c0/b6006e7cab11df9517f8a5951f36b133dc39e56ea27d4ba7322f3f6a7353b26eba5122aa6e04421c13e1e43833a4305357985e902c6aef175fd3db10815b3b45 +"@nomicfoundation/edr-linux-x64-musl@npm:0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.6.1" + checksum: 10c0/f6dc629ed8dc3f06532423d0b23c690da5aaeb074b06fbf1e4f53bbd463cbe6c5f0c7dd8c62130f17b9c1c24259bb989ce606f3bde44c632f9f82de60ea75d81 languageName: node linkType: hard -"@nomicfoundation/edr-win32-x64-msvc@npm:0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.5.2" - checksum: 10c0/75ac5b20fc1671f2c95daa66a1f447c7e28c949c0c5d3eaa94676f05bc362bc9025fb0bfd78e803251bce5e7e7c70d89a7502f31bcd99598c1bb774380e2d324 +"@nomicfoundation/edr-win32-x64-msvc@npm:0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.6.1" + checksum: 10c0/a17cd5c4aadf42246fa21d4fdbf2d90ec36c3fb16e585a3b73d58627891f0e33669d23f9ce1fc5b821ba5bcb3750aaf6b8e626140da750e0f6ed5e116b729d51 languageName: node linkType: hard -"@nomicfoundation/edr@npm:^0.5.2": - version: 0.5.2 - resolution: "@nomicfoundation/edr@npm:0.5.2" +"@nomicfoundation/edr@npm:^0.6.1": + version: 0.6.1 + resolution: "@nomicfoundation/edr@npm:0.6.1" dependencies: - "@nomicfoundation/edr-darwin-arm64": "npm:0.5.2" - "@nomicfoundation/edr-darwin-x64": "npm:0.5.2" - "@nomicfoundation/edr-linux-arm64-gnu": "npm:0.5.2" - "@nomicfoundation/edr-linux-arm64-musl": "npm:0.5.2" - "@nomicfoundation/edr-linux-x64-gnu": "npm:0.5.2" - "@nomicfoundation/edr-linux-x64-musl": "npm:0.5.2" - "@nomicfoundation/edr-win32-x64-msvc": "npm:0.5.2" - checksum: 10c0/958622818abde98128b5814ba022e39b6aba6641ade47de7f52e4f79795fcd80574198a3e0a0b36403be2e4edb03f3df20c637f778db974cb0d16c82ed8325f4 + "@nomicfoundation/edr-darwin-arm64": "npm:0.6.1" + "@nomicfoundation/edr-darwin-x64": "npm:0.6.1" + "@nomicfoundation/edr-linux-arm64-gnu": "npm:0.6.1" + "@nomicfoundation/edr-linux-arm64-musl": "npm:0.6.1" + "@nomicfoundation/edr-linux-x64-gnu": "npm:0.6.1" + "@nomicfoundation/edr-linux-x64-musl": "npm:0.6.1" + "@nomicfoundation/edr-win32-x64-msvc": "npm:0.6.1" + checksum: 10c0/67faebf291bc764d5a0f45c381486c04ed4c629c25178f838917c62155e500a99779d1b992bf7d7fec35ae31330fbbf8205794f4fabdb15be2b9057571f7d689 languageName: node linkType: hard @@ -6649,13 +6649,13 @@ __metadata: languageName: node linkType: hard -"hardhat@npm:^2.22.11": - version: 2.22.11 - resolution: "hardhat@npm:2.22.11" +"hardhat@npm:^2.22.12": + version: 2.22.12 + resolution: "hardhat@npm:2.22.12" dependencies: "@ethersproject/abi": "npm:^5.1.2" "@metamask/eth-sig-util": "npm:^4.0.0" - "@nomicfoundation/edr": "npm:^0.5.2" + "@nomicfoundation/edr": "npm:^0.6.1" "@nomicfoundation/ethereumjs-common": "npm:4.0.4" "@nomicfoundation/ethereumjs-tx": "npm:5.0.4" "@nomicfoundation/ethereumjs-util": "npm:9.0.4" @@ -6707,7 +6707,7 @@ __metadata: optional: true bin: hardhat: internal/cli/bootstrap.js - checksum: 10c0/d04987b1243964cb64ffd23cadf20bc1862df4e5fa1b6a9826a6152bcadd3d6080fe4b3b1f1e9bf8268de0d55ee8c4c2759184f7ed84dc5f3238631e39045640 + checksum: 10c0/ff1f9bf490fe7563b99c15862ef9e037cc2c6693c2c88dcefc4db1d98453a2890f421e4711bea3c20668c8c4533629ed2cb525cdfe0947d2f84310bc11961259 languageName: node linkType: hard @@ -8026,7 +8026,7 @@ __metadata: ethers: "npm:^6.13.2" glob: "npm:^11.0.0" globals: "npm:^15.9.0" - hardhat: "npm:^2.22.11" + hardhat: "npm:^2.22.12" hardhat-contract-sizer: "npm:^2.10.0" hardhat-gas-reporter: "npm:^1.0.10" hardhat-ignore-warnings: "npm:^0.2.11" From 168c9594b838d254ec7d9b99373a9f639b990bdb Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Tue, 24 Sep 2024 23:09:49 +0100 Subject: [PATCH 16/32] chore: add contract verification script --- .env.example | 3 + .github/workflows/release-abis.yml | 2 +- globals.d.ts | 3 + hardhat.config.ts | 9 +- package.json | 3 +- tasks/index.ts | 1 + tasks/verify-contracts.ts | 176 +++++++++++++++++++++++++++++ tsconfig.json | 2 +- 8 files changed, 195 insertions(+), 4 deletions(-) create mode 100644 tasks/index.ts create mode 100644 tasks/verify-contracts.ts diff --git a/.env.example b/.env.example index 03b8cd647..916e48b31 100644 --- a/.env.example +++ b/.env.example @@ -57,3 +57,6 @@ DEPLOYER=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 GENESIS_TIME=1639659600 GAS_PRIORITY_FEE=1 GAS_MAX_FEE=100 + +# Etherscan API key for verifying contracts +ETHERSCAN_API_KEY= diff --git a/.github/workflows/release-abis.yml b/.github/workflows/release-abis.yml index 567a82137..03b10fe9b 100644 --- a/.github/workflows/release-abis.yml +++ b/.github/workflows/release-abis.yml @@ -22,7 +22,7 @@ jobs: run: yarn compile - name: Extract ABIs - run: yarn extract-abis + run: yarn abis:extract - name: Create ABIs archive run: zip -j ABIs.zip lib/abi/*.json diff --git a/globals.d.ts b/globals.d.ts index 088abbc48..9fefd2991 100644 --- a/globals.d.ts +++ b/globals.d.ts @@ -66,5 +66,8 @@ declare namespace NodeJS { MAINNET_VALIDATORS_EXIT_BUS_ORACLE_ADDRESS?: string; MAINNET_WITHDRAWAL_QUEUE_ADDRESS?: string; MAINNET_WITHDRAWAL_VAULT_ADDRESS?: string; + + /* for contract verification */ + ETHERSCAN_API_KEY?: string; } } diff --git a/hardhat.config.ts b/hardhat.config.ts index 3722a1683..5ae8bcc18 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -14,10 +14,12 @@ import "hardhat-ignore-warnings"; import "hardhat-contract-sizer"; import { globSync } from "glob"; import { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } from "hardhat/builtin-tasks/task-names"; -import { HardhatUserConfig, subtask } from "hardhat/config"; +import { HardhatUserConfig, subtask, task } from "hardhat/config"; import { mochaRootHooks } from "test/hooks"; +import { verifyDeployedContracts } from "./tasks"; + const RPC_URL: string = process.env.RPC_URL || ""; const MAINNET_FORKING_URL = process.env.MAINNET_FORKING_URL || ""; const INTEGRATION_SCRATCH_DEPLOY = process.env.INTEGRATION_SCRATCH_DEPLOY || "off"; @@ -75,6 +77,9 @@ const config: HardhatUserConfig = { accounts: loadAccounts("sepolia"), }, }, + etherscan: { + apiKey: process.env.ETHERSCAN_API_KEY || "", + }, solidity: { compilers: [ { @@ -189,4 +194,6 @@ subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, hre, runSupe return [...paths, ...otherPaths]; }); +task("verify:deployed", "Verifies deployed contracts based on state file").setAction(verifyDeployedContracts); + export default config; diff --git a/package.json b/package.json index eadf1cb0e..73da08270 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "test:integration:fork:mainnet": "hardhat test test/integration/**/*.ts --network mainnet-fork --bail", "typecheck": "tsc --noEmit", "prepare": "husky", - "extract-abis": "ts-node scripts/utils/extract-abi.ts" + "abis:extract": "ts-node scripts/utils/extract-abi.ts", + "verify:deployed": "hardhat verify:deployed" }, "lint-staged": { "./**/*.ts": [ diff --git a/tasks/index.ts b/tasks/index.ts new file mode 100644 index 000000000..d3988c167 --- /dev/null +++ b/tasks/index.ts @@ -0,0 +1 @@ +export * from "./verify-contracts"; diff --git a/tasks/verify-contracts.ts b/tasks/verify-contracts.ts new file mode 100644 index 000000000..59cf3dbdb --- /dev/null +++ b/tasks/verify-contracts.ts @@ -0,0 +1,176 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { cy, log, yl } from "lib/log"; + +type DeployedContract = { + contract: string; + address: string; + constructorArgs: unknown[]; +}; + +type ProxyContract = { + proxy: DeployedContract; + implementation: DeployedContract; +}; + +type Contract = DeployedContract | ProxyContract; + +type NetworkState = { + deployer: string; + [key: string]: Contract | string | number; +}; + +const MAX_RETRY_ATTEMPTS = 5; +const RETRY_DELAY_MS = 1000; + +export async function verifyDeployedContracts(_: unknown, hre: HardhatRuntimeEnvironment) { + try { + await verifyContracts(hre); + } catch (error) { + log.error("Error verifying deployed contracts:", error as Error); + throw error; + } +} + +async function verifyContracts(hre: HardhatRuntimeEnvironment) { + const network = hre.network.name; + log("Verifying contracts for network:", network); + + const deployerAddress = await getDeployerAddress(hre); + log("Deployer address:", deployerAddress); + log.emptyLine(); + + const networkState = await getNetworkState(network, deployerAddress); + const deployedContracts = getDeployedContracts(networkState); + await verifyContractList(deployedContracts, hre); +} + +async function getDeployerAddress(hre: HardhatRuntimeEnvironment): Promise { + const deployer = await hre.ethers.provider.getSigner(); + if (!deployer) { + throw new Error("Deployer not found!"); + } + return deployer.address; +} + +async function getNetworkState(network: string, deployerAddress: string): Promise { + const networkStateFile = `deployed-${network}.json`; + const networkStateFilePath = path.resolve("./", networkStateFile); + const data = await fs.readFile(networkStateFilePath, "utf8"); + const networkState = JSON.parse(data) as NetworkState; + + if (networkState.deployer !== deployerAddress) { + throw new Error(`Deployer address mismatch: ${networkState.deployer} != ${deployerAddress}`); + } + + return networkState; +} + +function getDeployedContracts(networkState: NetworkState): DeployedContract[] { + return Object.values(networkState) + .filter((contract): contract is Contract => typeof contract === "object") + .flatMap(getDeployedContract); +} + +async function verifyContractList(contracts: DeployedContract[], hre: HardhatRuntimeEnvironment) { + for (const contract of contracts) { + await verifyContract(contract, hre); + } +} + +async function verifyContract(contract: DeployedContract, hre: HardhatRuntimeEnvironment) { + try { + if (await isContractVerified(contract.address, hre)) { + log.success(`Contract ${yl(contract.contract)} at ${cy(contract.address)} is already verified!`); + return; + } + + const verificationParams = buildVerificationParams(contract); + log.withArguments( + `Verifying contract: ${yl(contract.contract)} at ${cy(contract.address)} with constructor args `, + verificationParams.constructorArguments as string[], + ); + + await hre.run("verify:verify", verificationParams); + log.success(`Successfully verified ${yl(contract.contract)}!`); + } catch (error) { + log.error(`Failed to verify ${yl(contract.contract)}:`, error as Error); + } + log.emptyLine(); +} + +function buildVerificationParams(contract: DeployedContract) { + const contractName = contract.contract.split("/").pop()?.split(".")[0]; + return { + address: contract.address, + constructorArguments: contract.constructorArgs, + contract: `${contract.contract}:${contractName}`, + }; +} + +function getDeployedContract(contract: Contract): DeployedContract[] { + if ("proxy" in contract && "implementation" in contract) { + return [contract.proxy, contract.implementation]; + } else if ("contract" in contract && "address" in contract && "constructorArgs" in contract) { + return [contract]; + } + return []; +} + +async function isContractVerified(address: string, hre: HardhatRuntimeEnvironment): Promise { + try { + const apiURL = getEtherscanApiUrl(hre.network.name); + const etherscanApiKey = getEtherscanApiKey(hre); + const params = buildApiParams(address, etherscanApiKey); + const result = await fetchContractSourceCode(apiURL, params); + return isSourceCodeVerified(result); + } catch (error) { + console.error(`Failed to check verification status for contract ${address}:`, error); + return false; + } +} + +function getEtherscanApiUrl(network: string): string { + return `https://api${network !== "mainnet" ? `-${network}` : ""}.etherscan.io/api`; +} + +function getEtherscanApiKey(hre: HardhatRuntimeEnvironment): string { + return hre.config.etherscan.apiKey as string; +} + +function buildApiParams(address: string, apiKey: string): URLSearchParams { + return new URLSearchParams({ + module: "contract", + action: "getsourcecode", + address, + apikey: apiKey, + }); +} + +async function fetchContractSourceCode(apiURL: string, params: URLSearchParams) { + return await retryFetch(`${apiURL}?${params}`, MAX_RETRY_ATTEMPTS, RETRY_DELAY_MS); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isSourceCodeVerified(result: any): boolean { + return result.status === "1" && result.result.length > 0 && result.result[0].SourceCode !== ""; +} + +async function retryFetch(url: string, maxRetries: number, retryDelay: number) { + for (let attempt = 0; attempt < maxRetries; attempt++) { + const response = await fetch(url); + const data = await response.json(); + + if (data.status === "1" && data.result.length > 0) return data; + + if (data.message === "NOTOK" && data.result.includes("rate limit")) { + await new Promise((resolve) => setTimeout(resolve, retryDelay)); + } else { + return data; + } + } + throw new Error(`Max retries reached. Unable to fetch.`); +} diff --git a/tsconfig.json b/tsconfig.json index f3c94cd1f..fdac08afc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,6 @@ "typechain-types": ["./typechain-types"] } }, - "include": ["./test", "./typechain-types", "./lib", "./scripts", "./deployed-*.json"], + "include": ["./test", "./typechain-types", "./lib", "./scripts", "./tasks", "./deployed-*.json"], "files": ["./hardhat.config.ts", "./commitlint.config.ts", "./globals.d.ts"] } From c808cd31ad89ed1d5b1fdfa37e8bfed347d08556 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Tue, 24 Sep 2024 23:19:57 +0100 Subject: [PATCH 17/32] chore: small refactoring --- tasks/verify-contracts.ts | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/tasks/verify-contracts.ts b/tasks/verify-contracts.ts index 59cf3dbdb..da00ca4ee 100644 --- a/tasks/verify-contracts.ts +++ b/tasks/verify-contracts.ts @@ -123,8 +123,13 @@ function getDeployedContract(contract: Contract): DeployedContract[] { async function isContractVerified(address: string, hre: HardhatRuntimeEnvironment): Promise { try { const apiURL = getEtherscanApiUrl(hre.network.name); - const etherscanApiKey = getEtherscanApiKey(hre); - const params = buildApiParams(address, etherscanApiKey); + const params = new URLSearchParams({ + module: "contract", + action: "getsourcecode", + address, + apikey: getEtherscanApiKey(hre), + }); + const result = await fetchContractSourceCode(apiURL, params); return isSourceCodeVerified(result); } catch (error) { @@ -138,27 +143,19 @@ function getEtherscanApiUrl(network: string): string { } function getEtherscanApiKey(hre: HardhatRuntimeEnvironment): string { - return hre.config.etherscan.apiKey as string; -} - -function buildApiParams(address: string, apiKey: string): URLSearchParams { - return new URLSearchParams({ - module: "contract", - action: "getsourcecode", - address, - apikey: apiKey, - }); + const apiKey = hre.config.etherscan.apiKey; + if (typeof apiKey === "string") { + return apiKey; + } else if (typeof apiKey === "object" && apiKey !== null) { + return apiKey[hre.network.name] || ""; + } + return ""; } async function fetchContractSourceCode(apiURL: string, params: URLSearchParams) { return await retryFetch(`${apiURL}?${params}`, MAX_RETRY_ATTEMPTS, RETRY_DELAY_MS); } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function isSourceCodeVerified(result: any): boolean { - return result.status === "1" && result.result.length > 0 && result.result[0].SourceCode !== ""; -} - async function retryFetch(url: string, maxRetries: number, retryDelay: number) { for (let attempt = 0; attempt < maxRetries; attempt++) { const response = await fetch(url); @@ -174,3 +171,8 @@ async function retryFetch(url: string, maxRetries: number, retryDelay: number) { } throw new Error(`Max retries reached. Unable to fetch.`); } + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isSourceCodeVerified(result: any): boolean { + return result.status === "1" && result.result.length > 0 && result.result[0].SourceCode !== ""; +} From ae1cf4637d0044adea6fa053886aca3f4c868d26 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 25 Sep 2024 14:16:04 +0100 Subject: [PATCH 18/32] chore: move abi publish to the task --- hardhat.config.ts | 3 +- package.json | 4 +- scripts/utils/extract-abi.ts | 83 ------------------------------------ tasks/extract-abis.ts | 38 +++++++++++++++++ tasks/index.ts | 1 + 5 files changed, 43 insertions(+), 86 deletions(-) delete mode 100644 scripts/utils/extract-abi.ts create mode 100644 tasks/extract-abis.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index 5ae8bcc18..d9c50ae3c 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -18,7 +18,7 @@ import { HardhatUserConfig, subtask, task } from "hardhat/config"; import { mochaRootHooks } from "test/hooks"; -import { verifyDeployedContracts } from "./tasks"; +import { extractABIs, verifyDeployedContracts } from "./tasks"; const RPC_URL: string = process.env.RPC_URL || ""; const MAINNET_FORKING_URL = process.env.MAINNET_FORKING_URL || ""; @@ -195,5 +195,6 @@ subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, hre, runSupe }); task("verify:deployed", "Verifies deployed contracts based on state file").setAction(verifyDeployedContracts); +task("abis:extract", "Extract ABIs from artifacts").setAction(extractABIs); export default config; diff --git a/package.json b/package.json index 73da08270..5ba138163 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,8 @@ "test:integration:fork:mainnet": "hardhat test test/integration/**/*.ts --network mainnet-fork --bail", "typecheck": "tsc --noEmit", "prepare": "husky", - "abis:extract": "ts-node scripts/utils/extract-abi.ts", - "verify:deployed": "hardhat verify:deployed" + "abis:extract": "hardhat abis:extract", + "verify:deployed": "hardhat verify:deployed --no-compile" }, "lint-staged": { "./**/*.ts": [ diff --git a/scripts/utils/extract-abi.ts b/scripts/utils/extract-abi.ts deleted file mode 100644 index 0e212f17a..000000000 --- a/scripts/utils/extract-abi.ts +++ /dev/null @@ -1,83 +0,0 @@ -import fs from "node:fs/promises"; -import path from "node:path"; - -type Artifact = { - contractName: string; - abi: Record[]; -}; - -const ARTIFACTS_PATH = path.resolve(process.cwd(), "artifacts"); -const ABIS_PATH = path.resolve(process.cwd(), "lib", "abi"); - -const LIDO_ARTIFACT_PREFIX = "contracts/"; - -const ARAGON_ARTIFACT_PATHS = [ - "@aragon/apps-finance/contracts/Finance.sol/Finance.json", - "@aragon/apps-vault/contracts/Vault.sol/Vault.json", - "@aragon/apps-lido/apps/voting/contracts/Voting.sol/Voting.json", - "@aragon/apps-lido/apps/token-manager/contracts/TokenManager.sol/TokenManager.json", -]; - -const SKIP_NAMES_REGEX = /(Mock|test_helpers|Imports|deposit_contract|Pausable|.dbg.json|build-info|interfaces)/; - -async function exportABIs(): Promise { - const artifactPaths = await getArtifacts(ARTIFACTS_PATH); - const paths = artifactPaths - .map((p) => path.relative(ARTIFACTS_PATH, p)) - .filter((p) => !SKIP_NAMES_REGEX.test(p)) - .filter((p) => p.startsWith(LIDO_ARTIFACT_PREFIX)) - .concat(ARAGON_ARTIFACT_PATHS); - - await extractABIs(paths, ABIS_PATH); -} - -async function extractABIs(artifactPaths: string[], abiPath: string): Promise { - await prepareDirectory(abiPath); - - for (const artifactPath of artifactPaths) { - const artifact = await loadArtifact(artifactPath); - if (artifact.abi && artifact.abi.length > 0) { - await saveABI(artifact, abiPath); - } - } -} - -async function prepareDirectory(dir: string): Promise { - try { - await fs.rm(dir, { recursive: true, force: true }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (error) { - // Ignore - } finally { - await fs.mkdir(dir, { recursive: true }); - } -} - -async function loadArtifact(artifactPath: string): Promise { - const artifactContent = await fs.readFile(path.join(ARTIFACTS_PATH, artifactPath), "utf-8"); - return JSON.parse(artifactContent); -} - -async function saveABI(artifact: Artifact, abiPath: string): Promise { - console.log(`Extracting ABI for ${artifact.contractName}...`); - const abiData = JSON.stringify(artifact.abi); - await fs.writeFile(path.join(abiPath, `${artifact.contractName}.json`), abiData); -} - -async function getArtifacts(dir: string): Promise { - const entries = await fs.readdir(dir, { withFileTypes: true }); - const files = await Promise.all( - entries.map((dirent) => { - const res = path.join(dir, dirent.name); - return dirent.isDirectory() ? getArtifacts(res) : res; - }), - ); - return files.flat(); -} - -exportABIs() - .then(() => console.log(`All done!`)) - .catch((err: Error) => { - console.error(err.stack); - process.exit(10); - }); diff --git a/tasks/extract-abis.ts b/tasks/extract-abis.ts new file mode 100644 index 000000000..6a1c80526 --- /dev/null +++ b/tasks/extract-abis.ts @@ -0,0 +1,38 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { log, yl } from "lib/log"; + +const ABI_OUTPUT_PATH = path.resolve(process.cwd(), "lib", "abi"); +const LIDO_ARTIFACT_PREFIX = "contracts/"; +const ARAGON_ARTIFACT_PATHS = [ + "@aragon/apps-finance/contracts/Finance.sol:Finance", + "@aragon/apps-vault/contracts/Vault.sol:Vault", + "@aragon/apps-lido/apps/voting/contracts/Voting.sol:Voting", + "@aragon/apps-lido/apps/token-manager/contracts/TokenManager.sol:TokenManager", +]; +const SKIP_NAMES_REGEX = /(Mock|Harness|test_helpers|Imports|deposit_contract|Pausable|.dbg.json|build-info)/; + +export async function extractABIs(_: unknown, hre: HardhatRuntimeEnvironment) { + const artifactNames = await hre.artifacts.getAllFullyQualifiedNames(); + + const artifactNamesToPublish = artifactNames + .filter((name) => !SKIP_NAMES_REGEX.test(name) && name.startsWith(LIDO_ARTIFACT_PREFIX)) + .concat(ARAGON_ARTIFACT_PATHS); + + await fs.rm(ABI_OUTPUT_PATH, { recursive: true, force: true }); + await fs.mkdir(ABI_OUTPUT_PATH, { recursive: true }); + + for (const name of artifactNamesToPublish) { + const artifact = await hre.artifacts.readArtifact(name); + if (artifact.abi && artifact.abi.length > 0) { + const abiData = JSON.stringify(artifact.abi, null, 2); + await fs.writeFile(path.join(ABI_OUTPUT_PATH, `${artifact.contractName}.json`), abiData); + log.success(`ABI for ${yl(artifact.contractName)} has been saved!`); + } + } + + log.success("All ABIs have been extracted and saved!"); +} diff --git a/tasks/index.ts b/tasks/index.ts index d3988c167..ada28baca 100644 --- a/tasks/index.ts +++ b/tasks/index.ts @@ -1 +1,2 @@ export * from "./verify-contracts"; +export * from "./extract-abis"; From 9da77fe3efc263294886975c954192b42024d63e Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 25 Sep 2024 14:17:47 +0100 Subject: [PATCH 19/32] chore: small fix --- tasks/verify-contracts.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tasks/verify-contracts.ts b/tasks/verify-contracts.ts index da00ca4ee..9f70353ce 100644 --- a/tasks/verify-contracts.ts +++ b/tasks/verify-contracts.ts @@ -82,18 +82,18 @@ async function verifyContractList(contracts: DeployedContract[], hre: HardhatRun } async function verifyContract(contract: DeployedContract, hre: HardhatRuntimeEnvironment) { - try { - if (await isContractVerified(contract.address, hre)) { - log.success(`Contract ${yl(contract.contract)} at ${cy(contract.address)} is already verified!`); - return; - } + if (await isContractVerified(contract.address, hre)) { + log.success(`Contract ${yl(contract.contract)} at ${cy(contract.address)} is already verified!`); + return; + } - const verificationParams = buildVerificationParams(contract); - log.withArguments( - `Verifying contract: ${yl(contract.contract)} at ${cy(contract.address)} with constructor args `, - verificationParams.constructorArguments as string[], - ); + const verificationParams = buildVerificationParams(contract); + log.withArguments( + `Verifying contract: ${yl(contract.contract)} at ${cy(contract.address)} with constructor args `, + verificationParams.constructorArguments as string[], + ); + try { await hre.run("verify:verify", verificationParams); log.success(`Successfully verified ${yl(contract.contract)}!`); } catch (error) { From ece84fd6d756912e4452293cd0b3de32d46958ec Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 25 Sep 2024 14:23:28 +0100 Subject: [PATCH 20/32] chore: add force compilation before abi extraction --- tasks/extract-abis.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks/extract-abis.ts b/tasks/extract-abis.ts index 6a1c80526..f57a6dc74 100644 --- a/tasks/extract-abis.ts +++ b/tasks/extract-abis.ts @@ -16,6 +16,8 @@ const ARAGON_ARTIFACT_PATHS = [ const SKIP_NAMES_REGEX = /(Mock|Harness|test_helpers|Imports|deposit_contract|Pausable|.dbg.json|build-info)/; export async function extractABIs(_: unknown, hre: HardhatRuntimeEnvironment) { + await hre.run("compile"); + const artifactNames = await hre.artifacts.getAllFullyQualifiedNames(); const artifactNamesToPublish = artifactNames From 0a96d3d3a79688ea6b1d2dbe295c9889e8021d1a Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 25 Sep 2024 14:42:52 +0100 Subject: [PATCH 21/32] ci: remove duplicate compile --- .github/workflows/release-abis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/release-abis.yml b/.github/workflows/release-abis.yml index 03b10fe9b..58851a91c 100644 --- a/.github/workflows/release-abis.yml +++ b/.github/workflows/release-abis.yml @@ -18,9 +18,6 @@ jobs: - name: Common setup uses: ./.github/workflows/setup - - name: Compile contracts - run: yarn compile - - name: Extract ABIs run: yarn abis:extract From cc18828fadebba81738023937141f20f196ddfa2 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 25 Sep 2024 14:47:46 +0100 Subject: [PATCH 22/32] chore: simplify tasks definition --- hardhat.config.ts | 7 ++----- tasks/extract-abis.ts | 5 +++-- tasks/verify-contracts.ts | 19 +++++++++++-------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index d9c50ae3c..c4b0c2ef0 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -14,11 +14,11 @@ import "hardhat-ignore-warnings"; import "hardhat-contract-sizer"; import { globSync } from "glob"; import { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } from "hardhat/builtin-tasks/task-names"; -import { HardhatUserConfig, subtask, task } from "hardhat/config"; +import { HardhatUserConfig, subtask } from "hardhat/config"; import { mochaRootHooks } from "test/hooks"; -import { extractABIs, verifyDeployedContracts } from "./tasks"; +import "./tasks"; const RPC_URL: string = process.env.RPC_URL || ""; const MAINNET_FORKING_URL = process.env.MAINNET_FORKING_URL || ""; @@ -194,7 +194,4 @@ subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, hre, runSupe return [...paths, ...otherPaths]; }); -task("verify:deployed", "Verifies deployed contracts based on state file").setAction(verifyDeployedContracts); -task("abis:extract", "Extract ABIs from artifacts").setAction(extractABIs); - export default config; diff --git a/tasks/extract-abis.ts b/tasks/extract-abis.ts index f57a6dc74..62449c49c 100644 --- a/tasks/extract-abis.ts +++ b/tasks/extract-abis.ts @@ -1,6 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { task } from "hardhat/config"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { log, yl } from "lib/log"; @@ -15,7 +16,7 @@ const ARAGON_ARTIFACT_PATHS = [ ]; const SKIP_NAMES_REGEX = /(Mock|Harness|test_helpers|Imports|deposit_contract|Pausable|.dbg.json|build-info)/; -export async function extractABIs(_: unknown, hre: HardhatRuntimeEnvironment) { +task("abis:extract", "Extract ABIs from artifacts").setAction(async (_: unknown, hre: HardhatRuntimeEnvironment) => { await hre.run("compile"); const artifactNames = await hre.artifacts.getAllFullyQualifiedNames(); @@ -37,4 +38,4 @@ export async function extractABIs(_: unknown, hre: HardhatRuntimeEnvironment) { } log.success("All ABIs have been extracted and saved!"); -} +}); diff --git a/tasks/verify-contracts.ts b/tasks/verify-contracts.ts index 9f70353ce..44c505ffe 100644 --- a/tasks/verify-contracts.ts +++ b/tasks/verify-contracts.ts @@ -1,6 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { task } from "hardhat/config"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { cy, log, yl } from "lib/log"; @@ -26,14 +27,16 @@ type NetworkState = { const MAX_RETRY_ATTEMPTS = 5; const RETRY_DELAY_MS = 1000; -export async function verifyDeployedContracts(_: unknown, hre: HardhatRuntimeEnvironment) { - try { - await verifyContracts(hre); - } catch (error) { - log.error("Error verifying deployed contracts:", error as Error); - throw error; - } -} +task("verify:deployed", "Verifies deployed contracts based on state file").setAction( + async (_: unknown, hre: HardhatRuntimeEnvironment) => { + try { + await verifyContracts(hre); + } catch (error) { + log.error("Error verifying deployed contracts:", error as Error); + throw error; + } + }, +); async function verifyContracts(hre: HardhatRuntimeEnvironment) { const network = hre.network.name; From c2dcee13092f1820b0ffa14b40eb038afd9bc2a3 Mon Sep 17 00:00:00 2001 From: Elias Rad <146735585+nnsW3@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:17:06 +0300 Subject: [PATCH 23/32] Update scratch-deploy.md --- docs/scratch-deploy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/scratch-deploy.md b/docs/scratch-deploy.md index 1066503fe..55a1af436 100644 --- a/docs/scratch-deploy.md +++ b/docs/scratch-deploy.md @@ -43,7 +43,7 @@ These are the deployment setups, supported currently: - local (basically any node at http://127.0.0.1:8545); - Holešky testnet. -Each is described in the details in the sections below. +Each is described in detail in the sections below. > NB: Aragon UI for Lido DAO is to be deprecated and replaced by a custom solution, thus not included in the deployment > script, see https://research.lido.fi/t/discontinuation-of-aragon-ui-use/7992. From 3094e63b3bb76792e331b3e50b865eb7bb388471 Mon Sep 17 00:00:00 2001 From: Elias Rad <146735585+nnsW3@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:18:54 +0300 Subject: [PATCH 24/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 205350502..66c8d65f3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This repository is currently a **work-in-progress**. This repository is the modernized iteration of the outdated [`lido-dao` repository](https://github.com/lidofinance/lido-dao). Significant efforts were undertaken to update the tooling and infrastructure to align with current standards and best practices. As part of this modernization process: -- the codebase has been transitioned from JavaScript to TypeScript to leverage TypeScript's robust type-checking, IDE autocompletion, and scalability features; +- the codebase has been transitioned from JavaScript to TypeScript to leverage TypeScript's robust type-checking, IDE auto-completion, and scalability features; - the test suite was revamped and restructured to ensure consistent approach and comprehensive testing coverage; - deprecated dependencies (e.g. Waffle testing framework) were removed or replaced by modern alternatives; - outdated dependencies such as Hardhat, ethers and others were upgraded to their latest versions to improve performance, compatibility and developer experience; From 5f32255551deae17bc7662ee396c5e915ac3dee6 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 2 Oct 2024 15:08:21 +0100 Subject: [PATCH 25/32] ci: fix --- .github/workflows/coverage.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 872adb629..af6e03014 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -7,6 +7,10 @@ jobs: name: Hardhat runs-on: ubuntu-latest + permissions: + contents: write + issues: write + steps: - uses: actions/checkout@v4 From 5243b29a0398647c8050bcdc0635e76680322d11 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 2 Oct 2024 15:29:47 +0100 Subject: [PATCH 26/32] fix: review --- tasks/extract-abis.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tasks/extract-abis.ts b/tasks/extract-abis.ts index 62449c49c..22a3b9194 100644 --- a/tasks/extract-abis.ts +++ b/tasks/extract-abis.ts @@ -1,6 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { TASK_CLEAN, TASK_COMPILE } from "hardhat/builtin-tasks/task-names"; import { task } from "hardhat/config"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -14,10 +15,12 @@ const ARAGON_ARTIFACT_PATHS = [ "@aragon/apps-lido/apps/voting/contracts/Voting.sol:Voting", "@aragon/apps-lido/apps/token-manager/contracts/TokenManager.sol:TokenManager", ]; + const SKIP_NAMES_REGEX = /(Mock|Harness|test_helpers|Imports|deposit_contract|Pausable|.dbg.json|build-info)/; task("abis:extract", "Extract ABIs from artifacts").setAction(async (_: unknown, hre: HardhatRuntimeEnvironment) => { - await hre.run("compile"); + await hre.run(TASK_CLEAN); + await hre.run(TASK_COMPILE); const artifactNames = await hre.artifacts.getAllFullyQualifiedNames(); From 9479c3fdffa2cb4a6a42a51c1ba5ecc8e119a2f2 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 2 Oct 2024 15:46:43 +0100 Subject: [PATCH 27/32] chore: simplify contract verification --- tasks/verify-contracts.ts | 149 ++++++++------------------------------ 1 file changed, 29 insertions(+), 120 deletions(-) diff --git a/tasks/verify-contracts.ts b/tasks/verify-contracts.ts index 44c505ffe..3dd4e03a4 100644 --- a/tasks/verify-contracts.ts +++ b/tasks/verify-contracts.ts @@ -24,73 +24,47 @@ type NetworkState = { [key: string]: Contract | string | number; }; -const MAX_RETRY_ATTEMPTS = 5; -const RETRY_DELAY_MS = 1000; +const errors = [] as string[]; task("verify:deployed", "Verifies deployed contracts based on state file").setAction( async (_: unknown, hre: HardhatRuntimeEnvironment) => { try { - await verifyContracts(hre); + const network = hre.network.name; + log("Verifying contracts for network:", network); + + const networkStateFile = `deployed-${network}.json`; + const networkStateFilePath = path.resolve("./", networkStateFile); + const data = await fs.readFile(networkStateFilePath, "utf8"); + const networkState = JSON.parse(data) as NetworkState; + + const deployedContracts = Object.values(networkState) + .filter((contract): contract is Contract => typeof contract === "object") + .flatMap(getDeployedContract); + + // Not using Promise.all to avoid logging messages out of order + for (const contract of deployedContracts) { + await verifyContract(contract, hre); + } } catch (error) { log.error("Error verifying deployed contracts:", error as Error); throw error; } + + if (errors.length > 0) { + log.error(`Failed to verify ${errors.length} contract(s):`, errors as string[]); + process.exitCode = errors.length; + } }, ); -async function verifyContracts(hre: HardhatRuntimeEnvironment) { - const network = hre.network.name; - log("Verifying contracts for network:", network); - - const deployerAddress = await getDeployerAddress(hre); - log("Deployer address:", deployerAddress); - log.emptyLine(); - - const networkState = await getNetworkState(network, deployerAddress); - const deployedContracts = getDeployedContracts(networkState); - await verifyContractList(deployedContracts, hre); -} - -async function getDeployerAddress(hre: HardhatRuntimeEnvironment): Promise { - const deployer = await hre.ethers.provider.getSigner(); - if (!deployer) { - throw new Error("Deployer not found!"); - } - return deployer.address; -} - -async function getNetworkState(network: string, deployerAddress: string): Promise { - const networkStateFile = `deployed-${network}.json`; - const networkStateFilePath = path.resolve("./", networkStateFile); - const data = await fs.readFile(networkStateFilePath, "utf8"); - const networkState = JSON.parse(data) as NetworkState; - - if (networkState.deployer !== deployerAddress) { - throw new Error(`Deployer address mismatch: ${networkState.deployer} != ${deployerAddress}`); - } - - return networkState; -} - -function getDeployedContracts(networkState: NetworkState): DeployedContract[] { - return Object.values(networkState) - .filter((contract): contract is Contract => typeof contract === "object") - .flatMap(getDeployedContract); -} - -async function verifyContractList(contracts: DeployedContract[], hre: HardhatRuntimeEnvironment) { - for (const contract of contracts) { - await verifyContract(contract, hre); - } -} - async function verifyContract(contract: DeployedContract, hre: HardhatRuntimeEnvironment) { - if (await isContractVerified(contract.address, hre)) { - log.success(`Contract ${yl(contract.contract)} at ${cy(contract.address)} is already verified!`); - return; - } + const contractName = contract.contract.split("/").pop()?.split(".")[0]; + const verificationParams = { + address: contract.address, + constructorArguments: contract.constructorArgs, + contract: `${contract.contract}:${contractName}`, + }; - const verificationParams = buildVerificationParams(contract); log.withArguments( `Verifying contract: ${yl(contract.contract)} at ${cy(contract.address)} with constructor args `, verificationParams.constructorArguments as string[], @@ -101,19 +75,11 @@ async function verifyContract(contract: DeployedContract, hre: HardhatRuntimeEnv log.success(`Successfully verified ${yl(contract.contract)}!`); } catch (error) { log.error(`Failed to verify ${yl(contract.contract)}:`, error as Error); + errors.push(verificationParams.address); } log.emptyLine(); } -function buildVerificationParams(contract: DeployedContract) { - const contractName = contract.contract.split("/").pop()?.split(".")[0]; - return { - address: contract.address, - constructorArguments: contract.constructorArgs, - contract: `${contract.contract}:${contractName}`, - }; -} - function getDeployedContract(contract: Contract): DeployedContract[] { if ("proxy" in contract && "implementation" in contract) { return [contract.proxy, contract.implementation]; @@ -122,60 +88,3 @@ function getDeployedContract(contract: Contract): DeployedContract[] { } return []; } - -async function isContractVerified(address: string, hre: HardhatRuntimeEnvironment): Promise { - try { - const apiURL = getEtherscanApiUrl(hre.network.name); - const params = new URLSearchParams({ - module: "contract", - action: "getsourcecode", - address, - apikey: getEtherscanApiKey(hre), - }); - - const result = await fetchContractSourceCode(apiURL, params); - return isSourceCodeVerified(result); - } catch (error) { - console.error(`Failed to check verification status for contract ${address}:`, error); - return false; - } -} - -function getEtherscanApiUrl(network: string): string { - return `https://api${network !== "mainnet" ? `-${network}` : ""}.etherscan.io/api`; -} - -function getEtherscanApiKey(hre: HardhatRuntimeEnvironment): string { - const apiKey = hre.config.etherscan.apiKey; - if (typeof apiKey === "string") { - return apiKey; - } else if (typeof apiKey === "object" && apiKey !== null) { - return apiKey[hre.network.name] || ""; - } - return ""; -} - -async function fetchContractSourceCode(apiURL: string, params: URLSearchParams) { - return await retryFetch(`${apiURL}?${params}`, MAX_RETRY_ATTEMPTS, RETRY_DELAY_MS); -} - -async function retryFetch(url: string, maxRetries: number, retryDelay: number) { - for (let attempt = 0; attempt < maxRetries; attempt++) { - const response = await fetch(url); - const data = await response.json(); - - if (data.status === "1" && data.result.length > 0) return data; - - if (data.message === "NOTOK" && data.result.includes("rate limit")) { - await new Promise((resolve) => setTimeout(resolve, retryDelay)); - } else { - return data; - } - } - throw new Error(`Max retries reached. Unable to fetch.`); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function isSourceCodeVerified(result: any): boolean { - return result.status === "1" && result.result.length > 0 && result.result[0].SourceCode !== ""; -} From 7484eeaa62897ada2de54021e8b453d6b933a9bf Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 2 Oct 2024 16:50:34 +0200 Subject: [PATCH 28/32] Update globals.d.ts Co-authored-by: Eugene Mamin --- globals.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/globals.d.ts b/globals.d.ts index 9fefd2991..7637be82d 100644 --- a/globals.d.ts +++ b/globals.d.ts @@ -67,7 +67,7 @@ declare namespace NodeJS { MAINNET_WITHDRAWAL_QUEUE_ADDRESS?: string; MAINNET_WITHDRAWAL_VAULT_ADDRESS?: string; - /* for contract verification */ + /* for contract sourcecode verification with `hardhat-verify` */ ETHERSCAN_API_KEY?: string; } } From 5bec2ea64883cbe647cb4940b9af03d91de6efeb Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 2 Oct 2024 16:01:10 +0100 Subject: [PATCH 29/32] ci: try write all permissions --- .github/workflows/coverage.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index af6e03014..4f056ff79 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -7,9 +7,7 @@ jobs: name: Hardhat runs-on: ubuntu-latest - permissions: - contents: write - issues: write + permissions: write-all steps: - uses: actions/checkout@v4 From f175c55b0312284f77bf81dd9f5bcb488ce03c34 Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Wed, 2 Oct 2024 16:10:35 +0100 Subject: [PATCH 30/32] ci: update permissions once more --- .github/workflows/coverage.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 4f056ff79..8d79e6369 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -7,7 +7,10 @@ jobs: name: Hardhat runs-on: ubuntu-latest - permissions: write-all + permissions: + contents: write + issues: write + pull-requests: write steps: - uses: actions/checkout@v4 From 17c5ca7390d3038287bb3d9d7424aadac0922e3f Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Thu, 10 Oct 2024 21:58:02 +0100 Subject: [PATCH 31/32] fix: review feedback --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 8d79e6369..2b767be9c 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest permissions: - contents: write + contents: read issues: write pull-requests: write From 7e0bae9334ff527a422b4dfb06a834f56af1527a Mon Sep 17 00:00:00 2001 From: Yuri Tkachenko Date: Thu, 10 Oct 2024 22:04:06 +0100 Subject: [PATCH 32/32] fix: restore coverage --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 2b767be9c..8d79e6369 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest permissions: - contents: read + contents: write issues: write pull-requests: write