From d31e88390cb339a290d30cf93802c0e7f0494269 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Mon, 12 May 2025 21:04:05 +0900 Subject: [PATCH 01/56] Update git configs --- .gitignore | 4 ++++ src/core/.gitkeep | 0 2 files changed, 4 insertions(+) delete mode 100644 src/core/.gitkeep diff --git a/.gitignore b/.gitignore index 228a386..fd5888e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ +# python +.venv +.python-version + # misc cspell.json diff --git a/src/core/.gitkeep b/src/core/.gitkeep deleted file mode 100644 index e69de29..0000000 From 8e3a41156bc4c27efaf8dc49cb1399de4b4d87e4 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Mon, 12 May 2025 21:05:15 +0900 Subject: [PATCH 02/56] Reconstruct monorepo with uv instead of poetry --- pyproject.toml | 12 + src/core/README.md | 4 + src/core/pyproject.toml | 56 ++ uv.lock | 1569 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 1641 insertions(+) create mode 100644 pyproject.toml create mode 100644 src/core/README.md create mode 100644 src/core/pyproject.toml create mode 100644 uv.lock diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b99261d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "jpyc-python-sdks" +version = "1.0.0" +requires-python = ">=3.11" +description = "Python SDKs for JPYC protocols" +readme = "README.md" + +[tool.uv.sources] +core = { workspace = true } + +[tool.uv.workspace] +members = ["src/*"] diff --git a/src/core/README.md b/src/core/README.md new file mode 100644 index 0000000..6c77624 --- /dev/null +++ b/src/core/README.md @@ -0,0 +1,4 @@ +# Core SDK + +> [!IMPORTANT] +> TODO: README in English diff --git a/src/core/pyproject.toml b/src/core/pyproject.toml new file mode 100644 index 0000000..f103c9f --- /dev/null +++ b/src/core/pyproject.toml @@ -0,0 +1,56 @@ +[project] +name = "core-sdk" +version = "1.0.0" +requires-python = ">=3.11" +license = { text = "MIT" } +description = "Python SDKs for JPYCv2 contracts" +readme = "README.md" +keywords = [ + "jpyc", + "jpy", + "stablecoin", + "ethereum", + "evm", + "erc20", + "blockchain", +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Libraries :: Python Modules", +] +authors = [ + { name = "mameta", email = "mameta.zk@gmail.com" }, + { name = "SeiyaKobayashi", email = "eng@seiya.work" }, +] +maintainers = [ + { name = "mameta", email = "mameta.zk@gmail.com" }, + { name = "SeiyaKobayashi", email = "eng@seiya.work" }, +] +dependencies = [ + "pydantic>=2.11.4", + "python-dotenv>=1.1.0", + "web3>=7.11.0", +] + +[project.urls] +repository = "https://github.com/jcam1/python-sdk" +documentation = "https://github.com/jcam1/python-sdk/tree/main/docs" +"Bug Tracker" = "https://github.com/jcam1/python-sdk/issues/new?template=bug_report.md" + +[dependency-groups] +dev = [ + "mypy>=1.15.0", + "pytest>=8.3.5", + "pytest-cov>=6.1.1", + "ruff>=0.11.9", + "sphinx>=8.2.3", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..00a0309 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1569 @@ +version = 1 +revision = 2 +requires-python = ">=3.11" + +[manifest] +members = [ + "core-sdk", + "jpyc-python-sdks", +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.11.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload-time = "2025-04-21T09:43:09.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload-time = "2025-04-21T09:40:55.776Z" }, + { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload-time = "2025-04-21T09:40:57.301Z" }, + { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload-time = "2025-04-21T09:40:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload-time = "2025-04-21T09:41:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload-time = "2025-04-21T09:41:02.89Z" }, + { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload-time = "2025-04-21T09:41:04.461Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload-time = "2025-04-21T09:41:06.728Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload-time = "2025-04-21T09:41:08.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload-time = "2025-04-21T09:41:11.054Z" }, + { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload-time = "2025-04-21T09:41:13.213Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload-time = "2025-04-21T09:41:14.827Z" }, + { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload-time = "2025-04-21T09:41:17.168Z" }, + { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload-time = "2025-04-21T09:41:19.353Z" }, + { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload-time = "2025-04-21T09:41:21.868Z" }, + { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload-time = "2025-04-21T09:41:24.78Z" }, + { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload-time = "2025-04-21T09:41:26.48Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload-time = "2025-04-21T09:41:28.021Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload-time = "2025-04-21T09:41:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload-time = "2025-04-21T09:41:31.327Z" }, + { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload-time = "2025-04-21T09:41:33.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload-time = "2025-04-21T09:41:35.634Z" }, + { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload-time = "2025-04-21T09:41:37.456Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload-time = "2025-04-21T09:41:39.756Z" }, + { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload-time = "2025-04-21T09:41:41.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload-time = "2025-04-21T09:41:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload-time = "2025-04-21T09:41:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload-time = "2025-04-21T09:41:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload-time = "2025-04-21T09:41:50.323Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload-time = "2025-04-21T09:41:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload-time = "2025-04-21T09:41:53.94Z" }, + { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload-time = "2025-04-21T09:41:55.689Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload-time = "2025-04-21T09:41:57.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload-time = "2025-04-21T09:42:00.298Z" }, + { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload-time = "2025-04-21T09:42:02.015Z" }, + { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload-time = "2025-04-21T09:42:03.728Z" }, + { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload-time = "2025-04-21T09:42:06.053Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload-time = "2025-04-21T09:42:07.953Z" }, + { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload-time = "2025-04-21T09:42:09.855Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload-time = "2025-04-21T09:42:11.741Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload-time = "2025-04-21T09:42:14.137Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload-time = "2025-04-21T09:42:16.056Z" }, + { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload-time = "2025-04-21T09:42:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload-time = "2025-04-21T09:42:20.141Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload-time = "2025-04-21T09:42:21.993Z" }, + { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload-time = "2025-04-21T09:42:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload-time = "2025-04-21T09:42:25.764Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload-time = "2025-04-21T09:42:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload-time = "2025-04-21T09:42:29.209Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload-time = "2024-12-13T17:10:40.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload-time = "2024-12-13T17:10:38.469Z" }, +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "bitarray" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/7b/148091d4696b38a0b14ce495e64736472cc04b0757cc8b5e7846a1cf78a9/bitarray-3.4.0.tar.gz", hash = "sha256:33eee090eade2c8303bfc01a9e104fea306d330035b18b5c50a04cb0cb76f08d", size = 141279, upload-time = "2025-05-06T23:02:48.662Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/f1/8765c11198b4db5355a72995ece87493de8f43573ce36f3398a98d515d8c/bitarray-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf924be7b97cc5bec88bf63c09732aa5c90bd00f3152cffebed259a49df351b0", size = 139312, upload-time = "2025-05-06T22:59:31.557Z" }, + { url = "https://files.pythonhosted.org/packages/5f/0e/d9313541dc94a1aa4826d99b65f357714e832eef0622866c75de950c9623/bitarray-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f02850724d3e6c57265246329eeb71893a4a6884521b7f18fc5d9ea467300fe", size = 136160, upload-time = "2025-05-06T22:59:32.707Z" }, + { url = "https://files.pythonhosted.org/packages/30/f2/90d50d7fec3a98df0ae4b4585045a0131658846e125bfc50ea1460c74e79/bitarray-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93b88fa7bd0f958d7172862dcbebbe7c96eff90f989c6ddd28ec6e28bbe3f768", size = 309027, upload-time = "2025-05-06T22:59:33.844Z" }, + { url = "https://files.pythonhosted.org/packages/23/64/e940a135275a7424b34dc54be4846427b4f13d837582c4c02f044bc3f795/bitarray-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:341104cb87536114dc30728231427a335db4f90ea7e9ab94d8b1a94ff253624f", size = 323993, upload-time = "2025-05-06T22:59:35.335Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7d/55d4c81d762a018762ed29d98929d5155e8687c22577891dd933a4a3fccf/bitarray-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5af9d61f383335a52c28cac82b2a06ecf7ad72bb6a7e90711cb7534ce8c5fa07", size = 316992, upload-time = "2025-05-06T22:59:36.637Z" }, + { url = "https://files.pythonhosted.org/packages/41/a9/563e74ffcc0b2f44f2fd73eaf3e0ebf7d5176c9144cb299585606a30f044/bitarray-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77fd3e9c576f3952870b527c3a42795108946862ec11a3b17a723939dae76a12", size = 309113, upload-time = "2025-05-06T22:59:38.277Z" }, + { url = "https://files.pythonhosted.org/packages/00/56/e8ae194902df3ed3102e48bd1bcc36bebb2f555201723aa56a28473b49f9/bitarray-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12cc15dba08edb6e80c3a7f43cfaebba98dcbb89b120d534e32a42cd57c5f15f", size = 297274, upload-time = "2025-05-06T22:59:39.543Z" }, + { url = "https://files.pythonhosted.org/packages/73/c9/30530ade6c57cb40c37fe536457bf658397c2c3450ec9b5b756b2d11f96c/bitarray-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5e5fac8a9d1140ae55858f13914574ca63b48f968e424a02d918e46602569c02", size = 302445, upload-time = "2025-05-06T22:59:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/61/fe/b972f335fc49c0d0a8cf11cc99f6b59b52c20eb50b680083112d4d8bed3c/bitarray-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01df531279959c95c0eb1eccd3e6121cb241ddcb821594f3eb07a94b086f71a0", size = 293261, upload-time = "2025-05-06T22:59:42.365Z" }, + { url = "https://files.pythonhosted.org/packages/b6/80/08c5264585f245a245e3540bb8c4ab3f7102fefb50fc3b82e27798532ce9/bitarray-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5811b9aeacc8c2b62ed0732649600405a7df5bf28eb7b7475f56822f702fc718", size = 318589, upload-time = "2025-05-06T22:59:44.136Z" }, + { url = "https://files.pythonhosted.org/packages/a2/e8/59e71b455bcf4fc55c426ccc88e2f2ca80c98e6a91f39cbc744d857e19d3/bitarray-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:437d983fb4b34874faa2c6a0247be770ec3935b4cedc16f65f8a4cbf8c970f03", size = 322502, upload-time = "2025-05-06T22:59:45.864Z" }, + { url = "https://files.pythonhosted.org/packages/98/91/c3f46b7da8d7be6ea79af36ae00269f08f769150b35826ac6fc5991a65ca/bitarray-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:332a373fe20fdba78968bbeeb1aa01f2d861a30d938bb986e7101246cf371500", size = 300757, upload-time = "2025-05-06T22:59:47.707Z" }, + { url = "https://files.pythonhosted.org/packages/b6/df/c277d5c0404f0090eea6b580519e5a3696c092c939b857c2c09e901af096/bitarray-3.4.0-cp311-cp311-win32.whl", hash = "sha256:15197c8a3ec258401f80bbcc64b942d82dfcf3d9549320147aef900c80bdf77b", size = 132306, upload-time = "2025-05-06T22:59:48.885Z" }, + { url = "https://files.pythonhosted.org/packages/3b/62/975e3fec5f6d32c744f0558245475fbac4bcb7dfc2151403c3fda0a13f13/bitarray-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:11fcc8e92699a2463055ceab63071ff2179a1f53d1284f4b7b9a405365065efa", size = 139175, upload-time = "2025-05-06T22:59:50.312Z" }, + { url = "https://files.pythonhosted.org/packages/df/72/cb4d7c4377110aa4825c4f2971d66a856dddda229717b965ee75a5eb1845/bitarray-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef3f2dc1a95bec2af77c8685c847d41fc0c64d7329c994b6054c54462f835401", size = 139210, upload-time = "2025-05-06T22:59:51.546Z" }, + { url = "https://files.pythonhosted.org/packages/01/74/69e2d97a9525fc06430fbc9a075fa76ce9772578e480c9cc8d3b0f041afa/bitarray-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:75df7335ed7324a1ee9002d747c36a37de42b6469601ac39fef00c6bd80a4cb4", size = 136227, upload-time = "2025-05-06T22:59:52.727Z" }, + { url = "https://files.pythonhosted.org/packages/a7/eb/fc23c954e9f67c8a7116610fd204dbfed79be98ed40221cfe668aaed13c9/bitarray-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d089a0570e2acfabac9dd40ee7bfbc36ec48ff73c9312f3e61ebf31b315d05d", size = 311845, upload-time = "2025-05-06T22:59:53.935Z" }, + { url = "https://files.pythonhosted.org/packages/51/0f/3e39f6d552bdeda7434969d53e072683297bb62abb2513ea58625408ff4c/bitarray-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:823decea26d8be2ec46000583114d050d02033f99e54e3285c0a80f31e3d7784", size = 325732, upload-time = "2025-05-06T22:59:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/61/33/071d392af98a57d5539440cb60e07c1f123c181fbadf6f6789000760fd61/bitarray-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f455c100df47295ca19eb36527462fecbb2710140d92a61228df4cfdd2d7dd81", size = 319493, upload-time = "2025-05-06T22:59:57.497Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a6/3f331582d8bfe6177cdc2f6a258c2fb3f074721ff0cdaf53bd706a4be6d8/bitarray-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27456e66fae5726b2b1b9bc3ee0e2f1235bf8a353dc216d2651ad0652596657", size = 311900, upload-time = "2025-05-06T22:59:58.754Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d4/19f84fc297b2e8e061ce9647793ab42a74f190b09a9635151a164b1d2d2d/bitarray-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f2c1c3d1d0109b993791755f18d4b495f02744118f8f683eed982b9c8ed8687", size = 299956, upload-time = "2025-05-06T23:00:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/45/f8/0f506df3ce3a0bec5600a0bbba59dbdc061e2a9d5a0aaa5b597cf199e02b/bitarray-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e7274cdfe405c4e70a585b997d3a8c001425c03fa37d09a8e5460828a3d8bd6", size = 305007, upload-time = "2025-05-06T23:00:02.119Z" }, + { url = "https://files.pythonhosted.org/packages/e9/32/4cfd70cfaa65d2ad437007adbf462995841abf8a626ef9a5cecce824061a/bitarray-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0330f470bdb76825d760215e01f8d60ce09d4ac84434b364e27236db5657d323", size = 296128, upload-time = "2025-05-06T23:00:03.716Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7a/10ca59dab291c6289ab7fc2c75453bd7a906e4b48ecaac9635ed2ed08006/bitarray-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:013ba795deb6c54fdb0e70103fc142f97746074d2f67b4b6a8f67a17f2d03f06", size = 320568, upload-time = "2025-05-06T23:00:05.216Z" }, + { url = "https://files.pythonhosted.org/packages/08/0c/382f4bfd229e29e364bff0c3c29ffc60b865c21eeeab34f96cf731e223d5/bitarray-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5c62c2ae324c486f8e8f0482d5a8635e255da5302c44e7a5df83eee7d87e28ec", size = 325182, upload-time = "2025-05-06T23:00:07.029Z" }, + { url = "https://files.pythonhosted.org/packages/43/46/688f048fa43c95ba7f53d19837e5de96bb2d7ee641441ad5db20b5702d0f/bitarray-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:722c105dd4229b91d17804a0855e8f27519ceee99d8fd4db80bf09b507d7fb60", size = 303801, upload-time = "2025-05-06T23:00:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/33/8d/4bd7db2d0415acbbe2aea7887dd17c6e38f25574c8676ed38da5919f9290/bitarray-3.4.0-cp312-cp312-win32.whl", hash = "sha256:d6895389eeebf6836cfad1b301bae9e5386e3b94a21076aaf0c2dab0524af6d1", size = 132479, upload-time = "2025-05-06T23:00:10.261Z" }, + { url = "https://files.pythonhosted.org/packages/74/e4/5499298f8a50883d0524c057befbbdf699ca9a56cfb76db85fafd0177f7a/bitarray-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:0a4bb5dd53250e3c70924fd473034cb2e741027938702d9cc319646e53091dc1", size = 139440, upload-time = "2025-05-06T23:00:11.539Z" }, + { url = "https://files.pythonhosted.org/packages/e3/19/9d6c8697e16b1a868cc3331e164b8a54c118f87384b5bfc506daa40ecff7/bitarray-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b238e48844645ac397cfc67f5c8df86d640a9b33063c82ca2393a39e48b01c15", size = 139195, upload-time = "2025-05-06T23:00:13.585Z" }, + { url = "https://files.pythonhosted.org/packages/46/eb/ae718c3787d5b57f167543eb92085656ec418bf6fab3e733cab2f285b9e3/bitarray-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4292ef2a67ff6a3811e018c7e32c3ce4fb74c2f5c85257c06222895138df86f4", size = 136212, upload-time = "2025-05-06T23:00:15.151Z" }, + { url = "https://files.pythonhosted.org/packages/64/7d/a98e9838c24361ab5e510f1b3b06c03a5756b1e947d3f9f138eec614917d/bitarray-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27bb390521ba1032b95e31683fa9aed042222fca653760d5101435c2dbf28ede", size = 311738, upload-time = "2025-05-06T23:00:16.535Z" }, + { url = "https://files.pythonhosted.org/packages/e3/41/5dc90c32ac9eb50648a8a103eb788f4b68e75f90bedf2ab7da1f556dad60/bitarray-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2984abfc4e6281e703675280edbcf7618fa6983367d1fb4822b41917e2c3490", size = 325631, upload-time = "2025-05-06T23:00:18.009Z" }, + { url = "https://files.pythonhosted.org/packages/a3/96/d136b999b25522c9f679224eb782caf4444a6b0a6d6112828830a59436e8/bitarray-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae10e24915c7d84f5edb39d5385455b961c66e90a40b786cfcfba59f8399999e", size = 319420, upload-time = "2025-05-06T23:00:19.296Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6b/8f7b9b40e2c6d3a281f658650076ba3bd4a993c460555d7fc83188a21cf5/bitarray-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5c10255889045479b86405dd040c58e77ccf4f63a0e6e686d341b5fd8fa32c2", size = 311742, upload-time = "2025-05-06T23:00:20.943Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/e6b783745d43bd4ce3120213f14e3758d93d5a3cabfbc476b18a803b6aa6/bitarray-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d62db2fbf0a923ecbf5b71babc9deabd5ccea74d275bf74a5e37c050238d8f6a", size = 299863, upload-time = "2025-05-06T23:00:22.6Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a2/7e70a2cee6db8bc951c4bea3b646a327c859b3072ef0ae9e1f997a09ab26/bitarray-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1babc8dba17fad7409ca1cfe6ec4b89d175070f20d2c6f97f87d1c257be4aea9", size = 304969, upload-time = "2025-05-06T23:00:23.922Z" }, + { url = "https://files.pythonhosted.org/packages/c1/30/f6c7da738d9e1a87c8329670cdbd3920849bb09fca783a2952d43643fb26/bitarray-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a7eaed4731bd84504176ba5e0af3eba7a6e66afe208d5efb6a8779b66ecd51aa", size = 296171, upload-time = "2025-05-06T23:00:25.244Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e4/0e1725a53d945da593291d5f61aee840a9fccdfaadc0f0282027daff7ba3/bitarray-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d0b70cf75f82c919fe486af185895a77644ac3621ea8bd5b5a82fd21c03c843", size = 320575, upload-time = "2025-05-06T23:00:26.54Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a0/ff073f39227c0089c1e0c50fab09524a0f1e02fb323dc142202e68c48c49/bitarray-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e1652bf956c8874c790fe78f0dcdc0de04d82ded81373759bfc05f427afd1ff3", size = 325140, upload-time = "2025-05-06T23:00:27.874Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c1/0267051bbea0025da0f43e176df7695dff50ffe0a95edc4b826725418563/bitarray-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:49a41a724693b9f15ac965f548c2f68f6ff7b0ab36a29009d82e99f7d402888b", size = 303791, upload-time = "2025-05-06T23:00:29.73Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a6/bcef1426a16195f96fd905c1be68905d9f6addc1cd900ccd23875922ad78/bitarray-3.4.0-cp313-cp313-win32.whl", hash = "sha256:d3c0db664bffeb4bb80b228ed31773ccb701da11f266f9d8a56732e083e2cab0", size = 132487, upload-time = "2025-05-06T23:00:31.209Z" }, + { url = "https://files.pythonhosted.org/packages/f3/18/b69e211181f90f8a3b4ef8c7022fcdf0ebe1ad5701b68f60382195f48f66/bitarray-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:340dd788dad07ad004b591925e4b906786aaefb6632ea9d9ac616913f3cafa4e", size = 139440, upload-time = "2025-05-06T23:00:32.716Z" }, +] + +[[package]] +name = "certifi" +version = "2025.4.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +] + +[[package]] +name = "ckzg" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/55/df/f6db8e83bd4594c1ea685cd37fb81d5399e55765aae16d1a8a9502598f4e/ckzg-2.1.1.tar.gz", hash = "sha256:d6b306b7ec93a24e4346aa53d07f7f75053bc0afc7398e35fa649e5f9d48fcc4", size = 1120500, upload-time = "2025-03-31T21:24:12.324Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/2c/44120b2d9dcb0246d67a1f28b9eaa625c499014d4d42561467e28eedd285/ckzg-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:465e2b71cf9dc383f66f1979269420a0da9274a3a9e98b1a4455e84927dfe491", size = 116378, upload-time = "2025-03-31T21:22:36.96Z" }, + { url = "https://files.pythonhosted.org/packages/23/88/c5b89ba9a730fee5e089be9e0c7048fb6707c1a0e4b6c30fcf725c3eef44/ckzg-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ee2f26f17a64ad0aab833d637b276f28486b82a29e34f32cf54b237b8f8ab72d", size = 100202, upload-time = "2025-03-31T21:22:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/ee/11/b0a473e80346db52ad9a629bc9fd8f773c718ed78932ea3a70392306ffc3/ckzg-2.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99cc2c4e9fb8c62e3e0862c7f4df9142f07ba640da17fded5f6e0fd09f75909f", size = 175595, upload-time = "2025-03-31T21:22:39.013Z" }, + { url = "https://files.pythonhosted.org/packages/52/fa/17a7e125d07a96dd6dce4db7262231f7583856b2be5d5b7df59e04bfa188/ckzg-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773dd016693d74aca1f5d7982db2bad7dde2e147563aeb16a783f7e5f69c01fe", size = 161681, upload-time = "2025-03-31T21:22:40.257Z" }, + { url = "https://files.pythonhosted.org/packages/57/bd/46d6b90bf53da732f9adab7593d132a0834ed4f2f7659b4c7414d8f78d39/ckzg-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af2b2144f87ba218d8db01382a961b3ecbdde5ede4fa0d9428d35f8c8a595ba", size = 170471, upload-time = "2025-03-31T21:22:41.513Z" }, + { url = "https://files.pythonhosted.org/packages/9d/98/113c7704749d037d75f23240ffc5c46dfe8416de574b946438587835715f/ckzg-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f55e63d3f7c934a2cb53728ed1d815479e177aca8c84efe991c2920977cff6", size = 173595, upload-time = "2025-03-31T21:22:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d5/05fca6dcb5a19327be491157794eafc3d7498daf615c2ff5a5b745852945/ckzg-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ecb42aaa0ffa427ff14a9dde9356ba69e5ae6014650b397af55b31bdae7a9b6e", size = 188417, upload-time = "2025-03-31T21:22:43.466Z" }, + { url = "https://files.pythonhosted.org/packages/72/36/131ae2dfc82d0fdc98fae8e3bbfe71ff14265bb434b23bd07b585afc6d61/ckzg-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5a01514239f12fb1a7ad9009c20062a4496e13b09541c1a65f97e295da648c70", size = 183286, upload-time = "2025-03-31T21:22:44.732Z" }, + { url = "https://files.pythonhosted.org/packages/c5/6a/d371b27024422b25228fc11fa57b1ba7756a94cc9fb0c75da292c235fdaa/ckzg-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:6516b9684aae262c85cf7fddd8b585b8139ad20e08ec03994e219663abbb0916", size = 98819, upload-time = "2025-03-31T21:22:45.57Z" }, + { url = "https://files.pythonhosted.org/packages/93/a1/9c07513dd0ea01e5db727e67bd2660f3b300a4511281cdb8d5e04afa1cfd/ckzg-2.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c60e8903344ce98ce036f0fabacce952abb714cad4607198b2f0961c28b8aa72", size = 116421, upload-time = "2025-03-31T21:22:46.434Z" }, + { url = "https://files.pythonhosted.org/packages/27/04/b69a0dfbb2722a14c98a52973f276679151ec56a14178cb48e6f2e1697bc/ckzg-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4299149dd72448e5a8d2d1cc6cc7472c92fc9d9f00b1377f5b017c089d9cd92", size = 100216, upload-time = "2025-03-31T21:22:47.633Z" }, + { url = "https://files.pythonhosted.org/packages/2e/24/9cc850d0b8ead395ad5064de67c7c91adacaf31b6b35292ab53fbd93270b/ckzg-2.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:025dd31ffdcc799f3ff842570a2a6683b6c5b01567da0109c0c05d11768729c4", size = 175764, upload-time = "2025-03-31T21:22:48.768Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c1/eb13ba399082a98b932f10b230ec08e6456051c0ce3886b3f6d8548d11ab/ckzg-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b42ab8385c273f40a693657c09d2bba40cb4f4666141e263906ba2e519e80bd", size = 161885, upload-time = "2025-03-31T21:22:50.05Z" }, + { url = "https://files.pythonhosted.org/packages/57/c7/58baa64199781950c5a8c6139a46e1acff0f057a36e56769817400eb87fb/ckzg-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be3890fc1543f4fcfc0063e4baf5c036eb14bcf736dabdc6171ab017e0f1671", size = 170757, upload-time = "2025-03-31T21:22:51.282Z" }, + { url = "https://files.pythonhosted.org/packages/65/bd/4b8e1c70972c98829371b7004dc750a45268c5d3442d602e1b62f13ca867/ckzg-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b754210ded172968b201e2d7252573af6bf52d6ad127ddd13d0b9a45a51dae7b", size = 173761, upload-time = "2025-03-31T21:22:52.6Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/c3fd1002f97ba3e0c5b1d9ab2c8fb7a6f475fa9b80ed9c4fa55975501a54/ckzg-2.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2f8fda87865897a269c4e951e3826c2e814427a6cdfed6731cccfe548f12b36", size = 188666, upload-time = "2025-03-31T21:22:53.47Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d9/91cf5a8169ee60c9397c975163cbca34432571f94facec5f8c0086bb47d8/ckzg-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:98e70b5923d77c7359432490145e9d1ab0bf873eb5de56ec53f4a551d7eaec79", size = 183652, upload-time = "2025-03-31T21:22:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/d4/8c9f6b852f99926862344b29f0c59681916ccfec2ac60a85952a369e0bca/ckzg-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:42af7bde4ca45469cd93a96c3d15d69d51d40e7f0d30e3a20711ebd639465fcb", size = 98816, upload-time = "2025-03-31T21:22:55.23Z" }, + { url = "https://files.pythonhosted.org/packages/b7/9a/fa698b12e97452d11dd314e0335aae759725284ef6e1c1665aed56b1cd3e/ckzg-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e4edfdaf87825ff43b9885fabfdea408737a714f4ce5467100d9d1d0a03b673", size = 116426, upload-time = "2025-03-31T21:22:56.108Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/8cccd308bd11b49b40eecad6900b5769da117951cac33e880dd25e851ef7/ckzg-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:815fd2a87d6d6c57d669fda30c150bc9bf387d47e67d84535aa42b909fdc28ea", size = 100219, upload-time = "2025-03-31T21:22:56.982Z" }, + { url = "https://files.pythonhosted.org/packages/30/0e/63573d816c1292b9a4d70eb6a7366b3593d29a977794039e926805a76ca0/ckzg-2.1.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32466e809b1ab3ff01d3b0bb0b9912f61dcf72957885615595f75e3f7cc10e5", size = 175725, upload-time = "2025-03-31T21:22:58.213Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a279609516695ad3fb8b201098c669ba3b2844cbf4fa0d83a0f02b9bb29b/ckzg-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f11b73ccf37b12993f39a7dbace159c6d580aacacde6ee17282848476550ddbc", size = 161835, upload-time = "2025-03-31T21:22:59.448Z" }, + { url = "https://files.pythonhosted.org/packages/39/e4/8cf7aef7dc05a777cb221e94046f947c6fe5317159a8dae2cd7090d52ef2/ckzg-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3b9433a1f2604bd9ac1646d3c83ad84a850d454d3ac589fe8e70c94b38a6b0", size = 170759, upload-time = "2025-03-31T21:23:01.022Z" }, + { url = "https://files.pythonhosted.org/packages/0b/17/b34e3c08eb36bc67e338b114f289b2595e581b8bdc09a8f12299a1db5d2f/ckzg-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b7d7e1b5ea06234558cd95c483666fd785a629b720a7f1622b3cbffebdc62033", size = 173787, upload-time = "2025-03-31T21:23:01.974Z" }, + { url = "https://files.pythonhosted.org/packages/2e/f0/aff87c3ed80713453cb6c84fe6fbb7582d86a7a5e4460fda2a497d47f489/ckzg-2.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9f5556e6675866040cc4335907be6c537051e7f668da289fa660fdd8a30c9ddb", size = 188722, upload-time = "2025-03-31T21:23:02.966Z" }, + { url = "https://files.pythonhosted.org/packages/44/d9/1f08bfb8fd1cbb8c7513e7ad3fb76bbb5c3fb446238c1eba582276e4d905/ckzg-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55b2ba30c5c9daac0c55f1aac851f1b7bf1f7aa0028c2db4440e963dd5b866d6", size = 183686, upload-time = "2025-03-31T21:23:03.905Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ff/434f6d2893cbdfad00c20d17e9a52d426ca042f5e980d5c3db96bc6b6e15/ckzg-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:10d201601fc8f28c0e8cec3406676797024dd374c367bbeec5a7a9eac9147237", size = 98817, upload-time = "2025-03-31T21:23:05.2Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ba/7d9c1f9cec7e0e382653c72165896194a05743e589b1dae2aa80236aa87f/ckzg-2.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4b0c850bd6cad22ac79b2a2ab884e0e7cd2b54a67d643cd616c145ebdb535a11", size = 113188, upload-time = "2025-03-31T21:23:46.337Z" }, + { url = "https://files.pythonhosted.org/packages/2f/92/9728f5ccc1c5e87c6c5ae7941250a447b61fd5a63aadbc15249e29c21bcf/ckzg-2.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:26951f36bb60c9150bbd38110f5e1625596f9779dad54d1d492d8ec38bc84e3a", size = 96208, upload-time = "2025-03-31T21:23:47.255Z" }, + { url = "https://files.pythonhosted.org/packages/39/63/5e27d587bd224fee70cb66b022e7c4ef95d0e091e08ee76c25ec12094b0d/ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe12445e49c4bee67746b7b958e90a973b0de116d0390749b0df351d94e9a8c", size = 126158, upload-time = "2025-03-31T21:23:48.195Z" }, + { url = "https://files.pythonhosted.org/packages/43/98/e0a45946575a7b823d8ee0b47afb104b6017e54e1208f07da2529bc01900/ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71c5d4f66f09de4a99271acac74d2acb3559a77de77a366b34a91e99e8822667", size = 102812, upload-time = "2025-03-31T21:23:49.16Z" }, + { url = "https://files.pythonhosted.org/packages/cb/50/718ca7b03e4b89b18cdf99cc3038050105b0acbf9b612c23cd513093c6de/ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42673c1d007372a4e8b48f6ef8f0ce31a9688a463317a98539757d1e2fb1ecc7", size = 111327, upload-time = "2025-03-31T21:23:50.126Z" }, + { url = "https://files.pythonhosted.org/packages/29/c5/80e5a0c6967d02d801150104320484a258e5a49bd191e198643e74039320/ckzg-2.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:57a7dc41ec6b69c1d9117eb61cf001295e6b4f67a736020442e71fb4367fb1a5", size = 98847, upload-time = "2025-03-31T21:23:51.084Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "core-sdk" +version = "1.0.0" +source = { virtual = "src/core" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "web3" }, +] + +[package.dev-dependencies] +dev = [ + { name = "mypy" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sphinx" }, +] + +[package.metadata] +requires-dist = [ + { name = "pydantic", specifier = ">=2.11.4" }, + { name = "python-dotenv", specifier = ">=1.1.0" }, + { name = "web3", specifier = ">=7.11.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "mypy", specifier = ">=1.15.0" }, + { name = "pytest", specifier = ">=8.3.5" }, + { name = "pytest-cov", specifier = ">=6.1.1" }, + { name = "ruff", specifier = ">=0.11.9" }, + { name = "sphinx", specifier = ">=8.2.3" }, +] + +[[package]] +name = "coverage" +version = "7.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872, upload-time = "2025-03-30T20:36:45.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/77/074d201adb8383addae5784cb8e2dac60bb62bfdf28b2b10f3a3af2fda47/coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27", size = 211493, upload-time = "2025-03-30T20:35:12.286Z" }, + { url = "https://files.pythonhosted.org/packages/a9/89/7a8efe585750fe59b48d09f871f0e0c028a7b10722b2172dfe021fa2fdd4/coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea", size = 211921, upload-time = "2025-03-30T20:35:14.18Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ef/96a90c31d08a3f40c49dbe897df4f1fd51fb6583821a1a1c5ee30cc8f680/coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7", size = 244556, upload-time = "2025-03-30T20:35:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/89/97/dcd5c2ce72cee9d7b0ee8c89162c24972fb987a111b92d1a3d1d19100c61/coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040", size = 242245, upload-time = "2025-03-30T20:35:18.648Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7b/b63cbb44096141ed435843bbb251558c8e05cc835c8da31ca6ffb26d44c0/coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543", size = 244032, upload-time = "2025-03-30T20:35:20.131Z" }, + { url = "https://files.pythonhosted.org/packages/97/e3/7fa8c2c00a1ef530c2a42fa5df25a6971391f92739d83d67a4ee6dcf7a02/coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2", size = 243679, upload-time = "2025-03-30T20:35:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b3/e0a59d8df9150c8a0c0841d55d6568f0a9195692136c44f3d21f1842c8f6/coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318", size = 241852, upload-time = "2025-03-30T20:35:23.525Z" }, + { url = "https://files.pythonhosted.org/packages/9b/82/db347ccd57bcef150c173df2ade97976a8367a3be7160e303e43dd0c795f/coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9", size = 242389, upload-time = "2025-03-30T20:35:25.09Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/3f7d7879ceb03923195d9ff294456241ed05815281f5254bc16ef71d6a20/coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c", size = 213997, upload-time = "2025-03-30T20:35:26.914Z" }, + { url = "https://files.pythonhosted.org/packages/28/87/021189643e18ecf045dbe1e2071b2747901f229df302de01c998eeadf146/coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78", size = 214911, upload-time = "2025-03-30T20:35:28.498Z" }, + { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684, upload-time = "2025-03-30T20:35:29.959Z" }, + { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935, upload-time = "2025-03-30T20:35:31.912Z" }, + { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994, upload-time = "2025-03-30T20:35:33.455Z" }, + { url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885, upload-time = "2025-03-30T20:35:35.354Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142, upload-time = "2025-03-30T20:35:37.121Z" }, + { url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906, upload-time = "2025-03-30T20:35:39.07Z" }, + { url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124, upload-time = "2025-03-30T20:35:40.598Z" }, + { url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317, upload-time = "2025-03-30T20:35:42.204Z" }, + { url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170, upload-time = "2025-03-30T20:35:44.216Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969, upload-time = "2025-03-30T20:35:45.797Z" }, + { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708, upload-time = "2025-03-30T20:35:47.417Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981, upload-time = "2025-03-30T20:35:49.002Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495, upload-time = "2025-03-30T20:35:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538, upload-time = "2025-03-30T20:35:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561, upload-time = "2025-03-30T20:35:54.658Z" }, + { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633, upload-time = "2025-03-30T20:35:56.221Z" }, + { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712, upload-time = "2025-03-30T20:35:57.801Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000, upload-time = "2025-03-30T20:35:59.378Z" }, + { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195, upload-time = "2025-03-30T20:36:01.005Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998, upload-time = "2025-03-30T20:36:03.006Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541, upload-time = "2025-03-30T20:36:04.638Z" }, + { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767, upload-time = "2025-03-30T20:36:06.503Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997, upload-time = "2025-03-30T20:36:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708, upload-time = "2025-03-30T20:36:09.781Z" }, + { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046, upload-time = "2025-03-30T20:36:11.409Z" }, + { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139, upload-time = "2025-03-30T20:36:13.86Z" }, + { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307, upload-time = "2025-03-30T20:36:16.074Z" }, + { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116, upload-time = "2025-03-30T20:36:18.033Z" }, + { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909, upload-time = "2025-03-30T20:36:19.644Z" }, + { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068, upload-time = "2025-03-30T20:36:21.282Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f1/1da77bb4c920aa30e82fa9b6ea065da3467977c2e5e032e38e66f1c57ffd/coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd", size = 203443, upload-time = "2025-03-30T20:36:41.959Z" }, + { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435, upload-time = "2025-03-30T20:36:43.61Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cytoolz" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "toolz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/f9/3243eed3a6545c2a33a21f74f655e3fcb5d2192613cd3db81a93369eb339/cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6", size = 626652, upload-time = "2024-12-13T05:47:36.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/ea/8131ae39119820b8867cddc23716fa9f681f2b3bbce6f693e68dfb36b55b/cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6", size = 406162, upload-time = "2024-12-13T05:45:01.196Z" }, + { url = "https://files.pythonhosted.org/packages/26/18/3d9bd4c146f6ea6e51300c242b20cb416966b21d481dac230e1304f1e54b/cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab", size = 384961, upload-time = "2024-12-13T05:45:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/e4/73/9034827907c7f85c7c484c9494e905d022fb8174526004e9ef332570349e/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30", size = 2091698, upload-time = "2024-12-13T05:45:04.353Z" }, + { url = "https://files.pythonhosted.org/packages/74/af/d5c2733b0fde1a08254ff1a8a8d567874040c9eb1606363cfebc0713c73f/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b", size = 2188452, upload-time = "2024-12-13T05:45:05.748Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bb/77c71fa9c217260b4056a732d754748903423c2cdd82a673d6064741e375/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41", size = 2174203, upload-time = "2024-12-13T05:45:07.777Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a9/a5b4a3ff5d22faa1b60293bfe97362e2caf4a830c26d37ab5557f60d04b2/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd", size = 2099831, upload-time = "2024-12-13T05:45:11.477Z" }, + { url = "https://files.pythonhosted.org/packages/35/08/7f6869ea1ff31ce5289a7d58d0e7090acfe7058baa2764473048ff61ea3c/cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3", size = 1996744, upload-time = "2024-12-13T05:45:14.172Z" }, + { url = "https://files.pythonhosted.org/packages/46/b4/9ac424c994b51763fd1bbed62d95f8fba8fa0e45c8c3c583904fdaf8f51d/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7", size = 2013733, upload-time = "2024-12-13T05:45:16.912Z" }, + { url = "https://files.pythonhosted.org/packages/3e/99/03009765c4b87d742d5b5a8670abb56a8c7ede033c2cdaa4be8662d3b001/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61", size = 1994850, upload-time = "2024-12-13T05:45:18.414Z" }, + { url = "https://files.pythonhosted.org/packages/40/9a/8458af9a5557e177ea42f8cf7e477bede518b0bbef564e28c4151feaa52c/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3", size = 2155352, upload-time = "2024-12-13T05:45:19.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/2a701423e001fcbec288b4f3fc2bf67557d114c2388237fc1ae67e1e2686/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580", size = 2163515, upload-time = "2024-12-13T05:45:21.08Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/ee2e06e65d9d533bc05cd52a0b355ba9072fc8f60d77289e529c6d2e3750/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052", size = 2054431, upload-time = "2024-12-13T05:45:22.521Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d5/2fac8315f210fa1bc7106e27c19e1211580aa25bb7fa17dfd79505e5baf2/cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead", size = 322004, upload-time = "2024-12-13T05:45:24.048Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9e/0b70b641850a95f9ff90adde9d094a4b1d81ec54dadfd97fec0a2aaf440e/cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c", size = 365358, upload-time = "2024-12-13T05:45:25.383Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e8/218098344ed2cb5f8441fade9b2428e435e7073962374a9c71e59ac141a7/cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4", size = 414121, upload-time = "2024-12-13T05:45:26.588Z" }, + { url = "https://files.pythonhosted.org/packages/de/27/4d729a5653718109262b758fec1a959aa9facb74c15460d9074dc76d6635/cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662", size = 390904, upload-time = "2024-12-13T05:45:27.718Z" }, + { url = "https://files.pythonhosted.org/packages/72/c0/cbabfa788bab9c6038953bf9478adaec06e88903a726946ea7c88092f5c4/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3", size = 2090734, upload-time = "2024-12-13T05:45:30.515Z" }, + { url = "https://files.pythonhosted.org/packages/c3/66/369262c60f9423c2da82a60864a259c852f1aa122aced4acd2c679af58c0/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1", size = 2155933, upload-time = "2024-12-13T05:45:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/ee55186802f8d24b5fbf9a11405ccd1203b30eded07cc17750618219b94e/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8", size = 2171903, upload-time = "2024-12-13T05:45:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/a1/96/bd1a9f3396e9b7f618db8cd08d15630769ce3c8b7d0534f92cd639c977ae/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d", size = 2125270, upload-time = "2024-12-13T05:45:36.982Z" }, + { url = "https://files.pythonhosted.org/packages/28/48/2a3762873091c88a69e161111cfbc6c222ff145d57ff011a642b169f04f1/cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f", size = 1973967, upload-time = "2024-12-13T05:45:39.505Z" }, + { url = "https://files.pythonhosted.org/packages/e4/50/500bd69774bdc49a4d78ec8779eb6ac7c1a9d706bfd91cf2a1dba604373a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7", size = 2021695, upload-time = "2024-12-13T05:45:40.911Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4e/ba5a0ce34869495eb50653de8d676847490cf13a2cac1760fc4d313e78de/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126", size = 2010177, upload-time = "2024-12-13T05:45:42.48Z" }, + { url = "https://files.pythonhosted.org/packages/87/57/615c630b3089a13adb15351d958d227430cf624f03b1dd39eb52c34c1f59/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0", size = 2154321, upload-time = "2024-12-13T05:45:43.979Z" }, + { url = "https://files.pythonhosted.org/packages/7f/0f/fe1aa2d931e3b35ecc05215bd75da945ea7346095b3b6f6027164e602d5a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b", size = 2188374, upload-time = "2024-12-13T05:45:46.783Z" }, + { url = "https://files.pythonhosted.org/packages/de/fa/fd363d97a641b6d0e2fd1d5c35b8fd41d9ccaeb4df56302f53bf23a58e3a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d", size = 2077911, upload-time = "2024-12-13T05:45:48.219Z" }, + { url = "https://files.pythonhosted.org/packages/d9/68/0a22946b98ae5201b54ccb4e651295285c0fb79406022b6ee8b2f791940c/cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9", size = 321903, upload-time = "2024-12-13T05:45:50.3Z" }, + { url = "https://files.pythonhosted.org/packages/62/1a/f3903197956055032f8cb297342e2dff07e50f83991aebfe5b4c4fcb55e4/cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b", size = 364490, upload-time = "2024-12-13T05:45:51.494Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/a9f069db0107749e9e72baf6c21abe3f006841a3bcfdc9b8420e22ef31eb/cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0", size = 407365, upload-time = "2024-12-13T05:45:52.803Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9b/5e87dd0e31f54c778b4f9f34cc14c1162d3096c8d746b0f8be97d70dd73c/cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a", size = 385233, upload-time = "2024-12-13T05:45:53.994Z" }, + { url = "https://files.pythonhosted.org/packages/63/00/2fd32b16284cdb97cfe092822179bc0c3bcdd5e927dd39f986169a517642/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242", size = 2062903, upload-time = "2024-12-13T05:45:55.202Z" }, + { url = "https://files.pythonhosted.org/packages/85/39/b3cbb5a9847ba59584a263772ad4f8ca2dbfd2a0e11efd09211d1219804c/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296", size = 2139517, upload-time = "2024-12-13T05:45:56.804Z" }, + { url = "https://files.pythonhosted.org/packages/ea/39/bfcab4a46d50c467e36fe704f19d8904efead417787806ee210327f68390/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b", size = 2154849, upload-time = "2024-12-13T05:45:58.814Z" }, + { url = "https://files.pythonhosted.org/packages/fd/42/3bc6ee61b0aa47e1cb40819adc1a456d7efa809f0dea9faddacb43fdde8f/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b", size = 2102302, upload-time = "2024-12-13T05:46:00.181Z" }, + { url = "https://files.pythonhosted.org/packages/00/66/3f636c6ddea7b18026b90a8c238af472e423b86e427b11df02213689b012/cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266", size = 1960872, upload-time = "2024-12-13T05:46:01.612Z" }, + { url = "https://files.pythonhosted.org/packages/40/36/cb3b7cdd651007b69f9c48e9d104cec7cb8dc53afa1d6a720e5ad08022fa/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5", size = 2014430, upload-time = "2024-12-13T05:46:03.022Z" }, + { url = "https://files.pythonhosted.org/packages/88/3f/2e9bd2a16cfd269808922147551dcb2d8b68ba54a2c4deca2fa6a6cd0d5f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3", size = 2003127, upload-time = "2024-12-13T05:46:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/c4/7d/08604ff940aa784df8343c387fdf2489b948b714a6afb587775ae94da912/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296", size = 2142369, upload-time = "2024-12-13T05:46:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c6/39919a0645bdbdf720e97cae107f959ea9d1267fbc3b0d94fc6e1d12ac8f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140", size = 2180427, upload-time = "2024-12-13T05:46:07.526Z" }, + { url = "https://files.pythonhosted.org/packages/d8/03/dbb9d47556ee54337e7e0ac209d17ceff2d2a197c34de08005abc7a7449b/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581", size = 2069785, upload-time = "2024-12-13T05:46:10.122Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/11bb7b8947002231faae3ec2342df5896afbc19eb783a332cce6d219ff79/cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9", size = 320685, upload-time = "2024-12-13T05:46:11.553Z" }, + { url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297", size = 362898, upload-time = "2024-12-13T05:46:12.771Z" }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, +] + +[[package]] +name = "eth-abi" +version = "5.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-typing" }, + { name = "eth-utils" }, + { name = "parsimonious" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/71/d9e1380bd77fd22f98b534699af564f189b56d539cc2b9dab908d4e4c242/eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0", size = 49797, upload-time = "2025-01-14T16:29:34.629Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/b4/2f3982c4cbcbf5eeb6aec62df1533c0e63c653b3021ff338d44944405676/eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877", size = 28511, upload-time = "2025-01-14T16:29:31.862Z" }, +] + +[[package]] +name = "eth-account" +version = "0.13.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bitarray" }, + { name = "ckzg" }, + { name = "eth-abi" }, + { name = "eth-keyfile" }, + { name = "eth-keys" }, + { name = "eth-rlp" }, + { name = "eth-utils" }, + { name = "hexbytes" }, + { name = "pydantic" }, + { name = "rlp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/cf/20f76a29be97339c969fd765f1237154286a565a1d61be98e76bb7af946a/eth_account-0.13.7.tar.gz", hash = "sha256:5853ecbcbb22e65411176f121f5f24b8afeeaf13492359d254b16d8b18c77a46", size = 935998, upload-time = "2025-04-21T21:11:21.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/18/088fb250018cbe665bc2111974301b2d59f294a565aff7564c4df6878da2/eth_account-0.13.7-py3-none-any.whl", hash = "sha256:39727de8c94d004ff61d10da7587509c04d2dc7eac71e04830135300bdfc6d24", size = 587452, upload-time = "2025-04-21T21:11:18.346Z" }, +] + +[[package]] +name = "eth-hash" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/38/577b7bc9380ef9dff0f1dffefe0c9a1ded2385e7a06c306fd95afb6f9451/eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5", size = 12227, upload-time = "2025-01-13T21:29:21.765Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/db/f8775490669d28aca24871c67dd56b3e72105cb3bcae9a4ec65dd70859b3/eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a", size = 8028, upload-time = "2025-01-13T21:29:19.365Z" }, +] + +[package.optional-dependencies] +pycryptodome = [ + { name = "pycryptodome" }, +] + +[[package]] +name = "eth-keyfile" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-keys" }, + { name = "eth-utils" }, + { name = "pycryptodome" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/66/dd823b1537befefbbff602e2ada88f1477c5b40ec3731e3d9bc676c5f716/eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1", size = 12267, upload-time = "2024-04-23T20:28:53.862Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/fc/48a586175f847dd9e05e5b8994d2fe8336098781ec2e9836a2ad94280281/eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64", size = 7510, upload-time = "2024-04-23T20:28:51.063Z" }, +] + +[[package]] +name = "eth-keys" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-typing" }, + { name = "eth-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/11/1ed831c50bd74f57829aa06e58bd82a809c37e070ee501c953b9ac1f1552/eth_keys-0.7.0.tar.gz", hash = "sha256:79d24fd876201df67741de3e3fefb3f4dbcbb6ace66e47e6fe662851a4547814", size = 30166, upload-time = "2025-04-07T17:40:21.697Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/25/0ae00f2b0095e559d61ad3dc32171bd5a29dfd95ab04b4edd641f7c75f72/eth_keys-0.7.0-py3-none-any.whl", hash = "sha256:b0cdda8ffe8e5ba69c7c5ca33f153828edcace844f67aabd4542d7de38b159cf", size = 20656, upload-time = "2025-04-07T17:40:20.441Z" }, +] + +[[package]] +name = "eth-rlp" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-utils" }, + { name = "hexbytes" }, + { name = "rlp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/ea/ad39d001fa9fed07fad66edb00af701e29b48be0ed44a3bcf58cb3adf130/eth_rlp-2.2.0.tar.gz", hash = "sha256:5e4b2eb1b8213e303d6a232dfe35ab8c29e2d3051b86e8d359def80cd21db83d", size = 7720, upload-time = "2025-02-04T21:51:08.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/3b/57efe2bc2df0980680d57c01a36516cd3171d2319ceb30e675de19fc2cc5/eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47", size = 4446, upload-time = "2025-02-04T21:51:05.823Z" }, +] + +[[package]] +name = "eth-typing" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/54/62aa24b9cc708f06316167ee71c362779c8ed21fc8234a5cd94a8f53b623/eth_typing-5.2.1.tar.gz", hash = "sha256:7557300dbf02a93c70fa44af352b5c4a58f94e997a0fd6797fb7d1c29d9538ee", size = 21806, upload-time = "2025-04-14T20:39:28.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/72/c370bbe4c53da7bf998d3523f5a0f38867654923a82192df88d0705013d3/eth_typing-5.2.1-py3-none-any.whl", hash = "sha256:b0c2812ff978267563b80e9d701f487dd926f1d376d674f3b535cfe28b665d3d", size = 19163, upload-time = "2025-04-14T20:39:26.571Z" }, +] + +[[package]] +name = "eth-utils" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cytoolz", marker = "implementation_name == 'cpython'" }, + { name = "eth-hash" }, + { name = "eth-typing" }, + { name = "pydantic" }, + { name = "toolz", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/49/bee95f16d2ef068097afeeffbd6c67738107001ee57ad7bcdd4fc4d3c6a7/eth_utils-5.3.0.tar.gz", hash = "sha256:1f096867ac6be895f456fa3acb26e9573ae66e753abad9208f316d24d6178156", size = 123753, upload-time = "2025-04-14T19:35:56.431Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/c6/0417a92e6a3fc9b85f5a8380d9f9d43b69ba836a90e45f79f9ae74d41e53/eth_utils-5.3.0-py3-none-any.whl", hash = "sha256:ac184883ab299d923428bbe25dae5e356979a3993e0ef695a864db0a20bc262d", size = 102531, upload-time = "2025-04-14T19:35:55.176Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload-time = "2025-04-17T22:38:53.099Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload-time = "2025-04-17T22:36:17.235Z" }, + { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload-time = "2025-04-17T22:36:18.735Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload-time = "2025-04-17T22:36:20.6Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload-time = "2025-04-17T22:36:22.088Z" }, + { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload-time = "2025-04-17T22:36:24.247Z" }, + { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload-time = "2025-04-17T22:36:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload-time = "2025-04-17T22:36:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload-time = "2025-04-17T22:36:29.448Z" }, + { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload-time = "2025-04-17T22:36:31.55Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload-time = "2025-04-17T22:36:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload-time = "2025-04-17T22:36:34.688Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload-time = "2025-04-17T22:36:36.363Z" }, + { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload-time = "2025-04-17T22:36:38.16Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload-time = "2025-04-17T22:36:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload-time = "2025-04-17T22:36:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload-time = "2025-04-17T22:36:44.067Z" }, + { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload-time = "2025-04-17T22:36:45.465Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload-time = "2025-04-17T22:36:47.382Z" }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload-time = "2025-04-17T22:36:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload-time = "2025-04-17T22:36:51.899Z" }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload-time = "2025-04-17T22:36:53.402Z" }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload-time = "2025-04-17T22:36:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload-time = "2025-04-17T22:36:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload-time = "2025-04-17T22:36:58.735Z" }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload-time = "2025-04-17T22:37:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload-time = "2025-04-17T22:37:02.102Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload-time = "2025-04-17T22:37:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload-time = "2025-04-17T22:37:05.213Z" }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload-time = "2025-04-17T22:37:06.985Z" }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload-time = "2025-04-17T22:37:08.618Z" }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload-time = "2025-04-17T22:37:10.196Z" }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload-time = "2025-04-17T22:37:12.284Z" }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload-time = "2025-04-17T22:37:13.902Z" }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload-time = "2025-04-17T22:37:15.326Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload-time = "2025-04-17T22:37:16.837Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload-time = "2025-04-17T22:37:18.352Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload-time = "2025-04-17T22:37:19.857Z" }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload-time = "2025-04-17T22:37:21.328Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload-time = "2025-04-17T22:37:23.55Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload-time = "2025-04-17T22:37:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload-time = "2025-04-17T22:37:26.791Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload-time = "2025-04-17T22:37:28.958Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload-time = "2025-04-17T22:37:30.889Z" }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload-time = "2025-04-17T22:37:32.489Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload-time = "2025-04-17T22:37:34.59Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload-time = "2025-04-17T22:37:36.337Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload-time = "2025-04-17T22:37:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload-time = "2025-04-17T22:37:39.669Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload-time = "2025-04-17T22:37:41.662Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload-time = "2025-04-17T22:37:43.132Z" }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload-time = "2025-04-17T22:37:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload-time = "2025-04-17T22:37:46.635Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload-time = "2025-04-17T22:37:48.192Z" }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload-time = "2025-04-17T22:37:50.485Z" }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload-time = "2025-04-17T22:37:52.558Z" }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload-time = "2025-04-17T22:37:54.092Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload-time = "2025-04-17T22:37:55.951Z" }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload-time = "2025-04-17T22:37:57.633Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload-time = "2025-04-17T22:37:59.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload-time = "2025-04-17T22:38:01.416Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload-time = "2025-04-17T22:38:03.049Z" }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload-time = "2025-04-17T22:38:04.776Z" }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload-time = "2025-04-17T22:38:06.576Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload-time = "2025-04-17T22:38:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload-time = "2025-04-17T22:38:10.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload-time = "2025-04-17T22:38:11.826Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload-time = "2025-04-17T22:38:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload-time = "2025-04-17T22:38:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload-time = "2025-04-17T22:38:51.668Z" }, +] + +[[package]] +name = "hexbytes" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/71/1a3f2439cf138b555c182fffeffbf67c090837e4570370af85ee8e57013f/hexbytes-1.3.0.tar.gz", hash = "sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684", size = 8200, upload-time = "2025-01-13T20:43:46.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/96/035871b535a728700d3cc5b94cf883706f345c5a088253f26f0bee0b7939/hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c", size = 4902, upload-time = "2025-01-13T20:43:44.905Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jpyc-python-sdks" +version = "1.0.0" +source = { virtual = "." } + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "multidict" +version = "6.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload-time = "2025-04-10T22:20:17.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload-time = "2025-04-10T22:17:59.632Z" }, + { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload-time = "2025-04-10T22:18:01.202Z" }, + { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload-time = "2025-04-10T22:18:02.276Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload-time = "2025-04-10T22:18:03.436Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload-time = "2025-04-10T22:18:04.922Z" }, + { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload-time = "2025-04-10T22:18:06.274Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload-time = "2025-04-10T22:18:07.742Z" }, + { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload-time = "2025-04-10T22:18:09.095Z" }, + { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload-time = "2025-04-10T22:18:10.474Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload-time = "2025-04-10T22:18:11.793Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload-time = "2025-04-10T22:18:13.153Z" }, + { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload-time = "2025-04-10T22:18:14.654Z" }, + { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload-time = "2025-04-10T22:18:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload-time = "2025-04-10T22:18:17.979Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload-time = "2025-04-10T22:18:19.362Z" }, + { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload-time = "2025-04-10T22:18:20.728Z" }, + { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload-time = "2025-04-10T22:18:22.001Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload-time = "2025-04-10T22:18:23.174Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload-time = "2025-04-10T22:18:24.834Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload-time = "2025-04-10T22:18:26.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload-time = "2025-04-10T22:18:27.714Z" }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload-time = "2025-04-10T22:18:29.162Z" }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload-time = "2025-04-10T22:18:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload-time = "2025-04-10T22:18:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload-time = "2025-04-10T22:18:33.538Z" }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload-time = "2025-04-10T22:18:34.962Z" }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload-time = "2025-04-10T22:18:36.443Z" }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload-time = "2025-04-10T22:18:37.924Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload-time = "2025-04-10T22:18:39.807Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload-time = "2025-04-10T22:18:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload-time = "2025-04-10T22:18:42.817Z" }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload-time = "2025-04-10T22:18:44.311Z" }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload-time = "2025-04-10T22:18:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload-time = "2025-04-10T22:18:47.498Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload-time = "2025-04-10T22:18:48.748Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload-time = "2025-04-10T22:18:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload-time = "2025-04-10T22:18:51.246Z" }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload-time = "2025-04-10T22:18:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload-time = "2025-04-10T22:18:54.509Z" }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload-time = "2025-04-10T22:18:56.019Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload-time = "2025-04-10T22:18:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload-time = "2025-04-10T22:19:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload-time = "2025-04-10T22:19:02.244Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload-time = "2025-04-10T22:19:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload-time = "2025-04-10T22:19:06.117Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload-time = "2025-04-10T22:19:07.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload-time = "2025-04-10T22:19:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload-time = "2025-04-10T22:19:11Z" }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload-time = "2025-04-10T22:19:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload-time = "2025-04-10T22:19:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload-time = "2025-04-10T22:19:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload-time = "2025-04-10T22:19:17.527Z" }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload-time = "2025-04-10T22:19:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload-time = "2025-04-10T22:19:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload-time = "2025-04-10T22:19:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload-time = "2025-04-10T22:19:23.773Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload-time = "2025-04-10T22:19:25.35Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload-time = "2025-04-10T22:19:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload-time = "2025-04-10T22:19:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload-time = "2025-04-10T22:19:30.481Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload-time = "2025-04-10T22:19:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload-time = "2025-04-10T22:19:34.17Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload-time = "2025-04-10T22:19:35.879Z" }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload-time = "2025-04-10T22:19:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload-time = "2025-04-10T22:19:39.005Z" }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload-time = "2025-04-10T22:19:41.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload-time = "2025-04-10T22:19:43.707Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload-time = "2025-04-10T22:19:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload-time = "2025-04-10T22:20:16.445Z" }, +] + +[[package]] +name = "mypy" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload-time = "2025-02-05T03:50:34.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338, upload-time = "2025-02-05T03:50:17.287Z" }, + { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540, upload-time = "2025-02-05T03:49:51.21Z" }, + { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051, upload-time = "2025-02-05T03:50:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751, upload-time = "2025-02-05T03:49:42.408Z" }, + { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783, upload-time = "2025-02-05T03:49:07.707Z" }, + { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618, upload-time = "2025-02-05T03:49:54.581Z" }, + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981, upload-time = "2025-02-05T03:50:28.25Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175, upload-time = "2025-02-05T03:50:13.411Z" }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675, upload-time = "2025-02-05T03:50:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020, upload-time = "2025-02-05T03:48:48.705Z" }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582, upload-time = "2025-02-05T03:49:03.628Z" }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614, upload-time = "2025-02-05T03:50:00.313Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592, upload-time = "2025-02-05T03:48:55.789Z" }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611, upload-time = "2025-02-05T03:48:44.581Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443, upload-time = "2025-02-05T03:49:25.514Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541, upload-time = "2025-02-05T03:49:57.623Z" }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348, upload-time = "2025-02-05T03:48:52.361Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648, upload-time = "2025-02-05T03:49:11.395Z" }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777, upload-time = "2025-02-05T03:50:08.348Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "parsimonious" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7b/91/abdc50c4ef06fdf8d047f60ee777ca9b2a7885e1a9cea81343fbecda52d7/parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c", size = 52172, upload-time = "2022-09-03T17:01:17.004Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/0f/c8b64d9b54ea631fcad4e9e3c8dbe8c11bb32a623be94f22974c88e71eaf/parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f", size = 48427, upload-time = "2022-09-03T17:01:13.814Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "propcache" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload-time = "2025-03-26T03:06:12.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload-time = "2025-03-26T03:04:01.912Z" }, + { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload-time = "2025-03-26T03:04:03.704Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload-time = "2025-03-26T03:04:05.257Z" }, + { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload-time = "2025-03-26T03:04:07.044Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload-time = "2025-03-26T03:04:08.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload-time = "2025-03-26T03:04:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload-time = "2025-03-26T03:04:11.616Z" }, + { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload-time = "2025-03-26T03:04:13.102Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload-time = "2025-03-26T03:04:14.658Z" }, + { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload-time = "2025-03-26T03:04:16.207Z" }, + { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload-time = "2025-03-26T03:04:18.11Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload-time = "2025-03-26T03:04:19.562Z" }, + { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload-time = "2025-03-26T03:04:21.065Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload-time = "2025-03-26T03:04:22.718Z" }, + { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload-time = "2025-03-26T03:04:24.039Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload-time = "2025-03-26T03:04:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload-time = "2025-03-26T03:04:26.436Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload-time = "2025-03-26T03:04:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload-time = "2025-03-26T03:04:30.659Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload-time = "2025-03-26T03:04:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload-time = "2025-03-26T03:04:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload-time = "2025-03-26T03:04:35.542Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload-time = "2025-03-26T03:04:37.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload-time = "2025-03-26T03:04:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload-time = "2025-03-26T03:04:41.109Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload-time = "2025-03-26T03:04:42.544Z" }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload-time = "2025-03-26T03:04:44.06Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload-time = "2025-03-26T03:04:45.983Z" }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload-time = "2025-03-26T03:04:47.699Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload-time = "2025-03-26T03:04:49.195Z" }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload-time = "2025-03-26T03:04:50.595Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload-time = "2025-03-26T03:04:51.791Z" }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload-time = "2025-03-26T03:04:53.406Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload-time = "2025-03-26T03:04:54.624Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload-time = "2025-03-26T03:04:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload-time = "2025-03-26T03:04:57.158Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload-time = "2025-03-26T03:04:58.61Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload-time = "2025-03-26T03:05:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload-time = "2025-03-26T03:05:02.11Z" }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload-time = "2025-03-26T03:05:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload-time = "2025-03-26T03:05:05.107Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload-time = "2025-03-26T03:05:06.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload-time = "2025-03-26T03:05:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload-time = "2025-03-26T03:05:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload-time = "2025-03-26T03:05:11.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload-time = "2025-03-26T03:05:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload-time = "2025-03-26T03:05:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload-time = "2025-03-26T03:05:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload-time = "2025-03-26T03:05:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload-time = "2025-03-26T03:05:18.607Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload-time = "2025-03-26T03:05:19.85Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload-time = "2025-03-26T03:05:21.654Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload-time = "2025-03-26T03:05:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload-time = "2025-03-26T03:05:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload-time = "2025-03-26T03:05:26.459Z" }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload-time = "2025-03-26T03:05:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload-time = "2025-03-26T03:05:29.757Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload-time = "2025-03-26T03:05:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload-time = "2025-03-26T03:05:32.984Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload-time = "2025-03-26T03:05:34.496Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload-time = "2025-03-26T03:05:36.256Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload-time = "2025-03-26T03:05:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload-time = "2025-03-26T03:05:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload-time = "2025-03-26T03:05:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload-time = "2025-03-26T03:06:10.5Z" }, +] + +[[package]] +name = "pycryptodome" +version = "3.22.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/e6/099310419df5ada522ff34ffc2f1a48a11b37fc6a76f51a6854c182dbd3e/pycryptodome-3.22.0.tar.gz", hash = "sha256:fd7ab568b3ad7b77c908d7c3f7e167ec5a8f035c64ff74f10d47a4edd043d723", size = 4917300, upload-time = "2025-03-15T23:03:36.506Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/65/a05831c3e4bcd1bf6c2a034e399f74b3d6f30bb4e37e36b9c310c09dc8c0/pycryptodome-3.22.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:009e1c80eea42401a5bd5983c4bab8d516aef22e014a4705622e24e6d9d703c6", size = 2490637, upload-time = "2025-03-15T23:02:43.111Z" }, + { url = "https://files.pythonhosted.org/packages/5c/76/ff3c2e7a60d17c080c4c6120ebaf60f38717cd387e77f84da4dcf7f64ff0/pycryptodome-3.22.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3b76fa80daeff9519d7e9f6d9e40708f2fce36b9295a847f00624a08293f4f00", size = 1635372, upload-time = "2025-03-15T23:02:45.564Z" }, + { url = "https://files.pythonhosted.org/packages/cc/7f/cc5d6da0dbc36acd978d80a72b228e33aadaec9c4f91c93221166d8bdc05/pycryptodome-3.22.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a31fa5914b255ab62aac9265654292ce0404f6b66540a065f538466474baedbc", size = 2177456, upload-time = "2025-03-15T23:02:47.688Z" }, + { url = "https://files.pythonhosted.org/packages/92/65/35f5063e68790602d892ad36e35ac723147232a9084d1999630045c34593/pycryptodome-3.22.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0092fd476701eeeb04df5cc509d8b739fa381583cda6a46ff0a60639b7cd70d", size = 2263744, upload-time = "2025-03-15T23:02:49.548Z" }, + { url = "https://files.pythonhosted.org/packages/cc/67/46acdd35b1081c3dbc72dc466b1b95b80d2f64cad3520f994a9b6c5c7d00/pycryptodome-3.22.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d5b0ddc7cf69231736d778bd3ae2b3efb681ae33b64b0c92fb4626bb48bb89", size = 2303356, upload-time = "2025-03-15T23:02:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f9/a4f8a83384626098e3f55664519bec113002b9ef751887086ae63a53135a/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f6cf6aa36fcf463e622d2165a5ad9963b2762bebae2f632d719dfb8544903cf5", size = 2176714, upload-time = "2025-03-15T23:02:53.85Z" }, + { url = "https://files.pythonhosted.org/packages/88/65/e5f8c3a885f70a6e05c84844cd5542120576f4369158946e8cfc623a464d/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:aec7b40a7ea5af7c40f8837adf20a137d5e11a6eb202cde7e588a48fb2d871a8", size = 2337329, upload-time = "2025-03-15T23:02:56.11Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/25e0be2b509c28375c7f75c7e8d8d060773f2cce4856a1654276e3202339/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d21c1eda2f42211f18a25db4eaf8056c94a8563cd39da3683f89fe0d881fb772", size = 2262255, upload-time = "2025-03-15T23:02:58.055Z" }, + { url = "https://files.pythonhosted.org/packages/41/58/60917bc4bbd91712e53ce04daf237a74a0ad731383a01288130672994328/pycryptodome-3.22.0-cp37-abi3-win32.whl", hash = "sha256:f02baa9f5e35934c6e8dcec91fcde96612bdefef6e442813b8ea34e82c84bbfb", size = 1763403, upload-time = "2025-03-15T23:03:00.616Z" }, + { url = "https://files.pythonhosted.org/packages/55/f4/244c621afcf7867e23f63cfd7a9630f14cfe946c9be7e566af6c3915bcde/pycryptodome-3.22.0-cp37-abi3-win_amd64.whl", hash = "sha256:d086aed307e96d40c23c42418cbbca22ecc0ab4a8a0e24f87932eeab26c08627", size = 1794568, upload-time = "2025-03-15T23:03:03.189Z" }, +] + +[[package]] +name = "pydantic" +version = "2.11.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540, upload-time = "2025-04-29T20:38:55.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900, upload-time = "2025-04-29T20:38:52.724Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest-cov" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857, upload-time = "2025-04-05T14:07:51.592Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841, upload-time = "2025-04-05T14:07:49.641Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" }, +] + +[[package]] +name = "pyunormalize" +version = "16.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/08/568036c725dac746ecb267bb749ef930fb7907454fe69fce83c8557287fb/pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7", size = 49968, upload-time = "2024-09-17T17:08:18.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f9/9d86e56f716e0651194a5ad58be9c146fcaf1de6901ac6f3cd3affeeb74e/pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152", size = 49173, upload-time = "2024-09-17T17:08:17.078Z" }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload-time = "2025-03-17T00:55:53.124Z" }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload-time = "2025-03-17T00:55:55.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload-time = "2025-03-17T00:55:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload-time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload-time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload-time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload-time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload-time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload-time = "2024-11-06T20:12:31.635Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669, upload-time = "2024-11-06T20:09:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684, upload-time = "2024-11-06T20:09:32.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589, upload-time = "2024-11-06T20:09:35.504Z" }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121, upload-time = "2024-11-06T20:09:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275, upload-time = "2024-11-06T20:09:40.371Z" }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257, upload-time = "2024-11-06T20:09:43.059Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727, upload-time = "2024-11-06T20:09:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667, upload-time = "2024-11-06T20:09:49.828Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963, upload-time = "2024-11-06T20:09:51.819Z" }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700, upload-time = "2024-11-06T20:09:53.982Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592, upload-time = "2024-11-06T20:09:56.222Z" }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929, upload-time = "2024-11-06T20:09:58.642Z" }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213, upload-time = "2024-11-06T20:10:00.867Z" }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734, upload-time = "2024-11-06T20:10:03.361Z" }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052, upload-time = "2024-11-06T20:10:05.179Z" }, + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781, upload-time = "2024-11-06T20:10:07.07Z" }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455, upload-time = "2024-11-06T20:10:09.117Z" }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759, upload-time = "2024-11-06T20:10:11.155Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976, upload-time = "2024-11-06T20:10:13.24Z" }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077, upload-time = "2024-11-06T20:10:15.37Z" }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160, upload-time = "2024-11-06T20:10:19.027Z" }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896, upload-time = "2024-11-06T20:10:21.85Z" }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997, upload-time = "2024-11-06T20:10:24.329Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725, upload-time = "2024-11-06T20:10:28.067Z" }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481, upload-time = "2024-11-06T20:10:31.612Z" }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896, upload-time = "2024-11-06T20:10:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138, upload-time = "2024-11-06T20:10:36.142Z" }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692, upload-time = "2024-11-06T20:10:38.394Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135, upload-time = "2024-11-06T20:10:40.367Z" }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567, upload-time = "2024-11-06T20:10:43.467Z" }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525, upload-time = "2024-11-06T20:10:45.19Z" }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324, upload-time = "2024-11-06T20:10:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617, upload-time = "2024-11-06T20:10:49.312Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023, upload-time = "2024-11-06T20:10:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072, upload-time = "2024-11-06T20:10:52.926Z" }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130, upload-time = "2024-11-06T20:10:54.828Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857, upload-time = "2024-11-06T20:10:56.634Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006, upload-time = "2024-11-06T20:10:59.369Z" }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650, upload-time = "2024-11-06T20:11:02.042Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545, upload-time = "2024-11-06T20:11:03.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045, upload-time = "2024-11-06T20:11:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182, upload-time = "2024-11-06T20:11:09.06Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733, upload-time = "2024-11-06T20:11:11.256Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122, upload-time = "2024-11-06T20:11:13.161Z" }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545, upload-time = "2024-11-06T20:11:15Z" }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, +] + +[[package]] +name = "rlp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/2d/439b0728a92964a04d9c88ea1ca9ebb128893fbbd5834faa31f987f2fd4c/rlp-4.1.0.tar.gz", hash = "sha256:be07564270a96f3e225e2c107db263de96b5bc1f27722d2855bd3459a08e95a9", size = 33429, upload-time = "2025-02-04T22:05:59.089Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/fb/e4c0ced9893b84ac95b7181d69a9786ce5879aeb3bbbcbba80a164f85d6a/rlp-4.1.0-py3-none-any.whl", hash = "sha256:8eca394c579bad34ee0b937aecb96a57052ff3716e19c7a578883e767bc5da6f", size = 19973, upload-time = "2025-02-04T22:05:57.05Z" }, +] + +[[package]] +name = "roman-numerals-py" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, +] + +[[package]] +name = "ruff" +version = "0.11.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/e7/e55dda1c92cdcf34b677ebef17486669800de01e887b7831a1b8fdf5cb08/ruff-0.11.9.tar.gz", hash = "sha256:ebd58d4f67a00afb3a30bf7d383e52d0e036e6195143c6db7019604a05335517", size = 4132134, upload-time = "2025-05-09T16:19:41.511Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/71/75dfb7194fe6502708e547941d41162574d1f579c4676a8eb645bf1a6842/ruff-0.11.9-py3-none-linux_armv6l.whl", hash = "sha256:a31a1d143a5e6f499d1fb480f8e1e780b4dfdd580f86e05e87b835d22c5c6f8c", size = 10335453, upload-time = "2025-05-09T16:18:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/74/fc/ad80c869b1732f53c4232bbf341f33c5075b2c0fb3e488983eb55964076a/ruff-0.11.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:66bc18ca783b97186a1f3100e91e492615767ae0a3be584e1266aa9051990722", size = 11072566, upload-time = "2025-05-09T16:19:01.432Z" }, + { url = "https://files.pythonhosted.org/packages/87/0d/0ccececef8a0671dae155cbf7a1f90ea2dd1dba61405da60228bbe731d35/ruff-0.11.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bd576cd06962825de8aece49f28707662ada6a1ff2db848d1348e12c580acbf1", size = 10435020, upload-time = "2025-05-09T16:19:03.897Z" }, + { url = "https://files.pythonhosted.org/packages/52/01/e249e1da6ad722278094e183cbf22379a9bbe5f21a3e46cef24ccab76e22/ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b1d18b4be8182cc6fddf859ce432cc9631556e9f371ada52f3eaefc10d878de", size = 10593935, upload-time = "2025-05-09T16:19:06.455Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/40cf91f61e3003fe7bd43f1761882740e954506c5a0f9097b1cff861f04c/ruff-0.11.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f3f46f759ac623e94824b1e5a687a0df5cd7f5b00718ff9c24f0a894a683be7", size = 10172971, upload-time = "2025-05-09T16:19:10.261Z" }, + { url = "https://files.pythonhosted.org/packages/61/12/d395203de1e8717d7a2071b5a340422726d4736f44daf2290aad1085075f/ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34847eea11932d97b521450cf3e1d17863cfa5a94f21a056b93fb86f3f3dba2", size = 11748631, upload-time = "2025-05-09T16:19:12.307Z" }, + { url = "https://files.pythonhosted.org/packages/66/d6/ef4d5eba77677eab511644c37c55a3bb8dcac1cdeb331123fe342c9a16c9/ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f33b15e00435773df97cddcd263578aa83af996b913721d86f47f4e0ee0ff271", size = 12409236, upload-time = "2025-05-09T16:19:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8f/5a2c5fc6124dd925a5faf90e1089ee9036462118b619068e5b65f8ea03df/ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b27613a683b086f2aca8996f63cb3dd7bc49e6eccf590563221f7b43ded3f65", size = 11881436, upload-time = "2025-05-09T16:19:17.063Z" }, + { url = "https://files.pythonhosted.org/packages/39/d1/9683f469ae0b99b95ef99a56cfe8c8373c14eba26bd5c622150959ce9f64/ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e0d88756e63e8302e630cee3ce2ffb77859797cc84a830a24473939e6da3ca6", size = 13982759, upload-time = "2025-05-09T16:19:19.693Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0b/c53a664f06e0faab596397867c6320c3816df479e888fe3af63bc3f89699/ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:537c82c9829d7811e3aa680205f94c81a2958a122ac391c0eb60336ace741a70", size = 11541985, upload-time = "2025-05-09T16:19:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/23/a0/156c4d7e685f6526a636a60986ee4a3c09c8c4e2a49b9a08c9913f46c139/ruff-0.11.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:440ac6a7029f3dee7d46ab7de6f54b19e34c2b090bb4f2480d0a2d635228f381", size = 10465775, upload-time = "2025-05-09T16:19:24.401Z" }, + { url = "https://files.pythonhosted.org/packages/43/d5/88b9a6534d9d4952c355e38eabc343df812f168a2c811dbce7d681aeb404/ruff-0.11.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:71c539bac63d0788a30227ed4d43b81353c89437d355fdc52e0cda4ce5651787", size = 10170957, upload-time = "2025-05-09T16:19:27.08Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b8/2bd533bdaf469dc84b45815ab806784d561fab104d993a54e1852596d581/ruff-0.11.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c67117bc82457e4501473c5f5217d49d9222a360794bfb63968e09e70f340abd", size = 11143307, upload-time = "2025-05-09T16:19:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d9/43cfba291788459b9bfd4e09a0479aa94d05ab5021d381a502d61a807ec1/ruff-0.11.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e4b78454f97aa454586e8a5557facb40d683e74246c97372af3c2d76901d697b", size = 11603026, upload-time = "2025-05-09T16:19:31.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e6/7ed70048e89b01d728ccc950557a17ecf8df4127b08a56944b9d0bae61bc/ruff-0.11.9-py3-none-win32.whl", hash = "sha256:7fe1bc950e7d7b42caaee2a8a3bc27410547cc032c9558ee2e0f6d3b209e845a", size = 10548627, upload-time = "2025-05-09T16:19:33.657Z" }, + { url = "https://files.pythonhosted.org/packages/90/36/1da5d566271682ed10f436f732e5f75f926c17255c9c75cefb77d4bf8f10/ruff-0.11.9-py3-none-win_amd64.whl", hash = "sha256:52edaa4a6d70f8180343a5b7f030c7edd36ad180c9f4d224959c2d689962d964", size = 11634340, upload-time = "2025-05-09T16:19:35.815Z" }, + { url = "https://files.pythonhosted.org/packages/40/f7/70aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417/ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca", size = 10741080, upload-time = "2025-05-09T16:19:39.605Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, +] + +[[package]] +name = "sphinx" +version = "8.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals-py" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +] + +[[package]] +name = "toolz" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790, upload-time = "2024-10-04T16:17:04.001Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383, upload-time = "2024-10-04T16:17:01.533Z" }, +] + +[[package]] +name = "types-requests" +version = "2.32.0.20250328" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995, upload-time = "2025-03-28T02:55:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663, upload-time = "2025-03-28T02:55:11.946Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, +] + +[[package]] +name = "urllib3" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, +] + +[[package]] +name = "web3" +version = "7.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "eth-abi" }, + { name = "eth-account" }, + { name = "eth-hash", extra = ["pycryptodome"] }, + { name = "eth-typing" }, + { name = "eth-utils" }, + { name = "hexbytes" }, + { name = "pydantic" }, + { name = "pyunormalize" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "types-requests" }, + { name = "typing-extensions" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/8a/d3017597fb48d7f8b5d8955a9ca9d8bd97f232fb3e89fd8842ddeb837010/web3-7.11.0.tar.gz", hash = "sha256:5e65f43aed028fc9a2e094e95499e66b18d7878d829ff8ff13f1a825141ab747", size = 2197541, upload-time = "2025-04-29T17:28:29.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/d8/afd0fc2919177d1c1f4e7e30e2dc83eb5be71d29046497b80892e3a978cf/web3-7.11.0-py3-none-any.whl", hash = "sha256:bbc844e4ea8d5769aa7be28cd737693cab41c4c52dc3d28c32d91718bfddfb91", size = 1367624, upload-time = "2025-04-29T17:28:26.766Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "yarl" +version = "1.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload-time = "2025-04-17T00:45:14.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload-time = "2025-04-17T00:42:04.511Z" }, + { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload-time = "2025-04-17T00:42:06.43Z" }, + { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload-time = "2025-04-17T00:42:07.976Z" }, + { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload-time = "2025-04-17T00:42:09.902Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload-time = "2025-04-17T00:42:11.768Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload-time = "2025-04-17T00:42:13.983Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload-time = "2025-04-17T00:42:16.386Z" }, + { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload-time = "2025-04-17T00:42:18.622Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload-time = "2025-04-17T00:42:20.9Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload-time = "2025-04-17T00:42:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload-time = "2025-04-17T00:42:25.145Z" }, + { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload-time = "2025-04-17T00:42:27.475Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload-time = "2025-04-17T00:42:29.333Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload-time = "2025-04-17T00:42:31.668Z" }, + { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload-time = "2025-04-17T00:42:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload-time = "2025-04-17T00:42:35.873Z" }, + { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload-time = "2025-04-17T00:42:37.586Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload-time = "2025-04-17T00:42:39.602Z" }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload-time = "2025-04-17T00:42:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload-time = "2025-04-17T00:42:43.666Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload-time = "2025-04-17T00:42:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload-time = "2025-04-17T00:42:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload-time = "2025-04-17T00:42:49.406Z" }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload-time = "2025-04-17T00:42:51.588Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload-time = "2025-04-17T00:42:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload-time = "2025-04-17T00:42:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload-time = "2025-04-17T00:42:57.895Z" }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload-time = "2025-04-17T00:43:00.094Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload-time = "2025-04-17T00:43:02.242Z" }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload-time = "2025-04-17T00:43:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload-time = "2025-04-17T00:43:06.609Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload-time = "2025-04-17T00:43:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload-time = "2025-04-17T00:43:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload-time = "2025-04-17T00:43:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload-time = "2025-04-17T00:43:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload-time = "2025-04-17T00:43:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload-time = "2025-04-17T00:43:19.431Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload-time = "2025-04-17T00:43:21.426Z" }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload-time = "2025-04-17T00:43:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload-time = "2025-04-17T00:43:25.695Z" }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload-time = "2025-04-17T00:43:27.876Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload-time = "2025-04-17T00:43:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload-time = "2025-04-17T00:43:31.742Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload-time = "2025-04-17T00:43:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload-time = "2025-04-17T00:43:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload-time = "2025-04-17T00:43:38.551Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload-time = "2025-04-17T00:43:40.481Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload-time = "2025-04-17T00:43:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload-time = "2025-04-17T00:43:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload-time = "2025-04-17T00:43:47.076Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload-time = "2025-04-17T00:43:49.193Z" }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload-time = "2025-04-17T00:43:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload-time = "2025-04-17T00:43:53.506Z" }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload-time = "2025-04-17T00:43:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload-time = "2025-04-17T00:43:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload-time = "2025-04-17T00:44:00.526Z" }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload-time = "2025-04-17T00:44:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload-time = "2025-04-17T00:44:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload-time = "2025-04-17T00:44:07.721Z" }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload-time = "2025-04-17T00:44:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload-time = "2025-04-17T00:44:11.734Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload-time = "2025-04-17T00:44:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload-time = "2025-04-17T00:44:16.052Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload-time = "2025-04-17T00:44:18.547Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload-time = "2025-04-17T00:44:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload-time = "2025-04-17T00:44:22.851Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload-time = "2025-04-17T00:44:25.491Z" }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload-time = "2025-04-17T00:44:27.418Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload-time = "2025-04-17T00:45:12.199Z" }, +] From 4828ac35f9218ca94c4c2ec012e456c385c71c2d Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Tue, 13 May 2025 23:41:40 +0900 Subject: [PATCH 03/56] Add clients & utils; renamed directories --- packages/core/.gitignore | 2 + packages/core/LICENSE | 21 + packages/core/README.md | 8 + packages/core/abis/README.md | 10 + packages/core/abis/v2.json | 1260 ++++++++++++++++++++++ {src => packages}/core/pyproject.toml | 25 + packages/core/src/__init__.py | 1 + packages/core/src/client.py | 62 ++ packages/core/src/interfaces/__init__.py | 1 + packages/core/src/interfaces/client.py | 53 + packages/core/src/utils/__init__.py | 3 + packages/core/src/utils/addresses.py | 44 + packages/core/src/utils/chains.py | 133 +++ packages/core/src/utils/errors.py | 18 + pyproject.toml | 2 +- src/core/README.md | 4 - uv.lock | 4 +- 17 files changed, 1645 insertions(+), 6 deletions(-) create mode 100644 packages/core/.gitignore create mode 100644 packages/core/LICENSE create mode 100644 packages/core/README.md create mode 100644 packages/core/abis/README.md create mode 100644 packages/core/abis/v2.json rename {src => packages}/core/pyproject.toml (76%) create mode 100644 packages/core/src/__init__.py create mode 100644 packages/core/src/client.py create mode 100644 packages/core/src/interfaces/__init__.py create mode 100644 packages/core/src/interfaces/client.py create mode 100644 packages/core/src/utils/__init__.py create mode 100644 packages/core/src/utils/addresses.py create mode 100644 packages/core/src/utils/chains.py create mode 100644 packages/core/src/utils/errors.py delete mode 100644 src/core/README.md diff --git a/packages/core/.gitignore b/packages/core/.gitignore new file mode 100644 index 0000000..4ef250d --- /dev/null +++ b/packages/core/.gitignore @@ -0,0 +1,2 @@ +# misc +DS_STORE diff --git a/packages/core/LICENSE b/packages/core/LICENSE new file mode 100644 index 0000000..5caab71 --- /dev/null +++ b/packages/core/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 JPYC株式会社 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 0000000..e255c73 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,8 @@ +# Core SDK + +> [!IMPORTANT] +> TODO: README in English + +## Comments & Docstrings + +Docstrings should be written in the [Google-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). diff --git a/packages/core/abis/README.md b/packages/core/abis/README.md new file mode 100644 index 0000000..381ae54 --- /dev/null +++ b/packages/core/abis/README.md @@ -0,0 +1,10 @@ +# ABIs + +This directory contains the auto-generated ABIs of JPYC's [core contracts](https://github.com/jcam1/JPYCv2). + +## 📚 Available Versions + +| Version | File | Description | +| ---------------: | :----------------------------------------------------- | :----------------------------------------------------- | +| `v3` | n/a | Coming Soon | +| `v2` | [`v2.json`](./v2.json) | ABI of JPYCv2 contracts (**latest**) | diff --git a/packages/core/abis/v2.json b/packages/core/abis/v2.json new file mode 100644 index 0000000..6d35079 --- /dev/null +++ b/packages/core/abis/v2.json @@ -0,0 +1,1260 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FiatTokenV1", + "sourceName": "JPYCv2/contracts/v1/FiatTokenV1.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationUsed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "Blocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newBlocklister", + "type": "address" + } + ], + "name": "BlocklisterChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "burner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" + } + ], + "name": "MinterAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "MinterConfigured", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldMinter", + "type": "address" + } + ], + "name": "MinterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "PauserChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "RescuerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "UnBlocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "CANCEL_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_domainSeparatorV4", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "authorizationState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "blocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "blocklister", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "cancelAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "configureMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "currency", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "decrement", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "increment", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenName", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenSymbol", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenCurrency", + "type": "string" + }, + { + "internalType": "uint8", + "name": "tokenDecimals", + "type": "uint8" + }, + { + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "newPauser", + "type": "address" + }, + { + "internalType": "address", + "name": "newBlocklister", + "type": "address" + }, + { + "internalType": "address", + "name": "newRescuer", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isBlocklisted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minterAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "minterAllowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "receiveWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "removeMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "tokenContract", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "rescueERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rescuer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "transferWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "unBlocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newBlocklister", + "type": "address" + } + ], + "name": "updateBlocklister", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newMinterAdmin", + "type": "address" + } + ], + "name": "updateMinterAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauser", + "type": "address" + } + ], + "name": "updatePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "updateRescuer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x60a0604052306080523480156200001557600080fd5b50620000213362000027565b62000077565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b608051614e33620000af600039600081816111da0152818161127001528181611f0e01528181611fa4015261209f0152614e336000f3fe6080604052600436106103295760003560e01c80637ecebe00116101a5578063aa271e1a116100ec578063e3ee160e11610095578063e94a01021161006f578063e94a0102146109d7578063ef55bec614610a1e578063f2fde38b14610a3e578063f9b5aa9214610a5e57600080fd5b8063e3ee160e14610982578063e5a6b10f146109a2578063e5c7160b146109b757600080fd5b8063d505accf116100c6578063d505accf146108e7578063d916948714610907578063dd62ed3e1461093b57600080fd5b8063aa271e1a1461086d578063b2118a8d146108a7578063b54d9497146108c757600080fd5b806395d89b411161014e578063a457c2d711610128578063a457c2d71461080c578063a754d48f1461082c578063a9059cbb1461084d57600080fd5b806395d89b41146107a35780639fd0506d146107b8578063a0cc6a68146107d857600080fd5b80638a6db9c31161017f5780638a6db9c3146107155780638da5cb5b1461074c5780638e204c431461076a57600080fd5b80637ecebe00146106955780637f2eecc3146106cc5780638456cb591461070057600080fd5b80633f4ba83a1161027457806352d1902d1161021d5780635c975abb116101f75780635c975abb1461060857806370a082311461062957806374ebf673146106605780637b134b4c1461068057600080fd5b806352d1902d146105b3578063554bab3c146105c85780635a049a70146105e857600080fd5b8063439531fd1161024e578063439531fd146105605780634e44d956146105805780634f1ef286146105a057600080fd5b80633f4ba83a1461050b57806340c10f191461052057806342966c681461054057600080fd5b806330adf81f116102d65780633659cfe6116102b05780633659cfe61461049357806338a63183146104b357806339509351146104eb57600080fd5b806330adf81f1461040b578063313ce5671461043f57806331b230201461047357600080fd5b806323b872dd1161030757806323b872dd146103a95780632ab60045146103c95780633092afd5146103eb57600080fd5b806306fdde031461032e578063095ea7b31461035957806318160ddd14610389575b600080fd5b34801561033a57600080fd5b50610343610a7e565b604051610350919061481c565b60405180910390f35b34801561036557600080fd5b5061037961037436600461486f565b610b0d565b6040519015158152602001610350565b34801561039557600080fd5b50610202545b604051908152602001610350565b3480156103b557600080fd5b506103796103c436600461489b565b610c59565b3480156103d557600080fd5b506103e96103e43660046148dc565b610eed565b005b3480156103f757600080fd5b506103796104063660046148dc565b611029565b34801561041757600080fd5b5061039b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b57600080fd5b506102035461046190600160a01b900460ff1681565b60405160ff9091168152602001610350565b34801561047f57600080fd5b506103e961048e3660046148dc565b61110b565b34801561049f57600080fd5b506103e96104ae3660046148dc565b6111cf565b3480156104bf57600080fd5b50609a546104d3906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b3480156104f757600080fd5b5061037961050636600461486f565b61136d565b34801561051757600080fd5b506103e96114a9565b34801561052c57600080fd5b5061037961053b36600461486f565b61157c565b34801561054c57600080fd5b506103e961055b3660046148f9565b6119a7565b34801561056c57600080fd5b506103e961057b3660046148dc565b611c89565b34801561058c57600080fd5b5061037961059b36600461486f565b611dc6565b6103e96105ae3660046149b7565b611f03565b3480156105bf57600080fd5b5061039b612092565b3480156105d457600080fd5b506103e96105e33660046148dc565b612157565b3480156105f457600080fd5b506103e9610603366004614a2c565b612293565b34801561061457600080fd5b5060335461037990600160a01b900460ff1681565b34801561063557600080fd5b5061039b6106443660046148dc565b6001600160a01b03166000908152610204602052604090205490565b34801561066c57600080fd5b506103e961067b366004614a9c565b6122f4565b34801561068c57600080fd5b5061039b612838565b3480156106a157600080fd5b5061039b6106b03660046148dc565b6001600160a01b03166000908152610168602052604090205490565b3480156106d857600080fd5b5061039b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b34801561070c57600080fd5b506103e96129de565b34801561072157600080fd5b5061039b6107303660046148dc565b6001600160a01b03166000908152610207602052604090205490565b34801561075857600080fd5b506000546001600160a01b03166104d3565b34801561077657600080fd5b506103796107853660046148dc565b6001600160a01b031660009081526067602052604090205460011490565b3480156107af57600080fd5b50610343612ab7565b3480156107c457600080fd5b506033546104d3906001600160a01b031681565b3480156107e457600080fd5b5061039b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b34801561081857600080fd5b5061037961082736600461486f565b612ac5565b34801561083857600080fd5b50610203546104d3906001600160a01b031681565b34801561085957600080fd5b5061037961086836600461486f565b612c01565b34801561087957600080fd5b506103796108883660046148dc565b6001600160a01b03166000908152610206602052604090205460ff1690565b3480156108b357600080fd5b506103e96108c236600461489b565b612d3d565b3480156108d357600080fd5b506066546104d3906001600160a01b031681565b3480156108f357600080fd5b506103e9610902366004614b89565b612e4e565b34801561091357600080fd5b5061039b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b34801561094757600080fd5b5061039b610956366004614bf7565b6001600160a01b0391821660009081526102056020908152604080832093909416825291909152205490565b34801561098e57600080fd5b506103e961099d366004614c30565b612fa1565b3480156109ae57600080fd5b506103436130f8565b3480156109c357600080fd5b506103e96109d23660046148dc565b613106565b3480156109e357600080fd5b506103796109f236600461486f565b6001600160a01b0391909116600090815261013560209081526040808320938352929052205460011490565b348015610a2a57600080fd5b506103e9610a39366004614c30565b6131cb565b348015610a4a57600080fd5b506103e9610a593660046148dc565b613315565b348015610a6a57600080fd5b506103e9610a793660046148dc565b613403565b6101ff8054610a8c90614cb2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614cb2565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b603354600090600160a01b900460ff1615610b625760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b3360008181526067602052604090205415610bcd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015610c435760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e33868661353f565b506001949350505050565b603354600090600160a01b900460ff1615610ca95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415610d145760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610d8a5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610e005760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0387166000908152610205602090815260408083203384529091529020546000198114610ed45785811015610ea45760405162461bcd60e51b815260206004820152602c60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f647320616c6c6f77616e636500000000000000000000000000000000000000006064820152608401610b59565b610eae8682614d35565b6001600160a01b0389166000908152610205602090815260408083203384529091529020555b610edf888888613691565b506001979650505050505050565b33610f006000546001600160a01b031690565b6001600160a01b031614610f565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116610fd25760405162461bcd60e51b815260206004820152602a60248201527f526573637561626c653a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b609a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610203546000906001600160a01b031633146110ad5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038216600081815261020660209081526040808320805460ff19169055610207909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b6066546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038116600081815260676020526040808220829055517fbc3fe0fc667d12a7a22748747f024a7d971127ffc48f6622675d3e97a2591a519190a250565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561126e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113455760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b61134e816138b7565b6040805160008082526020820190925261136a91839190613920565b50565b603354600090600160a01b900460ff16156113bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b33600081815260676020526040902054156114285760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b03841660009081526067602052604090205484901561149e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613ac5565b6033546001600160a01b031633146115295760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b603354600090600160a01b900460ff16156115cc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff166116525760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b33600081815260676020526040902054156116bd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0384166000908152606760205260409020548490156117335760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0385166117af5760405162461bcd60e51b815260206004820152602360248201527f46696174546f6b656e3a206d696e7420746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b59565b600084116118255760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206d696e7420616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b3360009081526102076020526040902054808511156118ac5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d60448201527f696e746572416c6c6f77616e63650000000000000000000000000000000000006064820152608401610b59565b84610202546118bb9190614d4c565b610202556001600160a01b038616600090815261020460205260409020546118e4908690614d4c565b6001600160a01b038716600090815261020460205260409020556119088582614d35565b336000818152610207602090815260409182902093909355518781526001600160a01b038916927fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8910160405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b603354600160a01b900460ff16156119f45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff16611a7a5760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b3360008181526067602052604090205415611ae55760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b336000908152610204602052604090205482611b695760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206275726e20616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b82811015611bdf5760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a206275726e20616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b59565b8261020254611bee9190614d35565b61020255611bfc8382614d35565b3360008181526102046020526040908190209290925590517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590611c439086815260200190565b60405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b33611c9c6000546001600160a01b031690565b6001600160a01b031614611cf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116611d6e5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b610203805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4e6db312b79f0cdadbee5f76e2473786c1e81cba2356eacccc2aa5b5e6e3664c90600090a250565b603354600090600160a01b900460ff1615611e165760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b610203546001600160a01b03163314611e975760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038316600081815261020660209081526040808320805460ff1916600117905561020782529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611fa25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146120795760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b612082826138b7565b61208e82826001613920565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121325760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b59565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3361216a6000546001600160a01b031690565b6001600160a01b0316146121c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b03811661223c5760405162461bcd60e51b815260206004820152602860248201527f5061757361626c653a206e65772070617573657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b603354600160a01b900460ff16156122e05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6122ed8585858585613b04565b5050505050565b610203547501000000000000000000000000000000000000000000900460ff16156123875760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a20636f6e747261637420697320616c7265616479206960448201527f6e697469616c697a6564000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0385166124035760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03841661247f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206e65772070617573657220697320746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0383166124fb5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e657720626c6f636b6c697374657220697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166125775760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0381166125f35760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a206e6577206f776e657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b8851612607906101ff9060208c0190614757565b50875161261c906102009060208b0190614757565b508651612631906102019060208a0190614757565b5061020380547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b60ff89160273ffffffffffffffffffffffffffffffffffffffff19908116919091176001600160a01b0388811691909117909255603380548216878416179055606680548216868416179055609a80549091169184169190911790556126c381613c25565b30600081815260676020908152604091829020600190819055825180840184529081527f3100000000000000000000000000000000000000000000000000000000000000908201528b518c82012082517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81840152808401919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082015260a0808201949094528251808203909401845260c001909152815191012060ff55466101005588516127a5906101019060208c0190614757565b506040805180820190915260018082527f310000000000000000000000000000000000000000000000000000000000000060209092019182526127eb9161010291614757565b505061020380547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555050505050505050565b60006101005446141561284c575060ff5490565b6129d9610101805461285d90614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461288990614cb2565b80156128d65780601f106128ab576101008083540402835291602001916128d6565b820191906000526020600020905b8154815290600101906020018083116128b957829003601f168201915b505050505061010280546128e990614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461291590614cb2565b80156129625780601f1061293757610100808354040283529160200191612962565b820191906000526020600020905b81548152906001019060200180831161294557829003601f168201915b50505050508151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b905090565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6102008054610a8c90614cb2565b603354600090600160a01b900460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612b805760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612bf65760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613c82565b603354600090600160a01b900460ff1615612c515760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612cbc5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612d325760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613691565b609a546001600160a01b03163314612dbc5760405162461bcd60e51b8152602060048201526024808201527f526573637561626c653a2063616c6c6572206973206e6f74207468652072657360448201527f63756572000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190614d64565b50505050565b603354600160a01b900460ff1615612e9b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b038716600090815260676020526040902054879015612f115760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038716600090815260676020526040902054879015612f875760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b612f9689898989898989613d2e565b505050505050505050565b603354600160a01b900460ff1615612fee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b0389166000908152606760205260409020548990156130645760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156130da5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613e99565b5050505050505050505050565b6102018054610a8c90614cb2565b6066546001600160a01b031633146131865760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03811660008181526067602052604080822060019055517f917c251bb231c4b997a420bebe47edad5c20e70715da16c38e9b2e172e44ab929190a250565b603354600160a01b900460ff16156132185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b03891660009081526067602052604090205489901561328e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156133045760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613faa565b336133286000546001600160a01b031690565b6001600160a01b03161461337e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166133fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b61136a81613c25565b336134166000546001600160a01b031690565b6001600160a01b03161461346c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166134e85760405162461bcd60e51b815260206004820152603260248201527f426c6f636b6c69737461626c653a206e657720626c6f636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610b59565b6066805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f68f10ceb42d30acc930aaaedf5b94559e14fc4f22496dc2c1b38b1b1b5231f9890600090a250565b6001600160a01b0383166135bb5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a20617070726f76652066726f6d20746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166136375760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a20617070726f766520746f20746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038381166000818152610205602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611c7c565b6001600160a01b03831661370d5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a207472616e736665722066726f6d20746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166137895760405162461bcd60e51b815260206004820152602760248201527f46696174546f6b656e3a207472616e7366657220746f20746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03831660009081526102046020526040902054808211156138195760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f64732062616c616e6365000000000000000000000000000000000000000000006064820152608401610b59565b6138238282614d35565b6001600160a01b03808616600090815261020460205260408082209390935590851681522054613854908390614d4c565b6001600160a01b038085166000818152610204602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138a99086815260200190565b60405180910390a350505050565b336138ca6000546001600160a01b031690565b6001600160a01b03161461136a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561395857613953836140a0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156139b2575060408051601f3d908101601f191682019092526139af91810190614d86565b60015b613a245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114613ab95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610b59565b50613953838383614162565b6001600160a01b03808416600090815261020560209081526040808320938616835292905220546139539084908490613aff908590614d4c565b61353f565b613b0e8585614187565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b038716818301819052606080830188905283518084039091018152608090920190925290613b77613b6e612838565b8686868661421f565b6001600160a01b031614613bcd5760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b6001600160a01b03861660008181526101356020908152604080832089845290915280822060019055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084166000908152610205602090815260408083209386168352929052205480821115613d1f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610b59565b612e488484613aff8585614d35565b42841015613d7e5760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a207065726d697420697320657870697265640000000000006044820152606401610b59565b6001600160a01b03871660009081526101686020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a919086613dcc83614d9f565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040529050876001600160a01b0316613e2e613b6e612838565b6001600160a01b031614613e845760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613e8f88888861353f565b5050505050505050565b613ea58985888861429c565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e08101859052600090610100015b6040516020818303038152906040529050896001600160a01b0316613f33613b6e612838565b6001600160a01b031614613f895760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613f938a86614390565b613f9e8a8a8a613691565b50505050505050505050565b6001600160a01b03881633146140285760405162461bcd60e51b815260206004820152602160248201527f454950333030393a2063616c6c6572206d75737420626520746865207061796560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6140348985888861429c565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e0810185905260009061010001613f0d565b803b6141145760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61416b836143e4565b6000825111806141785750805b1561395357612e488383614424565b6001600160a01b0382166000908152610135602090815260408083208484529091529020541561208e5760405162461bcd60e51b815260206004820152602a60248201527f454950333030393a20617574686f72697a6174696f6e2069732075736564206f60448201527f722063616e63656c6564000000000000000000000000000000000000000000006064820152608401610b59565b60008086838051906020012060405160200161426d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061429181878787614450565b979650505050505050565b8142116143115760405162461bcd60e51b815260206004820152602760248201527f454950333030393a20617574686f72697a6174696f6e206973206e6f7420796560448201527f742076616c6964000000000000000000000000000000000000000000000000006064820152608401610b59565b8042106143865760405162461bcd60e51b815260206004820152602160248201527f454950333030393a20617574686f72697a6174696f6e2069732065787069726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b612e488484614187565b6001600160a01b03821660008181526101356020908152604080832085845290915280822060019055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6143ed816140a0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606144498383604051806060016040528060278152602001614dd760279139614633565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156144e85760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027732760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b8360ff16601b1415801561450057508360ff16601c14155b156145735760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027762760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156145c7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661462a5760405162461bcd60e51b815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e6174757265000000006044820152606401610b59565b95945050505050565b6060833b6146a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610b59565b600080856001600160a01b0316856040516146c49190614dba565b600060405180830381855af49150503d80600081146146ff576040519150601f19603f3d011682016040523d82523d6000602084013e614704565b606091505b509150915061471482828661471e565b9695505050505050565b6060831561472d575081614449565b82511561473d5782518084602001fd5b8160405162461bcd60e51b8152600401610b59919061481c565b82805461476390614cb2565b90600052602060002090601f01602090048101928261478557600085556147cb565b82601f1061479e57805160ff19168380011785556147cb565b828001600101855582156147cb579182015b828111156147cb5782518255916020019190600101906147b0565b506147d79291506147db565b5090565b5b808211156147d757600081556001016147dc565b60005b8381101561480b5781810151838201526020016147f3565b83811115612e485750506000910152565b602081526000825180602084015261483b8160408501602087016147f0565b601f01601f19169190910160400192915050565b6001600160a01b038116811461136a57600080fd5b80356111068161484f565b6000806040838503121561488257600080fd5b823561488d8161484f565b946020939093013593505050565b6000806000606084860312156148b057600080fd5b83356148bb8161484f565b925060208401356148cb8161484f565b929592945050506040919091013590565b6000602082840312156148ee57600080fd5b81356144498161484f565b60006020828403121561490b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561495c5761495c614912565b604051601f8501601f19908116603f0116810190828211818310171561498457614984614912565b8160405280935085815286868601111561499d57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156149ca57600080fd5b82356149d58161484f565b9150602083013567ffffffffffffffff8111156149f157600080fd5b8301601f81018513614a0257600080fd5b614a1185823560208401614941565b9150509250929050565b803560ff8116811461110657600080fd5b600080600080600060a08688031215614a4457600080fd5b8535614a4f8161484f565b945060208601359350614a6460408701614a1b565b94979396509394606081013594506080013592915050565b600082601f830112614a8d57600080fd5b61444983833560208501614941565b60008060008060008060008060006101208a8c031215614abb57600080fd5b893567ffffffffffffffff80821115614ad357600080fd5b614adf8d838e01614a7c565b9a5060208c0135915080821115614af557600080fd5b614b018d838e01614a7c565b995060408c0135915080821115614b1757600080fd5b50614b248c828d01614a7c565b975050614b3360608b01614a1b565b9550614b4160808b01614864565b9450614b4f60a08b01614864565b9350614b5d60c08b01614864565b9250614b6b60e08b01614864565b9150614b7a6101008b01614864565b90509295985092959850929598565b600080600080600080600060e0888a031215614ba457600080fd5b8735614baf8161484f565b96506020880135614bbf8161484f565b95506040880135945060608801359350614bdb60808901614a1b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614c0a57600080fd5b8235614c158161484f565b91506020830135614c258161484f565b809150509250929050565b60008060008060008060008060006101208a8c031215614c4f57600080fd5b8935614c5a8161484f565b985060208a0135614c6a8161484f565b975060408a0135965060608a0135955060808a0135945060a08a01359350614c9460c08b01614a1b565b925060e08a013591506101008a013590509295985092959850929598565b600181811c90821680614cc657607f821691505b60208210811415614d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d4757614d47614d06565b500390565b60008219821115614d5f57614d5f614d06565b500190565b600060208284031215614d7657600080fd5b8151801515811461444957600080fd5b600060208284031215614d9857600080fd5b5051919050565b6000600019821415614db357614db3614d06565b5060010190565b60008251614dcc8184602087016147f0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088b0c5194b9eca0801c00f098997e6c9042e68a8d796e28173d6611567e0d9a464736f6c634300080b0033", + "deployedBytecode": "0x6080604052600436106103295760003560e01c80637ecebe00116101a5578063aa271e1a116100ec578063e3ee160e11610095578063e94a01021161006f578063e94a0102146109d7578063ef55bec614610a1e578063f2fde38b14610a3e578063f9b5aa9214610a5e57600080fd5b8063e3ee160e14610982578063e5a6b10f146109a2578063e5c7160b146109b757600080fd5b8063d505accf116100c6578063d505accf146108e7578063d916948714610907578063dd62ed3e1461093b57600080fd5b8063aa271e1a1461086d578063b2118a8d146108a7578063b54d9497146108c757600080fd5b806395d89b411161014e578063a457c2d711610128578063a457c2d71461080c578063a754d48f1461082c578063a9059cbb1461084d57600080fd5b806395d89b41146107a35780639fd0506d146107b8578063a0cc6a68146107d857600080fd5b80638a6db9c31161017f5780638a6db9c3146107155780638da5cb5b1461074c5780638e204c431461076a57600080fd5b80637ecebe00146106955780637f2eecc3146106cc5780638456cb591461070057600080fd5b80633f4ba83a1161027457806352d1902d1161021d5780635c975abb116101f75780635c975abb1461060857806370a082311461062957806374ebf673146106605780637b134b4c1461068057600080fd5b806352d1902d146105b3578063554bab3c146105c85780635a049a70146105e857600080fd5b8063439531fd1161024e578063439531fd146105605780634e44d956146105805780634f1ef286146105a057600080fd5b80633f4ba83a1461050b57806340c10f191461052057806342966c681461054057600080fd5b806330adf81f116102d65780633659cfe6116102b05780633659cfe61461049357806338a63183146104b357806339509351146104eb57600080fd5b806330adf81f1461040b578063313ce5671461043f57806331b230201461047357600080fd5b806323b872dd1161030757806323b872dd146103a95780632ab60045146103c95780633092afd5146103eb57600080fd5b806306fdde031461032e578063095ea7b31461035957806318160ddd14610389575b600080fd5b34801561033a57600080fd5b50610343610a7e565b604051610350919061481c565b60405180910390f35b34801561036557600080fd5b5061037961037436600461486f565b610b0d565b6040519015158152602001610350565b34801561039557600080fd5b50610202545b604051908152602001610350565b3480156103b557600080fd5b506103796103c436600461489b565b610c59565b3480156103d557600080fd5b506103e96103e43660046148dc565b610eed565b005b3480156103f757600080fd5b506103796104063660046148dc565b611029565b34801561041757600080fd5b5061039b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b57600080fd5b506102035461046190600160a01b900460ff1681565b60405160ff9091168152602001610350565b34801561047f57600080fd5b506103e961048e3660046148dc565b61110b565b34801561049f57600080fd5b506103e96104ae3660046148dc565b6111cf565b3480156104bf57600080fd5b50609a546104d3906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b3480156104f757600080fd5b5061037961050636600461486f565b61136d565b34801561051757600080fd5b506103e96114a9565b34801561052c57600080fd5b5061037961053b36600461486f565b61157c565b34801561054c57600080fd5b506103e961055b3660046148f9565b6119a7565b34801561056c57600080fd5b506103e961057b3660046148dc565b611c89565b34801561058c57600080fd5b5061037961059b36600461486f565b611dc6565b6103e96105ae3660046149b7565b611f03565b3480156105bf57600080fd5b5061039b612092565b3480156105d457600080fd5b506103e96105e33660046148dc565b612157565b3480156105f457600080fd5b506103e9610603366004614a2c565b612293565b34801561061457600080fd5b5060335461037990600160a01b900460ff1681565b34801561063557600080fd5b5061039b6106443660046148dc565b6001600160a01b03166000908152610204602052604090205490565b34801561066c57600080fd5b506103e961067b366004614a9c565b6122f4565b34801561068c57600080fd5b5061039b612838565b3480156106a157600080fd5b5061039b6106b03660046148dc565b6001600160a01b03166000908152610168602052604090205490565b3480156106d857600080fd5b5061039b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b34801561070c57600080fd5b506103e96129de565b34801561072157600080fd5b5061039b6107303660046148dc565b6001600160a01b03166000908152610207602052604090205490565b34801561075857600080fd5b506000546001600160a01b03166104d3565b34801561077657600080fd5b506103796107853660046148dc565b6001600160a01b031660009081526067602052604090205460011490565b3480156107af57600080fd5b50610343612ab7565b3480156107c457600080fd5b506033546104d3906001600160a01b031681565b3480156107e457600080fd5b5061039b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b34801561081857600080fd5b5061037961082736600461486f565b612ac5565b34801561083857600080fd5b50610203546104d3906001600160a01b031681565b34801561085957600080fd5b5061037961086836600461486f565b612c01565b34801561087957600080fd5b506103796108883660046148dc565b6001600160a01b03166000908152610206602052604090205460ff1690565b3480156108b357600080fd5b506103e96108c236600461489b565b612d3d565b3480156108d357600080fd5b506066546104d3906001600160a01b031681565b3480156108f357600080fd5b506103e9610902366004614b89565b612e4e565b34801561091357600080fd5b5061039b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b34801561094757600080fd5b5061039b610956366004614bf7565b6001600160a01b0391821660009081526102056020908152604080832093909416825291909152205490565b34801561098e57600080fd5b506103e961099d366004614c30565b612fa1565b3480156109ae57600080fd5b506103436130f8565b3480156109c357600080fd5b506103e96109d23660046148dc565b613106565b3480156109e357600080fd5b506103796109f236600461486f565b6001600160a01b0391909116600090815261013560209081526040808320938352929052205460011490565b348015610a2a57600080fd5b506103e9610a39366004614c30565b6131cb565b348015610a4a57600080fd5b506103e9610a593660046148dc565b613315565b348015610a6a57600080fd5b506103e9610a793660046148dc565b613403565b6101ff8054610a8c90614cb2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614cb2565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b603354600090600160a01b900460ff1615610b625760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b3360008181526067602052604090205415610bcd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015610c435760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e33868661353f565b506001949350505050565b603354600090600160a01b900460ff1615610ca95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415610d145760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610d8a5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610e005760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0387166000908152610205602090815260408083203384529091529020546000198114610ed45785811015610ea45760405162461bcd60e51b815260206004820152602c60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f647320616c6c6f77616e636500000000000000000000000000000000000000006064820152608401610b59565b610eae8682614d35565b6001600160a01b0389166000908152610205602090815260408083203384529091529020555b610edf888888613691565b506001979650505050505050565b33610f006000546001600160a01b031690565b6001600160a01b031614610f565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116610fd25760405162461bcd60e51b815260206004820152602a60248201527f526573637561626c653a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b609a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610203546000906001600160a01b031633146110ad5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038216600081815261020660209081526040808320805460ff19169055610207909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b6066546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038116600081815260676020526040808220829055517fbc3fe0fc667d12a7a22748747f024a7d971127ffc48f6622675d3e97a2591a519190a250565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561126e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113455760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b61134e816138b7565b6040805160008082526020820190925261136a91839190613920565b50565b603354600090600160a01b900460ff16156113bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b33600081815260676020526040902054156114285760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b03841660009081526067602052604090205484901561149e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613ac5565b6033546001600160a01b031633146115295760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b603354600090600160a01b900460ff16156115cc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff166116525760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b33600081815260676020526040902054156116bd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0384166000908152606760205260409020548490156117335760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0385166117af5760405162461bcd60e51b815260206004820152602360248201527f46696174546f6b656e3a206d696e7420746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b59565b600084116118255760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206d696e7420616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b3360009081526102076020526040902054808511156118ac5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d60448201527f696e746572416c6c6f77616e63650000000000000000000000000000000000006064820152608401610b59565b84610202546118bb9190614d4c565b610202556001600160a01b038616600090815261020460205260409020546118e4908690614d4c565b6001600160a01b038716600090815261020460205260409020556119088582614d35565b336000818152610207602090815260409182902093909355518781526001600160a01b038916927fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8910160405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b603354600160a01b900460ff16156119f45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff16611a7a5760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b3360008181526067602052604090205415611ae55760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b336000908152610204602052604090205482611b695760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206275726e20616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b82811015611bdf5760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a206275726e20616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b59565b8261020254611bee9190614d35565b61020255611bfc8382614d35565b3360008181526102046020526040908190209290925590517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590611c439086815260200190565b60405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b33611c9c6000546001600160a01b031690565b6001600160a01b031614611cf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116611d6e5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b610203805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4e6db312b79f0cdadbee5f76e2473786c1e81cba2356eacccc2aa5b5e6e3664c90600090a250565b603354600090600160a01b900460ff1615611e165760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b610203546001600160a01b03163314611e975760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038316600081815261020660209081526040808320805460ff1916600117905561020782529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611fa25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146120795760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b612082826138b7565b61208e82826001613920565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121325760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b59565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3361216a6000546001600160a01b031690565b6001600160a01b0316146121c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b03811661223c5760405162461bcd60e51b815260206004820152602860248201527f5061757361626c653a206e65772070617573657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b603354600160a01b900460ff16156122e05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6122ed8585858585613b04565b5050505050565b610203547501000000000000000000000000000000000000000000900460ff16156123875760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a20636f6e747261637420697320616c7265616479206960448201527f6e697469616c697a6564000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0385166124035760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03841661247f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206e65772070617573657220697320746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0383166124fb5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e657720626c6f636b6c697374657220697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166125775760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0381166125f35760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a206e6577206f776e657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b8851612607906101ff9060208c0190614757565b50875161261c906102009060208b0190614757565b508651612631906102019060208a0190614757565b5061020380547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b60ff89160273ffffffffffffffffffffffffffffffffffffffff19908116919091176001600160a01b0388811691909117909255603380548216878416179055606680548216868416179055609a80549091169184169190911790556126c381613c25565b30600081815260676020908152604091829020600190819055825180840184529081527f3100000000000000000000000000000000000000000000000000000000000000908201528b518c82012082517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81840152808401919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082015260a0808201949094528251808203909401845260c001909152815191012060ff55466101005588516127a5906101019060208c0190614757565b506040805180820190915260018082527f310000000000000000000000000000000000000000000000000000000000000060209092019182526127eb9161010291614757565b505061020380547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555050505050505050565b60006101005446141561284c575060ff5490565b6129d9610101805461285d90614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461288990614cb2565b80156128d65780601f106128ab576101008083540402835291602001916128d6565b820191906000526020600020905b8154815290600101906020018083116128b957829003601f168201915b505050505061010280546128e990614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461291590614cb2565b80156129625780601f1061293757610100808354040283529160200191612962565b820191906000526020600020905b81548152906001019060200180831161294557829003601f168201915b50505050508151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b905090565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6102008054610a8c90614cb2565b603354600090600160a01b900460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612b805760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612bf65760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613c82565b603354600090600160a01b900460ff1615612c515760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612cbc5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612d325760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613691565b609a546001600160a01b03163314612dbc5760405162461bcd60e51b8152602060048201526024808201527f526573637561626c653a2063616c6c6572206973206e6f74207468652072657360448201527f63756572000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190614d64565b50505050565b603354600160a01b900460ff1615612e9b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b038716600090815260676020526040902054879015612f115760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038716600090815260676020526040902054879015612f875760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b612f9689898989898989613d2e565b505050505050505050565b603354600160a01b900460ff1615612fee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b0389166000908152606760205260409020548990156130645760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156130da5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613e99565b5050505050505050505050565b6102018054610a8c90614cb2565b6066546001600160a01b031633146131865760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03811660008181526067602052604080822060019055517f917c251bb231c4b997a420bebe47edad5c20e70715da16c38e9b2e172e44ab929190a250565b603354600160a01b900460ff16156132185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b03891660009081526067602052604090205489901561328e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156133045760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613faa565b336133286000546001600160a01b031690565b6001600160a01b03161461337e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166133fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b61136a81613c25565b336134166000546001600160a01b031690565b6001600160a01b03161461346c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166134e85760405162461bcd60e51b815260206004820152603260248201527f426c6f636b6c69737461626c653a206e657720626c6f636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610b59565b6066805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f68f10ceb42d30acc930aaaedf5b94559e14fc4f22496dc2c1b38b1b1b5231f9890600090a250565b6001600160a01b0383166135bb5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a20617070726f76652066726f6d20746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166136375760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a20617070726f766520746f20746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038381166000818152610205602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611c7c565b6001600160a01b03831661370d5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a207472616e736665722066726f6d20746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166137895760405162461bcd60e51b815260206004820152602760248201527f46696174546f6b656e3a207472616e7366657220746f20746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03831660009081526102046020526040902054808211156138195760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f64732062616c616e6365000000000000000000000000000000000000000000006064820152608401610b59565b6138238282614d35565b6001600160a01b03808616600090815261020460205260408082209390935590851681522054613854908390614d4c565b6001600160a01b038085166000818152610204602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138a99086815260200190565b60405180910390a350505050565b336138ca6000546001600160a01b031690565b6001600160a01b03161461136a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561395857613953836140a0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156139b2575060408051601f3d908101601f191682019092526139af91810190614d86565b60015b613a245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114613ab95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610b59565b50613953838383614162565b6001600160a01b03808416600090815261020560209081526040808320938616835292905220546139539084908490613aff908590614d4c565b61353f565b613b0e8585614187565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b038716818301819052606080830188905283518084039091018152608090920190925290613b77613b6e612838565b8686868661421f565b6001600160a01b031614613bcd5760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b6001600160a01b03861660008181526101356020908152604080832089845290915280822060019055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084166000908152610205602090815260408083209386168352929052205480821115613d1f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610b59565b612e488484613aff8585614d35565b42841015613d7e5760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a207065726d697420697320657870697265640000000000006044820152606401610b59565b6001600160a01b03871660009081526101686020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a919086613dcc83614d9f565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040529050876001600160a01b0316613e2e613b6e612838565b6001600160a01b031614613e845760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613e8f88888861353f565b5050505050505050565b613ea58985888861429c565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e08101859052600090610100015b6040516020818303038152906040529050896001600160a01b0316613f33613b6e612838565b6001600160a01b031614613f895760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613f938a86614390565b613f9e8a8a8a613691565b50505050505050505050565b6001600160a01b03881633146140285760405162461bcd60e51b815260206004820152602160248201527f454950333030393a2063616c6c6572206d75737420626520746865207061796560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6140348985888861429c565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e0810185905260009061010001613f0d565b803b6141145760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61416b836143e4565b6000825111806141785750805b1561395357612e488383614424565b6001600160a01b0382166000908152610135602090815260408083208484529091529020541561208e5760405162461bcd60e51b815260206004820152602a60248201527f454950333030393a20617574686f72697a6174696f6e2069732075736564206f60448201527f722063616e63656c6564000000000000000000000000000000000000000000006064820152608401610b59565b60008086838051906020012060405160200161426d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061429181878787614450565b979650505050505050565b8142116143115760405162461bcd60e51b815260206004820152602760248201527f454950333030393a20617574686f72697a6174696f6e206973206e6f7420796560448201527f742076616c6964000000000000000000000000000000000000000000000000006064820152608401610b59565b8042106143865760405162461bcd60e51b815260206004820152602160248201527f454950333030393a20617574686f72697a6174696f6e2069732065787069726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b612e488484614187565b6001600160a01b03821660008181526101356020908152604080832085845290915280822060019055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6143ed816140a0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606144498383604051806060016040528060278152602001614dd760279139614633565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156144e85760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027732760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b8360ff16601b1415801561450057508360ff16601c14155b156145735760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027762760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156145c7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661462a5760405162461bcd60e51b815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e6174757265000000006044820152606401610b59565b95945050505050565b6060833b6146a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610b59565b600080856001600160a01b0316856040516146c49190614dba565b600060405180830381855af49150503d80600081146146ff576040519150601f19603f3d011682016040523d82523d6000602084013e614704565b606091505b509150915061471482828661471e565b9695505050505050565b6060831561472d575081614449565b82511561473d5782518084602001fd5b8160405162461bcd60e51b8152600401610b59919061481c565b82805461476390614cb2565b90600052602060002090601f01602090048101928261478557600085556147cb565b82601f1061479e57805160ff19168380011785556147cb565b828001600101855582156147cb579182015b828111156147cb5782518255916020019190600101906147b0565b506147d79291506147db565b5090565b5b808211156147d757600081556001016147dc565b60005b8381101561480b5781810151838201526020016147f3565b83811115612e485750506000910152565b602081526000825180602084015261483b8160408501602087016147f0565b601f01601f19169190910160400192915050565b6001600160a01b038116811461136a57600080fd5b80356111068161484f565b6000806040838503121561488257600080fd5b823561488d8161484f565b946020939093013593505050565b6000806000606084860312156148b057600080fd5b83356148bb8161484f565b925060208401356148cb8161484f565b929592945050506040919091013590565b6000602082840312156148ee57600080fd5b81356144498161484f565b60006020828403121561490b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561495c5761495c614912565b604051601f8501601f19908116603f0116810190828211818310171561498457614984614912565b8160405280935085815286868601111561499d57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156149ca57600080fd5b82356149d58161484f565b9150602083013567ffffffffffffffff8111156149f157600080fd5b8301601f81018513614a0257600080fd5b614a1185823560208401614941565b9150509250929050565b803560ff8116811461110657600080fd5b600080600080600060a08688031215614a4457600080fd5b8535614a4f8161484f565b945060208601359350614a6460408701614a1b565b94979396509394606081013594506080013592915050565b600082601f830112614a8d57600080fd5b61444983833560208501614941565b60008060008060008060008060006101208a8c031215614abb57600080fd5b893567ffffffffffffffff80821115614ad357600080fd5b614adf8d838e01614a7c565b9a5060208c0135915080821115614af557600080fd5b614b018d838e01614a7c565b995060408c0135915080821115614b1757600080fd5b50614b248c828d01614a7c565b975050614b3360608b01614a1b565b9550614b4160808b01614864565b9450614b4f60a08b01614864565b9350614b5d60c08b01614864565b9250614b6b60e08b01614864565b9150614b7a6101008b01614864565b90509295985092959850929598565b600080600080600080600060e0888a031215614ba457600080fd5b8735614baf8161484f565b96506020880135614bbf8161484f565b95506040880135945060608801359350614bdb60808901614a1b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614c0a57600080fd5b8235614c158161484f565b91506020830135614c258161484f565b809150509250929050565b60008060008060008060008060006101208a8c031215614c4f57600080fd5b8935614c5a8161484f565b985060208a0135614c6a8161484f565b975060408a0135965060608a0135955060808a0135945060a08a01359350614c9460c08b01614a1b565b925060e08a013591506101008a013590509295985092959850929598565b600181811c90821680614cc657607f821691505b60208210811415614d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d4757614d47614d06565b500390565b60008219821115614d5f57614d5f614d06565b500190565b600060208284031215614d7657600080fd5b8151801515811461444957600080fd5b600060208284031215614d9857600080fd5b5051919050565b6000600019821415614db357614db3614d06565b5060010190565b60008251614dcc8184602087016147f0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088b0c5194b9eca0801c00f098997e6c9042e68a8d796e28173d6611567e0d9a464736f6c634300080b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/core/pyproject.toml b/packages/core/pyproject.toml similarity index 76% rename from src/core/pyproject.toml rename to packages/core/pyproject.toml index f103c9f..8e94525 100644 --- a/src/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -46,11 +46,36 @@ repository = "https://github.com/jcam1/python-sdk" documentation = "https://github.com/jcam1/python-sdk/tree/main/docs" "Bug Tracker" = "https://github.com/jcam1/python-sdk/issues/new?template=bug_report.md" +# Dev dependencies + [dependency-groups] dev = [ + "eth-typing>=5.2.1", "mypy>=1.15.0", "pytest>=8.3.5", "pytest-cov>=6.1.1", "ruff>=0.11.9", "sphinx>=8.2.3", ] + +# Ruff + +[tool.ruff] +target-version = "py311" +line-length = 88 +indent-width = 4 + +[tool.ruff.lint] +select = ["E4", "E7", "E9", "F"] +ignore = [] +fixable = ["ALL"] +unfixable = [] +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[tool.ruff.format] +indent-style = "space" +quote-style = "double" +skip-magic-trailing-comma = false +line-ending = "auto" +docstring-code-format = true +docstring-code-line-length = "dynamic" diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py new file mode 100644 index 0000000..1d20dac --- /dev/null +++ b/packages/core/src/__init__.py @@ -0,0 +1 @@ +from client import * diff --git a/packages/core/src/client.py b/packages/core/src/client.py new file mode 100644 index 0000000..204e468 --- /dev/null +++ b/packages/core/src/client.py @@ -0,0 +1,62 @@ +from eth_account.signers.local import LocalAccount +from web3 import Account, HTTPProvider, Web3 +from web3.middleware import ExtraDataToPOAMiddleware + +from interfaces import ISdkClient +from utils import get_default_rpc_endpoint + +class SdkClient(ISdkClient): + """SDK client. + + Attributes: + rpc_endpoint (str): RPC_endpoint + w3 (Web3): Configured web3 instance + account (LocalAccount): Local account + """ + rpc_endpoint: str + w3: Web3 + account: LocalAccount + + def __init__( + self, + chain_name: str, + network_name: str, + private_key: str, + ): + """Constructor that initializes SDK client. + + Args: + chain_name (str): Chain name + network_name (str): Network name + private_key (str): private key of EOA + + Raises: + NetworkNotSupported: If the specified network is not supported by the SDK + """ + rpc_endpoint = get_default_rpc_endpoint(chain_name, network_name) + + self.rpc_endpoint = rpc_endpoint + self.w3 = Web3(HTTPProvider(rpc_endpoint)).middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) + self.account = Account.from_key(private_key) + + def set_default_provider(self, chain_name: str, network_name: str) -> Web3: + rpc_endpoint = get_default_rpc_endpoint(chain_name, network_name) + + self.rpc_endpoint = rpc_endpoint + self.w3 = Web3(HTTPProvider(rpc_endpoint)).middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) + + return self.w3 + + def set_custom_provider(self, rpc_endpoint: str) -> Web3: + self.rpc_endpoint = rpc_endpoint + self.w3 = Web3(HTTPProvider(rpc_endpoint)) + + return self.w3 + + def set_account(self, private_key: str) -> LocalAccount: + self.account = Account.from_key(private_key) + + return self.account + + def get_account_address(self) -> str: + return self.account.address diff --git a/packages/core/src/interfaces/__init__.py b/packages/core/src/interfaces/__init__.py new file mode 100644 index 0000000..1d20dac --- /dev/null +++ b/packages/core/src/interfaces/__init__.py @@ -0,0 +1 @@ +from client import * diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py new file mode 100644 index 0000000..90674d2 --- /dev/null +++ b/packages/core/src/interfaces/client.py @@ -0,0 +1,53 @@ +from abc import ABC, abstractmethod + +from eth_account.signers.local import LocalAccount +from web3 import Web3 + +class ISdkClient(ABC): + """Interface of SDK client.""" + + @abstractmethod + def set_default_provider(self, chain_name: str, network_name: str) -> Web3: + """Set provider using one of the default RPC endpoints. + + Args: + chain_name (str): Chain name + network_name (str): Network name + + Returns: + Web3: Configured web3 instance + """ + pass + + @abstractmethod + def set_custom_provider(self, rpc_endpoint: str) -> Web3: + """Set provider using a custom RPC endpoint. + + Args: + rpc_endpoint (str): Custom RPC endpoint + + Returns: + Web3: Configured web3 instance + """ + pass + + @abstractmethod + def set_account(self, private_key: str) -> LocalAccount: + """Set account with private key. + + Args: + private_key (str): Private key of account + + Returns: + LocalAccount: Configured account + """ + pass + + @abstractmethod + def get_account_address(self) -> str: + """Get address of configured account. + + Returns: + str: Public address (starting with `0x`) of account + """ + pass diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py new file mode 100644 index 0000000..550316c --- /dev/null +++ b/packages/core/src/utils/__init__.py @@ -0,0 +1,3 @@ +from addresses import * +from chains import * +from errors import * diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py new file mode 100644 index 0000000..acbeab7 --- /dev/null +++ b/packages/core/src/utils/addresses.py @@ -0,0 +1,44 @@ +from typing import Final + +from eth_typing import ( + ChecksumAddress, + HexAddress, + HexStr, +) +from web3 import Web3 +from web3.constants import ADDRESS_ZERO + +#################################### +# Address-related helper functions # +#################################### + +def calc_checksum_address(address: str) -> ChecksumAddress: + """Calculates checksum address. + + Args: + address (str): Address string + + Returns: + ChecksumAddress: Checksum address + """ + return ChecksumAddress(HexAddress(HexStr(address))) + +def is_valid_address(address: str) -> bool: + """Checks validity of address. + + Args: + address (str): Address string + + Returns: + bool: True if valid, false otherwise + """ + return Web3.is_checksum_address(address) + +###################### +# Constant addresses # +###################### + +ZERO_ADDRESS: Final[ChecksumAddress] = calc_checksum_address(str(ADDRESS_ZERO)) +"""ChecksumAddress: Zero address.""" +V2_PROXY_ADDRESS: Final[ChecksumAddress] = calc_checksum_address("0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB") +"""ChecksumAddress: JPYCv2 address.""" diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py new file mode 100644 index 0000000..d55d6e2 --- /dev/null +++ b/packages/core/src/utils/chains.py @@ -0,0 +1,133 @@ +from typing import Final, List, Literal, TypeAlias, TypedDict + +from utils import NetworkNotSupported + +################## +# Chain Metadata # +################## + +ChainName: TypeAlias = Literal[ + "ethereum", + "polygon", + "gnosis", + "avalanche", + "astar", + "shiden", + "local", +] + +class NetworkMetadata(TypedDict): + id: int + name: str + rpc_endpoints: List[str] + +SUPPORTED_CHAINS: Final[dict[ChainName, dict[str, NetworkMetadata]]] = { + "ethereum": { + "mainnet": { + "id": 1, + "name": "Ethereum Mainnet", + "rpc_endpoints": ["https://ethereum-rpc.publicnode.com"], + }, + "sepolia": { + "id": 11155111, + "name": "Ethereum Sepolia Testnet", + "rpc_endpoints": ["https://ethereum-sepolia-rpc.publicnode.com"], + }, + }, + "polygon": { + "mainnet": { + "id": 137, + "name": "Polygon Mainnet", + "rpc_endpoints": ["https://polygon-rpc.com"], + }, + "amoy": { + "id": 80002, + "name": "Polygon Amoy Testnet", + "rpc_endpoints": ["https://rpc-amoy.polygon.technology"], + }, + }, + "gnosis": { + "mainnet": { + "id": 100, + "name": "Gnosis Chain", + "rpc_endpoints": ["https://rpc.gnosischain.com"], + }, + "chiado": { + "id": 10200, + "name": "Gnosis Chiado Testnet", + "rpc_endpoints": ["https://rpc.chiadochain.net"], + }, + }, + "avalanche": { + "mainnet": { + "id": 43114, + "name": "Avalanche C-Chain", + "rpc_endpoints": ["https://api.avax.network/ext/bc/C/rpc"], + }, + "fuji": { + "id": 43113, + "name": "Avalanche Fuji Testnet", + "rpc_endpoints": ["https://api.avax-test.network/ext/bc/C/rpc"], + }, + }, + "astar": { + "mainnet": { + "id": 592, + "name": "Astar Network", + "rpc_endpoints": ["https://astar.public.blastapi.io"], + }, + }, + "shiden": { + "mainnet": { + "id": 336, + "name": "Shiden Network", + "rpc_endpoints": ["https://shiden.public.blastapi.io"], + }, + }, + "local": { + "mainnet": { + "id": 31337, + "name": "Localhost Network", + "rpc_endpoints": ["http://127.0.0.1:8545/"], + }, + }, +} + +################################## +# Chain-related helper functions # +################################## + +def enumerate_supported_networks() -> str: + """Enumerate all the supported networks. + + Returns: + str: supported networks + """ + return ", ".join(f"'{chain}' => {list(networks.keys())}" for chain, networks in SUPPORTED_CHAINS.items()) + +def is_supported_network(chain_name: str, network_name: str) -> bool: + """Check if the specified network is supported by the SDK. + + Args: + chain_name (str): Chain name + network_name (str): Network name + + Returns: + bool: True if supported, false otherwise + """ + return chain_name in SUPPORTED_CHAINS and network_name in SUPPORTED_CHAINS[chain_name] + +def get_default_rpc_endpoint(chain_name: str, network_name: str) -> str: + """Get the default RPC endpoint for the specified network. + + Args: + chain_name (str): Chain name + network_name (str): Network name + + Returns: + str: RPC endpoint + """ + if not is_supported_network(chain_name, network_name): + raise NetworkNotSupported(chain_name, network_name) + + return SUPPORTED_CHAINS[chain_name][network_name].rpc_endpoints[0] diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py new file mode 100644 index 0000000..1375434 --- /dev/null +++ b/packages/core/src/utils/errors.py @@ -0,0 +1,18 @@ +from utils import enumerate_supported_networks + +class JpycSdkError(Exception): + """Base class for any SDK-related errors.""" + pass + +class NetworkNotSupported(JpycSdkError): + """Raised when the specified network is not supported by the SDK. + + Attributes: + chain_name (str): Chain name + network_name (str): Network name + """ + def __init__(self, chain_name: str, network_name: str): + super().__init__( + f"Network '{chain_name}/{network_name}' is not supported. " + f"Supported networks are: {enumerate_supported_networks()}" + ) diff --git a/pyproject.toml b/pyproject.toml index b99261d..043a491 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,4 +9,4 @@ readme = "README.md" core = { workspace = true } [tool.uv.workspace] -members = ["src/*"] +members = ["packages/*"] diff --git a/src/core/README.md b/src/core/README.md deleted file mode 100644 index 6c77624..0000000 --- a/src/core/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Core SDK - -> [!IMPORTANT] -> TODO: README in English diff --git a/uv.lock b/uv.lock index 00a0309..326b900 100644 --- a/uv.lock +++ b/uv.lock @@ -290,7 +290,7 @@ wheels = [ [[package]] name = "core-sdk" version = "1.0.0" -source = { virtual = "src/core" } +source = { virtual = "packages/core" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, @@ -299,6 +299,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "eth-typing" }, { name = "mypy" }, { name = "pytest" }, { name = "pytest-cov" }, @@ -315,6 +316,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "eth-typing", specifier = ">=5.2.1" }, { name = "mypy", specifier = ">=1.15.0" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-cov", specifier = ">=6.1.1" }, From ecc193d5a51ccbe9ee4677f6b45db16bee844e6b Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 14 May 2025 17:09:15 +0900 Subject: [PATCH 04/56] Update utils --- packages/core/src/utils/__init__.py | 10 ++++++--- packages/core/src/utils/abi.py | 30 +++++++++++++++++++++++++ packages/core/src/utils/addresses.py | 20 +++++++++++++++++ packages/core/src/utils/chains.py | 20 +++-------------- packages/core/src/utils/currency.py | 22 ++++++++++++++++++ packages/core/src/utils/errors.py | 11 ++++++++- packages/core/src/utils/transactions.py | 11 +++++++++ packages/core/src/utils/types.py | 26 +++++++++++++++++++++ 8 files changed, 129 insertions(+), 21 deletions(-) create mode 100644 packages/core/src/utils/abi.py create mode 100644 packages/core/src/utils/currency.py create mode 100644 packages/core/src/utils/transactions.py create mode 100644 packages/core/src/utils/types.py diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 550316c..9390689 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -1,3 +1,7 @@ -from addresses import * -from chains import * -from errors import * +from .abi import * +from .addresses import * +from .chains import * +from .currency import * +from .errors import * +from .transactions import * +from .types import * diff --git a/packages/core/src/utils/abi.py b/packages/core/src/utils/abi.py new file mode 100644 index 0000000..a277cc3 --- /dev/null +++ b/packages/core/src/utils/abi.py @@ -0,0 +1,30 @@ +import json +from pathlib import Path +from typing import Any + +from .types import ContractVersion + +def resolve_abi_file_path(contract_version: ContractVersion) -> str: + """Resolve the path of ABI file from the specified contract version. + + Args: + version (ContractVersion): Contract version + + Returns: + str: Absolute path of ABI file + """ + path = Path(__file__).parent.parent.joinpath("abis", f"v{contract_version}.json") + + return path.absolute() + +def get_abi(file_path: str) -> Any: + """Get ABI from the specified path. + + Args: + file_path (str): absolute path of ABI file + + Returns: + Any: Contents of ABI + """ + with open(file_path) as f: + return json.load(f) diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py index acbeab7..8f4f14b 100644 --- a/packages/core/src/utils/addresses.py +++ b/packages/core/src/utils/addresses.py @@ -8,6 +8,8 @@ from web3 import Web3 from web3.constants import ADDRESS_ZERO +from .types import ContractVersion + #################################### # Address-related helper functions # #################################### @@ -34,6 +36,24 @@ def is_valid_address(address: str) -> bool: """ return Web3.is_checksum_address(address) +def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress: + """Get proxy address from the specified version. + + Note: + Default address should be the address of the latest version (e.g., v2 as of May 2025). + + Args: + version (ContractVersion): Contract version + + Returns: + ChecksumAddress: Checksum address of proxy contract + """ + match contract_version: + case "2": + return V2_PROXY_ADDRESS + case _: + return V2_PROXY_ADDRESS + ###################### # Constant addresses # ###################### diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py index d55d6e2..81ee301 100644 --- a/packages/core/src/utils/chains.py +++ b/packages/core/src/utils/chains.py @@ -1,26 +1,12 @@ -from typing import Final, List, Literal, TypeAlias, TypedDict +from typing import Final -from utils import NetworkNotSupported +from .errors import NetworkNotSupported +from .types import ChainName, NetworkMetadata ################## # Chain Metadata # ################## -ChainName: TypeAlias = Literal[ - "ethereum", - "polygon", - "gnosis", - "avalanche", - "astar", - "shiden", - "local", -] - -class NetworkMetadata(TypedDict): - id: int - name: str - rpc_endpoints: List[str] - SUPPORTED_CHAINS: Final[dict[ChainName, dict[str, NetworkMetadata]]] = { "ethereum": { "mainnet": { diff --git a/packages/core/src/utils/currency.py b/packages/core/src/utils/currency.py new file mode 100644 index 0000000..a90839b --- /dev/null +++ b/packages/core/src/utils/currency.py @@ -0,0 +1,22 @@ +from decimal import Decimal + +from web3 import Web3 + +def remove_decimals(value: Decimal) -> int: + """Remove decimals. + + Args: + value (Decimal): Decimal value + + Returns: + int: Value in wei + """ + return Web3.to_wei(value, 'ether') + +def restore_decimals(func): + """Decorator to restore decimals.""" + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + return Web3.from_wei(result, 'ether') + + return wrapper diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 1375434..094365a 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -1,4 +1,4 @@ -from utils import enumerate_supported_networks +from .chains import enumerate_supported_networks class JpycSdkError(Exception): """Base class for any SDK-related errors.""" @@ -16,3 +16,12 @@ def __init__(self, chain_name: str, network_name: str): f"Network '{chain_name}/{network_name}' is not supported. " f"Supported networks are: {enumerate_supported_networks()}" ) + +class TransactionFailed(JpycSdkError): + """Raised when failed to send a transaction. + + Attributes: + message (str): Error message + """ + def __init__(self, message: str): + super().__init__(f"Failed to send a transaction: '{message}") diff --git a/packages/core/src/utils/transactions.py b/packages/core/src/utils/transactions.py new file mode 100644 index 0000000..af672d5 --- /dev/null +++ b/packages/core/src/utils/transactions.py @@ -0,0 +1,11 @@ +from .errors import TransactionFailed + +def catch_transaction_errors(func): + """Decorator to catch transaction errors.""" + def wrapper(*args, **kwargs): + try: + func(*args, **kwargs) + except Exception as e: + raise TransactionFailed(e) + + return wrapper diff --git a/packages/core/src/utils/types.py b/packages/core/src/utils/types.py new file mode 100644 index 0000000..fe7e2e0 --- /dev/null +++ b/packages/core/src/utils/types.py @@ -0,0 +1,26 @@ +from typing import List, Literal, TypeAlias, TypedDict + +########## +# Chains # +########## + +ChainName: TypeAlias = Literal[ + "ethereum", + "polygon", + "gnosis", + "avalanche", + "astar", + "shiden", + "local", +] + +class NetworkMetadata(TypedDict): + id: int + name: str + rpc_endpoints: List[str] + +############# +# Contracts # +############# + +ContractVersion: TypeAlias = Literal["2"] From 7032c6d6a2e7b3578481967403c3a7c775f8f8af Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 14 May 2025 17:09:35 +0900 Subject: [PATCH 05/56] Simplify ABI --- packages/core/abis/v2.json | 2275 ++++++++++++++++++------------------ 1 file changed, 1133 insertions(+), 1142 deletions(-) diff --git a/packages/core/abis/v2.json b/packages/core/abis/v2.json index 6d35079..23da514 100644 --- a/packages/core/abis/v2.json +++ b/packages/core/abis/v2.json @@ -1,1260 +1,1251 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "FiatTokenV1", - "sourceName": "JPYCv2/contracts/v1/FiatTokenV1.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, +[ + { + "anonymous": false, + "inputs": [ { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationCanceled", - "type": "event" + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationUsed", - "type": "event" + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "Blocklisted", - "type": "event" - }, + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationUsed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "Blocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newBlocklister", + "type": "address" + } + ], + "name": "BlocklisterChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "burner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newBlocklister", - "type": "address" - } - ], - "name": "BlocklisterChanged", - "type": "event" + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "burner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Burn", - "type": "event" + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Mint", - "type": "event" - }, + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" + } + ], + "name": "MinterAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "MinterConfigured", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldMinter", + "type": "address" + } + ], + "name": "MinterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "PauserChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "RescuerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newMinterAdmin", - "type": "address" - } - ], - "name": "MinterAdminChanged", - "type": "event" + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "MinterConfigured", - "type": "event" + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "oldMinter", - "type": "address" - } - ], - "name": "MinterRemoved", - "type": "event" - }, + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "UnBlocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "CANCEL_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_domainSeparatorV4", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" + "internalType": "address", + "name": "owner", + "type": "address" }, { - "anonymous": false, - "inputs": [], - "name": "Pause", - "type": "event" - }, + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "PauserChanged", - "type": "event" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "RescuerChanged", - "type": "event" + "internalType": "address", + "name": "spender", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "UnBlocklisted", - "type": "event" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "anonymous": false, - "inputs": [], - "name": "Unpause", - "type": "event" + "internalType": "address", + "name": "authorizer", + "type": "address" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "authorizationState", + "outputs": [ { - "inputs": [], - "name": "CANCEL_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "blocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "blocklister", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "inputs": [], - "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "authorizer", + "type": "address" }, { - "inputs": [], - "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" }, { - "inputs": [], - "name": "_domainSeparatorV4", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "uint8", + "name": "v", + "type": "uint8" }, { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "bytes32", + "name": "r", + "type": "bytes32" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "cancelAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "configureMinter", + "outputs": [ { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "authorizationState", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "currency", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "spender", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "blocklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, + "internalType": "uint256", + "name": "decrement", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ { - "inputs": [], - "name": "blocklister", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address", + "name": "spender", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "cancelAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, + "internalType": "uint256", + "name": "increment", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "configureMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenName", + "type": "string" }, { - "inputs": [], - "name": "currency", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "string", + "name": "tokenSymbol", + "type": "string" }, { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "string", + "name": "tokenCurrency", + "type": "string" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "decrement", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint8", + "name": "tokenDecimals", + "type": "uint8" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "increment", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" }, { - "inputs": [ - { - "internalType": "string", - "name": "tokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenCurrency", - "type": "string" - }, - { - "internalType": "uint8", - "name": "tokenDecimals", - "type": "uint8" - }, - { - "internalType": "address", - "name": "newMinterAdmin", - "type": "address" - }, - { - "internalType": "address", - "name": "newPauser", - "type": "address" - }, - { - "internalType": "address", - "name": "newBlocklister", - "type": "address" - }, - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address", + "name": "newPauser", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "isBlocklisted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "newBlocklister", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "newRescuer", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isBlocklisted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" }, { - "inputs": [], - "name": "minterAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minterAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "minterAllowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "minterAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "spender", + "type": "address" }, { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "uint256", + "name": "value", + "type": "uint256" }, { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "uint256", + "name": "deadline", + "type": "uint256" }, { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "uint8", + "name": "v", + "type": "uint8" }, { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "bytes32", + "name": "r", + "type": "bytes32" }, { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" }, { - "inputs": [], - "name": "pauser", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "to", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "value", + "type": "uint256" }, { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" }, { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "receiveWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" }, { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "removeMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" }, { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "tokenContract", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "rescueERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint8", + "name": "v", + "type": "uint8" }, { - "inputs": [], - "name": "rescuer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "bytes32", + "name": "r", + "type": "bytes32" }, { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "receiveWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "removeMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "tokenContract", + "type": "address" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "to", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "rescueERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rescuer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address", + "name": "to", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "transferWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "unBlocklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address", + "name": "to", + "type": "address" }, { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "value", + "type": "uint256" }, { - "inputs": [ - { - "internalType": "address", - "name": "_newBlocklister", - "type": "address" - } - ], - "name": "updateBlocklister", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" }, { - "inputs": [ - { - "internalType": "address", - "name": "_newMinterAdmin", - "type": "address" - } - ], - "name": "updateMinterAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" }, { - "inputs": [ - { - "internalType": "address", - "name": "_newPauser", - "type": "address" - } - ], - "name": "updatePauser", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" }, { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "updateRescuer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint8", + "name": "v", + "type": "uint8" }, { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "bytes32", + "name": "r", + "type": "bytes32" }, { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } - ], - "bytecode": "0x60a0604052306080523480156200001557600080fd5b50620000213362000027565b62000077565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b608051614e33620000af600039600081816111da0152818161127001528181611f0e01528181611fa4015261209f0152614e336000f3fe6080604052600436106103295760003560e01c80637ecebe00116101a5578063aa271e1a116100ec578063e3ee160e11610095578063e94a01021161006f578063e94a0102146109d7578063ef55bec614610a1e578063f2fde38b14610a3e578063f9b5aa9214610a5e57600080fd5b8063e3ee160e14610982578063e5a6b10f146109a2578063e5c7160b146109b757600080fd5b8063d505accf116100c6578063d505accf146108e7578063d916948714610907578063dd62ed3e1461093b57600080fd5b8063aa271e1a1461086d578063b2118a8d146108a7578063b54d9497146108c757600080fd5b806395d89b411161014e578063a457c2d711610128578063a457c2d71461080c578063a754d48f1461082c578063a9059cbb1461084d57600080fd5b806395d89b41146107a35780639fd0506d146107b8578063a0cc6a68146107d857600080fd5b80638a6db9c31161017f5780638a6db9c3146107155780638da5cb5b1461074c5780638e204c431461076a57600080fd5b80637ecebe00146106955780637f2eecc3146106cc5780638456cb591461070057600080fd5b80633f4ba83a1161027457806352d1902d1161021d5780635c975abb116101f75780635c975abb1461060857806370a082311461062957806374ebf673146106605780637b134b4c1461068057600080fd5b806352d1902d146105b3578063554bab3c146105c85780635a049a70146105e857600080fd5b8063439531fd1161024e578063439531fd146105605780634e44d956146105805780634f1ef286146105a057600080fd5b80633f4ba83a1461050b57806340c10f191461052057806342966c681461054057600080fd5b806330adf81f116102d65780633659cfe6116102b05780633659cfe61461049357806338a63183146104b357806339509351146104eb57600080fd5b806330adf81f1461040b578063313ce5671461043f57806331b230201461047357600080fd5b806323b872dd1161030757806323b872dd146103a95780632ab60045146103c95780633092afd5146103eb57600080fd5b806306fdde031461032e578063095ea7b31461035957806318160ddd14610389575b600080fd5b34801561033a57600080fd5b50610343610a7e565b604051610350919061481c565b60405180910390f35b34801561036557600080fd5b5061037961037436600461486f565b610b0d565b6040519015158152602001610350565b34801561039557600080fd5b50610202545b604051908152602001610350565b3480156103b557600080fd5b506103796103c436600461489b565b610c59565b3480156103d557600080fd5b506103e96103e43660046148dc565b610eed565b005b3480156103f757600080fd5b506103796104063660046148dc565b611029565b34801561041757600080fd5b5061039b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b57600080fd5b506102035461046190600160a01b900460ff1681565b60405160ff9091168152602001610350565b34801561047f57600080fd5b506103e961048e3660046148dc565b61110b565b34801561049f57600080fd5b506103e96104ae3660046148dc565b6111cf565b3480156104bf57600080fd5b50609a546104d3906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b3480156104f757600080fd5b5061037961050636600461486f565b61136d565b34801561051757600080fd5b506103e96114a9565b34801561052c57600080fd5b5061037961053b36600461486f565b61157c565b34801561054c57600080fd5b506103e961055b3660046148f9565b6119a7565b34801561056c57600080fd5b506103e961057b3660046148dc565b611c89565b34801561058c57600080fd5b5061037961059b36600461486f565b611dc6565b6103e96105ae3660046149b7565b611f03565b3480156105bf57600080fd5b5061039b612092565b3480156105d457600080fd5b506103e96105e33660046148dc565b612157565b3480156105f457600080fd5b506103e9610603366004614a2c565b612293565b34801561061457600080fd5b5060335461037990600160a01b900460ff1681565b34801561063557600080fd5b5061039b6106443660046148dc565b6001600160a01b03166000908152610204602052604090205490565b34801561066c57600080fd5b506103e961067b366004614a9c565b6122f4565b34801561068c57600080fd5b5061039b612838565b3480156106a157600080fd5b5061039b6106b03660046148dc565b6001600160a01b03166000908152610168602052604090205490565b3480156106d857600080fd5b5061039b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b34801561070c57600080fd5b506103e96129de565b34801561072157600080fd5b5061039b6107303660046148dc565b6001600160a01b03166000908152610207602052604090205490565b34801561075857600080fd5b506000546001600160a01b03166104d3565b34801561077657600080fd5b506103796107853660046148dc565b6001600160a01b031660009081526067602052604090205460011490565b3480156107af57600080fd5b50610343612ab7565b3480156107c457600080fd5b506033546104d3906001600160a01b031681565b3480156107e457600080fd5b5061039b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b34801561081857600080fd5b5061037961082736600461486f565b612ac5565b34801561083857600080fd5b50610203546104d3906001600160a01b031681565b34801561085957600080fd5b5061037961086836600461486f565b612c01565b34801561087957600080fd5b506103796108883660046148dc565b6001600160a01b03166000908152610206602052604090205460ff1690565b3480156108b357600080fd5b506103e96108c236600461489b565b612d3d565b3480156108d357600080fd5b506066546104d3906001600160a01b031681565b3480156108f357600080fd5b506103e9610902366004614b89565b612e4e565b34801561091357600080fd5b5061039b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b34801561094757600080fd5b5061039b610956366004614bf7565b6001600160a01b0391821660009081526102056020908152604080832093909416825291909152205490565b34801561098e57600080fd5b506103e961099d366004614c30565b612fa1565b3480156109ae57600080fd5b506103436130f8565b3480156109c357600080fd5b506103e96109d23660046148dc565b613106565b3480156109e357600080fd5b506103796109f236600461486f565b6001600160a01b0391909116600090815261013560209081526040808320938352929052205460011490565b348015610a2a57600080fd5b506103e9610a39366004614c30565b6131cb565b348015610a4a57600080fd5b506103e9610a593660046148dc565b613315565b348015610a6a57600080fd5b506103e9610a793660046148dc565b613403565b6101ff8054610a8c90614cb2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614cb2565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b603354600090600160a01b900460ff1615610b625760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b3360008181526067602052604090205415610bcd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015610c435760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e33868661353f565b506001949350505050565b603354600090600160a01b900460ff1615610ca95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415610d145760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610d8a5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610e005760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0387166000908152610205602090815260408083203384529091529020546000198114610ed45785811015610ea45760405162461bcd60e51b815260206004820152602c60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f647320616c6c6f77616e636500000000000000000000000000000000000000006064820152608401610b59565b610eae8682614d35565b6001600160a01b0389166000908152610205602090815260408083203384529091529020555b610edf888888613691565b506001979650505050505050565b33610f006000546001600160a01b031690565b6001600160a01b031614610f565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116610fd25760405162461bcd60e51b815260206004820152602a60248201527f526573637561626c653a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b609a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610203546000906001600160a01b031633146110ad5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038216600081815261020660209081526040808320805460ff19169055610207909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b6066546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038116600081815260676020526040808220829055517fbc3fe0fc667d12a7a22748747f024a7d971127ffc48f6622675d3e97a2591a519190a250565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561126e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113455760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b61134e816138b7565b6040805160008082526020820190925261136a91839190613920565b50565b603354600090600160a01b900460ff16156113bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b33600081815260676020526040902054156114285760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b03841660009081526067602052604090205484901561149e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613ac5565b6033546001600160a01b031633146115295760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b603354600090600160a01b900460ff16156115cc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff166116525760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b33600081815260676020526040902054156116bd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0384166000908152606760205260409020548490156117335760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0385166117af5760405162461bcd60e51b815260206004820152602360248201527f46696174546f6b656e3a206d696e7420746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b59565b600084116118255760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206d696e7420616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b3360009081526102076020526040902054808511156118ac5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d60448201527f696e746572416c6c6f77616e63650000000000000000000000000000000000006064820152608401610b59565b84610202546118bb9190614d4c565b610202556001600160a01b038616600090815261020460205260409020546118e4908690614d4c565b6001600160a01b038716600090815261020460205260409020556119088582614d35565b336000818152610207602090815260409182902093909355518781526001600160a01b038916927fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8910160405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b603354600160a01b900460ff16156119f45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff16611a7a5760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b3360008181526067602052604090205415611ae55760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b336000908152610204602052604090205482611b695760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206275726e20616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b82811015611bdf5760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a206275726e20616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b59565b8261020254611bee9190614d35565b61020255611bfc8382614d35565b3360008181526102046020526040908190209290925590517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590611c439086815260200190565b60405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b33611c9c6000546001600160a01b031690565b6001600160a01b031614611cf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116611d6e5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b610203805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4e6db312b79f0cdadbee5f76e2473786c1e81cba2356eacccc2aa5b5e6e3664c90600090a250565b603354600090600160a01b900460ff1615611e165760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b610203546001600160a01b03163314611e975760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038316600081815261020660209081526040808320805460ff1916600117905561020782529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611fa25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146120795760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b612082826138b7565b61208e82826001613920565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121325760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b59565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3361216a6000546001600160a01b031690565b6001600160a01b0316146121c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b03811661223c5760405162461bcd60e51b815260206004820152602860248201527f5061757361626c653a206e65772070617573657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b603354600160a01b900460ff16156122e05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6122ed8585858585613b04565b5050505050565b610203547501000000000000000000000000000000000000000000900460ff16156123875760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a20636f6e747261637420697320616c7265616479206960448201527f6e697469616c697a6564000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0385166124035760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03841661247f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206e65772070617573657220697320746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0383166124fb5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e657720626c6f636b6c697374657220697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166125775760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0381166125f35760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a206e6577206f776e657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b8851612607906101ff9060208c0190614757565b50875161261c906102009060208b0190614757565b508651612631906102019060208a0190614757565b5061020380547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b60ff89160273ffffffffffffffffffffffffffffffffffffffff19908116919091176001600160a01b0388811691909117909255603380548216878416179055606680548216868416179055609a80549091169184169190911790556126c381613c25565b30600081815260676020908152604091829020600190819055825180840184529081527f3100000000000000000000000000000000000000000000000000000000000000908201528b518c82012082517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81840152808401919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082015260a0808201949094528251808203909401845260c001909152815191012060ff55466101005588516127a5906101019060208c0190614757565b506040805180820190915260018082527f310000000000000000000000000000000000000000000000000000000000000060209092019182526127eb9161010291614757565b505061020380547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555050505050505050565b60006101005446141561284c575060ff5490565b6129d9610101805461285d90614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461288990614cb2565b80156128d65780601f106128ab576101008083540402835291602001916128d6565b820191906000526020600020905b8154815290600101906020018083116128b957829003601f168201915b505050505061010280546128e990614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461291590614cb2565b80156129625780601f1061293757610100808354040283529160200191612962565b820191906000526020600020905b81548152906001019060200180831161294557829003601f168201915b50505050508151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b905090565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6102008054610a8c90614cb2565b603354600090600160a01b900460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612b805760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612bf65760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613c82565b603354600090600160a01b900460ff1615612c515760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612cbc5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612d325760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613691565b609a546001600160a01b03163314612dbc5760405162461bcd60e51b8152602060048201526024808201527f526573637561626c653a2063616c6c6572206973206e6f74207468652072657360448201527f63756572000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190614d64565b50505050565b603354600160a01b900460ff1615612e9b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b038716600090815260676020526040902054879015612f115760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038716600090815260676020526040902054879015612f875760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b612f9689898989898989613d2e565b505050505050505050565b603354600160a01b900460ff1615612fee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b0389166000908152606760205260409020548990156130645760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156130da5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613e99565b5050505050505050505050565b6102018054610a8c90614cb2565b6066546001600160a01b031633146131865760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03811660008181526067602052604080822060019055517f917c251bb231c4b997a420bebe47edad5c20e70715da16c38e9b2e172e44ab929190a250565b603354600160a01b900460ff16156132185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b03891660009081526067602052604090205489901561328e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156133045760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613faa565b336133286000546001600160a01b031690565b6001600160a01b03161461337e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166133fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b61136a81613c25565b336134166000546001600160a01b031690565b6001600160a01b03161461346c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166134e85760405162461bcd60e51b815260206004820152603260248201527f426c6f636b6c69737461626c653a206e657720626c6f636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610b59565b6066805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f68f10ceb42d30acc930aaaedf5b94559e14fc4f22496dc2c1b38b1b1b5231f9890600090a250565b6001600160a01b0383166135bb5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a20617070726f76652066726f6d20746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166136375760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a20617070726f766520746f20746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038381166000818152610205602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611c7c565b6001600160a01b03831661370d5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a207472616e736665722066726f6d20746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166137895760405162461bcd60e51b815260206004820152602760248201527f46696174546f6b656e3a207472616e7366657220746f20746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03831660009081526102046020526040902054808211156138195760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f64732062616c616e6365000000000000000000000000000000000000000000006064820152608401610b59565b6138238282614d35565b6001600160a01b03808616600090815261020460205260408082209390935590851681522054613854908390614d4c565b6001600160a01b038085166000818152610204602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138a99086815260200190565b60405180910390a350505050565b336138ca6000546001600160a01b031690565b6001600160a01b03161461136a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561395857613953836140a0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156139b2575060408051601f3d908101601f191682019092526139af91810190614d86565b60015b613a245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114613ab95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610b59565b50613953838383614162565b6001600160a01b03808416600090815261020560209081526040808320938616835292905220546139539084908490613aff908590614d4c565b61353f565b613b0e8585614187565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b038716818301819052606080830188905283518084039091018152608090920190925290613b77613b6e612838565b8686868661421f565b6001600160a01b031614613bcd5760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b6001600160a01b03861660008181526101356020908152604080832089845290915280822060019055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084166000908152610205602090815260408083209386168352929052205480821115613d1f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610b59565b612e488484613aff8585614d35565b42841015613d7e5760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a207065726d697420697320657870697265640000000000006044820152606401610b59565b6001600160a01b03871660009081526101686020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a919086613dcc83614d9f565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040529050876001600160a01b0316613e2e613b6e612838565b6001600160a01b031614613e845760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613e8f88888861353f565b5050505050505050565b613ea58985888861429c565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e08101859052600090610100015b6040516020818303038152906040529050896001600160a01b0316613f33613b6e612838565b6001600160a01b031614613f895760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613f938a86614390565b613f9e8a8a8a613691565b50505050505050505050565b6001600160a01b03881633146140285760405162461bcd60e51b815260206004820152602160248201527f454950333030393a2063616c6c6572206d75737420626520746865207061796560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6140348985888861429c565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e0810185905260009061010001613f0d565b803b6141145760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61416b836143e4565b6000825111806141785750805b1561395357612e488383614424565b6001600160a01b0382166000908152610135602090815260408083208484529091529020541561208e5760405162461bcd60e51b815260206004820152602a60248201527f454950333030393a20617574686f72697a6174696f6e2069732075736564206f60448201527f722063616e63656c6564000000000000000000000000000000000000000000006064820152608401610b59565b60008086838051906020012060405160200161426d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061429181878787614450565b979650505050505050565b8142116143115760405162461bcd60e51b815260206004820152602760248201527f454950333030393a20617574686f72697a6174696f6e206973206e6f7420796560448201527f742076616c6964000000000000000000000000000000000000000000000000006064820152608401610b59565b8042106143865760405162461bcd60e51b815260206004820152602160248201527f454950333030393a20617574686f72697a6174696f6e2069732065787069726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b612e488484614187565b6001600160a01b03821660008181526101356020908152604080832085845290915280822060019055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6143ed816140a0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606144498383604051806060016040528060278152602001614dd760279139614633565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156144e85760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027732760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b8360ff16601b1415801561450057508360ff16601c14155b156145735760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027762760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156145c7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661462a5760405162461bcd60e51b815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e6174757265000000006044820152606401610b59565b95945050505050565b6060833b6146a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610b59565b600080856001600160a01b0316856040516146c49190614dba565b600060405180830381855af49150503d80600081146146ff576040519150601f19603f3d011682016040523d82523d6000602084013e614704565b606091505b509150915061471482828661471e565b9695505050505050565b6060831561472d575081614449565b82511561473d5782518084602001fd5b8160405162461bcd60e51b8152600401610b59919061481c565b82805461476390614cb2565b90600052602060002090601f01602090048101928261478557600085556147cb565b82601f1061479e57805160ff19168380011785556147cb565b828001600101855582156147cb579182015b828111156147cb5782518255916020019190600101906147b0565b506147d79291506147db565b5090565b5b808211156147d757600081556001016147dc565b60005b8381101561480b5781810151838201526020016147f3565b83811115612e485750506000910152565b602081526000825180602084015261483b8160408501602087016147f0565b601f01601f19169190910160400192915050565b6001600160a01b038116811461136a57600080fd5b80356111068161484f565b6000806040838503121561488257600080fd5b823561488d8161484f565b946020939093013593505050565b6000806000606084860312156148b057600080fd5b83356148bb8161484f565b925060208401356148cb8161484f565b929592945050506040919091013590565b6000602082840312156148ee57600080fd5b81356144498161484f565b60006020828403121561490b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561495c5761495c614912565b604051601f8501601f19908116603f0116810190828211818310171561498457614984614912565b8160405280935085815286868601111561499d57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156149ca57600080fd5b82356149d58161484f565b9150602083013567ffffffffffffffff8111156149f157600080fd5b8301601f81018513614a0257600080fd5b614a1185823560208401614941565b9150509250929050565b803560ff8116811461110657600080fd5b600080600080600060a08688031215614a4457600080fd5b8535614a4f8161484f565b945060208601359350614a6460408701614a1b565b94979396509394606081013594506080013592915050565b600082601f830112614a8d57600080fd5b61444983833560208501614941565b60008060008060008060008060006101208a8c031215614abb57600080fd5b893567ffffffffffffffff80821115614ad357600080fd5b614adf8d838e01614a7c565b9a5060208c0135915080821115614af557600080fd5b614b018d838e01614a7c565b995060408c0135915080821115614b1757600080fd5b50614b248c828d01614a7c565b975050614b3360608b01614a1b565b9550614b4160808b01614864565b9450614b4f60a08b01614864565b9350614b5d60c08b01614864565b9250614b6b60e08b01614864565b9150614b7a6101008b01614864565b90509295985092959850929598565b600080600080600080600060e0888a031215614ba457600080fd5b8735614baf8161484f565b96506020880135614bbf8161484f565b95506040880135945060608801359350614bdb60808901614a1b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614c0a57600080fd5b8235614c158161484f565b91506020830135614c258161484f565b809150509250929050565b60008060008060008060008060006101208a8c031215614c4f57600080fd5b8935614c5a8161484f565b985060208a0135614c6a8161484f565b975060408a0135965060608a0135955060808a0135945060a08a01359350614c9460c08b01614a1b565b925060e08a013591506101008a013590509295985092959850929598565b600181811c90821680614cc657607f821691505b60208210811415614d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d4757614d47614d06565b500390565b60008219821115614d5f57614d5f614d06565b500190565b600060208284031215614d7657600080fd5b8151801515811461444957600080fd5b600060208284031215614d9857600080fd5b5051919050565b6000600019821415614db357614db3614d06565b5060010190565b60008251614dcc8184602087016147f0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088b0c5194b9eca0801c00f098997e6c9042e68a8d796e28173d6611567e0d9a464736f6c634300080b0033", - "deployedBytecode": "0x6080604052600436106103295760003560e01c80637ecebe00116101a5578063aa271e1a116100ec578063e3ee160e11610095578063e94a01021161006f578063e94a0102146109d7578063ef55bec614610a1e578063f2fde38b14610a3e578063f9b5aa9214610a5e57600080fd5b8063e3ee160e14610982578063e5a6b10f146109a2578063e5c7160b146109b757600080fd5b8063d505accf116100c6578063d505accf146108e7578063d916948714610907578063dd62ed3e1461093b57600080fd5b8063aa271e1a1461086d578063b2118a8d146108a7578063b54d9497146108c757600080fd5b806395d89b411161014e578063a457c2d711610128578063a457c2d71461080c578063a754d48f1461082c578063a9059cbb1461084d57600080fd5b806395d89b41146107a35780639fd0506d146107b8578063a0cc6a68146107d857600080fd5b80638a6db9c31161017f5780638a6db9c3146107155780638da5cb5b1461074c5780638e204c431461076a57600080fd5b80637ecebe00146106955780637f2eecc3146106cc5780638456cb591461070057600080fd5b80633f4ba83a1161027457806352d1902d1161021d5780635c975abb116101f75780635c975abb1461060857806370a082311461062957806374ebf673146106605780637b134b4c1461068057600080fd5b806352d1902d146105b3578063554bab3c146105c85780635a049a70146105e857600080fd5b8063439531fd1161024e578063439531fd146105605780634e44d956146105805780634f1ef286146105a057600080fd5b80633f4ba83a1461050b57806340c10f191461052057806342966c681461054057600080fd5b806330adf81f116102d65780633659cfe6116102b05780633659cfe61461049357806338a63183146104b357806339509351146104eb57600080fd5b806330adf81f1461040b578063313ce5671461043f57806331b230201461047357600080fd5b806323b872dd1161030757806323b872dd146103a95780632ab60045146103c95780633092afd5146103eb57600080fd5b806306fdde031461032e578063095ea7b31461035957806318160ddd14610389575b600080fd5b34801561033a57600080fd5b50610343610a7e565b604051610350919061481c565b60405180910390f35b34801561036557600080fd5b5061037961037436600461486f565b610b0d565b6040519015158152602001610350565b34801561039557600080fd5b50610202545b604051908152602001610350565b3480156103b557600080fd5b506103796103c436600461489b565b610c59565b3480156103d557600080fd5b506103e96103e43660046148dc565b610eed565b005b3480156103f757600080fd5b506103796104063660046148dc565b611029565b34801561041757600080fd5b5061039b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b57600080fd5b506102035461046190600160a01b900460ff1681565b60405160ff9091168152602001610350565b34801561047f57600080fd5b506103e961048e3660046148dc565b61110b565b34801561049f57600080fd5b506103e96104ae3660046148dc565b6111cf565b3480156104bf57600080fd5b50609a546104d3906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b3480156104f757600080fd5b5061037961050636600461486f565b61136d565b34801561051757600080fd5b506103e96114a9565b34801561052c57600080fd5b5061037961053b36600461486f565b61157c565b34801561054c57600080fd5b506103e961055b3660046148f9565b6119a7565b34801561056c57600080fd5b506103e961057b3660046148dc565b611c89565b34801561058c57600080fd5b5061037961059b36600461486f565b611dc6565b6103e96105ae3660046149b7565b611f03565b3480156105bf57600080fd5b5061039b612092565b3480156105d457600080fd5b506103e96105e33660046148dc565b612157565b3480156105f457600080fd5b506103e9610603366004614a2c565b612293565b34801561061457600080fd5b5060335461037990600160a01b900460ff1681565b34801561063557600080fd5b5061039b6106443660046148dc565b6001600160a01b03166000908152610204602052604090205490565b34801561066c57600080fd5b506103e961067b366004614a9c565b6122f4565b34801561068c57600080fd5b5061039b612838565b3480156106a157600080fd5b5061039b6106b03660046148dc565b6001600160a01b03166000908152610168602052604090205490565b3480156106d857600080fd5b5061039b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b34801561070c57600080fd5b506103e96129de565b34801561072157600080fd5b5061039b6107303660046148dc565b6001600160a01b03166000908152610207602052604090205490565b34801561075857600080fd5b506000546001600160a01b03166104d3565b34801561077657600080fd5b506103796107853660046148dc565b6001600160a01b031660009081526067602052604090205460011490565b3480156107af57600080fd5b50610343612ab7565b3480156107c457600080fd5b506033546104d3906001600160a01b031681565b3480156107e457600080fd5b5061039b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b34801561081857600080fd5b5061037961082736600461486f565b612ac5565b34801561083857600080fd5b50610203546104d3906001600160a01b031681565b34801561085957600080fd5b5061037961086836600461486f565b612c01565b34801561087957600080fd5b506103796108883660046148dc565b6001600160a01b03166000908152610206602052604090205460ff1690565b3480156108b357600080fd5b506103e96108c236600461489b565b612d3d565b3480156108d357600080fd5b506066546104d3906001600160a01b031681565b3480156108f357600080fd5b506103e9610902366004614b89565b612e4e565b34801561091357600080fd5b5061039b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b34801561094757600080fd5b5061039b610956366004614bf7565b6001600160a01b0391821660009081526102056020908152604080832093909416825291909152205490565b34801561098e57600080fd5b506103e961099d366004614c30565b612fa1565b3480156109ae57600080fd5b506103436130f8565b3480156109c357600080fd5b506103e96109d23660046148dc565b613106565b3480156109e357600080fd5b506103796109f236600461486f565b6001600160a01b0391909116600090815261013560209081526040808320938352929052205460011490565b348015610a2a57600080fd5b506103e9610a39366004614c30565b6131cb565b348015610a4a57600080fd5b506103e9610a593660046148dc565b613315565b348015610a6a57600080fd5b506103e9610a793660046148dc565b613403565b6101ff8054610a8c90614cb2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614cb2565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b603354600090600160a01b900460ff1615610b625760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b3360008181526067602052604090205415610bcd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015610c435760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e33868661353f565b506001949350505050565b603354600090600160a01b900460ff1615610ca95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415610d145760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610d8a5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610e005760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0387166000908152610205602090815260408083203384529091529020546000198114610ed45785811015610ea45760405162461bcd60e51b815260206004820152602c60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f647320616c6c6f77616e636500000000000000000000000000000000000000006064820152608401610b59565b610eae8682614d35565b6001600160a01b0389166000908152610205602090815260408083203384529091529020555b610edf888888613691565b506001979650505050505050565b33610f006000546001600160a01b031690565b6001600160a01b031614610f565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116610fd25760405162461bcd60e51b815260206004820152602a60248201527f526573637561626c653a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b609a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610203546000906001600160a01b031633146110ad5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038216600081815261020660209081526040808320805460ff19169055610207909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b6066546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038116600081815260676020526040808220829055517fbc3fe0fc667d12a7a22748747f024a7d971127ffc48f6622675d3e97a2591a519190a250565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561126e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113455760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b61134e816138b7565b6040805160008082526020820190925261136a91839190613920565b50565b603354600090600160a01b900460ff16156113bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b33600081815260676020526040902054156114285760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b03841660009081526067602052604090205484901561149e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613ac5565b6033546001600160a01b031633146115295760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b603354600090600160a01b900460ff16156115cc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff166116525760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b33600081815260676020526040902054156116bd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0384166000908152606760205260409020548490156117335760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0385166117af5760405162461bcd60e51b815260206004820152602360248201527f46696174546f6b656e3a206d696e7420746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b59565b600084116118255760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206d696e7420616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b3360009081526102076020526040902054808511156118ac5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d60448201527f696e746572416c6c6f77616e63650000000000000000000000000000000000006064820152608401610b59565b84610202546118bb9190614d4c565b610202556001600160a01b038616600090815261020460205260409020546118e4908690614d4c565b6001600160a01b038716600090815261020460205260409020556119088582614d35565b336000818152610207602090815260409182902093909355518781526001600160a01b038916927fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8910160405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b603354600160a01b900460ff16156119f45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff16611a7a5760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b3360008181526067602052604090205415611ae55760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b336000908152610204602052604090205482611b695760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206275726e20616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b82811015611bdf5760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a206275726e20616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b59565b8261020254611bee9190614d35565b61020255611bfc8382614d35565b3360008181526102046020526040908190209290925590517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590611c439086815260200190565b60405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b33611c9c6000546001600160a01b031690565b6001600160a01b031614611cf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116611d6e5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b610203805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4e6db312b79f0cdadbee5f76e2473786c1e81cba2356eacccc2aa5b5e6e3664c90600090a250565b603354600090600160a01b900460ff1615611e165760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b610203546001600160a01b03163314611e975760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038316600081815261020660209081526040808320805460ff1916600117905561020782529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611fa25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146120795760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b612082826138b7565b61208e82826001613920565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121325760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b59565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3361216a6000546001600160a01b031690565b6001600160a01b0316146121c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b03811661223c5760405162461bcd60e51b815260206004820152602860248201527f5061757361626c653a206e65772070617573657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b603354600160a01b900460ff16156122e05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6122ed8585858585613b04565b5050505050565b610203547501000000000000000000000000000000000000000000900460ff16156123875760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a20636f6e747261637420697320616c7265616479206960448201527f6e697469616c697a6564000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0385166124035760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03841661247f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206e65772070617573657220697320746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0383166124fb5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e657720626c6f636b6c697374657220697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166125775760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0381166125f35760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a206e6577206f776e657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b8851612607906101ff9060208c0190614757565b50875161261c906102009060208b0190614757565b508651612631906102019060208a0190614757565b5061020380547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b60ff89160273ffffffffffffffffffffffffffffffffffffffff19908116919091176001600160a01b0388811691909117909255603380548216878416179055606680548216868416179055609a80549091169184169190911790556126c381613c25565b30600081815260676020908152604091829020600190819055825180840184529081527f3100000000000000000000000000000000000000000000000000000000000000908201528b518c82012082517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81840152808401919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082015260a0808201949094528251808203909401845260c001909152815191012060ff55466101005588516127a5906101019060208c0190614757565b506040805180820190915260018082527f310000000000000000000000000000000000000000000000000000000000000060209092019182526127eb9161010291614757565b505061020380547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555050505050505050565b60006101005446141561284c575060ff5490565b6129d9610101805461285d90614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461288990614cb2565b80156128d65780601f106128ab576101008083540402835291602001916128d6565b820191906000526020600020905b8154815290600101906020018083116128b957829003601f168201915b505050505061010280546128e990614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461291590614cb2565b80156129625780601f1061293757610100808354040283529160200191612962565b820191906000526020600020905b81548152906001019060200180831161294557829003601f168201915b50505050508151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b905090565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6102008054610a8c90614cb2565b603354600090600160a01b900460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612b805760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612bf65760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613c82565b603354600090600160a01b900460ff1615612c515760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612cbc5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612d325760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613691565b609a546001600160a01b03163314612dbc5760405162461bcd60e51b8152602060048201526024808201527f526573637561626c653a2063616c6c6572206973206e6f74207468652072657360448201527f63756572000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190614d64565b50505050565b603354600160a01b900460ff1615612e9b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b038716600090815260676020526040902054879015612f115760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038716600090815260676020526040902054879015612f875760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b612f9689898989898989613d2e565b505050505050505050565b603354600160a01b900460ff1615612fee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b0389166000908152606760205260409020548990156130645760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156130da5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613e99565b5050505050505050505050565b6102018054610a8c90614cb2565b6066546001600160a01b031633146131865760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03811660008181526067602052604080822060019055517f917c251bb231c4b997a420bebe47edad5c20e70715da16c38e9b2e172e44ab929190a250565b603354600160a01b900460ff16156132185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b03891660009081526067602052604090205489901561328e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156133045760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613faa565b336133286000546001600160a01b031690565b6001600160a01b03161461337e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166133fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b61136a81613c25565b336134166000546001600160a01b031690565b6001600160a01b03161461346c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166134e85760405162461bcd60e51b815260206004820152603260248201527f426c6f636b6c69737461626c653a206e657720626c6f636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610b59565b6066805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f68f10ceb42d30acc930aaaedf5b94559e14fc4f22496dc2c1b38b1b1b5231f9890600090a250565b6001600160a01b0383166135bb5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a20617070726f76652066726f6d20746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166136375760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a20617070726f766520746f20746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038381166000818152610205602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611c7c565b6001600160a01b03831661370d5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a207472616e736665722066726f6d20746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166137895760405162461bcd60e51b815260206004820152602760248201527f46696174546f6b656e3a207472616e7366657220746f20746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03831660009081526102046020526040902054808211156138195760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f64732062616c616e6365000000000000000000000000000000000000000000006064820152608401610b59565b6138238282614d35565b6001600160a01b03808616600090815261020460205260408082209390935590851681522054613854908390614d4c565b6001600160a01b038085166000818152610204602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138a99086815260200190565b60405180910390a350505050565b336138ca6000546001600160a01b031690565b6001600160a01b03161461136a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561395857613953836140a0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156139b2575060408051601f3d908101601f191682019092526139af91810190614d86565b60015b613a245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114613ab95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610b59565b50613953838383614162565b6001600160a01b03808416600090815261020560209081526040808320938616835292905220546139539084908490613aff908590614d4c565b61353f565b613b0e8585614187565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b038716818301819052606080830188905283518084039091018152608090920190925290613b77613b6e612838565b8686868661421f565b6001600160a01b031614613bcd5760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b6001600160a01b03861660008181526101356020908152604080832089845290915280822060019055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084166000908152610205602090815260408083209386168352929052205480821115613d1f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610b59565b612e488484613aff8585614d35565b42841015613d7e5760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a207065726d697420697320657870697265640000000000006044820152606401610b59565b6001600160a01b03871660009081526101686020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a919086613dcc83614d9f565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040529050876001600160a01b0316613e2e613b6e612838565b6001600160a01b031614613e845760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613e8f88888861353f565b5050505050505050565b613ea58985888861429c565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e08101859052600090610100015b6040516020818303038152906040529050896001600160a01b0316613f33613b6e612838565b6001600160a01b031614613f895760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613f938a86614390565b613f9e8a8a8a613691565b50505050505050505050565b6001600160a01b03881633146140285760405162461bcd60e51b815260206004820152602160248201527f454950333030393a2063616c6c6572206d75737420626520746865207061796560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6140348985888861429c565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e0810185905260009061010001613f0d565b803b6141145760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61416b836143e4565b6000825111806141785750805b1561395357612e488383614424565b6001600160a01b0382166000908152610135602090815260408083208484529091529020541561208e5760405162461bcd60e51b815260206004820152602a60248201527f454950333030393a20617574686f72697a6174696f6e2069732075736564206f60448201527f722063616e63656c6564000000000000000000000000000000000000000000006064820152608401610b59565b60008086838051906020012060405160200161426d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061429181878787614450565b979650505050505050565b8142116143115760405162461bcd60e51b815260206004820152602760248201527f454950333030393a20617574686f72697a6174696f6e206973206e6f7420796560448201527f742076616c6964000000000000000000000000000000000000000000000000006064820152608401610b59565b8042106143865760405162461bcd60e51b815260206004820152602160248201527f454950333030393a20617574686f72697a6174696f6e2069732065787069726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b612e488484614187565b6001600160a01b03821660008181526101356020908152604080832085845290915280822060019055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6143ed816140a0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606144498383604051806060016040528060278152602001614dd760279139614633565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156144e85760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027732760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b8360ff16601b1415801561450057508360ff16601c14155b156145735760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027762760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156145c7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661462a5760405162461bcd60e51b815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e6174757265000000006044820152606401610b59565b95945050505050565b6060833b6146a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610b59565b600080856001600160a01b0316856040516146c49190614dba565b600060405180830381855af49150503d80600081146146ff576040519150601f19603f3d011682016040523d82523d6000602084013e614704565b606091505b509150915061471482828661471e565b9695505050505050565b6060831561472d575081614449565b82511561473d5782518084602001fd5b8160405162461bcd60e51b8152600401610b59919061481c565b82805461476390614cb2565b90600052602060002090601f01602090048101928261478557600085556147cb565b82601f1061479e57805160ff19168380011785556147cb565b828001600101855582156147cb579182015b828111156147cb5782518255916020019190600101906147b0565b506147d79291506147db565b5090565b5b808211156147d757600081556001016147dc565b60005b8381101561480b5781810151838201526020016147f3565b83811115612e485750506000910152565b602081526000825180602084015261483b8160408501602087016147f0565b601f01601f19169190910160400192915050565b6001600160a01b038116811461136a57600080fd5b80356111068161484f565b6000806040838503121561488257600080fd5b823561488d8161484f565b946020939093013593505050565b6000806000606084860312156148b057600080fd5b83356148bb8161484f565b925060208401356148cb8161484f565b929592945050506040919091013590565b6000602082840312156148ee57600080fd5b81356144498161484f565b60006020828403121561490b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561495c5761495c614912565b604051601f8501601f19908116603f0116810190828211818310171561498457614984614912565b8160405280935085815286868601111561499d57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156149ca57600080fd5b82356149d58161484f565b9150602083013567ffffffffffffffff8111156149f157600080fd5b8301601f81018513614a0257600080fd5b614a1185823560208401614941565b9150509250929050565b803560ff8116811461110657600080fd5b600080600080600060a08688031215614a4457600080fd5b8535614a4f8161484f565b945060208601359350614a6460408701614a1b565b94979396509394606081013594506080013592915050565b600082601f830112614a8d57600080fd5b61444983833560208501614941565b60008060008060008060008060006101208a8c031215614abb57600080fd5b893567ffffffffffffffff80821115614ad357600080fd5b614adf8d838e01614a7c565b9a5060208c0135915080821115614af557600080fd5b614b018d838e01614a7c565b995060408c0135915080821115614b1757600080fd5b50614b248c828d01614a7c565b975050614b3360608b01614a1b565b9550614b4160808b01614864565b9450614b4f60a08b01614864565b9350614b5d60c08b01614864565b9250614b6b60e08b01614864565b9150614b7a6101008b01614864565b90509295985092959850929598565b600080600080600080600060e0888a031215614ba457600080fd5b8735614baf8161484f565b96506020880135614bbf8161484f565b95506040880135945060608801359350614bdb60808901614a1b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614c0a57600080fd5b8235614c158161484f565b91506020830135614c258161484f565b809150509250929050565b60008060008060008060008060006101208a8c031215614c4f57600080fd5b8935614c5a8161484f565b985060208a0135614c6a8161484f565b975060408a0135965060608a0135955060808a0135945060a08a01359350614c9460c08b01614a1b565b925060e08a013591506101008a013590509295985092959850929598565b600181811c90821680614cc657607f821691505b60208210811415614d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d4757614d47614d06565b500390565b60008219821115614d5f57614d5f614d06565b500190565b600060208284031215614d7657600080fd5b8151801515811461444957600080fd5b600060208284031215614d9857600080fd5b5051919050565b6000600019821415614db357614db3614d06565b5060010190565b60008251614dcc8184602087016147f0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088b0c5194b9eca0801c00f098997e6c9042e68a8d796e28173d6611567e0d9a464736f6c634300080b0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "transferWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "unBlocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newBlocklister", + "type": "address" + } + ], + "name": "updateBlocklister", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newMinterAdmin", + "type": "address" + } + ], + "name": "updateMinterAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauser", + "type": "address" + } + ], + "name": "updatePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "updateRescuer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } +] From 42a8d01c879745545696dbdbff47070de05ee335 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 14 May 2025 17:10:01 +0900 Subject: [PATCH 06/56] Refactor client --- packages/core/src/client.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/core/src/client.py b/packages/core/src/client.py index 204e468..c83b2fe 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -1,6 +1,6 @@ from eth_account.signers.local import LocalAccount from web3 import Account, HTTPProvider, Web3 -from web3.middleware import ExtraDataToPOAMiddleware +from web3.middleware import ExtraDataToPOAMiddleware, SignAndSendRawMiddlewareBuilder from interfaces import ISdkClient from utils import get_default_rpc_endpoint @@ -9,11 +9,9 @@ class SdkClient(ISdkClient): """SDK client. Attributes: - rpc_endpoint (str): RPC_endpoint w3 (Web3): Configured web3 instance account (LocalAccount): Local account """ - rpc_endpoint: str w3: Web3 account: LocalAccount @@ -34,27 +32,31 @@ def __init__( NetworkNotSupported: If the specified network is not supported by the SDK """ rpc_endpoint = get_default_rpc_endpoint(chain_name, network_name) + account = Account.from_key(private_key) - self.rpc_endpoint = rpc_endpoint - self.w3 = Web3(HTTPProvider(rpc_endpoint)).middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) - self.account = Account.from_key(private_key) + w3 = Web3(HTTPProvider(rpc_endpoint)) + w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) + w3.middleware_onion.inject(SignAndSendRawMiddlewareBuilder.build(account), layer=0) + + self.w3 = w3 + self.account = account def set_default_provider(self, chain_name: str, network_name: str) -> Web3: rpc_endpoint = get_default_rpc_endpoint(chain_name, network_name) - self.rpc_endpoint = rpc_endpoint - self.w3 = Web3(HTTPProvider(rpc_endpoint)).middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) + self.w3 = Web3(HTTPProvider(rpc_endpoint)) return self.w3 def set_custom_provider(self, rpc_endpoint: str) -> Web3: - self.rpc_endpoint = rpc_endpoint self.w3 = Web3(HTTPProvider(rpc_endpoint)) return self.w3 def set_account(self, private_key: str) -> LocalAccount: - self.account = Account.from_key(private_key) + account = Account.from_key(private_key) + self.w3.middleware_onion.replace(SignAndSendRawMiddlewareBuilder.build(self.account), SignAndSendRawMiddlewareBuilder.build(account)) + self.account = account return self.account From 1a2c3ac4a4fc14b06ea60ce614a38e2cf7b32b86 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 14 May 2025 17:10:12 +0900 Subject: [PATCH 07/56] Add JPYC client --- packages/core/src/__init__.py | 3 +- packages/core/src/interfaces/__init__.py | 3 +- packages/core/src/interfaces/jpyc.py | 289 +++++++++++++++++++++++ packages/core/src/jpyc.py | 210 ++++++++++++++++ 4 files changed, 503 insertions(+), 2 deletions(-) create mode 100644 packages/core/src/interfaces/jpyc.py create mode 100644 packages/core/src/jpyc.py diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py index 1d20dac..f07af5e 100644 --- a/packages/core/src/__init__.py +++ b/packages/core/src/__init__.py @@ -1 +1,2 @@ -from client import * +from .client import * +from .jpyc import * diff --git a/packages/core/src/interfaces/__init__.py b/packages/core/src/interfaces/__init__.py index 1d20dac..f07af5e 100644 --- a/packages/core/src/interfaces/__init__.py +++ b/packages/core/src/interfaces/__init__.py @@ -1 +1,2 @@ -from client import * +from .client import * +from .jpyc import * diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py new file mode 100644 index 0000000..4e944be --- /dev/null +++ b/packages/core/src/interfaces/jpyc.py @@ -0,0 +1,289 @@ +from abc import ABC, abstractmethod +from decimal import Decimal + +from eth_typing import ChecksumAddress + +class IJPYC(ABC): + """Interface of JPYC contracts.""" + + ################## + # View functions # + ################## + + @abstractmethod + def is_minter(self, account: ChecksumAddress) -> bool: + """Call `isMinter` function. + + Args: + account (ChecksumAddress): Account address + + Returns: + bool: True if `account` is a minter, false otherwise + """ + pass + + @abstractmethod + def minter_allowance(self, minter: ChecksumAddress) -> Decimal: + """Call `minterAllowance` function. + + Args: + minter (ChecksumAddress): Minter address + + Returns: + Decimal: Minter allowance + """ + pass + + @abstractmethod + def total_supply(self) -> Decimal: + """Call `totalSupply` function. + + Returns: + Decimal: Total supply of tokens + """ + pass + + @abstractmethod + def balance_of(self, account: ChecksumAddress) -> Decimal: + """Call `balanceOf` function. + + Args: + account (ChecksumAddress): Account address + + Returns: + Decimal: Account balance + """ + pass + + @abstractmethod + def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Decimal: + """Call `allowance` function. + + Args: + owner (ChecksumAddress): Owner address + spender (ChecksumAddress): Spender address + + Returns: + Decimal: Allowance of spender over owner's tokens + """ + pass + + @abstractmethod + def nonces(self, owner: ChecksumAddress) -> int: + """Call `nonces` function. + + Args: + owner (ChecksumAddress): Owner address + + Returns: + int: Nonce for EIP2612's `permit`. + """ + pass + + ###################### + # Mutation functions # + ###################### + + @abstractmethod + def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decimal) -> str: + """Call `configureMinter` function. + + Args: + minter (ChecksumAddress): Minter address + minter_allowed_amount (Decimal): Minter allowance + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def mint(self, to: ChecksumAddress, amount: Decimal) -> str: + """Call `mint` function. + + Args: + to (ChecksumAddress): Receiver address + amount (Decimal): Amount of tokens to mint + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def transfer(self, to: ChecksumAddress, value: Decimal) -> str: + """Call `transfer` function. + + Args: + to (ChecksumAddress): Receiver address + value (Decimal): Amount of tokens to transfer + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Decimal) -> str: + """Call `transferFrom` function. + + Args: + from_ (ChecksumAddress): Owner address + to (ChecksumAddress): Receiver address + value (Decimal): Amount of tokens to transfer + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def transfer_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Decimal, + validAfter: int, + validBefore: int, + nonce: str, + v: int, + r: str, + s: str, + ) -> str: + """Call `transferWithAuthorization` function. + + Args: + from_ (ChecksumAddress): Owner address + to (ChecksumAddress): Receiver allowance + value (Decimal): Amount of tokens to transfer + validAfter (int): Unix time when transaction becomes valid + validBefore (int): Unix time when transaction becomes invalid + nonce (str): Unique nonce + v (int): v of ECDSA + r (str): r of ECDSA + s (str): s of ECDSA + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def receive_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Decimal, + validAfter: int, + validBefore: int, + nonce: str, + v: int, + r: str, + s: str, + ) -> str: + """Call `receiveWithAuthorization` function. + + Args: + from_ (ChecksumAddress): Owner address + to (ChecksumAddress): Receiver allowance + value (Decimal): Amount of tokens to transfer + validAfter (int): Unix time when transaction becomes valid + validBefore (int): Unix time when transaction becomes invalid + nonce (str): Unique nonce + v (int): v of ECDSA + r (str): r of ECDSA + s (str): s of ECDSA + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def cancel_authorization( + self, + authorizer: ChecksumAddress, + nonce: str, + v: int, + r: str, + s: str, + ) -> str: + """Call `cancelAuthorization` function. + + Args: + authorizer (ChecksumAddress): Owner address + nonce (str): Unique nonce + v (int): v of ECDSA + r (str): r of ECDSA + s (str): s of ECDSA + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def approve(self, spender: ChecksumAddress, value: Decimal) -> str: + """Call `approve` function. + + Args: + spender (ChecksumAddress): Spender address + value (Decimal): Amount of allowance + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> str: + """Call `increaseAllowance` function. + + Args: + spender (ChecksumAddress): Spender address + increment (Decimal): Amount of allowance to increase + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> str: + """Call `decreaseAllowance` function. + + Args: + spender (ChecksumAddress): Spender address + decrement (Decimal): Amount of allowance to decrease + + Returns: + str: Transaction hash + """ + pass + + @abstractmethod + def permit( + self, + owner: ChecksumAddress, + spender: ChecksumAddress, + value: Decimal, + deadline: int, + v: int, + r: str, + s: str, + ) -> str: + """Call `permit` function. + + Args: + owner (ChecksumAddress): Owner address + spender (ChecksumAddress): Spender address + value (Decimal): Amount of allowance + deadline (int): Unix time when transaction becomes invalid + v (int): v of ECDSA + r (str): r of ECDSA + s (str): s of ECDSA + + Returns: + str: Transaction hash + """ + pass diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py new file mode 100644 index 0000000..4d12dcf --- /dev/null +++ b/packages/core/src/jpyc.py @@ -0,0 +1,210 @@ +from decimal import Decimal + +from eth_typing import ChecksumAddress +from web3 import Web3 +from web3.contract import Contract + +from interfaces import IJPYC +from utils import ( + catch_transaction_errors, + ContractVersion, + get_abi, + get_proxy_address, + remove_decimals, + resolve_abi_file_path, + restore_decimals, +) + +class JPYC(IJPYC): + """Implementation of IJPYC. + + Attributes: + contact (Contract): Contract instance + """ + contact: Contract + + def __init__( + self, + w3: Web3, + contract_version: ContractVersion = "2" + ): + """Constructor that initializes JPYC client. + + Args: + w3 (Web3): Configured web3 instance + contract_version (ContractVersion): Contract version + """ + self.contract = w3.eth.contract( + address=get_proxy_address(contract_version=contract_version), + abi=get_abi(resolve_abi_file_path(contract_version=contract_version)), + ) + + ################## + # View functions # + ################## + + def is_minter(self, account: ChecksumAddress) -> bool: + return self.contact.functions.isMinter(account).call() + + @restore_decimals + def minter_allowance(self, minter: ChecksumAddress) -> Decimal: + return self.contact.functions.minterAllowance(minter).call() + + @restore_decimals + def total_supply(self) -> Decimal: + return self.contact.functions.totalSupply().call() + + @restore_decimals + def balance_of(self, account: ChecksumAddress) -> Decimal: + return self.contact.functions.balanceOf(account).call() + + @restore_decimals + def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Decimal: + return self.contact.functions.allowance(owner, spender).call() + + def nonces(self, owner: ChecksumAddress) -> int: + return self.contact.functions.nonces(owner).call() + + ###################### + # Mutation functions # + ###################### + + # TODO: transaction simulation using eth.call() + + @catch_transaction_errors + def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decimal) -> str: + return self.contact.functions.configureMinter( + minter, + remove_decimals(minter_allowed_amount), + ).call() + + @catch_transaction_errors + def mint(self, to: ChecksumAddress, amount: Decimal) -> str: + return self.contact.functions.mint( + to, + remove_decimals(amount), + ).call() + + @catch_transaction_errors + def transfer(self, to: ChecksumAddress, value: Decimal) -> str: + return self.contact.functions.transfer( + to, + remove_decimals(value), + ).call() + + @catch_transaction_errors + def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Decimal) -> str: + return self.contact.functions.transferFrom( + from_, + to, + remove_decimals(value), + ).call() + + @catch_transaction_errors + def transfer_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Decimal, + validAfter: int, + validBefore: int, + nonce: str, + v: int, + r: str, + s: str, + ) -> str: + return self.contact.functions.transferWithAuthorization( + from_, + to, + remove_decimals(value), + validAfter, + validBefore, + nonce, + v, + r, + s, + ).call() + + @catch_transaction_errors + def receive_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Decimal, + validAfter: int, + validBefore: int, + nonce: str, + v: int, + r: str, + s: str, + ) -> str: + return self.contact.functions.receiveWithAuthorization( + from_, + to, + remove_decimals(value), + validAfter, + validBefore, + nonce, + v, + r, + s, + ).call() + + @catch_transaction_errors + def cancel_authorization( + self, + authorizer: ChecksumAddress, + nonce: str, + v: int, + r: str, + s: str, + ) -> str: + return self.contact.functions.cancelAuthorization( + authorizer, + nonce, + v, + r, + s, + ).call() + + @catch_transaction_errors + def approve(self, spender: ChecksumAddress, value: Decimal) -> str: + return self.contact.functions.approve( + spender, + remove_decimals(value), + ).call() + + @catch_transaction_errors + def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> str: + return self.contact.functions.increaseAllowance( + spender, + remove_decimals(increment), + ).call() + + @catch_transaction_errors + def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> str: + return self.contact.functions.decreaseAllowance( + spender, + remove_decimals(decrement), + ).call() + + @catch_transaction_errors + def permit( + self, + owner: ChecksumAddress, + spender: ChecksumAddress, + value: Decimal, + deadline: int, + v: int, + r: str, + s: str, + ) -> str: + return self.contact.functions.permit( + owner, + spender, + remove_decimals(value), + deadline, + v, + r, + s, + ).call() From b22c1e97b7b3969dfcfd70a368f6f34a77977eb8 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 15 May 2025 17:25:52 +0900 Subject: [PATCH 08/56] Rename package name --- packages/core/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 8e94525..164e4e6 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "core-sdk" +name = "jpyc-core-sdk" version = "1.0.0" requires-python = ">=3.11" license = { text = "MIT" } From dcc1c345869f3cc59f60e4e1f5b8ed349824a1ee Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 15 May 2025 17:26:40 +0900 Subject: [PATCH 09/56] Add & refactor utils --- packages/core/src/utils/__init__.py | 49 ++++++++++++++++--- packages/core/src/utils/{abi.py => abis.py} | 2 +- packages/core/src/utils/addresses.py | 2 +- packages/core/src/utils/chains.py | 10 ++-- packages/core/src/utils/constants.py | 10 ++++ .../src/utils/{currency.py => currencies.py} | 0 packages/core/src/utils/errors.py | 28 +++++++++-- packages/core/src/utils/transactions.py | 13 +++-- packages/core/src/utils/types.py | 2 + 9 files changed, 98 insertions(+), 18 deletions(-) rename packages/core/src/utils/{abi.py => abis.py} (93%) create mode 100644 packages/core/src/utils/constants.py rename packages/core/src/utils/{currency.py => currencies.py} (100%) diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 9390689..68cff5e 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -1,7 +1,42 @@ -from .abi import * -from .addresses import * -from .chains import * -from .currency import * -from .errors import * -from .transactions import * -from .types import * +from core.src.utils.abis import * +from core.src.utils.addresses import * +from core.src.utils.chains import * +from core.src.utils.constants import * +from core.src.utils.currencies import * +from core.src.utils.errors import * +from core.src.utils.transactions import * +from core.src.utils.types import * + +__all__ = [ + # abi + "resolve_abi_file_path", + "get_abi", + # address + "calc_checksum_address", + "is_valid_address", + "get_proxy_address", + "ZERO_ADDRESS", + "V2_PROXY_ADDRESS", + # chains + "SUPPORTED_CHAINS", + "enumerate_supported_networks", + "is_supported_network", + "get_default_rpc_endpoint", + # constants + "poa_middleware", + "sign_middleware", + # currency + "remove_decimals", + "restore_decimals", + # errors + "NetworkNotSupported", + "AccountNotInitialized", + "TransactionSimulationFailed", + "TransactionFailedToSend", + # transactions + "catch_transaction_errors", + # types + "ChainName", + "NetworkMetadata", + "ContractVersion", +] diff --git a/packages/core/src/utils/abi.py b/packages/core/src/utils/abis.py similarity index 93% rename from packages/core/src/utils/abi.py rename to packages/core/src/utils/abis.py index a277cc3..599b23a 100644 --- a/packages/core/src/utils/abi.py +++ b/packages/core/src/utils/abis.py @@ -2,7 +2,7 @@ from pathlib import Path from typing import Any -from .types import ContractVersion +from core.src.utils.types import ContractVersion def resolve_abi_file_path(contract_version: ContractVersion) -> str: """Resolve the path of ABI file from the specified contract version. diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py index 8f4f14b..d40d9a6 100644 --- a/packages/core/src/utils/addresses.py +++ b/packages/core/src/utils/addresses.py @@ -8,7 +8,7 @@ from web3 import Web3 from web3.constants import ADDRESS_ZERO -from .types import ContractVersion +from core.src.utils.types import ContractVersion #################################### # Address-related helper functions # diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py index 81ee301..e68335b 100644 --- a/packages/core/src/utils/chains.py +++ b/packages/core/src/utils/chains.py @@ -1,13 +1,13 @@ from typing import Final -from .errors import NetworkNotSupported -from .types import ChainName, NetworkMetadata +from core.src.utils.errors import NetworkNotSupported +from core.src.utils.types import ChainMetadata ################## # Chain Metadata # ################## -SUPPORTED_CHAINS: Final[dict[ChainName, dict[str, NetworkMetadata]]] = { +SUPPORTED_CHAINS: Final[ChainMetadata] = { "ethereum": { "mainnet": { "id": 1, @@ -78,6 +78,7 @@ }, }, } +"""ChainMetadata: Supported chains & networks.""" ################################## # Chain-related helper functions # @@ -112,6 +113,9 @@ def get_default_rpc_endpoint(chain_name: str, network_name: str) -> str: Returns: str: RPC endpoint + + Raises: + NetworkNotSupported: If the specified network is not supported by the SDK """ if not is_supported_network(chain_name, network_name): raise NetworkNotSupported(chain_name, network_name) diff --git a/packages/core/src/utils/constants.py b/packages/core/src/utils/constants.py new file mode 100644 index 0000000..2f6346f --- /dev/null +++ b/packages/core/src/utils/constants.py @@ -0,0 +1,10 @@ +from typing import Final + +#################### +# Middleware Names # +#################### + +poa_middleware: Final[str] = "poa_middleware" +"""str: Name of POA compatibility middleware.""" +sign_middleware: Final[str] = "sign_middleware" +"""str: Name of auto-signature middleware.""" diff --git a/packages/core/src/utils/currency.py b/packages/core/src/utils/currencies.py similarity index 100% rename from packages/core/src/utils/currency.py rename to packages/core/src/utils/currencies.py diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 094365a..957bf2a 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -1,9 +1,13 @@ -from .chains import enumerate_supported_networks +from core.src.utils.chains import enumerate_supported_networks class JpycSdkError(Exception): """Base class for any SDK-related errors.""" pass +################# +# Config Errors # +################# + class NetworkNotSupported(JpycSdkError): """Raised when the specified network is not supported by the SDK. @@ -17,8 +21,26 @@ def __init__(self, chain_name: str, network_name: str): f"Supported networks are: {enumerate_supported_networks()}" ) -class TransactionFailed(JpycSdkError): - """Raised when failed to send a transaction. +class AccountNotInitialized(JpycSdkError): + """Raised when account is not initialized or hoisted to web3 instance.""" + def __init__(self): + super().__init__("Account is not initialized.") + +###################### +# Transaction Errors # +###################### + +class TransactionSimulationFailed(JpycSdkError): + """Raised when transaction simulation fails. + + Attributes: + message (str): Error message + """ + def __init__(self, message: str): + super().__init__(f"Failed to simulate a transaction locally: '{message}") + +class TransactionFailedToSend(JpycSdkError): + """Raised when it fails to send a transaction. Attributes: message (str): Error message diff --git a/packages/core/src/utils/transactions.py b/packages/core/src/utils/transactions.py index af672d5..3af2975 100644 --- a/packages/core/src/utils/transactions.py +++ b/packages/core/src/utils/transactions.py @@ -1,11 +1,18 @@ -from .errors import TransactionFailed +from core.src.utils.errors import AccountNotInitialized, TransactionFailedToSend def catch_transaction_errors(func): - """Decorator to catch transaction errors.""" + """Decorator to catch any transaction errors. + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction + """ def wrapper(*args, **kwargs): try: func(*args, **kwargs) + except AccountNotInitialized: + raise AccountNotInitialized() except Exception as e: - raise TransactionFailed(e) + raise TransactionFailedToSend(e) return wrapper diff --git a/packages/core/src/utils/types.py b/packages/core/src/utils/types.py index fe7e2e0..b40c7a1 100644 --- a/packages/core/src/utils/types.py +++ b/packages/core/src/utils/types.py @@ -19,6 +19,8 @@ class NetworkMetadata(TypedDict): name: str rpc_endpoints: List[str] +ChainMetadata: TypeAlias = dict[ChainName, dict[str, NetworkMetadata]] + ############# # Contracts # ############# From ee49f4be945e8e1d75e2e4e1e093b8d948aa1911 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 15 May 2025 17:27:14 +0900 Subject: [PATCH 10/56] Refactor clients --- packages/core/src/__init__.py | 13 +++- packages/core/src/client.py | 88 +++++++++++++++++------- packages/core/src/interfaces/__init__.py | 9 ++- packages/core/src/interfaces/client.py | 10 ++- packages/core/src/interfaces/jpyc.py | 44 ++++++++++++ packages/core/src/jpyc.py | 61 ++++++++++++---- 6 files changed, 184 insertions(+), 41 deletions(-) diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py index f07af5e..7ec93b4 100644 --- a/packages/core/src/__init__.py +++ b/packages/core/src/__init__.py @@ -1,2 +1,11 @@ -from .client import * -from .jpyc import * +from importlib.metadata import version + +from core.src.client import * +from core.src.jpyc import * + +__version__ = version("jpyc-core-sdk") +__all__ = [ + "__version__", + "SdkClient", + "JPYC", +] diff --git a/packages/core/src/client.py b/packages/core/src/client.py index c83b2fe..c597a05 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -2,24 +2,24 @@ from web3 import Account, HTTPProvider, Web3 from web3.middleware import ExtraDataToPOAMiddleware, SignAndSendRawMiddlewareBuilder -from interfaces import ISdkClient -from utils import get_default_rpc_endpoint +from core.src.interfaces import ISdkClient +from core.src.utils.chains import ( + get_default_rpc_endpoint, +) +from core.src.utils.constants import ( + poa_middleware, + sign_middleware, +) +from core.src.utils.errors import AccountNotInitialized class SdkClient(ISdkClient): - """SDK client. - - Attributes: - w3 (Web3): Configured web3 instance - account (LocalAccount): Local account - """ - w3: Web3 - account: LocalAccount + """SDK client.""" def __init__( self, chain_name: str, network_name: str, - private_key: str, + private_key: str | None = None, ): """Constructor that initializes SDK client. @@ -32,33 +32,75 @@ def __init__( NetworkNotSupported: If the specified network is not supported by the SDK """ rpc_endpoint = get_default_rpc_endpoint(chain_name, network_name) - account = Account.from_key(private_key) - - w3 = Web3(HTTPProvider(rpc_endpoint)) - w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) - w3.middleware_onion.inject(SignAndSendRawMiddlewareBuilder.build(account), layer=0) + account = Account.from_key(private_key) if private_key is not None else None + w3 = self.__configure_w3( + rpc_endpoint=rpc_endpoint, + account=account, + ) self.w3 = w3 + """Web3: Configured web3 instance""" + self.rpc_endpoint = rpc_endpoint + """str: RPC endpoint""" self.account = account + """LocalAccount | None: Account instance""" - def set_default_provider(self, chain_name: str, network_name: str) -> Web3: - rpc_endpoint = get_default_rpc_endpoint(chain_name, network_name) + def __configure_w3( + self, + rpc_endpoint: str, + account: LocalAccount | None = None, + ) -> Web3: + """Configure a web3 instance. - self.w3 = Web3(HTTPProvider(rpc_endpoint)) + Args: + rpc_endpoint (str): RPC endpoint + account (LocalAccount | None): Account instance + + Returns: + Web3: Configured web3 instance + """ + w3 = Web3(HTTPProvider(Web3(HTTPProvider(rpc_endpoint)))) + w3.middleware_onion.inject( + ExtraDataToPOAMiddleware, + name=poa_middleware, + layer=0, + ) + if account is not None: + w3.middleware_onion.inject( + SignAndSendRawMiddlewareBuilder.build(account), + name=sign_middleware, + layer=0, + ) + + return w3 + + def set_default_provider(self, chain_name: str, network_name: str) -> Web3: + self.w3 = self.__configure_w3( + rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name), + account=self.account + ) return self.w3 def set_custom_provider(self, rpc_endpoint: str) -> Web3: - self.w3 = Web3(HTTPProvider(rpc_endpoint)) + self.w3 = self.__configure_w3( + rpc_endpoint=rpc_endpoint, + account=self.account + ) return self.w3 def set_account(self, private_key: str) -> LocalAccount: - account = Account.from_key(private_key) - self.w3.middleware_onion.replace(SignAndSendRawMiddlewareBuilder.build(self.account), SignAndSendRawMiddlewareBuilder.build(account)) - self.account = account + self.account = Account.from_key(private_key) + self.w3 = self.__configure_w3( + rpc_endpoint=self.rpc_endpoint, + account=self.account + ) return self.account def get_account_address(self) -> str: + if self.account is None: + raise AccountNotInitialized() + return self.account.address diff --git a/packages/core/src/interfaces/__init__.py b/packages/core/src/interfaces/__init__.py index f07af5e..32b4814 100644 --- a/packages/core/src/interfaces/__init__.py +++ b/packages/core/src/interfaces/__init__.py @@ -1,2 +1,7 @@ -from .client import * -from .jpyc import * +from core.src.interfaces.client import * +from core.src.interfaces.jpyc import * + +__all__ = [ + "ISdkClient", + "IJPYC", +] diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index 90674d2..720d527 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -16,6 +16,9 @@ def set_default_provider(self, chain_name: str, network_name: str) -> Web3: Returns: Web3: Configured web3 instance + + Raises: + NetworkNotSupported: If the specified network is not supported by the SDK """ pass @@ -45,9 +48,12 @@ def set_account(self, private_key: str) -> LocalAccount: @abstractmethod def get_account_address(self) -> str: - """Get address of configured account. + """Get address of the configured account. Returns: - str: Public address (starting with `0x`) of account + str: Public address of account + + Raises: + AccountNotInitialized: If account is not initialized """ pass diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py index 4e944be..4f4c0fc 100644 --- a/packages/core/src/interfaces/jpyc.py +++ b/packages/core/src/interfaces/jpyc.py @@ -94,6 +94,10 @@ def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decim Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -107,6 +111,10 @@ def mint(self, to: ChecksumAddress, amount: Decimal) -> str: Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -120,6 +128,10 @@ def transfer(self, to: ChecksumAddress, value: Decimal) -> str: Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -134,6 +146,10 @@ def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Deci Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -165,6 +181,10 @@ def transfer_with_authorization( Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -196,6 +216,10 @@ def receive_with_authorization( Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -219,6 +243,10 @@ def cancel_authorization( Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -232,6 +260,10 @@ def approve(self, spender: ChecksumAddress, value: Decimal) -> str: Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -245,6 +277,10 @@ def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> st Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -258,6 +294,10 @@ def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> st Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass @@ -285,5 +325,9 @@ def permit( Returns: str: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + TransactionFailedToSend: If failed to send a transaction """ pass diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 4d12dcf..5d2f0be 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -2,26 +2,26 @@ from eth_typing import ChecksumAddress from web3 import Web3 -from web3.contract import Contract -from interfaces import IJPYC -from utils import ( - catch_transaction_errors, - ContractVersion, +from core.src.interfaces import IJPYC +from core.src.utils.abis import ( get_abi, + resolve_abi_file_path, +) +from core.src.utils.addresses import ( get_proxy_address, +) +from core.src.utils.constants import sign_middleware +from core.src.utils.currencies import ( remove_decimals, - resolve_abi_file_path, restore_decimals, ) +from core.src.utils.errors import AccountNotInitialized +from core.src.utils.transactions import catch_transaction_errors +from core.src.utils.types import ContractVersion class JPYC(IJPYC): - """Implementation of IJPYC. - - Attributes: - contact (Contract): Contract instance - """ - contact: Contract + """Implementation of IJPYC.""" def __init__( self, @@ -34,10 +34,25 @@ def __init__( w3 (Web3): Configured web3 instance contract_version (ContractVersion): Contract version """ + self.w3 = w3 + """Web3: Configured web3 instance""" self.contract = w3.eth.contract( address=get_proxy_address(contract_version=contract_version), abi=get_abi(resolve_abi_file_path(contract_version=contract_version)), ) + """Contract: Contract instance""" + + def __account_initialized(self) -> None: + """Check if account is initialized. + + Note: + An account must be set to web3 instance to send transactions. + + Raises: + AccountNotInitialized: If account is not initialized + """ + if sign_middleware not in self.w3.middleware_onion: + raise AccountNotInitialized() ################## # View functions # @@ -73,6 +88,8 @@ def nonces(self, owner: ChecksumAddress) -> int: @catch_transaction_errors def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decimal) -> str: + self.__account_initialized() + return self.contact.functions.configureMinter( minter, remove_decimals(minter_allowed_amount), @@ -80,6 +97,8 @@ def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decim @catch_transaction_errors def mint(self, to: ChecksumAddress, amount: Decimal) -> str: + self.__account_initialized() + return self.contact.functions.mint( to, remove_decimals(amount), @@ -87,6 +106,8 @@ def mint(self, to: ChecksumAddress, amount: Decimal) -> str: @catch_transaction_errors def transfer(self, to: ChecksumAddress, value: Decimal) -> str: + self.__account_initialized() + return self.contact.functions.transfer( to, remove_decimals(value), @@ -94,6 +115,8 @@ def transfer(self, to: ChecksumAddress, value: Decimal) -> str: @catch_transaction_errors def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Decimal) -> str: + self.__account_initialized() + return self.contact.functions.transferFrom( from_, to, @@ -113,6 +136,8 @@ def transfer_with_authorization( r: str, s: str, ) -> str: + self.__account_initialized() + return self.contact.functions.transferWithAuthorization( from_, to, @@ -138,6 +163,8 @@ def receive_with_authorization( r: str, s: str, ) -> str: + self.__account_initialized() + return self.contact.functions.receiveWithAuthorization( from_, to, @@ -159,6 +186,8 @@ def cancel_authorization( r: str, s: str, ) -> str: + self.__account_initialized() + return self.contact.functions.cancelAuthorization( authorizer, nonce, @@ -169,6 +198,8 @@ def cancel_authorization( @catch_transaction_errors def approve(self, spender: ChecksumAddress, value: Decimal) -> str: + self.__account_initialized() + return self.contact.functions.approve( spender, remove_decimals(value), @@ -176,6 +207,8 @@ def approve(self, spender: ChecksumAddress, value: Decimal) -> str: @catch_transaction_errors def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> str: + self.__account_initialized() + return self.contact.functions.increaseAllowance( spender, remove_decimals(increment), @@ -183,6 +216,8 @@ def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> st @catch_transaction_errors def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> str: + self.__account_initialized() + return self.contact.functions.decreaseAllowance( spender, remove_decimals(decrement), @@ -199,6 +234,8 @@ def permit( r: str, s: str, ) -> str: + self.__account_initialized() + return self.contact.functions.permit( owner, spender, From b46dd20852d909e32c3a9c8a95a94fbb28626ec5 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 15 May 2025 17:39:06 +0900 Subject: [PATCH 11/56] Fix JPYC client --- packages/core/src/jpyc.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 5d2f0be..04d8793 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -1,9 +1,8 @@ from decimal import Decimal from eth_typing import ChecksumAddress -from web3 import Web3 -from core.src.interfaces import IJPYC +from core.src.interfaces import IJPYC, ISdkClient from core.src.utils.abis import ( get_abi, resolve_abi_file_path, @@ -25,22 +24,22 @@ class JPYC(IJPYC): def __init__( self, - w3: Web3, + client: ISdkClient, contract_version: ContractVersion = "2" ): """Constructor that initializes JPYC client. Args: - w3 (Web3): Configured web3 instance + client (ISdkClient): Configured SDK client contract_version (ContractVersion): Contract version """ - self.w3 = w3 - """Web3: Configured web3 instance""" - self.contract = w3.eth.contract( + self.client = client + """ISdkClient: Configured SDK client""" + self.contract = client.w3.eth.contract( address=get_proxy_address(contract_version=contract_version), abi=get_abi(resolve_abi_file_path(contract_version=contract_version)), ) - """Contract: Contract instance""" + """Contract: Configured contract instance""" def __account_initialized(self) -> None: """Check if account is initialized. @@ -51,7 +50,7 @@ def __account_initialized(self) -> None: Raises: AccountNotInitialized: If account is not initialized """ - if sign_middleware not in self.w3.middleware_onion: + if sign_middleware not in self.client.w3.middleware_onion: raise AccountNotInitialized() ################## From c8a6b80003263c0226d7f48bfe7eecfed39295e4 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 15 May 2025 18:58:58 +0900 Subject: [PATCH 12/56] Add tx simulation --- packages/core/src/interfaces/jpyc.py | 16 +- packages/core/src/jpyc.py | 239 ++++++++++++++++-------- packages/core/src/utils/transactions.py | 8 +- 3 files changed, 180 insertions(+), 83 deletions(-) diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py index 4f4c0fc..5dd7db0 100644 --- a/packages/core/src/interfaces/jpyc.py +++ b/packages/core/src/interfaces/jpyc.py @@ -159,8 +159,8 @@ def transfer_with_authorization( from_: ChecksumAddress, to: ChecksumAddress, value: Decimal, - validAfter: int, - validBefore: int, + valid_after: int, + valid_before: int, nonce: str, v: int, r: str, @@ -172,8 +172,8 @@ def transfer_with_authorization( from_ (ChecksumAddress): Owner address to (ChecksumAddress): Receiver allowance value (Decimal): Amount of tokens to transfer - validAfter (int): Unix time when transaction becomes valid - validBefore (int): Unix time when transaction becomes invalid + valid_after (int): Unix time when transaction becomes valid + valid_before (int): Unix time when transaction becomes invalid nonce (str): Unique nonce v (int): v of ECDSA r (str): r of ECDSA @@ -194,8 +194,8 @@ def receive_with_authorization( from_: ChecksumAddress, to: ChecksumAddress, value: Decimal, - validAfter: int, - validBefore: int, + valid_after: int, + valid_before: int, nonce: str, v: int, r: str, @@ -207,8 +207,8 @@ def receive_with_authorization( from_ (ChecksumAddress): Owner address to (ChecksumAddress): Receiver allowance value (Decimal): Amount of tokens to transfer - validAfter (int): Unix time when transaction becomes valid - validBefore (int): Unix time when transaction becomes invalid + valid_after (int): Unix time when transaction becomes valid + valid_before (int): Unix time when transaction becomes invalid nonce (str): Unique nonce v (int): v of ECDSA r (str): r of ECDSA diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 04d8793..1a83887 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -1,6 +1,8 @@ from decimal import Decimal +from typing import Any from eth_typing import ChecksumAddress +from web3.contract.contract import ContractFunction from core.src.interfaces import IJPYC, ISdkClient from core.src.utils.abis import ( @@ -15,7 +17,7 @@ remove_decimals, restore_decimals, ) -from core.src.utils.errors import AccountNotInitialized +from core.src.utils.errors import AccountNotInitialized, TransactionSimulationFailed from core.src.utils.transactions import catch_transaction_errors from core.src.utils.types import ContractVersion @@ -53,6 +55,20 @@ def __account_initialized(self) -> None: if sign_middleware not in self.client.w3.middleware_onion: raise AccountNotInitialized() + def __simulate_transaction(self, contract_func: ContractFunction, func_args: dict[Any]) -> None: + """Simulate a transaction locally. + + Note: + This method should be called before sending actual transactions. + + Raises: + TransactionSimulationFailed: If transaction simulation fails + """ + try: + contract_func.call(**func_args) + except Exception as e: + raise TransactionSimulationFailed(e) + ################## # View functions # ################## @@ -83,44 +99,70 @@ def nonces(self, owner: ChecksumAddress) -> int: # Mutation functions # ###################### - # TODO: transaction simulation using eth.call() - @catch_transaction_errors def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decimal) -> str: self.__account_initialized() - return self.contact.functions.configureMinter( - minter, - remove_decimals(minter_allowed_amount), - ).call() + args = { + "minter": minter, + "minterAllowedAmount": remove_decimals(minter_allowed_amount), + } + + self.__simulate_transaction( + contract_func=self.contact.functions.configureMinter, + func_args=args + ) + + return self.contact.functions.configureMinter(**args).transact() @catch_transaction_errors def mint(self, to: ChecksumAddress, amount: Decimal) -> str: self.__account_initialized() - return self.contact.functions.mint( - to, - remove_decimals(amount), - ).call() + args = { + "to": to, + "amount": remove_decimals(amount), + } + + self.__simulate_transaction( + contract_func=self.contact.functions.mint, + func_args=args + ) + + return self.contact.functions.mint(**args).transact() @catch_transaction_errors def transfer(self, to: ChecksumAddress, value: Decimal) -> str: self.__account_initialized() - return self.contact.functions.transfer( - to, - remove_decimals(value), - ).call() + args = { + "to": to, + "value": remove_decimals(value), + } + + self.__simulate_transaction( + contract_func=self.contact.functions.transfer, + func_args=args + ) + + return self.contact.functions.transfer(**args).transact() @catch_transaction_errors def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Decimal) -> str: self.__account_initialized() - return self.contact.functions.transferFrom( - from_, - to, - remove_decimals(value), - ).call() + args = { + "from": from_, + "to": to, + "value": remove_decimals(value), + } + + self.__simulate_transaction( + contract_func=self.contact.functions.transferFrom, + func_args=args + ) + + return self.contact.functions.transferFrom(**args).transact() @catch_transaction_errors def transfer_with_authorization( @@ -128,8 +170,8 @@ def transfer_with_authorization( from_: ChecksumAddress, to: ChecksumAddress, value: Decimal, - validAfter: int, - validBefore: int, + valid_after: int, + valid_before: int, nonce: str, v: int, r: str, @@ -137,17 +179,24 @@ def transfer_with_authorization( ) -> str: self.__account_initialized() - return self.contact.functions.transferWithAuthorization( - from_, - to, - remove_decimals(value), - validAfter, - validBefore, - nonce, - v, - r, - s, - ).call() + args = { + "from": from_, + "to": to, + "value": remove_decimals(value), + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + } + + self.__simulate_transaction( + contract_func=self.contact.functions.transferWithAuthorization, + func_args=args + ) + + return self.contact.functions.transferWithAuthorization(**args).transact() @catch_transaction_errors def receive_with_authorization( @@ -155,8 +204,8 @@ def receive_with_authorization( from_: ChecksumAddress, to: ChecksumAddress, value: Decimal, - validAfter: int, - validBefore: int, + valid_after: int, + valid_before: int, nonce: str, v: int, r: str, @@ -164,17 +213,24 @@ def receive_with_authorization( ) -> str: self.__account_initialized() - return self.contact.functions.receiveWithAuthorization( - from_, - to, - remove_decimals(value), - validAfter, - validBefore, - nonce, - v, - r, - s, - ).call() + args = { + "from": from_, + "to": to, + "value": remove_decimals(value), + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + } + + self.__simulate_transaction( + contract_func=self.contact.functions.receiveWithAuthorization, + func_args=args + ) + + return self.contact.functions.receiveWithAuthorization(**args).transact() @catch_transaction_errors def cancel_authorization( @@ -187,40 +243,68 @@ def cancel_authorization( ) -> str: self.__account_initialized() - return self.contact.functions.cancelAuthorization( - authorizer, - nonce, - v, - r, - s, - ).call() + args = { + "authorizer": authorizer, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + } + + self.__simulate_transaction( + contract_func=self.contact.functions.cancelAuthorization, + func_args=args + ) + + return self.contact.functions.cancelAuthorization(**args).transact() @catch_transaction_errors def approve(self, spender: ChecksumAddress, value: Decimal) -> str: self.__account_initialized() - return self.contact.functions.approve( - spender, - remove_decimals(value), - ).call() + args = { + "spender": spender, + "value": remove_decimals(value), + } + + self.__simulate_transaction( + contract_func=self.contact.functions.approve, + func_args=args + ) + + return self.contact.functions.approve(**args).transact() @catch_transaction_errors def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> str: self.__account_initialized() - return self.contact.functions.increaseAllowance( - spender, - remove_decimals(increment), - ).call() + args = { + "spender": spender, + "increment": remove_decimals(increment), + } + + self.__simulate_transaction( + contract_func=self.contact.functions.increaseAllowance, + func_args=args + ) + + return self.contact.functions.increaseAllowance(**args).transact() @catch_transaction_errors def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> str: self.__account_initialized() - return self.contact.functions.decreaseAllowance( - spender, - remove_decimals(decrement), - ).call() + args = { + "spender": spender, + "decrement": remove_decimals(decrement), + } + + self.__simulate_transaction( + contract_func=self.contact.functions.decreaseAllowance, + func_args=args + ) + + return self.contact.functions.decreaseAllowance(**args).transact() @catch_transaction_errors def permit( @@ -235,12 +319,19 @@ def permit( ) -> str: self.__account_initialized() - return self.contact.functions.permit( - owner, - spender, - remove_decimals(value), - deadline, - v, - r, - s, - ).call() + args = { + "owner": owner, + "spender": spender, + "value": remove_decimals(value), + "deadline": deadline, + "v": v, + "r": r, + "s": s, + } + + self.__simulate_transaction( + contract_func=self.contact.functions.permit, + func_args=args + ) + + return self.contact.functions.permit(**args).transact() diff --git a/packages/core/src/utils/transactions.py b/packages/core/src/utils/transactions.py index 3af2975..78c0d58 100644 --- a/packages/core/src/utils/transactions.py +++ b/packages/core/src/utils/transactions.py @@ -1,4 +1,8 @@ -from core.src.utils.errors import AccountNotInitialized, TransactionFailedToSend +from core.src.utils.errors import ( + AccountNotInitialized, + TransactionFailedToSend, + TransactionSimulationFailed, +) def catch_transaction_errors(func): """Decorator to catch any transaction errors. @@ -12,6 +16,8 @@ def wrapper(*args, **kwargs): func(*args, **kwargs) except AccountNotInitialized: raise AccountNotInitialized() + except TransactionSimulationFailed as e: + raise TransactionSimulationFailed(e) except Exception as e: raise TransactionFailedToSend(e) From 2f3c105e29bf45aa5e9e1f1ee4d7b055d993bdd2 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 15 May 2025 20:53:44 +0900 Subject: [PATCH 13/56] Update s --- .gitignore | 3 +++ packages/core/.gitignore | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index fd5888e..dac8d9a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # python .venv .python-version +dist +*.egg-info +__pycache__ # misc cspell.json diff --git a/packages/core/.gitignore b/packages/core/.gitignore index 4ef250d..c91af9b 100644 --- a/packages/core/.gitignore +++ b/packages/core/.gitignore @@ -1,2 +1,7 @@ +# python +dist +*.egg-info +__pycache__ + # misc DS_STORE From 76e940f89106fd468b82cd9c1d3524437ae2e057 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 15 May 2025 20:54:26 +0900 Subject: [PATCH 14/56] Resolve import errors & Fixed typos --- packages/core/pyproject.toml | 3 +- packages/core/src/__init__.py | 4 +- packages/core/src/client.py | 12 ++-- packages/core/src/interfaces/__init__.py | 4 +- packages/core/src/jpyc.py | 72 +++++++++++----------- packages/core/src/utils/__init__.py | 16 ++--- packages/core/src/utils/abis.py | 4 +- packages/core/src/utils/addresses.py | 2 +- packages/core/src/utils/chains.py | 6 +- packages/core/src/utils/errors.py | 4 +- packages/core/src/utils/transactions.py | 2 +- uv.lock | 76 ++++++++++++------------ 12 files changed, 102 insertions(+), 103 deletions(-) diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 164e4e6..126e526 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -2,7 +2,7 @@ name = "jpyc-core-sdk" version = "1.0.0" requires-python = ">=3.11" -license = { text = "MIT" } +license = "MIT" description = "Python SDKs for JPYCv2 contracts" readme = "README.md" keywords = [ @@ -17,7 +17,6 @@ keywords = [ classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py index 7ec93b4..df53b0c 100644 --- a/packages/core/src/__init__.py +++ b/packages/core/src/__init__.py @@ -1,7 +1,7 @@ from importlib.metadata import version -from core.src.client import * -from core.src.jpyc import * +from .client import * +from .jpyc import * __version__ = version("jpyc-core-sdk") __all__ = [ diff --git a/packages/core/src/client.py b/packages/core/src/client.py index c597a05..b50ceac 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -2,15 +2,15 @@ from web3 import Account, HTTPProvider, Web3 from web3.middleware import ExtraDataToPOAMiddleware, SignAndSendRawMiddlewareBuilder -from core.src.interfaces import ISdkClient -from core.src.utils.chains import ( +from interfaces import ISdkClient +from utils.chains import ( get_default_rpc_endpoint, ) -from core.src.utils.constants import ( +from utils.constants import ( poa_middleware, sign_middleware, ) -from core.src.utils.errors import AccountNotInitialized +from utils.errors import AccountNotInitialized class SdkClient(ISdkClient): """SDK client.""" @@ -26,7 +26,7 @@ def __init__( Args: chain_name (str): Chain name network_name (str): Network name - private_key (str): private key of EOA + private_key (str | None): private key of EOA Raises: NetworkNotSupported: If the specified network is not supported by the SDK @@ -59,7 +59,7 @@ def __configure_w3( Returns: Web3: Configured web3 instance """ - w3 = Web3(HTTPProvider(Web3(HTTPProvider(rpc_endpoint)))) + w3 = Web3(HTTPProvider(rpc_endpoint)) w3.middleware_onion.inject( ExtraDataToPOAMiddleware, name=poa_middleware, diff --git a/packages/core/src/interfaces/__init__.py b/packages/core/src/interfaces/__init__.py index 32b4814..ed7877e 100644 --- a/packages/core/src/interfaces/__init__.py +++ b/packages/core/src/interfaces/__init__.py @@ -1,5 +1,5 @@ -from core.src.interfaces.client import * -from core.src.interfaces.jpyc import * +from .client import * +from .jpyc import * __all__ = [ "ISdkClient", diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 1a83887..37bad67 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -4,22 +4,22 @@ from eth_typing import ChecksumAddress from web3.contract.contract import ContractFunction -from core.src.interfaces import IJPYC, ISdkClient -from core.src.utils.abis import ( +from interfaces import IJPYC, ISdkClient +from utils.abis import ( get_abi, resolve_abi_file_path, ) -from core.src.utils.addresses import ( +from utils.addresses import ( get_proxy_address, ) -from core.src.utils.constants import sign_middleware -from core.src.utils.currencies import ( +from utils.constants import sign_middleware +from utils.currencies import ( remove_decimals, restore_decimals, ) -from core.src.utils.errors import AccountNotInitialized, TransactionSimulationFailed -from core.src.utils.transactions import catch_transaction_errors -from core.src.utils.types import ContractVersion +from utils.errors import AccountNotInitialized, TransactionSimulationFailed +from utils.transactions import catch_transaction_errors +from utils.types import ContractVersion class JPYC(IJPYC): """Implementation of IJPYC.""" @@ -74,26 +74,26 @@ def __simulate_transaction(self, contract_func: ContractFunction, func_args: dic ################## def is_minter(self, account: ChecksumAddress) -> bool: - return self.contact.functions.isMinter(account).call() + return self.contract.functions.isMinter(account).call() @restore_decimals def minter_allowance(self, minter: ChecksumAddress) -> Decimal: - return self.contact.functions.minterAllowance(minter).call() + return self.contract.functions.minterAllowance(minter).call() @restore_decimals def total_supply(self) -> Decimal: - return self.contact.functions.totalSupply().call() + return self.contract.functions.totalSupply().call() @restore_decimals def balance_of(self, account: ChecksumAddress) -> Decimal: - return self.contact.functions.balanceOf(account).call() + return self.contract.functions.balanceOf(account).call() @restore_decimals def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Decimal: - return self.contact.functions.allowance(owner, spender).call() + return self.contract.functions.allowance(owner, spender).call() def nonces(self, owner: ChecksumAddress) -> int: - return self.contact.functions.nonces(owner).call() + return self.contract.functions.nonces(owner).call() ###################### # Mutation functions # @@ -109,11 +109,11 @@ def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decim } self.__simulate_transaction( - contract_func=self.contact.functions.configureMinter, + contract_func=self.contract.functions.configureMinter, func_args=args ) - return self.contact.functions.configureMinter(**args).transact() + return self.contract.functions.configureMinter(**args).transact() @catch_transaction_errors def mint(self, to: ChecksumAddress, amount: Decimal) -> str: @@ -125,11 +125,11 @@ def mint(self, to: ChecksumAddress, amount: Decimal) -> str: } self.__simulate_transaction( - contract_func=self.contact.functions.mint, + contract_func=self.contract.functions.mint, func_args=args ) - return self.contact.functions.mint(**args).transact() + return self.contract.functions.mint(**args).transact() @catch_transaction_errors def transfer(self, to: ChecksumAddress, value: Decimal) -> str: @@ -141,11 +141,11 @@ def transfer(self, to: ChecksumAddress, value: Decimal) -> str: } self.__simulate_transaction( - contract_func=self.contact.functions.transfer, + contract_func=self.contract.functions.transfer, func_args=args ) - return self.contact.functions.transfer(**args).transact() + return self.contract.functions.transfer(**args).transact() @catch_transaction_errors def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Decimal) -> str: @@ -158,11 +158,11 @@ def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Deci } self.__simulate_transaction( - contract_func=self.contact.functions.transferFrom, + contract_func=self.contract.functions.transferFrom, func_args=args ) - return self.contact.functions.transferFrom(**args).transact() + return self.contract.functions.transferFrom(**args).transact() @catch_transaction_errors def transfer_with_authorization( @@ -192,11 +192,11 @@ def transfer_with_authorization( } self.__simulate_transaction( - contract_func=self.contact.functions.transferWithAuthorization, + contract_func=self.contract.functions.transferWithAuthorization, func_args=args ) - return self.contact.functions.transferWithAuthorization(**args).transact() + return self.contract.functions.transferWithAuthorization(**args).transact() @catch_transaction_errors def receive_with_authorization( @@ -226,11 +226,11 @@ def receive_with_authorization( } self.__simulate_transaction( - contract_func=self.contact.functions.receiveWithAuthorization, + contract_func=self.contract.functions.receiveWithAuthorization, func_args=args ) - return self.contact.functions.receiveWithAuthorization(**args).transact() + return self.contract.functions.receiveWithAuthorization(**args).transact() @catch_transaction_errors def cancel_authorization( @@ -252,11 +252,11 @@ def cancel_authorization( } self.__simulate_transaction( - contract_func=self.contact.functions.cancelAuthorization, + contract_func=self.contract.functions.cancelAuthorization, func_args=args ) - return self.contact.functions.cancelAuthorization(**args).transact() + return self.contract.functions.cancelAuthorization(**args).transact() @catch_transaction_errors def approve(self, spender: ChecksumAddress, value: Decimal) -> str: @@ -268,11 +268,11 @@ def approve(self, spender: ChecksumAddress, value: Decimal) -> str: } self.__simulate_transaction( - contract_func=self.contact.functions.approve, + contract_func=self.contract.functions.approve, func_args=args ) - return self.contact.functions.approve(**args).transact() + return self.contract.functions.approve(**args).transact() @catch_transaction_errors def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> str: @@ -284,11 +284,11 @@ def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> st } self.__simulate_transaction( - contract_func=self.contact.functions.increaseAllowance, + contract_func=self.contract.functions.increaseAllowance, func_args=args ) - return self.contact.functions.increaseAllowance(**args).transact() + return self.contract.functions.increaseAllowance(**args).transact() @catch_transaction_errors def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> str: @@ -300,11 +300,11 @@ def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> st } self.__simulate_transaction( - contract_func=self.contact.functions.decreaseAllowance, + contract_func=self.contract.functions.decreaseAllowance, func_args=args ) - return self.contact.functions.decreaseAllowance(**args).transact() + return self.contract.functions.decreaseAllowance(**args).transact() @catch_transaction_errors def permit( @@ -330,8 +330,8 @@ def permit( } self.__simulate_transaction( - contract_func=self.contact.functions.permit, + contract_func=self.contract.functions.permit, func_args=args ) - return self.contact.functions.permit(**args).transact() + return self.contract.functions.permit(**args).transact() diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 68cff5e..8477539 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -1,11 +1,11 @@ -from core.src.utils.abis import * -from core.src.utils.addresses import * -from core.src.utils.chains import * -from core.src.utils.constants import * -from core.src.utils.currencies import * -from core.src.utils.errors import * -from core.src.utils.transactions import * -from core.src.utils.types import * +from .abis import * +from .addresses import * +from .chains import * +from .constants import * +from .currencies import * +from .errors import * +from .transactions import * +from .types import * __all__ = [ # abi diff --git a/packages/core/src/utils/abis.py b/packages/core/src/utils/abis.py index 599b23a..a90bb33 100644 --- a/packages/core/src/utils/abis.py +++ b/packages/core/src/utils/abis.py @@ -2,7 +2,7 @@ from pathlib import Path from typing import Any -from core.src.utils.types import ContractVersion +from .types import ContractVersion def resolve_abi_file_path(contract_version: ContractVersion) -> str: """Resolve the path of ABI file from the specified contract version. @@ -13,7 +13,7 @@ def resolve_abi_file_path(contract_version: ContractVersion) -> str: Returns: str: Absolute path of ABI file """ - path = Path(__file__).parent.parent.joinpath("abis", f"v{contract_version}.json") + path = Path(__file__).parent.parent.parent.joinpath("abis", f"v{contract_version}.json") return path.absolute() diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py index d40d9a6..8f4f14b 100644 --- a/packages/core/src/utils/addresses.py +++ b/packages/core/src/utils/addresses.py @@ -8,7 +8,7 @@ from web3 import Web3 from web3.constants import ADDRESS_ZERO -from core.src.utils.types import ContractVersion +from .types import ContractVersion #################################### # Address-related helper functions # diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py index e68335b..ce553a2 100644 --- a/packages/core/src/utils/chains.py +++ b/packages/core/src/utils/chains.py @@ -1,7 +1,7 @@ from typing import Final -from core.src.utils.errors import NetworkNotSupported -from core.src.utils.types import ChainMetadata +from .errors import NetworkNotSupported +from .types import ChainMetadata ################## # Chain Metadata # @@ -120,4 +120,4 @@ def get_default_rpc_endpoint(chain_name: str, network_name: str) -> str: if not is_supported_network(chain_name, network_name): raise NetworkNotSupported(chain_name, network_name) - return SUPPORTED_CHAINS[chain_name][network_name].rpc_endpoints[0] + return SUPPORTED_CHAINS[chain_name][network_name]["rpc_endpoints"][0] diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 957bf2a..8bfef80 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -1,5 +1,3 @@ -from core.src.utils.chains import enumerate_supported_networks - class JpycSdkError(Exception): """Base class for any SDK-related errors.""" pass @@ -16,6 +14,8 @@ class NetworkNotSupported(JpycSdkError): network_name (str): Network name """ def __init__(self, chain_name: str, network_name: str): + from .chains import enumerate_supported_networks + super().__init__( f"Network '{chain_name}/{network_name}' is not supported. " f"Supported networks are: {enumerate_supported_networks()}" diff --git a/packages/core/src/utils/transactions.py b/packages/core/src/utils/transactions.py index 78c0d58..21e6b86 100644 --- a/packages/core/src/utils/transactions.py +++ b/packages/core/src/utils/transactions.py @@ -1,4 +1,4 @@ -from core.src.utils.errors import ( +from .errors import ( AccountNotInitialized, TransactionFailedToSend, TransactionSimulationFailed, diff --git a/uv.lock b/uv.lock index 326b900..67bb2a2 100644 --- a/uv.lock +++ b/uv.lock @@ -4,7 +4,7 @@ requires-python = ">=3.11" [manifest] members = [ - "core-sdk", + "jpyc-core-sdk", "jpyc-python-sdks", ] @@ -287,43 +287,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "core-sdk" -version = "1.0.0" -source = { virtual = "packages/core" } -dependencies = [ - { name = "pydantic" }, - { name = "python-dotenv" }, - { name = "web3" }, -] - -[package.dev-dependencies] -dev = [ - { name = "eth-typing" }, - { name = "mypy" }, - { name = "pytest" }, - { name = "pytest-cov" }, - { name = "ruff" }, - { name = "sphinx" }, -] - -[package.metadata] -requires-dist = [ - { name = "pydantic", specifier = ">=2.11.4" }, - { name = "python-dotenv", specifier = ">=1.1.0" }, - { name = "web3", specifier = ">=7.11.0" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "eth-typing", specifier = ">=5.2.1" }, - { name = "mypy", specifier = ">=1.15.0" }, - { name = "pytest", specifier = ">=8.3.5" }, - { name = "pytest-cov", specifier = ">=6.1.1" }, - { name = "ruff", specifier = ">=0.11.9" }, - { name = "sphinx", specifier = ">=8.2.3" }, -] - [[package]] name = "coverage" version = "7.8.0" @@ -684,6 +647,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "jpyc-core-sdk" +version = "1.0.0" +source = { virtual = "packages/core" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "web3" }, +] + +[package.dev-dependencies] +dev = [ + { name = "eth-typing" }, + { name = "mypy" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sphinx" }, +] + +[package.metadata] +requires-dist = [ + { name = "pydantic", specifier = ">=2.11.4" }, + { name = "python-dotenv", specifier = ">=1.1.0" }, + { name = "web3", specifier = ">=7.11.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "eth-typing", specifier = ">=5.2.1" }, + { name = "mypy", specifier = ">=1.15.0" }, + { name = "pytest", specifier = ">=8.3.5" }, + { name = "pytest-cov", specifier = ">=6.1.1" }, + { name = "ruff", specifier = ">=0.11.9" }, + { name = "sphinx", specifier = ">=8.2.3" }, +] + [[package]] name = "jpyc-python-sdks" version = "1.0.0" From 3f2c1a11faa1479953d0dd7be0b6ad78dbf7eba6 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Fri, 16 May 2025 05:26:42 +0900 Subject: [PATCH 15/56] Update dependencies --- packages/core/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 126e526..6dfb7bb 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -35,8 +35,8 @@ maintainers = [ { name = "SeiyaKobayashi", email = "eng@seiya.work" }, ] dependencies = [ + "eth-typing>=5.2.1", "pydantic>=2.11.4", - "python-dotenv>=1.1.0", "web3>=7.11.0", ] @@ -49,10 +49,10 @@ documentation = "https://github.com/jcam1/python-sdk/tree/main/docs" [dependency-groups] dev = [ - "eth-typing>=5.2.1", "mypy>=1.15.0", "pytest>=8.3.5", "pytest-cov>=6.1.1", + "python-dotenv>=1.1.0", "ruff>=0.11.9", "sphinx>=8.2.3", ] From fbc07cbb74b4d33d6059380ac71c1fc092d2beb3 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Fri, 16 May 2025 05:27:48 +0900 Subject: [PATCH 16/56] Add arg validation; refactor clients --- packages/core/src/client.py | 8 +- packages/core/src/jpyc.py | 421 ++++++++++++------------ packages/core/src/utils/__init__.py | 21 +- packages/core/src/utils/constants.py | 15 +- packages/core/src/utils/errors.py | 84 ++++- packages/core/src/utils/transactions.py | 24 -- packages/core/src/utils/validators.py | 94 ++++++ uv.lock | 8 +- 8 files changed, 424 insertions(+), 251 deletions(-) delete mode 100644 packages/core/src/utils/transactions.py create mode 100644 packages/core/src/utils/validators.py diff --git a/packages/core/src/client.py b/packages/core/src/client.py index b50ceac..94926f1 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -7,8 +7,8 @@ get_default_rpc_endpoint, ) from utils.constants import ( - poa_middleware, - sign_middleware, + POA_MIDDLEWARE, + SIGN_MIDDLEWARE, ) from utils.errors import AccountNotInitialized @@ -62,13 +62,13 @@ def __configure_w3( w3 = Web3(HTTPProvider(rpc_endpoint)) w3.middleware_onion.inject( ExtraDataToPOAMiddleware, - name=poa_middleware, + name=POA_MIDDLEWARE, layer=0, ) if account is not None: w3.middleware_onion.inject( SignAndSendRawMiddlewareBuilder.build(account), - name=sign_middleware, + name=SIGN_MIDDLEWARE, layer=0, ) diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 37bad67..6f7c34d 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -1,7 +1,6 @@ -from decimal import Decimal from typing import Any -from eth_typing import ChecksumAddress +from pydantic import validate_call from web3.contract.contract import ContractFunction from interfaces import IJPYC, ISdkClient @@ -12,14 +11,18 @@ from utils.addresses import ( get_proxy_address, ) -from utils.constants import sign_middleware +from utils.constants import SIGN_MIDDLEWARE from utils.currencies import ( remove_decimals, restore_decimals, ) -from utils.errors import AccountNotInitialized, TransactionSimulationFailed -from utils.transactions import catch_transaction_errors +from utils.errors import ( + AccountNotInitialized, + TransactionFailedToSend, + TransactionSimulationFailed, +) from utils.types import ContractVersion +from utils.validators import Bytes32, ChecksumAddress, Uint256, Uint8 class JPYC(IJPYC): """Implementation of IJPYC.""" @@ -43,8 +46,12 @@ def __init__( ) """Contract: Configured contract instance""" + ################## + # Helper methods # + ################## + def __account_initialized(self) -> None: - """Check if account is initialized. + """Checks if account is initialized. Note: An account must be set to web3 instance to send transactions. @@ -52,15 +59,19 @@ def __account_initialized(self) -> None: Raises: AccountNotInitialized: If account is not initialized """ - if sign_middleware not in self.client.w3.middleware_onion: + if SIGN_MIDDLEWARE not in self.client.w3.middleware_onion: raise AccountNotInitialized() def __simulate_transaction(self, contract_func: ContractFunction, func_args: dict[Any]) -> None: - """Simulate a transaction locally. + """Simulates a transaction locally. Note: This method should be called before sending actual transactions. + Args: + contract_func (ContractFunction): Contract function + func_args (dict[Any]): Arguments of contract function + Raises: TransactionSimulationFailed: If transaction simulation fails """ @@ -69,269 +80,273 @@ def __simulate_transaction(self, contract_func: ContractFunction, func_args: dic except Exception as e: raise TransactionSimulationFailed(e) + def __send_transaction(self, contract_func: ContractFunction, func_args: dict[Any]) -> Any: + """Sends a transaction to blockchain. + + Args: + contract_func (ContractFunction): Contract function + func_args (dict[Any]): Arguments of contract function + + Returns: + Any: Response from the contract function + + Raises: + TransactionFailedToSend: If it fails to send a transaction + """ + try: + return contract_func(**func_args).transact() + except Exception as e: + raise TransactionFailedToSend(e) + + def __transact(self, contract_func: ContractFunction, func_args: dict[Any]) -> Any: + """Helper method to prepare & send a transaction in one method. + + Args: + tx_args (TransactionArgs): Arguments necessary to send a transaction + + Returns: + Any: Response from the contract function + + Raises: + AccountNotInitialized: If account is not initialized + TransactionSimulationFailed: If transaction simulation fails + TransactionFailedToSend: If it fails to send a transaction + """ + + self.__account_initialized() + self.__simulate_transaction( + contract_func, + func_args, + ) + return self.__send_transaction( + contract_func, + func_args, + ) + ################## # View functions # ################## + @validate_call def is_minter(self, account: ChecksumAddress) -> bool: return self.contract.functions.isMinter(account).call() @restore_decimals - def minter_allowance(self, minter: ChecksumAddress) -> Decimal: + @validate_call + def minter_allowance(self, minter: ChecksumAddress) -> Uint256: return self.contract.functions.minterAllowance(minter).call() @restore_decimals - def total_supply(self) -> Decimal: + def total_supply(self) -> Uint256: return self.contract.functions.totalSupply().call() @restore_decimals - def balance_of(self, account: ChecksumAddress) -> Decimal: + @validate_call + def balance_of(self, account: ChecksumAddress) -> Uint256: return self.contract.functions.balanceOf(account).call() @restore_decimals - def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Decimal: + @validate_call + def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256: return self.contract.functions.allowance(owner, spender).call() - def nonces(self, owner: ChecksumAddress) -> int: + @validate_call + def nonces(self, owner: ChecksumAddress) -> Uint256: return self.contract.functions.nonces(owner).call() ###################### # Mutation functions # ###################### - @catch_transaction_errors - def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decimal) -> str: - self.__account_initialized() - - args = { - "minter": minter, - "minterAllowedAmount": remove_decimals(minter_allowed_amount), + @validate_call + def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Uint256) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.configureMinter, + "func_args": { + "minter": minter, + "minterAllowedAmount": remove_decimals(minter_allowed_amount), + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.configureMinter, - func_args=args - ) + return self.__transact(**tx_args) - return self.contract.functions.configureMinter(**args).transact() - - @catch_transaction_errors - def mint(self, to: ChecksumAddress, amount: Decimal) -> str: - self.__account_initialized() - - args = { - "to": to, - "amount": remove_decimals(amount), + @validate_call + def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.mint, + "func_args": { + "to": to, + "amount": remove_decimals(amount), + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.mint, - func_args=args - ) - - return self.contract.functions.mint(**args).transact() - - @catch_transaction_errors - def transfer(self, to: ChecksumAddress, value: Decimal) -> str: - self.__account_initialized() + return self.__transact(**tx_args) - args = { - "to": to, - "value": remove_decimals(value), + @validate_call + def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.transfer, + "func_args": { + "to": to, + "value": remove_decimals(value), + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.transfer, - func_args=args - ) - - return self.contract.functions.transfer(**args).transact() - - @catch_transaction_errors - def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Decimal) -> str: - self.__account_initialized() - - args = { - "from": from_, - "to": to, - "value": remove_decimals(value), + return self.__transact(**tx_args) + + @validate_call + def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.transferFrom, + "func_args": { + "from": from_, + "to": to, + "value": remove_decimals(value), + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.transferFrom, - func_args=args - ) + return self.__transact(**tx_args) - return self.contract.functions.transferFrom(**args).transact() - - @catch_transaction_errors + @validate_call def transfer_with_authorization( self, from_: ChecksumAddress, to: ChecksumAddress, - value: Decimal, - valid_after: int, - valid_before: int, - nonce: str, - v: int, - r: str, - s: str, - ) -> str: - self.__account_initialized() - - args = { - "from": from_, - "to": to, - "value": remove_decimals(value), - "validAfter": valid_after, - "validBefore": valid_before, - "nonce": nonce, - "v": v, - "r": r, - "s": s, + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.transferWithAuthorization, + "func_args": { + "from": from_, + "to": to, + "value": remove_decimals(value), + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.transferWithAuthorization, - func_args=args - ) + return self.__transact(**tx_args) - return self.contract.functions.transferWithAuthorization(**args).transact() - - @catch_transaction_errors + @validate_call def receive_with_authorization( self, from_: ChecksumAddress, to: ChecksumAddress, - value: Decimal, - valid_after: int, - valid_before: int, - nonce: str, - v: int, - r: str, - s: str, - ) -> str: - self.__account_initialized() - - args = { - "from": from_, - "to": to, - "value": remove_decimals(value), - "validAfter": valid_after, - "validBefore": valid_before, - "nonce": nonce, - "v": v, - "r": r, - "s": s, + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.receiveWithAuthorization, + "func_args": { + "from": from_, + "to": to, + "value": remove_decimals(value), + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.receiveWithAuthorization, - func_args=args - ) - - return self.contract.functions.receiveWithAuthorization(**args).transact() + return self.__transact(**tx_args) - @catch_transaction_errors + @validate_call def cancel_authorization( self, authorizer: ChecksumAddress, - nonce: str, - v: int, - r: str, - s: str, - ) -> str: - self.__account_initialized() - - args = { - "authorizer": authorizer, - "nonce": nonce, - "v": v, - "r": r, - "s": s, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.cancelAuthorization, + "func_args": { + "authorizer": authorizer, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.cancelAuthorization, - func_args=args - ) - - return self.contract.functions.cancelAuthorization(**args).transact() - - @catch_transaction_errors - def approve(self, spender: ChecksumAddress, value: Decimal) -> str: - self.__account_initialized() + return self.__transact(**tx_args) - args = { - "spender": spender, - "value": remove_decimals(value), + @validate_call + def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.approve, + "func_args": { + "spender": spender, + "value": remove_decimals(value), + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.approve, - func_args=args - ) - - return self.contract.functions.approve(**args).transact() + return self.__transact(**tx_args) - @catch_transaction_errors - def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> str: - self.__account_initialized() - - args = { - "spender": spender, - "increment": remove_decimals(increment), + @validate_call + def increase_allowance(self, spender: ChecksumAddress, increment: Uint256) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.increaseAllowance, + "func_args": { + "spender": spender, + "increment": remove_decimals(increment), + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.increaseAllowance, - func_args=args - ) - - return self.contract.functions.increaseAllowance(**args).transact() + return self.__transact(**tx_args) - @catch_transaction_errors - def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> str: - self.__account_initialized() - - args = { - "spender": spender, - "decrement": remove_decimals(decrement), + @validate_call + def decrease_allowance(self, spender: ChecksumAddress, decrement: Uint256) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.decreaseAllowance, + "func_args": { + "spender": spender, + "decrement": remove_decimals(decrement), + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.decreaseAllowance, - func_args=args - ) - - return self.contract.functions.decreaseAllowance(**args).transact() + return self.__transact(**tx_args) - @catch_transaction_errors + @validate_call def permit( self, owner: ChecksumAddress, spender: ChecksumAddress, - value: Decimal, - deadline: int, - v: int, - r: str, - s: str, - ) -> str: - self.__account_initialized() - - args = { - "owner": owner, - "spender": spender, - "value": remove_decimals(value), - "deadline": deadline, - "v": v, - "r": r, - "s": s, + value: Uint256, + deadline: Uint256, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args = { + "contract_func": self.contract.functions.permit, + "func_args": { + "owner": owner, + "spender": spender, + "value": remove_decimals(value), + "deadline": deadline, + "v": v, + "r": r, + "s": s, + }, } - self.__simulate_transaction( - contract_func=self.contract.functions.permit, - func_args=args - ) - - return self.contract.functions.permit(**args).transact() + return self.__transact(**tx_args) diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 8477539..8098c07 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -4,8 +4,8 @@ from .constants import * from .currencies import * from .errors import * -from .transactions import * from .types import * +from .validators import * __all__ = [ # abi @@ -23,20 +23,31 @@ "is_supported_network", "get_default_rpc_endpoint", # constants - "poa_middleware", - "sign_middleware", + "POA_MIDDLEWARE", + "SIGN_MIDDLEWARE", + "UINT_MIN", + "UINT256_MAX", + "UINT8_MAX", # currency "remove_decimals", "restore_decimals", # errors "NetworkNotSupported", "AccountNotInitialized", + "InvalidChecksumAddress", + "InvalidUint8", + "InvalidUint256", + "InvalidBytes32", "TransactionSimulationFailed", "TransactionFailedToSend", - # transactions - "catch_transaction_errors", # types "ChainName", "NetworkMetadata", "ContractVersion", + "TransactionArgs", + # validators + "ChecksumAddress" + "Bytes32", + "Uint256", + "Uint8", ] diff --git a/packages/core/src/utils/constants.py b/packages/core/src/utils/constants.py index 2f6346f..204059a 100644 --- a/packages/core/src/utils/constants.py +++ b/packages/core/src/utils/constants.py @@ -1,10 +1,21 @@ from typing import Final +######## +# Math # +######## + +UINT_MIN: Final[int] = 0 +"""int: Minimum value of uint.""" +UINT8_MAX: Final[int] = 255 +"""int: Maximum value of uint8.""" +UINT256_MAX: Final[int] = 115792089237316195423570985008687907853269984665640564039457584007913129639935 +"""int: Maximum value of uint256.""" + #################### # Middleware Names # #################### -poa_middleware: Final[str] = "poa_middleware" +POA_MIDDLEWARE: Final[str] = "poa_middleware" """str: Name of POA compatibility middleware.""" -sign_middleware: Final[str] = "sign_middleware" +SIGN_MIDDLEWARE: Final[str] = "sign_middleware" """str: Name of auto-signature middleware.""" diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 8bfef80..0a29c78 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -1,6 +1,11 @@ class JpycSdkError(Exception): - """Base class for any SDK-related errors.""" - pass + """A base class for any errors related to JPYC SDK.""" + def __init__(self, code: int, message: str): + self.code = code + """int: Custom error code""" + self.message = message + """str: Error message""" + super().__init__(f"\nError Code: {code}\nMessage: {message}") ################# # Config Errors # @@ -13,18 +18,69 @@ class NetworkNotSupported(JpycSdkError): chain_name (str): Chain name network_name (str): Network name """ + code = 100 + def __init__(self, chain_name: str, network_name: str): from .chains import enumerate_supported_networks super().__init__( - f"Network '{chain_name}/{network_name}' is not supported. " - f"Supported networks are: {enumerate_supported_networks()}" + code=NetworkNotSupported.code, + message=f"Network '{chain_name}/{network_name}' is not supported. " + f"Supported networks are: {enumerate_supported_networks()}" ) class AccountNotInitialized(JpycSdkError): """Raised when account is not initialized or hoisted to web3 instance.""" + code = 101 + def __init__(self): - super().__init__("Account is not initialized.") + super().__init__( + code=AccountNotInitialized.code, + message="Account is not initialized.", + ) + +##################### +# Validation Errors # +##################### +class InvalidChecksumAddress(JpycSdkError, TypeError): + """Raised when the given address is not a valid checksum address.""" + code = 200 + + def __init__(self, message_: str): + super().__init__( + code=InvalidChecksumAddress.code, + message=f"Invalid checksum address: {message_}. Address must be compatible with EIP55.", + ) + +class InvalidUint8(JpycSdkError, TypeError): + """Raised when the given integer is not a valid uint8.""" + code = 201 + + def __init__(self, message_: str): + super().__init__( + code=InvalidUint8.code, + message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.", + ) + +class InvalidUint256(JpycSdkError, TypeError): + """Raised when the given integer is not a valid uint256.""" + code = 202 + + def __init__(self, message_: str): + super().__init__( + code=InvalidUint256.code, + message=f"Invalid uint256: {message_}. Integer must be between 0 ~ 2^256 - 1.", + ) + +class InvalidBytes32(JpycSdkError, TypeError): + """Raised when the given byte string is not a valid bytes32.""" + code = 203 + + def __init__(self, message_: str): + super().__init__( + code=InvalidBytes32.code, + message=f"Invalid bytes32: {message_}.", + ) ###################### # Transaction Errors # @@ -36,8 +92,13 @@ class TransactionSimulationFailed(JpycSdkError): Attributes: message (str): Error message """ - def __init__(self, message: str): - super().__init__(f"Failed to simulate a transaction locally: '{message}") + code = 300 + + def __init__(self, message_: str): + super().__init__( + code=TransactionSimulationFailed.code, + message=f"Failed to simulate a transaction locally: {message_}", + ) class TransactionFailedToSend(JpycSdkError): """Raised when it fails to send a transaction. @@ -45,5 +106,10 @@ class TransactionFailedToSend(JpycSdkError): Attributes: message (str): Error message """ - def __init__(self, message: str): - super().__init__(f"Failed to send a transaction: '{message}") + code = 301 + + def __init__(self, message_: str): + super().__init__( + code=TransactionFailedToSend.code, + message=f"Failed to send a transaction: {message_}", + ) diff --git a/packages/core/src/utils/transactions.py b/packages/core/src/utils/transactions.py deleted file mode 100644 index 21e6b86..0000000 --- a/packages/core/src/utils/transactions.py +++ /dev/null @@ -1,24 +0,0 @@ -from .errors import ( - AccountNotInitialized, - TransactionFailedToSend, - TransactionSimulationFailed, -) - -def catch_transaction_errors(func): - """Decorator to catch any transaction errors. - - Raises: - AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction - """ - def wrapper(*args, **kwargs): - try: - func(*args, **kwargs) - except AccountNotInitialized: - raise AccountNotInitialized() - except TransactionSimulationFailed as e: - raise TransactionSimulationFailed(e) - except Exception as e: - raise TransactionFailedToSend(e) - - return wrapper diff --git a/packages/core/src/utils/validators.py b/packages/core/src/utils/validators.py new file mode 100644 index 0000000..20ecaeb --- /dev/null +++ b/packages/core/src/utils/validators.py @@ -0,0 +1,94 @@ +from typing import Annotated + +from pydantic.functional_validators import AfterValidator +from web3 import Web3 + +from .constants import UINT256_MAX, UINT8_MAX, UINT_MIN +from .errors import ( + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint8, + InvalidUint256, +) + +def validate_checksum_address(address: str) -> str: + """Checks if the given address is a checksum address. + + Args: + address (str): Address string + + Returns: + str: Address string + + Raises: + InvalidChecksumAddress: If the address is not a valid checksum address + """ + if not Web3.is_checksum_address(address): + raise InvalidChecksumAddress(address) + + return address + +ChecksumAddress = Annotated[str, AfterValidator(validate_checksum_address)] +"""A type that contains a checksum address. See `EIP55 `_ for more details.""" + +def validate_uint8(integer: int) -> int: + """Checks if the given integer is a uint8. + + Args: + integer (int): Integer + + Returns: + int: Integer + + Raises: + InvalidUint8: If the integer is not a valid uint8 + """ + if integer < UINT_MIN or UINT8_MAX < integer: + raise InvalidUint8(integer) + + return integer + +Uint8 = Annotated[int, AfterValidator(validate_uint8)] +"""A type that contains a uint8.""" + +def validate_uint256(integer: int) -> int: + """Checks if the given integer is a uint256. + + Args: + integer (int): Integer + + Returns: + int: Integer + + Raises: + InvalidUint256: If the integer is not a valid uint256 + """ + if integer < UINT_MIN or UINT256_MAX < integer: + raise InvalidUint256(integer) + + return integer + +Uint256 = Annotated[int, AfterValidator(validate_uint256)] +"""A type that contains a uint256.""" + +def validate_bytes32(string: str) -> str: + """Checks if the given string is bytes32. + + Args: + string (str): String + + Returns: + str: String + + Raises: + InvalidBytes32: If the string is not a valid bytes32 + """ + try: + assert len(bytes.fromhex(string)) == 32 + except Exception: + raise InvalidBytes32(string) + + return string + +Bytes32 = Annotated[str, AfterValidator(validate_bytes32)] +"""A type that contains a bytes32.""" diff --git a/uv.lock b/uv.lock index 67bb2a2..98120c6 100644 --- a/uv.lock +++ b/uv.lock @@ -652,34 +652,34 @@ name = "jpyc-core-sdk" version = "1.0.0" source = { virtual = "packages/core" } dependencies = [ + { name = "eth-typing" }, { name = "pydantic" }, - { name = "python-dotenv" }, { name = "web3" }, ] [package.dev-dependencies] dev = [ - { name = "eth-typing" }, { name = "mypy" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "python-dotenv" }, { name = "ruff" }, { name = "sphinx" }, ] [package.metadata] requires-dist = [ + { name = "eth-typing", specifier = ">=5.2.1" }, { name = "pydantic", specifier = ">=2.11.4" }, - { name = "python-dotenv", specifier = ">=1.1.0" }, { name = "web3", specifier = ">=7.11.0" }, ] [package.metadata.requires-dev] dev = [ - { name = "eth-typing", specifier = ">=5.2.1" }, { name = "mypy", specifier = ">=1.15.0" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-cov", specifier = ">=6.1.1" }, + { name = "python-dotenv", specifier = ">=1.1.0" }, { name = "ruff", specifier = ">=0.11.9" }, { name = "sphinx", specifier = ">=8.2.3" }, ] From 5a79f6fb1522344f1613d3a12f23d1eb16d568f6 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Sat, 17 May 2025 15:40:09 +0900 Subject: [PATCH 17/56] Rename & refactor artifacts-related utils --- packages/core/abis/v2.json | 1251 ------------------ packages/core/{abis => artifacts}/README.md | 6 +- packages/core/artifacts/v2.json | 1254 +++++++++++++++++++ packages/core/src/utils/abis.py | 30 - packages/core/src/utils/artifacts.py | 30 + 5 files changed, 1287 insertions(+), 1284 deletions(-) delete mode 100644 packages/core/abis/v2.json rename packages/core/{abis => artifacts}/README.md (56%) create mode 100644 packages/core/artifacts/v2.json delete mode 100644 packages/core/src/utils/abis.py create mode 100644 packages/core/src/utils/artifacts.py diff --git a/packages/core/abis/v2.json b/packages/core/abis/v2.json deleted file mode 100644 index 23da514..0000000 --- a/packages/core/abis/v2.json +++ /dev/null @@ -1,1251 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationUsed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "Blocklisted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newBlocklister", - "type": "address" - } - ], - "name": "BlocklisterChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "burner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Burn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Mint", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newMinterAdmin", - "type": "address" - } - ], - "name": "MinterAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "MinterConfigured", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "oldMinter", - "type": "address" - } - ], - "name": "MinterRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Pause", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "PauserChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "RescuerChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "UnBlocklisted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Unpause", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "inputs": [], - "name": "CANCEL_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "_domainSeparatorV4", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "authorizationState", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "blocklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "blocklister", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "cancelAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "configureMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "currency", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "decrement", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "increment", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "tokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenCurrency", - "type": "string" - }, - { - "internalType": "uint8", - "name": "tokenDecimals", - "type": "uint8" - }, - { - "internalType": "address", - "name": "newMinterAdmin", - "type": "address" - }, - { - "internalType": "address", - "name": "newPauser", - "type": "address" - }, - { - "internalType": "address", - "name": "newBlocklister", - "type": "address" - }, - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "isBlocklisted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "minterAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "minterAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pauser", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "receiveWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "removeMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "tokenContract", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "rescueERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rescuer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "transferWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "unBlocklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newBlocklister", - "type": "address" - } - ], - "name": "updateBlocklister", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newMinterAdmin", - "type": "address" - } - ], - "name": "updateMinterAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newPauser", - "type": "address" - } - ], - "name": "updatePauser", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "updateRescuer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/core/abis/README.md b/packages/core/artifacts/README.md similarity index 56% rename from packages/core/abis/README.md rename to packages/core/artifacts/README.md index 381ae54..f757b5a 100644 --- a/packages/core/abis/README.md +++ b/packages/core/artifacts/README.md @@ -1,10 +1,10 @@ -# ABIs +# Artifacts -This directory contains the auto-generated ABIs of JPYC's [core contracts](https://github.com/jcam1/JPYCv2). +This directory contains the auto-generated artifacts of JPYC's [core contracts](https://github.com/jcam1/JPYCv2). ## 📚 Available Versions | Version | File | Description | | ---------------: | :----------------------------------------------------- | :----------------------------------------------------- | | `v3` | n/a | Coming Soon | -| `v2` | [`v2.json`](./v2.json) | ABI of JPYCv2 contracts (**latest**) | +| `v2` | [`v2.json`](./v2.json) | Artifacts of JPYCv2 contracts (**latest**) | diff --git a/packages/core/artifacts/v2.json b/packages/core/artifacts/v2.json new file mode 100644 index 0000000..45ab6cb --- /dev/null +++ b/packages/core/artifacts/v2.json @@ -0,0 +1,1254 @@ +{ + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationUsed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "Blocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newBlocklister", + "type": "address" + } + ], + "name": "BlocklisterChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "burner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" + } + ], + "name": "MinterAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "MinterConfigured", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldMinter", + "type": "address" + } + ], + "name": "MinterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "PauserChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "RescuerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "UnBlocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "CANCEL_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_domainSeparatorV4", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "authorizationState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "blocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "blocklister", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "cancelAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "configureMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "currency", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "decrement", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "increment", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenName", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenSymbol", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenCurrency", + "type": "string" + }, + { + "internalType": "uint8", + "name": "tokenDecimals", + "type": "uint8" + }, + { + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "newPauser", + "type": "address" + }, + { + "internalType": "address", + "name": "newBlocklister", + "type": "address" + }, + { + "internalType": "address", + "name": "newRescuer", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isBlocklisted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minterAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "minterAllowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "receiveWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "removeMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "tokenContract", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "rescueERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rescuer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "transferWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "unBlocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newBlocklister", + "type": "address" + } + ], + "name": "updateBlocklister", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newMinterAdmin", + "type": "address" + } + ], + "name": "updateMinterAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauser", + "type": "address" + } + ], + "name": "updatePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "updateRescuer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x60a0604052306080523480156200001557600080fd5b50620000213362000027565b62000077565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b608051614e33620000af600039600081816111da0152818161127001528181611f0e01528181611fa4015261209f0152614e336000f3fe6080604052600436106103295760003560e01c80637ecebe00116101a5578063aa271e1a116100ec578063e3ee160e11610095578063e94a01021161006f578063e94a0102146109d7578063ef55bec614610a1e578063f2fde38b14610a3e578063f9b5aa9214610a5e57600080fd5b8063e3ee160e14610982578063e5a6b10f146109a2578063e5c7160b146109b757600080fd5b8063d505accf116100c6578063d505accf146108e7578063d916948714610907578063dd62ed3e1461093b57600080fd5b8063aa271e1a1461086d578063b2118a8d146108a7578063b54d9497146108c757600080fd5b806395d89b411161014e578063a457c2d711610128578063a457c2d71461080c578063a754d48f1461082c578063a9059cbb1461084d57600080fd5b806395d89b41146107a35780639fd0506d146107b8578063a0cc6a68146107d857600080fd5b80638a6db9c31161017f5780638a6db9c3146107155780638da5cb5b1461074c5780638e204c431461076a57600080fd5b80637ecebe00146106955780637f2eecc3146106cc5780638456cb591461070057600080fd5b80633f4ba83a1161027457806352d1902d1161021d5780635c975abb116101f75780635c975abb1461060857806370a082311461062957806374ebf673146106605780637b134b4c1461068057600080fd5b806352d1902d146105b3578063554bab3c146105c85780635a049a70146105e857600080fd5b8063439531fd1161024e578063439531fd146105605780634e44d956146105805780634f1ef286146105a057600080fd5b80633f4ba83a1461050b57806340c10f191461052057806342966c681461054057600080fd5b806330adf81f116102d65780633659cfe6116102b05780633659cfe61461049357806338a63183146104b357806339509351146104eb57600080fd5b806330adf81f1461040b578063313ce5671461043f57806331b230201461047357600080fd5b806323b872dd1161030757806323b872dd146103a95780632ab60045146103c95780633092afd5146103eb57600080fd5b806306fdde031461032e578063095ea7b31461035957806318160ddd14610389575b600080fd5b34801561033a57600080fd5b50610343610a7e565b604051610350919061481c565b60405180910390f35b34801561036557600080fd5b5061037961037436600461486f565b610b0d565b6040519015158152602001610350565b34801561039557600080fd5b50610202545b604051908152602001610350565b3480156103b557600080fd5b506103796103c436600461489b565b610c59565b3480156103d557600080fd5b506103e96103e43660046148dc565b610eed565b005b3480156103f757600080fd5b506103796104063660046148dc565b611029565b34801561041757600080fd5b5061039b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b57600080fd5b506102035461046190600160a01b900460ff1681565b60405160ff9091168152602001610350565b34801561047f57600080fd5b506103e961048e3660046148dc565b61110b565b34801561049f57600080fd5b506103e96104ae3660046148dc565b6111cf565b3480156104bf57600080fd5b50609a546104d3906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b3480156104f757600080fd5b5061037961050636600461486f565b61136d565b34801561051757600080fd5b506103e96114a9565b34801561052c57600080fd5b5061037961053b36600461486f565b61157c565b34801561054c57600080fd5b506103e961055b3660046148f9565b6119a7565b34801561056c57600080fd5b506103e961057b3660046148dc565b611c89565b34801561058c57600080fd5b5061037961059b36600461486f565b611dc6565b6103e96105ae3660046149b7565b611f03565b3480156105bf57600080fd5b5061039b612092565b3480156105d457600080fd5b506103e96105e33660046148dc565b612157565b3480156105f457600080fd5b506103e9610603366004614a2c565b612293565b34801561061457600080fd5b5060335461037990600160a01b900460ff1681565b34801561063557600080fd5b5061039b6106443660046148dc565b6001600160a01b03166000908152610204602052604090205490565b34801561066c57600080fd5b506103e961067b366004614a9c565b6122f4565b34801561068c57600080fd5b5061039b612838565b3480156106a157600080fd5b5061039b6106b03660046148dc565b6001600160a01b03166000908152610168602052604090205490565b3480156106d857600080fd5b5061039b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b34801561070c57600080fd5b506103e96129de565b34801561072157600080fd5b5061039b6107303660046148dc565b6001600160a01b03166000908152610207602052604090205490565b34801561075857600080fd5b506000546001600160a01b03166104d3565b34801561077657600080fd5b506103796107853660046148dc565b6001600160a01b031660009081526067602052604090205460011490565b3480156107af57600080fd5b50610343612ab7565b3480156107c457600080fd5b506033546104d3906001600160a01b031681565b3480156107e457600080fd5b5061039b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b34801561081857600080fd5b5061037961082736600461486f565b612ac5565b34801561083857600080fd5b50610203546104d3906001600160a01b031681565b34801561085957600080fd5b5061037961086836600461486f565b612c01565b34801561087957600080fd5b506103796108883660046148dc565b6001600160a01b03166000908152610206602052604090205460ff1690565b3480156108b357600080fd5b506103e96108c236600461489b565b612d3d565b3480156108d357600080fd5b506066546104d3906001600160a01b031681565b3480156108f357600080fd5b506103e9610902366004614b89565b612e4e565b34801561091357600080fd5b5061039b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b34801561094757600080fd5b5061039b610956366004614bf7565b6001600160a01b0391821660009081526102056020908152604080832093909416825291909152205490565b34801561098e57600080fd5b506103e961099d366004614c30565b612fa1565b3480156109ae57600080fd5b506103436130f8565b3480156109c357600080fd5b506103e96109d23660046148dc565b613106565b3480156109e357600080fd5b506103796109f236600461486f565b6001600160a01b0391909116600090815261013560209081526040808320938352929052205460011490565b348015610a2a57600080fd5b506103e9610a39366004614c30565b6131cb565b348015610a4a57600080fd5b506103e9610a593660046148dc565b613315565b348015610a6a57600080fd5b506103e9610a793660046148dc565b613403565b6101ff8054610a8c90614cb2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614cb2565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b603354600090600160a01b900460ff1615610b625760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b3360008181526067602052604090205415610bcd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015610c435760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e33868661353f565b506001949350505050565b603354600090600160a01b900460ff1615610ca95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415610d145760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610d8a5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610e005760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0387166000908152610205602090815260408083203384529091529020546000198114610ed45785811015610ea45760405162461bcd60e51b815260206004820152602c60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f647320616c6c6f77616e636500000000000000000000000000000000000000006064820152608401610b59565b610eae8682614d35565b6001600160a01b0389166000908152610205602090815260408083203384529091529020555b610edf888888613691565b506001979650505050505050565b33610f006000546001600160a01b031690565b6001600160a01b031614610f565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116610fd25760405162461bcd60e51b815260206004820152602a60248201527f526573637561626c653a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b609a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610203546000906001600160a01b031633146110ad5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038216600081815261020660209081526040808320805460ff19169055610207909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b6066546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038116600081815260676020526040808220829055517fbc3fe0fc667d12a7a22748747f024a7d971127ffc48f6622675d3e97a2591a519190a250565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561126e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113455760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b61134e816138b7565b6040805160008082526020820190925261136a91839190613920565b50565b603354600090600160a01b900460ff16156113bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b33600081815260676020526040902054156114285760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b03841660009081526067602052604090205484901561149e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613ac5565b6033546001600160a01b031633146115295760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b603354600090600160a01b900460ff16156115cc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff166116525760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b33600081815260676020526040902054156116bd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0384166000908152606760205260409020548490156117335760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0385166117af5760405162461bcd60e51b815260206004820152602360248201527f46696174546f6b656e3a206d696e7420746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b59565b600084116118255760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206d696e7420616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b3360009081526102076020526040902054808511156118ac5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d60448201527f696e746572416c6c6f77616e63650000000000000000000000000000000000006064820152608401610b59565b84610202546118bb9190614d4c565b610202556001600160a01b038616600090815261020460205260409020546118e4908690614d4c565b6001600160a01b038716600090815261020460205260409020556119088582614d35565b336000818152610207602090815260409182902093909355518781526001600160a01b038916927fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8910160405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b603354600160a01b900460ff16156119f45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff16611a7a5760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b3360008181526067602052604090205415611ae55760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b336000908152610204602052604090205482611b695760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206275726e20616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b82811015611bdf5760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a206275726e20616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b59565b8261020254611bee9190614d35565b61020255611bfc8382614d35565b3360008181526102046020526040908190209290925590517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590611c439086815260200190565b60405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b33611c9c6000546001600160a01b031690565b6001600160a01b031614611cf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116611d6e5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b610203805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4e6db312b79f0cdadbee5f76e2473786c1e81cba2356eacccc2aa5b5e6e3664c90600090a250565b603354600090600160a01b900460ff1615611e165760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b610203546001600160a01b03163314611e975760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038316600081815261020660209081526040808320805460ff1916600117905561020782529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611fa25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146120795760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b612082826138b7565b61208e82826001613920565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121325760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b59565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3361216a6000546001600160a01b031690565b6001600160a01b0316146121c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b03811661223c5760405162461bcd60e51b815260206004820152602860248201527f5061757361626c653a206e65772070617573657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b603354600160a01b900460ff16156122e05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6122ed8585858585613b04565b5050505050565b610203547501000000000000000000000000000000000000000000900460ff16156123875760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a20636f6e747261637420697320616c7265616479206960448201527f6e697469616c697a6564000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0385166124035760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03841661247f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206e65772070617573657220697320746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0383166124fb5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e657720626c6f636b6c697374657220697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166125775760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0381166125f35760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a206e6577206f776e657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b8851612607906101ff9060208c0190614757565b50875161261c906102009060208b0190614757565b508651612631906102019060208a0190614757565b5061020380547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b60ff89160273ffffffffffffffffffffffffffffffffffffffff19908116919091176001600160a01b0388811691909117909255603380548216878416179055606680548216868416179055609a80549091169184169190911790556126c381613c25565b30600081815260676020908152604091829020600190819055825180840184529081527f3100000000000000000000000000000000000000000000000000000000000000908201528b518c82012082517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81840152808401919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082015260a0808201949094528251808203909401845260c001909152815191012060ff55466101005588516127a5906101019060208c0190614757565b506040805180820190915260018082527f310000000000000000000000000000000000000000000000000000000000000060209092019182526127eb9161010291614757565b505061020380547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555050505050505050565b60006101005446141561284c575060ff5490565b6129d9610101805461285d90614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461288990614cb2565b80156128d65780601f106128ab576101008083540402835291602001916128d6565b820191906000526020600020905b8154815290600101906020018083116128b957829003601f168201915b505050505061010280546128e990614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461291590614cb2565b80156129625780601f1061293757610100808354040283529160200191612962565b820191906000526020600020905b81548152906001019060200180831161294557829003601f168201915b50505050508151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b905090565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6102008054610a8c90614cb2565b603354600090600160a01b900460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612b805760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612bf65760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613c82565b603354600090600160a01b900460ff1615612c515760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612cbc5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612d325760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613691565b609a546001600160a01b03163314612dbc5760405162461bcd60e51b8152602060048201526024808201527f526573637561626c653a2063616c6c6572206973206e6f74207468652072657360448201527f63756572000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190614d64565b50505050565b603354600160a01b900460ff1615612e9b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b038716600090815260676020526040902054879015612f115760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038716600090815260676020526040902054879015612f875760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b612f9689898989898989613d2e565b505050505050505050565b603354600160a01b900460ff1615612fee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b0389166000908152606760205260409020548990156130645760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156130da5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613e99565b5050505050505050505050565b6102018054610a8c90614cb2565b6066546001600160a01b031633146131865760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03811660008181526067602052604080822060019055517f917c251bb231c4b997a420bebe47edad5c20e70715da16c38e9b2e172e44ab929190a250565b603354600160a01b900460ff16156132185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b03891660009081526067602052604090205489901561328e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156133045760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613faa565b336133286000546001600160a01b031690565b6001600160a01b03161461337e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166133fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b61136a81613c25565b336134166000546001600160a01b031690565b6001600160a01b03161461346c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166134e85760405162461bcd60e51b815260206004820152603260248201527f426c6f636b6c69737461626c653a206e657720626c6f636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610b59565b6066805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f68f10ceb42d30acc930aaaedf5b94559e14fc4f22496dc2c1b38b1b1b5231f9890600090a250565b6001600160a01b0383166135bb5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a20617070726f76652066726f6d20746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166136375760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a20617070726f766520746f20746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038381166000818152610205602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611c7c565b6001600160a01b03831661370d5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a207472616e736665722066726f6d20746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166137895760405162461bcd60e51b815260206004820152602760248201527f46696174546f6b656e3a207472616e7366657220746f20746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03831660009081526102046020526040902054808211156138195760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f64732062616c616e6365000000000000000000000000000000000000000000006064820152608401610b59565b6138238282614d35565b6001600160a01b03808616600090815261020460205260408082209390935590851681522054613854908390614d4c565b6001600160a01b038085166000818152610204602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138a99086815260200190565b60405180910390a350505050565b336138ca6000546001600160a01b031690565b6001600160a01b03161461136a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561395857613953836140a0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156139b2575060408051601f3d908101601f191682019092526139af91810190614d86565b60015b613a245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114613ab95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610b59565b50613953838383614162565b6001600160a01b03808416600090815261020560209081526040808320938616835292905220546139539084908490613aff908590614d4c565b61353f565b613b0e8585614187565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b038716818301819052606080830188905283518084039091018152608090920190925290613b77613b6e612838565b8686868661421f565b6001600160a01b031614613bcd5760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b6001600160a01b03861660008181526101356020908152604080832089845290915280822060019055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084166000908152610205602090815260408083209386168352929052205480821115613d1f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610b59565b612e488484613aff8585614d35565b42841015613d7e5760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a207065726d697420697320657870697265640000000000006044820152606401610b59565b6001600160a01b03871660009081526101686020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a919086613dcc83614d9f565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040529050876001600160a01b0316613e2e613b6e612838565b6001600160a01b031614613e845760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613e8f88888861353f565b5050505050505050565b613ea58985888861429c565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e08101859052600090610100015b6040516020818303038152906040529050896001600160a01b0316613f33613b6e612838565b6001600160a01b031614613f895760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613f938a86614390565b613f9e8a8a8a613691565b50505050505050505050565b6001600160a01b03881633146140285760405162461bcd60e51b815260206004820152602160248201527f454950333030393a2063616c6c6572206d75737420626520746865207061796560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6140348985888861429c565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e0810185905260009061010001613f0d565b803b6141145760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61416b836143e4565b6000825111806141785750805b1561395357612e488383614424565b6001600160a01b0382166000908152610135602090815260408083208484529091529020541561208e5760405162461bcd60e51b815260206004820152602a60248201527f454950333030393a20617574686f72697a6174696f6e2069732075736564206f60448201527f722063616e63656c6564000000000000000000000000000000000000000000006064820152608401610b59565b60008086838051906020012060405160200161426d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061429181878787614450565b979650505050505050565b8142116143115760405162461bcd60e51b815260206004820152602760248201527f454950333030393a20617574686f72697a6174696f6e206973206e6f7420796560448201527f742076616c6964000000000000000000000000000000000000000000000000006064820152608401610b59565b8042106143865760405162461bcd60e51b815260206004820152602160248201527f454950333030393a20617574686f72697a6174696f6e2069732065787069726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b612e488484614187565b6001600160a01b03821660008181526101356020908152604080832085845290915280822060019055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6143ed816140a0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606144498383604051806060016040528060278152602001614dd760279139614633565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156144e85760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027732760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b8360ff16601b1415801561450057508360ff16601c14155b156145735760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027762760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156145c7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661462a5760405162461bcd60e51b815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e6174757265000000006044820152606401610b59565b95945050505050565b6060833b6146a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610b59565b600080856001600160a01b0316856040516146c49190614dba565b600060405180830381855af49150503d80600081146146ff576040519150601f19603f3d011682016040523d82523d6000602084013e614704565b606091505b509150915061471482828661471e565b9695505050505050565b6060831561472d575081614449565b82511561473d5782518084602001fd5b8160405162461bcd60e51b8152600401610b59919061481c565b82805461476390614cb2565b90600052602060002090601f01602090048101928261478557600085556147cb565b82601f1061479e57805160ff19168380011785556147cb565b828001600101855582156147cb579182015b828111156147cb5782518255916020019190600101906147b0565b506147d79291506147db565b5090565b5b808211156147d757600081556001016147dc565b60005b8381101561480b5781810151838201526020016147f3565b83811115612e485750506000910152565b602081526000825180602084015261483b8160408501602087016147f0565b601f01601f19169190910160400192915050565b6001600160a01b038116811461136a57600080fd5b80356111068161484f565b6000806040838503121561488257600080fd5b823561488d8161484f565b946020939093013593505050565b6000806000606084860312156148b057600080fd5b83356148bb8161484f565b925060208401356148cb8161484f565b929592945050506040919091013590565b6000602082840312156148ee57600080fd5b81356144498161484f565b60006020828403121561490b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561495c5761495c614912565b604051601f8501601f19908116603f0116810190828211818310171561498457614984614912565b8160405280935085815286868601111561499d57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156149ca57600080fd5b82356149d58161484f565b9150602083013567ffffffffffffffff8111156149f157600080fd5b8301601f81018513614a0257600080fd5b614a1185823560208401614941565b9150509250929050565b803560ff8116811461110657600080fd5b600080600080600060a08688031215614a4457600080fd5b8535614a4f8161484f565b945060208601359350614a6460408701614a1b565b94979396509394606081013594506080013592915050565b600082601f830112614a8d57600080fd5b61444983833560208501614941565b60008060008060008060008060006101208a8c031215614abb57600080fd5b893567ffffffffffffffff80821115614ad357600080fd5b614adf8d838e01614a7c565b9a5060208c0135915080821115614af557600080fd5b614b018d838e01614a7c565b995060408c0135915080821115614b1757600080fd5b50614b248c828d01614a7c565b975050614b3360608b01614a1b565b9550614b4160808b01614864565b9450614b4f60a08b01614864565b9350614b5d60c08b01614864565b9250614b6b60e08b01614864565b9150614b7a6101008b01614864565b90509295985092959850929598565b600080600080600080600060e0888a031215614ba457600080fd5b8735614baf8161484f565b96506020880135614bbf8161484f565b95506040880135945060608801359350614bdb60808901614a1b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614c0a57600080fd5b8235614c158161484f565b91506020830135614c258161484f565b809150509250929050565b60008060008060008060008060006101208a8c031215614c4f57600080fd5b8935614c5a8161484f565b985060208a0135614c6a8161484f565b975060408a0135965060608a0135955060808a0135945060a08a01359350614c9460c08b01614a1b565b925060e08a013591506101008a013590509295985092959850929598565b600181811c90821680614cc657607f821691505b60208210811415614d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d4757614d47614d06565b500390565b60008219821115614d5f57614d5f614d06565b500190565b600060208284031215614d7657600080fd5b8151801515811461444957600080fd5b600060208284031215614d9857600080fd5b5051919050565b6000600019821415614db357614db3614d06565b5060010190565b60008251614dcc8184602087016147f0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088b0c5194b9eca0801c00f098997e6c9042e68a8d796e28173d6611567e0d9a464736f6c634300080b0033" +} diff --git a/packages/core/src/utils/abis.py b/packages/core/src/utils/abis.py deleted file mode 100644 index a90bb33..0000000 --- a/packages/core/src/utils/abis.py +++ /dev/null @@ -1,30 +0,0 @@ -import json -from pathlib import Path -from typing import Any - -from .types import ContractVersion - -def resolve_abi_file_path(contract_version: ContractVersion) -> str: - """Resolve the path of ABI file from the specified contract version. - - Args: - version (ContractVersion): Contract version - - Returns: - str: Absolute path of ABI file - """ - path = Path(__file__).parent.parent.parent.joinpath("abis", f"v{contract_version}.json") - - return path.absolute() - -def get_abi(file_path: str) -> Any: - """Get ABI from the specified path. - - Args: - file_path (str): absolute path of ABI file - - Returns: - Any: Contents of ABI - """ - with open(file_path) as f: - return json.load(f) diff --git a/packages/core/src/utils/artifacts.py b/packages/core/src/utils/artifacts.py new file mode 100644 index 0000000..e927d17 --- /dev/null +++ b/packages/core/src/utils/artifacts.py @@ -0,0 +1,30 @@ +import json +from pathlib import Path +from typing import Any + +from .types import ArtifactType, ContractVersion + +def resolve_artifacts_file_path(contract_version: ContractVersion) -> str: + """Resolve the path of artifacts file from the specified contract version. + + Args: + version (ContractVersion): Contract version + + Returns: + str: Absolute path of artifacts file + """ + path = Path(__file__).parent.parent.parent.joinpath("artifacts", f"v{contract_version}.json") + + return path.absolute() + +def get_artifacts(file_path: str, artifact_type: ArtifactType) -> Any: + """Get contract artifacts from the specified file path. + + Args: + file_path (str): absolute path of artifacts file + + Returns: + Any: Artifacts of contracts + """ + with open(file_path) as f: + return json.load(f)[artifact_type] From 9cdb3421e1de1ab96047c6c7512a290b42d44a09 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Sat, 17 May 2025 15:40:30 +0900 Subject: [PATCH 18/56] Update dependencies --- packages/core/pyproject.toml | 1 + uv.lock | 194 ++++++++++++++++++++++++++++++++++- 2 files changed, 191 insertions(+), 4 deletions(-) diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 6dfb7bb..dcdd33e 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -55,6 +55,7 @@ dev = [ "python-dotenv>=1.1.0", "ruff>=0.11.9", "sphinx>=8.2.3", + "web3[tester]>=7.11.0", ] # Ruff diff --git a/uv.lock b/uv.lock index 98120c6..b0b71b0 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,11 @@ version = 1 revision = 2 requires-python = ">=3.11" +resolution-markers = [ + "implementation_name == 'cpython'", + "implementation_name == 'pypy'", + "implementation_name != 'cpython' and implementation_name != 'pypy'", +] [manifest] members = [ @@ -180,6 +185,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f3/18/b69e211181f90f8a3b4ef8c7022fcdf0ebe1ad5701b68f60382195f48f66/bitarray-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:340dd788dad07ad004b591925e4b906786aaefb6632ea9d9ac616913f3cafa4e", size = 139440, upload-time = "2025-05-06T23:00:32.716Z" }, ] +[[package]] +name = "cached-property" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/4b/3d870836119dbe9a5e3c9a61af8cc1a8b69d75aea564572e385882d5aefb/cached_property-2.0.1.tar.gz", hash = "sha256:484d617105e3ee0e4f1f58725e72a8ef9e93deee462222dbd51cd91230897641", size = 10574, upload-time = "2024-10-25T15:43:55.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/0e/7d8225aab3bc1a0f5811f8e1b557aa034ac04bdf641925b30d3caf586b28/cached_property-2.0.1-py3-none-any.whl", hash = "sha256:f617d70ab1100b7bcf6e42228f9ddcb78c676ffa167278d9f730d1c2fba69ccb", size = 7428, upload-time = "2024-10-25T15:43:54.711Z" }, +] + [[package]] name = "certifi" version = "2025.4.26" @@ -347,7 +361,7 @@ name = "cytoolz" version = "1.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "toolz" }, + { name = "toolz", marker = "implementation_name == 'cpython'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/f9/3243eed3a6545c2a33a21f74f655e3fcb5d2192613cd3db81a93369eb339/cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6", size = 626652, upload-time = "2024-12-13T05:47:36.672Z" } wheels = [ @@ -439,6 +453,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/18/088fb250018cbe665bc2111974301b2d59f294a565aff7564c4df6878da2/eth_account-0.13.7-py3-none-any.whl", hash = "sha256:39727de8c94d004ff61d10da7587509c04d2dc7eac71e04830135300bdfc6d24", size = 587452, upload-time = "2025-04-21T21:11:18.346Z" }, ] +[[package]] +name = "eth-bloom" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-hash", extra = ["pycryptodome"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/d6/9c345601de27b536dc8b0f4c1d6cb84fe76a47de9ac02753f58deae59c86/eth_bloom-3.1.0.tar.gz", hash = "sha256:4bc918f6fde44334e92b23cfb345db961e2e3af620535cbc872444f7a143cb88", size = 9807, upload-time = "2025-01-08T19:05:18.945Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e5/251bda1d3f3cff230fa39e95d41141c1b44e8f55c101c5f593ccf5a31b63/eth_bloom-3.1.0-py3-none-any.whl", hash = "sha256:c96b2dd6cafa407373bca1a9d74b650378ba672d5b17f2771bf7d3c3aaa7651c", size = 5785, upload-time = "2025-01-08T19:05:17.757Z" }, +] + [[package]] name = "eth-hash" version = "0.7.1" @@ -452,6 +478,9 @@ wheels = [ pycryptodome = [ { name = "pycryptodome" }, ] +pysha3 = [ + { name = "safe-pysha3", marker = "implementation_name == 'cpython'" }, +] [[package]] name = "eth-keyfile" @@ -494,6 +523,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/3b/57efe2bc2df0980680d57c01a36516cd3171d2319ceb30e675de19fc2cc5/eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47", size = 4446, upload-time = "2025-02-04T21:51:05.823Z" }, ] +[[package]] +name = "eth-tester" +version = "0.13.0b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-abi" }, + { name = "eth-account" }, + { name = "eth-keys" }, + { name = "eth-utils" }, + { name = "rlp" }, + { name = "semantic-version" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/3d/d9b8191fd252b3c99c86f939d2fbe5c3cd259984e61505052ccf2a91bc85/eth_tester-0.13.0b1.tar.gz", hash = "sha256:87fb561d450cd3639ce82eed52e566c902a0ac241f3e9581c6b7545690fcece5", size = 102766, upload-time = "2025-04-23T21:02:29.906Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/81/809ff0b461a7f7688925675cb99071b272bf3863e8d16e01a91434f03633/eth_tester-0.13.0b1-py3-none-any.whl", hash = "sha256:872108cea7df1340f56bab25b9ed5cf0f835aa467c1a8195d0891238c0e73ab3", size = 76168, upload-time = "2025-04-23T21:02:28.67Z" }, +] + +[package.optional-dependencies] +py-evm = [ + { name = "eth-hash", marker = "implementation_name == 'cpython' or implementation_name == 'pypy'" }, + { name = "eth-hash", extra = ["pycryptodome"], marker = "implementation_name == 'pypy'" }, + { name = "eth-hash", extra = ["pysha3"], marker = "implementation_name == 'cpython'" }, + { name = "py-evm" }, +] + [[package]] name = "eth-typing" version = "5.2.1" @@ -665,6 +719,7 @@ dev = [ { name = "python-dotenv" }, { name = "ruff" }, { name = "sphinx" }, + { name = "web3", extra = ["tester"] }, ] [package.metadata] @@ -682,6 +737,7 @@ dev = [ { name = "python-dotenv", specifier = ">=1.1.0" }, { name = "ruff", specifier = ">=0.11.9" }, { name = "sphinx", specifier = ">=8.2.3" }, + { name = "web3", extras = ["tester"], specifier = ">=7.11.0" }, ] [[package]] @@ -689,6 +745,40 @@ name = "jpyc-python-sdks" version = "1.0.0" source = { virtual = "." } +[[package]] +name = "lru-dict" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/e3/42c87871920602a3c8300915bd0292f76eccc66c38f782397acbf8a62088/lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b", size = 13123, upload-time = "2023-11-06T01:40:12.951Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/c9/6fac0cb67160f0efa3cc76a6a7d04d5e21a516eeb991ebba08f4f8f01ec5/lru_dict-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:20c595764695d20bdc3ab9b582e0cc99814da183544afb83783a36d6741a0dac", size = 17750, upload-time = "2023-11-06T01:38:52.667Z" }, + { url = "https://files.pythonhosted.org/packages/61/14/f90dee4bc547ae266dbeffd4e11611234bb6af511dea48f3bc8dac1de478/lru_dict-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d9b30a8f50c3fa72a494eca6be5810a1b5c89e4f0fda89374f0d1c5ad8d37d51", size = 11055, upload-time = "2023-11-06T01:38:53.798Z" }, + { url = "https://files.pythonhosted.org/packages/4e/63/a0ae20525f9d52f62ac0def47935f8a2b3b6fcd2c145218b9a27fc1fb910/lru_dict-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9710737584650a4251b9a566cbb1a86f83437adb209c9ba43a4e756d12faf0d7", size = 11330, upload-time = "2023-11-06T01:38:54.847Z" }, + { url = "https://files.pythonhosted.org/packages/e9/c6/8c2b81b61e5206910c81b712500736227289aefe4ccfb36137aa21807003/lru_dict-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b84c321ae34f2f40aae80e18b6fa08b31c90095792ab64bb99d2e385143effaa", size = 31793, upload-time = "2023-11-06T01:38:56.163Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d7/af9733f94df67a2e9e31ef47d4c41aff1836024f135cdbda4743eb628452/lru_dict-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eed24272b4121b7c22f234daed99899817d81d671b3ed030c876ac88bc9dc890", size = 33090, upload-time = "2023-11-06T01:38:57.091Z" }, + { url = "https://files.pythonhosted.org/packages/5b/6e/5b09b069a70028bcf05dbdc57a301fbe8b3bafecf916f2ed5a3065c79a71/lru_dict-1.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd13af06dab7c6ee92284fd02ed9a5613a07d5c1b41948dc8886e7207f86dfd", size = 29795, upload-time = "2023-11-06T01:38:58.278Z" }, + { url = "https://files.pythonhosted.org/packages/21/92/4690daefc2602f7c3429ecf54572d37a9e3c372d370344d2185daa4d5ecc/lru_dict-1.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1efc59bfba6aac33684d87b9e02813b0e2445b2f1c444dae2a0b396ad0ed60c", size = 31586, upload-time = "2023-11-06T01:38:59.363Z" }, + { url = "https://files.pythonhosted.org/packages/3c/67/0a29a91087196b02f278d8765120ee4e7486f1f72a4c505fd1cd3109e627/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfaf75ac574447afcf8ad998789071af11d2bcf6f947643231f692948839bd98", size = 36662, upload-time = "2023-11-06T01:39:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/8d56c514cd2333b652bd44c8f1962ab986cbe68e8ad7258c9e0f360cddb6/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c95f8751e2abd6f778da0399c8e0239321d560dbc58cb063827123137d213242", size = 35118, upload-time = "2023-11-06T01:39:01.883Z" }, + { url = "https://files.pythonhosted.org/packages/f5/9a/c7a175d10d503b86974cb07141ca175947145dd1c7370fcda86fbbcaf326/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:abd0c284b26b5c4ee806ca4f33ab5e16b4bf4d5ec9e093e75a6f6287acdde78e", size = 38198, upload-time = "2023-11-06T01:39:03.306Z" }, + { url = "https://files.pythonhosted.org/packages/fd/59/2e5086c8e8a05a7282a824a2a37e3c45cd5714e7b83d8bc0267cb3bb5b4f/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a47740652b25900ac5ce52667b2eade28d8b5fdca0ccd3323459df710e8210a", size = 36542, upload-time = "2023-11-06T01:39:04.751Z" }, + { url = "https://files.pythonhosted.org/packages/12/52/80d0a06e5f45fe7c278dd662da6ea5b39f2ff003248f448189932f6b71c2/lru_dict-1.3.0-cp311-cp311-win32.whl", hash = "sha256:a690c23fc353681ed8042d9fe8f48f0fb79a57b9a45daea2f0be1eef8a1a4aa4", size = 12533, upload-time = "2023-11-06T01:39:05.838Z" }, + { url = "https://files.pythonhosted.org/packages/ce/fe/1f12f33513310860ec6d722709ec4ad8256d9dcc3385f6ae2a244e6e66f5/lru_dict-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:efd3f4e0385d18f20f7ea6b08af2574c1bfaa5cb590102ef1bee781bdfba84bc", size = 13651, upload-time = "2023-11-06T01:39:06.871Z" }, + { url = "https://files.pythonhosted.org/packages/fc/5c/385f080747eb3083af87d8e4c9068f3c4cab89035f6982134889940dafd8/lru_dict-1.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c279068f68af3b46a5d649855e1fb87f5705fe1f744a529d82b2885c0e1fc69d", size = 17174, upload-time = "2023-11-06T01:39:07.923Z" }, + { url = "https://files.pythonhosted.org/packages/3c/de/5ef2ed75ce55d7059d1b96177ba04fa7ee1f35564f97bdfcd28fccfbe9d2/lru_dict-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:350e2233cfee9f326a0d7a08e309372d87186565e43a691b120006285a0ac549", size = 10742, upload-time = "2023-11-06T01:39:08.871Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/f69a6abb0062d2cf2ce0aaf0284b105b97d1da024ca6d3d0730e6151242e/lru_dict-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eafb188a84483b3231259bf19030859f070321b00326dcb8e8c6cbf7db4b12f", size = 11079, upload-time = "2023-11-06T01:39:09.766Z" }, + { url = "https://files.pythonhosted.org/packages/ea/59/cf891143abe58a455b8eaa9175f0e80f624a146a2bf9a1ca842ee0ef930a/lru_dict-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73593791047e36b37fdc0b67b76aeed439fcea80959c7d46201240f9ec3b2563", size = 32469, upload-time = "2023-11-06T01:39:11.091Z" }, + { url = "https://files.pythonhosted.org/packages/59/88/d5976e9f70107ce11e45d93c6f0c2d5eaa1fc30bb3c8f57525eda4510dff/lru_dict-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1958cb70b9542773d6241974646e5410e41ef32e5c9e437d44040d59bd80daf2", size = 33496, upload-time = "2023-11-06T01:39:12.463Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f8/94d6e910d54fc1fa05c0ee1cd608c39401866a18cf5e5aff238449b33c11/lru_dict-1.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1cd3ed2cee78a47f11f3b70be053903bda197a873fd146e25c60c8e5a32cd6", size = 29914, upload-time = "2023-11-06T01:39:13.395Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b9/9db79780c8a3cfd66bba6847773061e5cf8a3746950273b9985d47bbfe53/lru_dict-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82eb230d48eaebd6977a92ddaa6d788f14cf4f4bcf5bbffa4ddfd60d051aa9d4", size = 32241, upload-time = "2023-11-06T01:39:14.612Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b6/08a623019daec22a40c4d6d2c40851dfa3d129a53b2f9469db8eb13666c1/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5ad659cbc349d0c9ba8e536b5f40f96a70c360f43323c29f4257f340d891531c", size = 37320, upload-time = "2023-11-06T01:39:15.875Z" }, + { url = "https://files.pythonhosted.org/packages/70/0b/d3717159c26155ff77679cee1b077d22e1008bf45f19921e193319cd8e46/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba490b8972531d153ac0d4e421f60d793d71a2f4adbe2f7740b3c55dce0a12f1", size = 35054, upload-time = "2023-11-06T01:39:17.063Z" }, + { url = "https://files.pythonhosted.org/packages/04/74/f2ae00de7c27984a19b88d2b09ac877031c525b01199d7841ec8fa657fd6/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:c0131351b8a7226c69f1eba5814cbc9d1d8daaf0fdec1ae3f30508e3de5262d4", size = 38613, upload-time = "2023-11-06T01:39:18.136Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0b/e30236aafe31b4247aa9ae61ba8aac6dde75c3ea0e47a8fb7eef53f6d5ce/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0e88dba16695f17f41701269fa046197a3fd7b34a8dba744c8749303ddaa18df", size = 37143, upload-time = "2023-11-06T01:39:19.571Z" }, + { url = "https://files.pythonhosted.org/packages/1c/28/b59bcebb8d76ba8147a784a8be7eab6a4ad3395b9236e73740ff675a5a52/lru_dict-1.3.0-cp312-cp312-win32.whl", hash = "sha256:6ffaf595e625b388babc8e7d79b40f26c7485f61f16efe76764e32dce9ea17fc", size = 12653, upload-time = "2023-11-06T01:39:20.574Z" }, + { url = "https://files.pythonhosted.org/packages/bd/18/06d9710cb0a0d3634f8501e4bdcc07abe64a32e404d82895a6a36fab97f6/lru_dict-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf9da32ef2582434842ab6ba6e67290debfae72771255a8e8ab16f3e006de0aa", size = 13811, upload-time = "2023-11-06T01:39:21.599Z" }, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -856,11 +946,11 @@ wheels = [ [[package]] name = "packaging" -version = "25.0" +version = "23.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", size = 146714, upload-time = "2023-10-01T13:50:05.279Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", size = 53011, upload-time = "2023-10-01T13:50:03.745Z" }, ] [[package]] @@ -957,6 +1047,56 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload-time = "2025-03-26T03:06:10.5Z" }, ] +[[package]] +name = "py-ecc" +version = "8.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-typing" }, + { name = "eth-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/96/e73075d5c885274efada2fbc5db6377022036c2f5b4b470dbcf4106e07d5/py_ecc-8.0.0.tar.gz", hash = "sha256:56aca19e5dc37294f60c1cc76666c03c2276e7666412b9a559fa0145d099933d", size = 51193, upload-time = "2025-04-14T16:14:03.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/58/383335eac96d2f1aba78741c6ce128c54e7eba2ea1dc47408257d751d35c/py_ecc-8.0.0-py3-none-any.whl", hash = "sha256:c0b2dfc4bde67a55122a392591a10e851a986d5128f680628c80b405f7663e13", size = 47814, upload-time = "2025-04-14T16:14:01.827Z" }, +] + +[[package]] +name = "py-evm" +version = "0.12.1b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cached-property" }, + { name = "ckzg" }, + { name = "eth-bloom" }, + { name = "eth-keys" }, + { name = "eth-typing" }, + { name = "eth-utils" }, + { name = "lru-dict" }, + { name = "py-ecc" }, + { name = "rlp" }, + { name = "trie" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/57/a0a84d991bac43058200245d853de9e7e819d216b56e22f66654fdf596d5/py_evm-0.12.1b1.tar.gz", hash = "sha256:7bcd9935a3ac2989c8f068b2006f136189281ebc6e279663405cb2c5397ed890", size = 851927, upload-time = "2025-05-14T17:25:14.686Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/be/1e0de8a1f1dbe3911ccae2d598a2c60610e2f4984a918690b5469e8c8774/py_evm-0.12.1b1-py3-none-any.whl", hash = "sha256:015ebc8dd95925030be87ce4b3fd31e3c70df626c5ad8665fb06cd611c73eb68", size = 798589, upload-time = "2025-05-14T17:25:12.707Z" }, +] + +[[package]] +name = "py-geth" +version = "5.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "requests" }, + { name = "semantic-version" }, + { name = "types-requests" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/30/b6bf796d652d9d48be91012e06aa98376318c933eb2f7e2446af6671dcef/py_geth-5.6.0.tar.gz", hash = "sha256:c2d22bd06ebd39861e683fb5210a13a0f496025f05c9a7638c234966f5499396", size = 36386, upload-time = "2025-05-07T17:01:59.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/84/bf5cb7b900aad875199459fd1da253cda018bdbe39aaa8689b13c2bd7b53/py_geth-5.6.0-py3-none-any.whl", hash = "sha256:77663217ccd394c58811406585b1d314b5bf983e7d4e4356701cc022ab603fa7", size = 28235, upload-time = "2025-05-07T17:01:58.31Z" }, +] + [[package]] name = "pycryptodome" version = "3.22.0" @@ -1240,6 +1380,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/f7/70aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417/ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca", size = 10741080, upload-time = "2025-05-09T16:19:39.605Z" }, ] +[[package]] +name = "safe-pysha3" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/73/67ba7ed2177b0b17d10665418fb5deafa03d76b8d4b2cb30883b81b00edf/safe-pysha3-1.0.4.tar.gz", hash = "sha256:e429146b1edd198b2ca934a2046a65656c5d31b0ec894bbd6055127f4deaff17", size = 827688, upload-time = "2023-05-04T10:43:09.971Z" } + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + [[package]] name = "snowballstemmer" version = "3.0.1" @@ -1249,6 +1404,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + [[package]] name = "sphinx" version = "8.2.3" @@ -1379,6 +1543,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383, upload-time = "2024-10-04T16:17:01.533Z" }, ] +[[package]] +name = "trie" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-hash" }, + { name = "eth-utils" }, + { name = "hexbytes" }, + { name = "rlp" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/2f/5ec6be52952de47e79b1d250c00a922365a76503e3c75605c1cd890c61aa/trie-3.1.0.tar.gz", hash = "sha256:b31fd3376d6dccfe8ad13b525e233f2c268d5c48afb90a4de09672423d4b1026", size = 72800, upload-time = "2025-01-29T17:51:26.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/79/e6e105236eb1bb0c3ac82c968c143de456a3192c17d60df2f8c528eb3323/trie-3.1.0-py3-none-any.whl", hash = "sha256:dfc3e6ac0e76f0efa900ec1bfd082f0f1ba87f95cbfd81cc12338b03f4c679c4", size = 38940, upload-time = "2025-01-29T17:51:24.21Z" }, +] + [[package]] name = "types-requests" version = "2.32.0.20250328" @@ -1446,6 +1626,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/d8/afd0fc2919177d1c1f4e7e30e2dc83eb5be71d29046497b80892e3a978cf/web3-7.11.0-py3-none-any.whl", hash = "sha256:bbc844e4ea8d5769aa7be28cd737693cab41c4c52dc3d28c32d91718bfddfb91", size = 1367624, upload-time = "2025-04-29T17:28:26.766Z" }, ] +[package.optional-dependencies] +tester = [ + { name = "eth-tester", extra = ["py-evm"] }, + { name = "py-geth" }, +] + [[package]] name = "websockets" version = "15.0.1" From 8ac0567446ffdedb610abbfa2bc950af4f25b22d Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Sat, 17 May 2025 15:41:21 +0900 Subject: [PATCH 19/56] Improve imports; more refactoring --- packages/core/src/__init__.py | 4 +- packages/core/src/client.py | 37 +++++++---- packages/core/src/interfaces/__init__.py | 4 +- packages/core/src/interfaces/client.py | 10 ++- packages/core/src/jpyc.py | 36 +++++++---- packages/core/src/utils/__init__.py | 78 ++++++++++++++++-------- packages/core/src/utils/chains.py | 4 +- packages/core/src/utils/errors.py | 8 +-- packages/core/src/utils/types.py | 1 + 9 files changed, 119 insertions(+), 63 deletions(-) diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py index df53b0c..ee2a271 100644 --- a/packages/core/src/__init__.py +++ b/packages/core/src/__init__.py @@ -1,7 +1,7 @@ from importlib.metadata import version -from .client import * -from .jpyc import * +from .client import SdkClient +from .jpyc import JPYC __version__ = version("jpyc-core-sdk") __all__ = [ diff --git a/packages/core/src/client.py b/packages/core/src/client.py index 94926f1..1d3b8b1 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -1,11 +1,12 @@ from eth_account.signers.local import LocalAccount from web3 import Account, HTTPProvider, Web3 -from web3.middleware import ExtraDataToPOAMiddleware, SignAndSendRawMiddlewareBuilder +from web3.middleware import ( + ExtraDataToPOAMiddleware, + SignAndSendRawMiddlewareBuilder, +) from interfaces import ISdkClient -from utils.chains import ( - get_default_rpc_endpoint, -) +from utils.chains import get_default_rpc_endpoint from utils.constants import ( POA_MIDDLEWARE, SIGN_MIDDLEWARE, @@ -19,19 +20,25 @@ def __init__( self, chain_name: str, network_name: str, + rpc_endpoint: str | None = None, private_key: str | None = None, ): """Constructor that initializes SDK client. + Notes: + This constructor prioritizes `rpc_endpoint` parameter over \ + `chain_name` & `network_name` parameters when configuring `rpc_endpoint`. + Args: chain_name (str): Chain name network_name (str): Network name + rpc_endpoint (str | None): RPC endpoint private_key (str | None): private key of EOA Raises: NetworkNotSupported: If the specified network is not supported by the SDK """ - rpc_endpoint = get_default_rpc_endpoint(chain_name, network_name) + rpc_endpoint = rpc_endpoint if rpc_endpoint is not None else get_default_rpc_endpoint(chain_name, network_name) account = Account.from_key(private_key) if private_key is not None else None w3 = self.__configure_w3( rpc_endpoint=rpc_endpoint, @@ -77,7 +84,7 @@ def __configure_w3( def set_default_provider(self, chain_name: str, network_name: str) -> Web3: self.w3 = self.__configure_w3( rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name), - account=self.account + account=self.account, ) return self.w3 @@ -90,12 +97,18 @@ def set_custom_provider(self, rpc_endpoint: str) -> Web3: return self.w3 - def set_account(self, private_key: str) -> LocalAccount: - self.account = Account.from_key(private_key) - self.w3 = self.__configure_w3( - rpc_endpoint=self.rpc_endpoint, - account=self.account - ) + def set_account(self, private_key: str | None) -> LocalAccount | None: + if private_key is None: + self.account = None + self.w3 = self.__configure_w3( + rpc_endpoint=self.rpc_endpoint, + ) + else: + self.account = Account.from_key(private_key) + self.w3 = self.__configure_w3( + rpc_endpoint=self.rpc_endpoint, + account=self.account + ) return self.account diff --git a/packages/core/src/interfaces/__init__.py b/packages/core/src/interfaces/__init__.py index ed7877e..60d5863 100644 --- a/packages/core/src/interfaces/__init__.py +++ b/packages/core/src/interfaces/__init__.py @@ -1,5 +1,5 @@ -from .client import * -from .jpyc import * +from .client import ISdkClient +from .jpyc import IJPYC __all__ = [ "ISdkClient", diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index 720d527..24aacab 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -35,14 +35,18 @@ def set_custom_provider(self, rpc_endpoint: str) -> Web3: pass @abstractmethod - def set_account(self, private_key: str) -> LocalAccount: + def set_account(self, private_key: str | None) -> LocalAccount | None: """Set account with private key. + Notes: + If `private_key` parameter is set to `None`, \ + this method removes `account` from the configured web3 instance. + Args: - private_key (str): Private key of account + private_key (str | None): Private key of account Returns: - LocalAccount: Configured account + LocalAccount | None: Configured account """ pass diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 6f7c34d..b31e84a 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -4,13 +4,13 @@ from web3.contract.contract import ContractFunction from interfaces import IJPYC, ISdkClient -from utils.abis import ( - get_abi, - resolve_abi_file_path, -) from utils.addresses import ( get_proxy_address, ) +from utils.artifacts import ( + get_artifacts, + resolve_artifacts_file_path, +) from utils.constants import SIGN_MIDDLEWARE from utils.currencies import ( remove_decimals, @@ -18,7 +18,7 @@ ) from utils.errors import ( AccountNotInitialized, - TransactionFailedToSend, + TransactionFailed, TransactionSimulationFailed, ) from utils.types import ContractVersion @@ -42,7 +42,10 @@ def __init__( """ISdkClient: Configured SDK client""" self.contract = client.w3.eth.contract( address=get_proxy_address(contract_version=contract_version), - abi=get_abi(resolve_abi_file_path(contract_version=contract_version)), + abi=get_artifacts( + file_path=resolve_artifacts_file_path(contract_version=contract_version), + artifact_type="abi", + ), ) """Contract: Configured contract instance""" @@ -62,7 +65,11 @@ def __account_initialized(self) -> None: if SIGN_MIDDLEWARE not in self.client.w3.middleware_onion: raise AccountNotInitialized() - def __simulate_transaction(self, contract_func: ContractFunction, func_args: dict[Any]) -> None: + def __simulate_transaction( + self, + contract_func: ContractFunction, + func_args: dict[Any], + ) -> None: """Simulates a transaction locally. Note: @@ -80,7 +87,11 @@ def __simulate_transaction(self, contract_func: ContractFunction, func_args: dic except Exception as e: raise TransactionSimulationFailed(e) - def __send_transaction(self, contract_func: ContractFunction, func_args: dict[Any]) -> Any: + def __send_transaction( + self, + contract_func: ContractFunction, + func_args: dict[Any], + ) -> Any: """Sends a transaction to blockchain. Args: @@ -91,18 +102,19 @@ def __send_transaction(self, contract_func: ContractFunction, func_args: dict[An Any: Response from the contract function Raises: - TransactionFailedToSend: If it fails to send a transaction + TransactionFailed: If transaction fails """ try: return contract_func(**func_args).transact() except Exception as e: - raise TransactionFailedToSend(e) + raise TransactionFailed(e) def __transact(self, contract_func: ContractFunction, func_args: dict[Any]) -> Any: """Helper method to prepare & send a transaction in one method. Args: - tx_args (TransactionArgs): Arguments necessary to send a transaction + contract_func (ContractFunction): Contract function + func_args (dict[Any]): Arguments of contract function Returns: Any: Response from the contract function @@ -110,7 +122,7 @@ def __transact(self, contract_func: ContractFunction, func_args: dict[Any]) -> A Raises: AccountNotInitialized: If account is not initialized TransactionSimulationFailed: If transaction simulation fails - TransactionFailedToSend: If it fails to send a transaction + TransactionFailedToSend: If transaction fails """ self.__account_initialized() diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 8098c07..684a23b 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -1,26 +1,53 @@ -from .abis import * -from .addresses import * -from .chains import * -from .constants import * -from .currencies import * -from .errors import * -from .types import * -from .validators import * +from .artifacts import ( + get_artifacts, + resolve_artifacts_file_path, +) +from .addresses import get_proxy_address +from .chains import ( + enumerate_supported_networks, + get_default_rpc_endpoint, +) +from .constants import ( + POA_MIDDLEWARE, + SIGN_MIDDLEWARE, + UINT_MIN, + UINT256_MAX, + UINT8_MAX, +) +from .currencies import ( + remove_decimals, + restore_decimals, +) +from .errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint256, + InvalidUint8, + NetworkNotSupported, + TransactionFailed, + TransactionSimulationFailed, +) +from .types import ( + ArtifactType, + ChainMetadata, + ContractVersion, +) +from .validators import ( + Bytes32, + ChecksumAddress, + Uint256, + Uint8, +) __all__ = [ - # abi - "resolve_abi_file_path", - "get_abi", - # address - "calc_checksum_address", - "is_valid_address", + # contract artifacts + "get_artifacts", + "resolve_artifacts_file_path", + # addresses "get_proxy_address", - "ZERO_ADDRESS", - "V2_PROXY_ADDRESS", # chains - "SUPPORTED_CHAINS", "enumerate_supported_networks", - "is_supported_network", "get_default_rpc_endpoint", # constants "POA_MIDDLEWARE", @@ -28,26 +55,25 @@ "UINT_MIN", "UINT256_MAX", "UINT8_MAX", - # currency + # currencies "remove_decimals", "restore_decimals", # errors - "NetworkNotSupported", "AccountNotInitialized", + "InvalidBytes32", "InvalidChecksumAddress", "InvalidUint8", "InvalidUint256", - "InvalidBytes32", + "NetworkNotSupported", + "TransactionFailed", "TransactionSimulationFailed", - "TransactionFailedToSend", # types - "ChainName", - "NetworkMetadata", + "ArtifactType", + "ChainMetadata", "ContractVersion", - "TransactionArgs", # validators - "ChecksumAddress" "Bytes32", + "ChecksumAddress", "Uint256", "Uint8", ] diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py index ce553a2..e46d7ef 100644 --- a/packages/core/src/utils/chains.py +++ b/packages/core/src/utils/chains.py @@ -70,8 +70,8 @@ "rpc_endpoints": ["https://shiden.public.blastapi.io"], }, }, - "local": { - "mainnet": { + "localhost": { + "devnet": { "id": 31337, "name": "Localhost Network", "rpc_endpoints": ["http://127.0.0.1:8545/"], diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 0a29c78..4bbd7d1 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -100,8 +100,8 @@ def __init__(self, message_: str): message=f"Failed to simulate a transaction locally: {message_}", ) -class TransactionFailedToSend(JpycSdkError): - """Raised when it fails to send a transaction. +class TransactionFailed(JpycSdkError): + """Raised when transaction fails. Attributes: message (str): Error message @@ -110,6 +110,6 @@ class TransactionFailedToSend(JpycSdkError): def __init__(self, message_: str): super().__init__( - code=TransactionFailedToSend.code, - message=f"Failed to send a transaction: {message_}", + code=TransactionFailed.code, + message=f"Transaction failed: {message_}", ) diff --git a/packages/core/src/utils/types.py b/packages/core/src/utils/types.py index b40c7a1..8125a7d 100644 --- a/packages/core/src/utils/types.py +++ b/packages/core/src/utils/types.py @@ -26,3 +26,4 @@ class NetworkMetadata(TypedDict): ############# ContractVersion: TypeAlias = Literal["2"] +ArtifactType: TypeAlias = Literal["abi", "bytecode"] From a8ed8bdf9d71960c33f557dbe4d62b8eb3e5ea39 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Sun, 18 May 2025 15:12:59 +0900 Subject: [PATCH 20/56] Refactor web3 client --- packages/core/src/client.py | 19 ++++++++++--------- packages/core/src/interfaces/client.py | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/core/src/client.py b/packages/core/src/client.py index 1d3b8b1..60f86ab 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -18,22 +18,23 @@ class SdkClient(ISdkClient): def __init__( self, - chain_name: str, - network_name: str, + chain_name: str | None = None, + network_name: str | None = None, rpc_endpoint: str | None = None, private_key: str | None = None, ): """Constructor that initializes SDK client. Notes: - This constructor prioritizes `rpc_endpoint` parameter over \ + - Either `chain_name` & `network_name` parameters or `rpc_endpoint` parameter are required. + - This constructor prioritizes `rpc_endpoint` parameter over \ `chain_name` & `network_name` parameters when configuring `rpc_endpoint`. Args: - chain_name (str): Chain name - network_name (str): Network name - rpc_endpoint (str | None): RPC endpoint - private_key (str | None): private key of EOA + chain_name (str, optional): Chain name + network_name (str, optional): Network name + rpc_endpoint (str, optional): RPC endpoint + private_key (str, optional): private key of EOA Raises: NetworkNotSupported: If the specified network is not supported by the SDK @@ -52,8 +53,8 @@ def __init__( self.account = account """LocalAccount | None: Account instance""" + @staticmethod def __configure_w3( - self, rpc_endpoint: str, account: LocalAccount | None = None, ) -> Web3: @@ -61,7 +62,7 @@ def __configure_w3( Args: rpc_endpoint (str): RPC endpoint - account (LocalAccount | None): Account instance + account (LocalAccount, optional): Account instance Returns: Web3: Configured web3 instance diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index 24aacab..941c64a 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -43,7 +43,7 @@ def set_account(self, private_key: str | None) -> LocalAccount | None: this method removes `account` from the configured web3 instance. Args: - private_key (str | None): Private key of account + private_key (str, optional): Private key of account Returns: LocalAccount | None: Configured account From 7d501bb364f341831f7de8c2412756a1cc9c6085 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Sun, 18 May 2025 15:13:24 +0900 Subject: [PATCH 21/56] Fix & refactor JPYC SDK --- packages/core/src/interfaces/jpyc.py | 163 +++++++++++++-------------- packages/core/src/jpyc.py | 107 +++++++++++++++--- packages/core/src/utils/__init__.py | 2 + 3 files changed, 177 insertions(+), 95 deletions(-) diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py index 5dd7db0..1148c2f 100644 --- a/packages/core/src/interfaces/jpyc.py +++ b/packages/core/src/interfaces/jpyc.py @@ -1,7 +1,6 @@ from abc import ABC, abstractmethod -from decimal import Decimal -from eth_typing import ChecksumAddress +from utils.validators import Bytes32, ChecksumAddress, Uint256, Uint8 class IJPYC(ABC): """Interface of JPYC contracts.""" @@ -23,7 +22,7 @@ def is_minter(self, account: ChecksumAddress) -> bool: pass @abstractmethod - def minter_allowance(self, minter: ChecksumAddress) -> Decimal: + def minter_allowance(self, minter: ChecksumAddress) -> Uint256: """Call `minterAllowance` function. Args: @@ -35,7 +34,7 @@ def minter_allowance(self, minter: ChecksumAddress) -> Decimal: pass @abstractmethod - def total_supply(self) -> Decimal: + def total_supply(self) -> Uint256: """Call `totalSupply` function. Returns: @@ -44,7 +43,7 @@ def total_supply(self) -> Decimal: pass @abstractmethod - def balance_of(self, account: ChecksumAddress) -> Decimal: + def balance_of(self, account: ChecksumAddress) -> Uint256: """Call `balanceOf` function. Args: @@ -56,7 +55,7 @@ def balance_of(self, account: ChecksumAddress) -> Decimal: pass @abstractmethod - def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Decimal: + def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256: """Call `allowance` function. Args: @@ -69,7 +68,7 @@ def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Decimal pass @abstractmethod - def nonces(self, owner: ChecksumAddress) -> int: + def nonces(self, owner: ChecksumAddress) -> Uint256: """Call `nonces` function. Args: @@ -85,15 +84,15 @@ def nonces(self, owner: ChecksumAddress) -> int: ###################### @abstractmethod - def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decimal) -> str: + def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Uint256) -> Bytes32: """Call `configureMinter` function. Args: minter (ChecksumAddress): Minter address - minter_allowed_amount (Decimal): Minter allowance + minter_allowed_amount (Uint256): Minter allowance Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -102,15 +101,15 @@ def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Decim pass @abstractmethod - def mint(self, to: ChecksumAddress, amount: Decimal) -> str: + def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: """Call `mint` function. Args: to (ChecksumAddress): Receiver address - amount (Decimal): Amount of tokens to mint + amount (Uint256): Amount of tokens to mint Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -119,15 +118,15 @@ def mint(self, to: ChecksumAddress, amount: Decimal) -> str: pass @abstractmethod - def transfer(self, to: ChecksumAddress, value: Decimal) -> str: + def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: """Call `transfer` function. Args: to (ChecksumAddress): Receiver address - value (Decimal): Amount of tokens to transfer + value (Uint256): Amount of tokens to transfer Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -136,16 +135,16 @@ def transfer(self, to: ChecksumAddress, value: Decimal) -> str: pass @abstractmethod - def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Decimal) -> str: + def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256) -> Bytes32: """Call `transferFrom` function. Args: from_ (ChecksumAddress): Owner address to (ChecksumAddress): Receiver address - value (Decimal): Amount of tokens to transfer + value (Uint256): Amount of tokens to transfer Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -158,29 +157,29 @@ def transfer_with_authorization( self, from_: ChecksumAddress, to: ChecksumAddress, - value: Decimal, - valid_after: int, - valid_before: int, - nonce: str, - v: int, - r: str, - s: str, - ) -> str: + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: """Call `transferWithAuthorization` function. Args: from_ (ChecksumAddress): Owner address to (ChecksumAddress): Receiver allowance - value (Decimal): Amount of tokens to transfer - valid_after (int): Unix time when transaction becomes valid - valid_before (int): Unix time when transaction becomes invalid - nonce (str): Unique nonce - v (int): v of ECDSA - r (str): r of ECDSA - s (str): s of ECDSA + value (Uint256): Amount of tokens to transfer + valid_after (Uint256): Unix time when transaction becomes valid + valid_before (Uint256): Unix time when transaction becomes invalid + nonce (Bytes32): Unique nonce + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -193,29 +192,29 @@ def receive_with_authorization( self, from_: ChecksumAddress, to: ChecksumAddress, - value: Decimal, - valid_after: int, - valid_before: int, - nonce: str, - v: int, - r: str, - s: str, - ) -> str: + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: """Call `receiveWithAuthorization` function. Args: from_ (ChecksumAddress): Owner address to (ChecksumAddress): Receiver allowance - value (Decimal): Amount of tokens to transfer - valid_after (int): Unix time when transaction becomes valid - valid_before (int): Unix time when transaction becomes invalid - nonce (str): Unique nonce - v (int): v of ECDSA - r (str): r of ECDSA - s (str): s of ECDSA + value (Uint256): Amount of tokens to transfer + valid_after (Uint256): Unix time when transaction becomes valid + valid_before (Uint256): Unix time when transaction becomes invalid + nonce (Bytes32): Unique nonce + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -227,22 +226,22 @@ def receive_with_authorization( def cancel_authorization( self, authorizer: ChecksumAddress, - nonce: str, - v: int, - r: str, - s: str, - ) -> str: + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: """Call `cancelAuthorization` function. Args: authorizer (ChecksumAddress): Owner address - nonce (str): Unique nonce - v (int): v of ECDSA - r (str): r of ECDSA - s (str): s of ECDSA + nonce (Bytes32): Unique nonce + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -251,15 +250,15 @@ def cancel_authorization( pass @abstractmethod - def approve(self, spender: ChecksumAddress, value: Decimal) -> str: + def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: """Call `approve` function. Args: spender (ChecksumAddress): Spender address - value (Decimal): Amount of allowance + value (Uint256): Amount of allowance Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -268,15 +267,15 @@ def approve(self, spender: ChecksumAddress, value: Decimal) -> str: pass @abstractmethod - def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> str: + def increase_allowance(self, spender: ChecksumAddress, increment: Uint256) -> Bytes32: """Call `increaseAllowance` function. Args: spender (ChecksumAddress): Spender address - increment (Decimal): Amount of allowance to increase + increment (Uint256): Amount of allowance to increase Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -285,15 +284,15 @@ def increase_allowance(self, spender: ChecksumAddress, increment: Decimal) -> st pass @abstractmethod - def decrease_allowance(self, spender: ChecksumAddress, decrement: Decimal) -> str: + def decrease_allowance(self, spender: ChecksumAddress, decrement: Uint256) -> Bytes32: """Call `decreaseAllowance` function. Args: spender (ChecksumAddress): Spender address - decrement (Decimal): Amount of allowance to decrease + decrement (Uint256): Amount of allowance to decrease Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized @@ -306,25 +305,25 @@ def permit( self, owner: ChecksumAddress, spender: ChecksumAddress, - value: Decimal, - deadline: int, - v: int, - r: str, - s: str, - ) -> str: + value: Uint256, + deadline: Uint256, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: """Call `permit` function. Args: owner (ChecksumAddress): Owner address spender (ChecksumAddress): Spender address - value (Decimal): Amount of allowance - deadline (int): Unix time when transaction becomes invalid - v (int): v of ECDSA - r (str): r of ECDSA - s (str): s of ECDSA + value (Uint256): Amount of allowance + deadline (Uint256): Unix time when transaction becomes invalid + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA Returns: - str: Transaction hash + Bytes32: Transaction hash Raises: AccountNotInitialized: If account is not initialized diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index b31e84a..395818b 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -11,6 +11,7 @@ get_artifacts, resolve_artifacts_file_path, ) +from utils.chains import SUPPORTED_CHAINS from utils.constants import SIGN_MIDDLEWARE from utils.currencies import ( remove_decimals, @@ -30,29 +31,109 @@ class JPYC(IJPYC): def __init__( self, client: ISdkClient, - contract_version: ContractVersion = "2" + contract_version: ContractVersion = "2", ): """Constructor that initializes JPYC client. + Notes: + If `client` parameter is configured to use localhost network,\ + this deploys JPYC contracts to localhost network, initializes it,\ + and sets its address to `address` attribute. + Args: client (ISdkClient): Configured SDK client contract_version (ContractVersion): Contract version """ + if (client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"]): + address = self.__deploy_contract( + client=client, + contract_version=contract_version, + ) + contract = self.__get_contract( + client=client, + contract_address=address, + contract_version=contract_version, + ) + owner_address = client.get_account_address() + contract.functions.initialize( + "JPY Coin", + "JPYC", + "Yen", + 18, + owner_address, + owner_address, + owner_address, + owner_address, + owner_address, + ).transact() + else: + address = get_proxy_address(contract_version=contract_version) + contract = self.__get_contract( + client=client, + contract_address=address, + contract_version=contract_version, + ) + self.client = client """ISdkClient: Configured SDK client""" - self.contract = client.w3.eth.contract( - address=get_proxy_address(contract_version=contract_version), - abi=get_artifacts( - file_path=resolve_artifacts_file_path(contract_version=contract_version), - artifact_type="abi", - ), - ) + self.contract = contract """Contract: Configured contract instance""" ################## # Helper methods # ################## + @staticmethod + def __deploy_contract( + client: ISdkClient, + contract_version: ContractVersion = "2", + ) -> ChecksumAddress: + """Deploy contracts to the configured network. + + Note: + This helper method is mainly for development purposes.\ + Please use this method to deploy contracts to localhost network. + + Args: + client (ISdkClient): Configured SDK client + contract_version (ContractVersion): Contract version + + Returns: + ChecksumAddress: Address of the deployed contracts + """ + file_path=resolve_artifacts_file_path(contract_version=contract_version) + contract = client.w3.eth.contract( + abi=get_artifacts(file_path, "abi"), + bytecode=get_artifacts(file_path, "bytecode"), + ) + tx_hash = contract.constructor().transact() + + return client.w3.eth.wait_for_transaction_receipt(tx_hash).contractAddress + + @staticmethod + def __get_contract( + client: ISdkClient, + contract_address: ChecksumAddress, + contract_version: ContractVersion = "2", + ) -> ChecksumAddress: + """Get contract instance from the configured network. + + Args: + client (ISdkClient): Configured SDK client + contract_address (ChecksumAddress): Contract address + contract_version (ContractVersion): Contract version + + Returns: + ChecksumAddress: Address of the deployed contracts + """ + return client.w3.eth.contract( + address=contract_address, + abi=get_artifacts( + file_path=resolve_artifacts_file_path(contract_version=contract_version), + artifact_type="abi", + ), + ) + def __account_initialized(self) -> None: """Checks if account is initialized. @@ -65,8 +146,8 @@ def __account_initialized(self) -> None: if SIGN_MIDDLEWARE not in self.client.w3.middleware_onion: raise AccountNotInitialized() + @staticmethod def __simulate_transaction( - self, contract_func: ContractFunction, func_args: dict[Any], ) -> None: @@ -83,12 +164,12 @@ def __simulate_transaction( TransactionSimulationFailed: If transaction simulation fails """ try: - contract_func.call(**func_args) + contract_func(**func_args).call() except Exception as e: raise TransactionSimulationFailed(e) + @staticmethod def __send_transaction( - self, contract_func: ContractFunction, func_args: dict[Any], ) -> Any: @@ -187,8 +268,8 @@ def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: tx_args = { "contract_func": self.contract.functions.mint, "func_args": { - "to": to, - "amount": remove_decimals(amount), + "_to": to, + "_amount": remove_decimals(amount), }, } diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 684a23b..0160407 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -6,6 +6,7 @@ from .chains import ( enumerate_supported_networks, get_default_rpc_endpoint, + SUPPORTED_CHAINS, ) from .constants import ( POA_MIDDLEWARE, @@ -49,6 +50,7 @@ # chains "enumerate_supported_networks", "get_default_rpc_endpoint", + "SUPPORTED_CHAINS", # constants "POA_MIDDLEWARE", "SIGN_MIDDLEWARE", From 7224f11b2de9fc5f917acf5082283a9058539f1a Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Mon, 19 May 2025 12:50:42 +0900 Subject: [PATCH 22/56] Update & refactor utils modules --- packages/core/src/utils/README.md | 16 ++++++++++++++++ packages/core/src/utils/__init__.py | 10 ++++++---- packages/core/src/utils/chains.py | 5 +++-- packages/core/src/utils/currencies.py | 8 +++++--- packages/core/src/utils/errors.py | 10 ++++++++++ packages/core/src/utils/types.py | 3 +++ packages/core/src/utils/validators.py | 26 +++++++++++++++++++++++++- 7 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 packages/core/src/utils/README.md diff --git a/packages/core/src/utils/README.md b/packages/core/src/utils/README.md new file mode 100644 index 0000000..58de36d --- /dev/null +++ b/packages/core/src/utils/README.md @@ -0,0 +1,16 @@ +# Utils + +This directory contains a collection of utility tools (e.g., functions, type definitions, constants) for the SDK. + +## 🌲 Directory Structure + +| Module | Description | +| ---------------: | :----------------------------------------------------- | +| [`addresses`](./addresses.py) | Address constants & helper functions for address-related operations. | +| [`artifacts`](./artifacts.py) | Helper functions to load contract artifacts. | +| [`chains`](./chains.py) | Chain constants & helper functions for chain-related operations. | +| [`constants`](./constants.py) | Common constants among modules. | +| [`currencies`](./currencies.py) | Helper functions for converting units of currencies. | +| [`errors`](./errors.py) | Custom error classes. | +| [`types`](./types.py) | Custom types. | +| [`validators`](./validators.py) | Pydantic validators. | diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 0160407..8442de1 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -1,8 +1,8 @@ +from .addresses import get_proxy_address from .artifacts import ( get_artifacts, resolve_artifacts_file_path, ) -from .addresses import get_proxy_address from .chains import ( enumerate_supported_networks, get_default_rpc_endpoint, @@ -37,16 +37,17 @@ from .validators import ( Bytes32, ChecksumAddress, + RpcEndpoint, Uint256, Uint8, ) __all__ = [ - # contract artifacts - "get_artifacts", - "resolve_artifacts_file_path", # addresses "get_proxy_address", + # artifacts + "get_artifacts", + "resolve_artifacts_file_path", # chains "enumerate_supported_networks", "get_default_rpc_endpoint", @@ -76,6 +77,7 @@ # validators "Bytes32", "ChecksumAddress", + "RpcEndpoint", "Uint256", "Uint8", ] diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py index e46d7ef..4465ad9 100644 --- a/packages/core/src/utils/chains.py +++ b/packages/core/src/utils/chains.py @@ -2,6 +2,7 @@ from .errors import NetworkNotSupported from .types import ChainMetadata +from .validators import RpcEndpoint ################## # Chain Metadata # @@ -104,7 +105,7 @@ def is_supported_network(chain_name: str, network_name: str) -> bool: """ return chain_name in SUPPORTED_CHAINS and network_name in SUPPORTED_CHAINS[chain_name] -def get_default_rpc_endpoint(chain_name: str, network_name: str) -> str: +def get_default_rpc_endpoint(chain_name: str, network_name: str) -> RpcEndpoint: """Get the default RPC endpoint for the specified network. Args: @@ -112,7 +113,7 @@ def get_default_rpc_endpoint(chain_name: str, network_name: str) -> str: network_name (str): Network name Returns: - str: RPC endpoint + RpcEndpoint: RPC endpoint Raises: NetworkNotSupported: If the specified network is not supported by the SDK diff --git a/packages/core/src/utils/currencies.py b/packages/core/src/utils/currencies.py index a90839b..9a8c547 100644 --- a/packages/core/src/utils/currencies.py +++ b/packages/core/src/utils/currencies.py @@ -2,14 +2,16 @@ from web3 import Web3 -def remove_decimals(value: Decimal) -> int: +from utils.validators import Uint256 + +def remove_decimals(value: Uint256 | Decimal) -> Uint256: """Remove decimals. Args: - value (Decimal): Decimal value + value (Uint256 | Decimal): Value in ether Returns: - int: Value in wei + Uint256: Value in wei """ return Web3.to_wei(value, 'ether') diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 4bbd7d1..466d4ac 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -82,6 +82,16 @@ def __init__(self, message_: str): message=f"Invalid bytes32: {message_}.", ) +class InvalidRpcEndpoint(JpycSdkError, TypeError): + """Raised when the given string is not a valid RPC endpoint.""" + code = 204 + + def __init__(self, message_: str): + super().__init__( + code=InvalidRpcEndpoint.code, + message=f"Invalid RPC endpoint: {message_}.", + ) + ###################### # Transaction Errors # ###################### diff --git a/packages/core/src/utils/types.py b/packages/core/src/utils/types.py index 8125a7d..d2041fd 100644 --- a/packages/core/src/utils/types.py +++ b/packages/core/src/utils/types.py @@ -20,10 +20,13 @@ class NetworkMetadata(TypedDict): rpc_endpoints: List[str] ChainMetadata: TypeAlias = dict[ChainName, dict[str, NetworkMetadata]] +"""A type that contains metadata of chains.""" ############# # Contracts # ############# ContractVersion: TypeAlias = Literal["2"] +"""A type that contains available contract versions.""" ArtifactType: TypeAlias = Literal["abi", "bytecode"] +"""A type that contains types of contract artifacts.""" diff --git a/packages/core/src/utils/validators.py b/packages/core/src/utils/validators.py index 20ecaeb..fbb8610 100644 --- a/packages/core/src/utils/validators.py +++ b/packages/core/src/utils/validators.py @@ -7,6 +7,7 @@ from .errors import ( InvalidBytes32, InvalidChecksumAddress, + InvalidRpcEndpoint, InvalidUint8, InvalidUint256, ) @@ -84,7 +85,8 @@ def validate_bytes32(string: str) -> str: InvalidBytes32: If the string is not a valid bytes32 """ try: - assert len(bytes.fromhex(string)) == 32 + assert string[:2] == "0x" + assert len(bytes.fromhex(string[2:])) == 32 except Exception: raise InvalidBytes32(string) @@ -92,3 +94,25 @@ def validate_bytes32(string: str) -> str: Bytes32 = Annotated[str, AfterValidator(validate_bytes32)] """A type that contains a bytes32.""" + +def validate_rpc_endpoint(string: str) -> str: + """Checks if the given string is a valid RPC endpoint. + + Args: + string (str): String + + Returns: + str: String + + Raises: + InvalidRpcEndpoint: If the string is not a valid RPC endpoint + """ + try: + assert string.startswith(("http")) == True + except Exception: + raise InvalidRpcEndpoint(string) + + return string + +RpcEndpoint = Annotated[str, AfterValidator(validate_rpc_endpoint)] +"""A type that contains a rpc endpoint.""" From 666cf59e7f331447074f31213c4dcd63df1d056a Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Mon, 19 May 2025 12:51:13 +0900 Subject: [PATCH 23/56] Update & refactor clients --- packages/core/src/__init__.py | 2 + packages/core/src/client.py | 29 +++++--- packages/core/src/interfaces/README.md | 10 +++ packages/core/src/interfaces/__init__.py | 2 + packages/core/src/interfaces/client.py | 28 +++++-- packages/core/src/interfaces/jpyc.py | 94 +++++++++++++++++++----- packages/core/src/jpyc.py | 2 +- 7 files changed, 132 insertions(+), 35 deletions(-) create mode 100644 packages/core/src/interfaces/README.md diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py index ee2a271..cb83c76 100644 --- a/packages/core/src/__init__.py +++ b/packages/core/src/__init__.py @@ -6,6 +6,8 @@ __version__ = version("jpyc-core-sdk") __all__ = [ "__version__", + # client "SdkClient", + # jpyc "JPYC", ] diff --git a/packages/core/src/client.py b/packages/core/src/client.py index 60f86ab..be435be 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -1,4 +1,5 @@ from eth_account.signers.local import LocalAccount +from pydantic import validate_call from web3 import Account, HTTPProvider, Web3 from web3.middleware import ( ExtraDataToPOAMiddleware, @@ -12,16 +13,22 @@ SIGN_MIDDLEWARE, ) from utils.errors import AccountNotInitialized +from utils.validators import ( + Bytes32, + ChecksumAddress, + RpcEndpoint, +) class SdkClient(ISdkClient): """SDK client.""" + @validate_call def __init__( self, chain_name: str | None = None, network_name: str | None = None, - rpc_endpoint: str | None = None, - private_key: str | None = None, + rpc_endpoint: RpcEndpoint | None = None, + private_key: Bytes32 | None = None, ): """Constructor that initializes SDK client. @@ -33,10 +40,12 @@ def __init__( Args: chain_name (str, optional): Chain name network_name (str, optional): Network name - rpc_endpoint (str, optional): RPC endpoint - private_key (str, optional): private key of EOA + rpc_endpoint (RpcEndpoint, optional): RPC endpoint + private_key (Bytes32, optional): private key of EOA Raises: + InvalidBytes32: If the supplied `private_key` is not in a valid form + InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form NetworkNotSupported: If the specified network is not supported by the SDK """ rpc_endpoint = rpc_endpoint if rpc_endpoint is not None else get_default_rpc_endpoint(chain_name, network_name) @@ -55,13 +64,13 @@ def __init__( @staticmethod def __configure_w3( - rpc_endpoint: str, + rpc_endpoint: RpcEndpoint, account: LocalAccount | None = None, ) -> Web3: """Configure a web3 instance. Args: - rpc_endpoint (str): RPC endpoint + rpc_endpoint (RpcEndpoint): RPC endpoint account (LocalAccount, optional): Account instance Returns: @@ -90,7 +99,8 @@ def set_default_provider(self, chain_name: str, network_name: str) -> Web3: return self.w3 - def set_custom_provider(self, rpc_endpoint: str) -> Web3: + @validate_call + def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3: self.w3 = self.__configure_w3( rpc_endpoint=rpc_endpoint, account=self.account @@ -98,7 +108,8 @@ def set_custom_provider(self, rpc_endpoint: str) -> Web3: return self.w3 - def set_account(self, private_key: str | None) -> LocalAccount | None: + @validate_call + def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None: if private_key is None: self.account = None self.w3 = self.__configure_w3( @@ -113,7 +124,7 @@ def set_account(self, private_key: str | None) -> LocalAccount | None: return self.account - def get_account_address(self) -> str: + def get_account_address(self) -> ChecksumAddress: if self.account is None: raise AccountNotInitialized() diff --git a/packages/core/src/interfaces/README.md b/packages/core/src/interfaces/README.md new file mode 100644 index 0000000..83aa6df --- /dev/null +++ b/packages/core/src/interfaces/README.md @@ -0,0 +1,10 @@ +# Interfaces + +This directory contains the interfaces of the SDK. + +## 🌲 Directory Structure + +| Module | Description | +| ---------------: | :----------------------------------------------------- | +| [`client`](./client.py) | Interface of SDK client. | +| [`jpyc`](./jpyc.py) | Interface of JPYC contracts. | diff --git a/packages/core/src/interfaces/__init__.py b/packages/core/src/interfaces/__init__.py index 60d5863..a70d614 100644 --- a/packages/core/src/interfaces/__init__.py +++ b/packages/core/src/interfaces/__init__.py @@ -2,6 +2,8 @@ from .jpyc import IJPYC __all__ = [ + # client "ISdkClient", + # jpyc "IJPYC", ] diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index 941c64a..fe2d65a 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -3,6 +3,12 @@ from eth_account.signers.local import LocalAccount from web3 import Web3 +from utils.validators import ( + Bytes32, + ChecksumAddress, + RpcEndpoint, +) + class ISdkClient(ABC): """Interface of SDK client.""" @@ -23,39 +29,45 @@ def set_default_provider(self, chain_name: str, network_name: str) -> Web3: pass @abstractmethod - def set_custom_provider(self, rpc_endpoint: str) -> Web3: + def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3: """Set provider using a custom RPC endpoint. Args: - rpc_endpoint (str): Custom RPC endpoint + rpc_endpoint (RpcEndpoint): Custom RPC endpoint Returns: Web3: Configured web3 instance + + Raises: + InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form """ pass @abstractmethod - def set_account(self, private_key: str | None) -> LocalAccount | None: - """Set account with private key. + def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None: + """Set account with a private key. Notes: If `private_key` parameter is set to `None`, \ this method removes `account` from the configured web3 instance. Args: - private_key (str, optional): Private key of account + private_key (Bytes32, optional): Private key of account Returns: - LocalAccount | None: Configured account + LocalAccount | None: Configured account instance + + Raises: + InvalidBytes32: If the supplied `private_key` is not in a valid form """ pass @abstractmethod - def get_account_address(self) -> str: + def get_account_address(self) -> ChecksumAddress: """Get address of the configured account. Returns: - str: Public address of account + ChecksumAddress: Public address of account Raises: AccountNotInitialized: If account is not initialized diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py index 1148c2f..2bd98f6 100644 --- a/packages/core/src/interfaces/jpyc.py +++ b/packages/core/src/interfaces/jpyc.py @@ -1,6 +1,11 @@ from abc import ABC, abstractmethod -from utils.validators import Bytes32, ChecksumAddress, Uint256, Uint8 +from utils.validators import ( + Bytes32, + ChecksumAddress, + Uint256, + Uint8, +) class IJPYC(ABC): """Interface of JPYC contracts.""" @@ -18,6 +23,9 @@ def is_minter(self, account: ChecksumAddress) -> bool: Returns: bool: True if `account` is a minter, false otherwise + + Raises: + InvalidChecksumAddress: If supplied `account` is not in a valid form """ pass @@ -29,7 +37,10 @@ def minter_allowance(self, minter: ChecksumAddress) -> Uint256: minter (ChecksumAddress): Minter address Returns: - Decimal: Minter allowance + Uint256: Minter allowance + + Raises: + InvalidChecksumAddress: If supplied `minter` is not in a valid form """ pass @@ -38,7 +49,7 @@ def total_supply(self) -> Uint256: """Call `totalSupply` function. Returns: - Decimal: Total supply of tokens + Uint256: Total supply of tokens """ pass @@ -50,7 +61,10 @@ def balance_of(self, account: ChecksumAddress) -> Uint256: account (ChecksumAddress): Account address Returns: - Decimal: Account balance + Uint256: Account balance + + Raises: + InvalidChecksumAddress: If supplied `account` is not in a valid form """ pass @@ -63,7 +77,10 @@ def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256 spender (ChecksumAddress): Spender address Returns: - Decimal: Allowance of spender over owner's tokens + Uint256: Allowance of spender over owner's tokens + + Raises: + InvalidChecksumAddress: If supplied `owner` or `spender` is not in a valid form """ pass @@ -75,7 +92,10 @@ def nonces(self, owner: ChecksumAddress) -> Uint256: owner (ChecksumAddress): Owner address Returns: - int: Nonce for EIP2612's `permit`. + Uint256: Nonce for EIP2612's `permit`. + + Raises: + InvalidChecksumAddress: If supplied `owner` is not in a valid form """ pass @@ -96,7 +116,10 @@ def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Uint2 Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidChecksumAddress: If supplied `minter` is not in a valid form + InvalidUint256: If supplied `minter_allowed_amount` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -113,7 +136,10 @@ def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidChecksumAddress: If supplied `to` is not in a valid form + InvalidUint256: If supplied `amount` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -130,7 +156,10 @@ def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidChecksumAddress: If supplied `to` is not in a valid form + InvalidUint256: If supplied `value` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -148,7 +177,10 @@ def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form + InvalidUint256: If supplied `value` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -183,7 +215,12 @@ def transfer_with_authorization( Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form + InvalidUint256: If supplied `value` or `valid_after` or `valid_before` is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -218,7 +255,12 @@ def receive_with_authorization( Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form + InvalidUint256: If supplied `value` or `valid_after` or `valid_before` is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -245,7 +287,11 @@ def cancel_authorization( Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `authorizer` is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -262,7 +308,10 @@ def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidChecksumAddress: If supplied `spender` is not in a valid form + InvalidUint256: If supplied `value` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -279,7 +328,10 @@ def increase_allowance(self, spender: ChecksumAddress, increment: Uint256) -> By Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidChecksumAddress: If supplied `spender` is not in a valid form + InvalidUint256: If supplied `increment` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -296,7 +348,10 @@ def decrease_allowance(self, spender: ChecksumAddress, decrement: Uint256) -> By Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidChecksumAddress: If supplied `spender` is not in a valid form + InvalidUint256: If supplied `decrement` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass @@ -327,6 +382,11 @@ def permit( Raises: AccountNotInitialized: If account is not initialized - TransactionFailedToSend: If failed to send a transaction + InvalidBytes32: If supplied `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `owner` or `spender` is not in a valid form + InvalidUint256: If supplied `value` or `deadline` is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails """ pass diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 395818b..c2c7d1d 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -203,7 +203,7 @@ def __transact(self, contract_func: ContractFunction, func_args: dict[Any]) -> A Raises: AccountNotInitialized: If account is not initialized TransactionSimulationFailed: If transaction simulation fails - TransactionFailedToSend: If transaction fails + TransactionFailed: If transaction fails """ self.__account_initialized() From e4d4a4068b1587db2e309965479c15bb4f2f1adc Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Mon, 19 May 2025 16:45:10 +0900 Subject: [PATCH 24/56] Fix clients & imports --- packages/core/src/__init__.py | 6 ++--- packages/core/src/client.py | 11 ++++---- packages/core/src/interfaces/client.py | 2 +- packages/core/src/interfaces/jpyc.py | 2 +- packages/core/src/jpyc.py | 37 +++++++++++++++----------- packages/core/src/utils/currencies.py | 2 +- 6 files changed, 34 insertions(+), 26 deletions(-) diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py index cb83c76..5c0ec42 100644 --- a/packages/core/src/__init__.py +++ b/packages/core/src/__init__.py @@ -1,11 +1,11 @@ -from importlib.metadata import version +# from importlib.metadata import version from .client import SdkClient from .jpyc import JPYC -__version__ = version("jpyc-core-sdk") +# __version__ = version("jpyc-core-sdk") __all__ = [ - "__version__", + # "__version__", # client "SdkClient", # jpyc diff --git a/packages/core/src/client.py b/packages/core/src/client.py index be435be..3353b96 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -6,14 +6,14 @@ SignAndSendRawMiddlewareBuilder, ) -from interfaces import ISdkClient -from utils.chains import get_default_rpc_endpoint -from utils.constants import ( +from .interfaces import ISdkClient +from .utils.chains import get_default_rpc_endpoint +from .utils.constants import ( POA_MIDDLEWARE, SIGN_MIDDLEWARE, ) -from utils.errors import AccountNotInitialized -from utils.validators import ( +from .utils.errors import AccountNotInitialized +from .utils.validators import ( Bytes32, ChecksumAddress, RpcEndpoint, @@ -83,6 +83,7 @@ def __configure_w3( layer=0, ) if account is not None: + w3.eth.default_account = account.address w3.middleware_onion.inject( SignAndSendRawMiddlewareBuilder.build(account), name=SIGN_MIDDLEWARE, diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index fe2d65a..5305ef2 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -3,7 +3,7 @@ from eth_account.signers.local import LocalAccount from web3 import Web3 -from utils.validators import ( +from ..utils.validators import ( Bytes32, ChecksumAddress, RpcEndpoint, diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py index 2bd98f6..d122225 100644 --- a/packages/core/src/interfaces/jpyc.py +++ b/packages/core/src/interfaces/jpyc.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from utils.validators import ( +from ..utils.validators import ( Bytes32, ChecksumAddress, Uint256, diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index c2c7d1d..cae340d 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -1,29 +1,30 @@ from typing import Any +from eth_typing import ChecksumAddress as EthChecksumAddress from pydantic import validate_call -from web3.contract.contract import ContractFunction +from web3.contract.contract import Contract, ContractFunction -from interfaces import IJPYC, ISdkClient -from utils.addresses import ( +from .interfaces import IJPYC, ISdkClient +from .utils.addresses import ( get_proxy_address, ) -from utils.artifacts import ( +from .utils.artifacts import ( get_artifacts, resolve_artifacts_file_path, ) -from utils.chains import SUPPORTED_CHAINS -from utils.constants import SIGN_MIDDLEWARE -from utils.currencies import ( +from .utils.chains import SUPPORTED_CHAINS +from .utils.constants import SIGN_MIDDLEWARE +from .utils.currencies import ( remove_decimals, restore_decimals, ) -from utils.errors import ( +from .utils.errors import ( AccountNotInitialized, TransactionFailed, TransactionSimulationFailed, ) -from utils.types import ContractVersion -from utils.validators import Bytes32, ChecksumAddress, Uint256, Uint8 +from .utils.types import ContractVersion +from .utils.validators import Bytes32, ChecksumAddress, Uint256, Uint8 class JPYC(IJPYC): """Implementation of IJPYC.""" @@ -32,19 +33,22 @@ def __init__( self, client: ISdkClient, contract_version: ContractVersion = "2", + contract_address: EthChecksumAddress | None = None, ): """Constructor that initializes JPYC client. Notes: - If `client` parameter is configured to use localhost network,\ + - If `client` parameter is configured to use localhost network,\ this deploys JPYC contracts to localhost network, initializes it,\ and sets its address to `address` attribute. + - If `contract_address` is supplied, this configures contract instance with that address. Args: client (ISdkClient): Configured SDK client contract_version (ContractVersion): Contract version + contract_address (EthChecksumAddress, optional): Contract address """ - if (client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"]): + if (client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"] and contract_address is None): address = self.__deploy_contract( client=client, contract_version=contract_version, @@ -67,7 +71,10 @@ def __init__( owner_address, ).transact() else: - address = get_proxy_address(contract_version=contract_version) + address = ( + contract_address if contract_address is not None + else get_proxy_address(contract_version=contract_version) + ) contract = self.__get_contract( client=client, contract_address=address, @@ -115,7 +122,7 @@ def __get_contract( client: ISdkClient, contract_address: ChecksumAddress, contract_version: ContractVersion = "2", - ) -> ChecksumAddress: + ) -> Contract: """Get contract instance from the configured network. Args: @@ -124,7 +131,7 @@ def __get_contract( contract_version (ContractVersion): Contract version Returns: - ChecksumAddress: Address of the deployed contracts + Contract: Address of the deployed contracts """ return client.w3.eth.contract( address=contract_address, diff --git a/packages/core/src/utils/currencies.py b/packages/core/src/utils/currencies.py index 9a8c547..370af55 100644 --- a/packages/core/src/utils/currencies.py +++ b/packages/core/src/utils/currencies.py @@ -2,7 +2,7 @@ from web3 import Web3 -from utils.validators import Uint256 +from .validators import Uint256 def remove_decimals(value: Uint256 | Decimal) -> Uint256: """Remove decimals. From e9c4a4fc7657026a769da617099442106aa3fd68 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Mon, 19 May 2025 16:45:45 +0900 Subject: [PATCH 25/56] Add example code for basic usage --- packages/core/examples/constants.py | 23 +++++++++++ packages/core/examples/main.py | 30 ++++++++++++++ packages/core/examples/mint.py | 48 +++++++++++++++++++++ packages/core/examples/transfer.py | 38 +++++++++++++++++ packages/core/examples/transfer_from.py | 55 +++++++++++++++++++++++++ 5 files changed, 194 insertions(+) create mode 100644 packages/core/examples/constants.py create mode 100644 packages/core/examples/main.py create mode 100644 packages/core/examples/mint.py create mode 100644 packages/core/examples/transfer.py create mode 100644 packages/core/examples/transfer_from.py diff --git a/packages/core/examples/constants.py b/packages/core/examples/constants.py new file mode 100644 index 0000000..70f16f6 --- /dev/null +++ b/packages/core/examples/constants.py @@ -0,0 +1,23 @@ +from dataclasses import dataclass +from typing import Final, List + +@dataclass(frozen=True) +class KnownAccount: + address: str + private_key: str + +# A list of known accounts (DO NOT USE IN PRODUCTION) +KNOWN_ACCOUNTS: Final[List[KnownAccount]] = [ + KnownAccount( + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + ), + KnownAccount( + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + ), + KnownAccount( + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", + ), +] diff --git a/packages/core/examples/main.py b/packages/core/examples/main.py new file mode 100644 index 0000000..1a1ae30 --- /dev/null +++ b/packages/core/examples/main.py @@ -0,0 +1,30 @@ +from pathlib import Path +import sys + +sys.path.append(str(Path(__file__).parents[1])) + +from src.jpyc import * +from src.client import * + +from examples.constants import KNOWN_ACCOUNTS + +# SDK clients +client_0 = SdkClient( + chain_name="localhost", + network_name="devnet", + private_key=KNOWN_ACCOUNTS[0].private_key, +) +client_1 = SdkClient( + chain_name="localhost", + network_name="devnet", + private_key=KNOWN_ACCOUNTS[1].private_key, +) + +# JPYC clients +jpyc_0 = JPYC( + client=client_0, +) +jpyc_1 = JPYC( + client=client_1, + contract_address=jpyc_0.contract.address, +) diff --git a/packages/core/examples/mint.py b/packages/core/examples/mint.py new file mode 100644 index 0000000..0ae5b89 --- /dev/null +++ b/packages/core/examples/mint.py @@ -0,0 +1,48 @@ +from pathlib import Path +import sys + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from src.jpyc import * +from src.client import * + +def main(): + # 0. Check initial total supply of jpyc tokens + total_supply = jpyc_0.total_supply() + print(f"Total Supply (before minting): {total_supply}") + + # 1. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 2. Check minter validity + is_minter_0 = jpyc_0.is_minter(account=KNOWN_ACCOUNTS[0].address) + print(f"Is {KNOWN_ACCOUNTS[0].address} a minter?: {is_minter_0}") + + is_minter_1 = jpyc_0.is_minter(account=KNOWN_ACCOUNTS[1].address) + print(f"Is {KNOWN_ACCOUNTS[1].address} a minter?: {is_minter_1}") + + # 3. Check minter allowance + minter_allowance = jpyc_0.minter_allowance(minter=KNOWN_ACCOUNTS[0].address) + print(f"Minter allowance of {KNOWN_ACCOUNTS[0].address}: {minter_allowance}") + + # 4. Mint jpyc tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[1].address, + amount=10000, + ) + + # 5. Check balance of receiver address + balance = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance}") + + # 6. Check total supply of jpyc tokens after minting + total_supply = jpyc_0.total_supply() + print(f"Total Supply (after minting): {total_supply}") + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/transfer.py b/packages/core/examples/transfer.py new file mode 100644 index 0000000..89ad9ac --- /dev/null +++ b/packages/core/examples/transfer.py @@ -0,0 +1,38 @@ +from pathlib import Path +import sys + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from src.jpyc import * +from src.client import * + +def main(): + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.transfer( + to=KNOWN_ACCOUNTS[1].address, + value=3000, + ) + + # 3. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/transfer_from.py b/packages/core/examples/transfer_from.py new file mode 100644 index 0000000..c773e0d --- /dev/null +++ b/packages/core/examples/transfer_from.py @@ -0,0 +1,55 @@ +from pathlib import Path +import sys + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0, jpyc_1 +from src.jpyc import * +from src.client import * + +def main(): + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Approve `KNOWN_ACCOUNTS[1]` to transfer JPYC tokens on behalf of `KNOWN_ACCOUNTS[0]` + jpyc_0.approve( + spender=KNOWN_ACCOUNTS[1].address, + value=5000, + ) + + # 3. Check allowance + allowance = jpyc_0.allowance( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + ) + print(f"Allowance of {KNOWN_ACCOUNTS[1].address} over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}") + + # 4. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[1]`) + jpyc_1.transfer_from( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[2].address, + value=2500, + ) + + # 5. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + + balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) + print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + +if __name__ == "__main__": + main() From 1351742f2dbcc3c268ed4f337b97e169f23e1cec Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Tue, 20 May 2025 18:40:53 +0900 Subject: [PATCH 26/56] Add code examples for eip-3009 methods --- .../core/examples/cancel_authorization.py | 130 ++++++++++++++++++ packages/core/examples/permit.py | 91 ++++++++++++ .../examples/receive_with_authorization.py | 100 ++++++++++++++ .../examples/transfer_with_authorization.py | 100 ++++++++++++++ 4 files changed, 421 insertions(+) create mode 100644 packages/core/examples/cancel_authorization.py create mode 100644 packages/core/examples/permit.py create mode 100644 packages/core/examples/receive_with_authorization.py create mode 100644 packages/core/examples/transfer_with_authorization.py diff --git a/packages/core/examples/cancel_authorization.py b/packages/core/examples/cancel_authorization.py new file mode 100644 index 0000000..12f9e83 --- /dev/null +++ b/packages/core/examples/cancel_authorization.py @@ -0,0 +1,130 @@ +from pathlib import Path +from random import randbytes +import sys +import time + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from src.jpyc import * +from src.client import * + +def main(): + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Prepare common typed data + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": 31337, + "verifyingContract": jpyc_0.contract.address, + } + nonce = f"0x{randbytes(32).hex()}" + + # 3. Sign a typed message for`transferWithAuthorization` + types = { + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" }, + ], + "TransferWithAuthorization": [ + { "name": "from", "type": "address" }, + { "name": "to", "type": "address" }, + { "name": "value", "type": "uint256" }, + { "name": "validAfter", "type": "uint256" }, + { "name": "validBefore", "type": "uint256" }, + { "name": "nonce", "type": "bytes32" }, + ], + } + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[2].address + value = 3000 + validAfter = 0 + validBefore = int(time.time()) + 3600 + + signature = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "TransferWithAuthorization", + "message": { + "from": from_, + "to": to, + "value": value, + "validAfter": validAfter, + "validBefore": validBefore, + "nonce": nonce, + }, + } + ) + + # 4. Sign a typed message for `cancelAuthorization` + types = { + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" }, + ], + "CancelAuthorization": [ + { "name": "authorizer", "type": "address" }, + { "name": "nonce", "type": "bytes32" }, + ], + } + + signature = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "CancelAuthorization", + "message": { + "authorizer": from_, + "nonce": nonce, + }, + } + ) + + # 5. Cancel authorization (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.cancel_authorization( + authorizer=from_, + nonce=nonce, + v=signature.v, + r=hex(signature.r), + s=hex(signature.s), + ) + + # 6. Check if authorization has been cancelled (note that caller here is `KNOWN_ACCOUNTS[0]`) + try: + jpyc_0.transfer_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=validAfter, + valid_before=validBefore, + nonce=nonce, + v=signature.v, + r=hex(signature.r), + s=hex(signature.s), + ) + except Exception as e: + print(f"Authorization has been successfully cancelled: {e}") + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/permit.py b/packages/core/examples/permit.py new file mode 100644 index 0000000..deefbc7 --- /dev/null +++ b/packages/core/examples/permit.py @@ -0,0 +1,91 @@ +from pathlib import Path +import sys +import time + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from src.jpyc import * +from src.client import * + +# WARNING: this is a broken code example (`EIP3009: invalid signature` is raised) +def main(): + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Sign a typed message + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": 31337, + "verifyingContract": jpyc_0.contract.address, + } + types = { + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" }, + ], + "Permit": [ + { "name": "owner", "type": "address" }, + { "name": "spender", "type": "address" }, + { "name": "value", "type": "uint256" }, + { "name": "deadline", "type": "uint256" }, + ], + } + owner = KNOWN_ACCOUNTS[0].address + spender = KNOWN_ACCOUNTS[1].address + value = 3000 + deadline = int(time.time()) + 3600 + nonce = hex(jpyc_0.nonces(owner=owner))[2:] + nonce_bytes32 = f"0x{nonce.zfill(64)}" + + signature = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "Permit", + "message": { + "owner": owner, + "spender": spender, + "value": value, + "deadline": deadline, + "nonce": nonce_bytes32, + }, + } + ) + + # 3. Permit `spender` to transfer JPYC tokens on behalf of `owner` (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.permit( + owner=owner, + spender=spender, + value=value, + deadline=deadline, + v=signature.v, + r=hex(signature.r), + s=hex(signature.s), + ) + + # 4. Check allowance + allowance = jpyc_0.allowance( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + ) + print(f"Allowance of {KNOWN_ACCOUNTS[1].address} over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}") + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/receive_with_authorization.py b/packages/core/examples/receive_with_authorization.py new file mode 100644 index 0000000..0234fcf --- /dev/null +++ b/packages/core/examples/receive_with_authorization.py @@ -0,0 +1,100 @@ +from pathlib import Path +from random import randbytes +import sys +import time + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0, jpyc_1 +from src.jpyc import * +from src.client import * + +# WARNING: this is a broken code example (`EIP3009: invalid signature` is raised) +def main(): + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Sign a typed message + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": 31337, + "verifyingContract": jpyc_0.contract.address, + } + types = { + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" }, + ], + "ReceiveWithAuthorization": [ + { "name": "from", "type": "address" }, + { "name": "to", "type": "address" }, + { "name": "value", "type": "uint256" }, + { "name": "validAfter", "type": "uint256" }, + { "name": "validBefore", "type": "uint256" }, + { "name": "nonce", "type": "bytes32" }, + ], + } + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 3000 + validAfter = 0 + validBefore = int(time.time()) + 3600 + nonce = f"0x{randbytes(32).hex()}" + + signature = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "ReceiveWithAuthorization", + "message": { + "from": from_, + "to": to, + "value": value, + "validAfter": validAfter, + "validBefore": validBefore, + "nonce": nonce, + }, + } + ) + + # 3. Receive JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[1]`) + jpyc_1.receive_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=validAfter, + valid_before=validBefore, + nonce=nonce, + v=signature.v, + r=hex(signature.r), + s=hex(signature.s), + ) + + # 4. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + + balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) + print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/transfer_with_authorization.py b/packages/core/examples/transfer_with_authorization.py new file mode 100644 index 0000000..5a6836f --- /dev/null +++ b/packages/core/examples/transfer_with_authorization.py @@ -0,0 +1,100 @@ +from pathlib import Path +from random import randbytes +import sys +import time + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from src.jpyc import * +from src.client import * + +# WARNING: this is a broken code example (`EIP3009: invalid signature` is raised) +def main(): + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Sign a typed message + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": 31337, + "verifyingContract": jpyc_0.contract.address, + } + types = { + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" }, + ], + "TransferWithAuthorization": [ + { "name": "from", "type": "address" }, + { "name": "to", "type": "address" }, + { "name": "value", "type": "uint256" }, + { "name": "validAfter", "type": "uint256" }, + { "name": "validBefore", "type": "uint256" }, + { "name": "nonce", "type": "bytes32" }, + ], + } + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[2].address + value = 3000 + validAfter = 0 + validBefore = int(time.time()) + 3600 + nonce = f"0x{randbytes(32).hex()}" + + signature = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "TransferWithAuthorization", + "message": { + "from": from_, + "to": to, + "value": value, + "validAfter": validAfter, + "validBefore": validBefore, + "nonce": nonce, + }, + } + ) + + # 3. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.transfer_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=validAfter, + valid_before=validBefore, + nonce=nonce, + v=signature.v, + r=hex(signature.r), + s=hex(signature.s), + ) + + # 4. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + + balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) + print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + +if __name__ == "__main__": + main() From 2b40d3d52bf0443acff2b17e37866676d7c86d1b Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Tue, 20 May 2025 18:41:16 +0900 Subject: [PATCH 27/56] Add 'README' at 'examples' directory --- packages/core/examples/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 packages/core/examples/README.md diff --git a/packages/core/examples/README.md b/packages/core/examples/README.md new file mode 100644 index 0000000..23812a7 --- /dev/null +++ b/packages/core/examples/README.md @@ -0,0 +1,18 @@ +# Examples + +This directory contains a collection of code examples of using the SDK. + +## 🌲 Directory Structure + +> [!CAUTION] +> Code examples for the methods defined in [EIP-3009](https://eips.ethereum.org/EIPS/eip-3009) (`transfer_with_authorization`, `receive_with_authorization` and `cancel_authorization`) are currently broken. + +| Module | Description | +| ---------------: | :----------------------------------------------------- | +| [`transfer`](./transfer.py) | Code example that uses `transfer` method. | +| [`transfer_from`](./transfer_from.py) | Code example that uses `approve` & `transferFrom` methods. | +| [`transfer_with_authorization`](./transfer_with_authorization.py) | Code example that uses `transferWithAuthorization` method. | +| [`receive_with_authorization`](./receive_with_authorization.py) | Code example that uses `receiveWithAuthorization` method. | +| [`cancel_authorization`](./cancel_authorization.py) | Code example that uses `cancelAuthorization` method. | +| [`permit`](./permit.py) | Code example that uses `permit` method. | +| [`mint`](./mint.py) | Code example that uses `mint` method. | From 6f5f48e05af3a84df4523f851f1e7034d0d92d33 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Tue, 20 May 2025 21:05:28 +0900 Subject: [PATCH 28/56] Fix & refactor broken code examples --- .../core/examples/cancel_authorization.py | 25 +++++++++++-------- packages/core/examples/permit.py | 20 +++++++-------- .../examples/receive_with_authorization.py | 14 +++++------ .../examples/transfer_with_authorization.py | 14 +++++------ packages/core/examples/utils.py | 7 ++++++ 5 files changed, 45 insertions(+), 35 deletions(-) create mode 100644 packages/core/examples/utils.py diff --git a/packages/core/examples/cancel_authorization.py b/packages/core/examples/cancel_authorization.py index 12f9e83..ae38af2 100644 --- a/packages/core/examples/cancel_authorization.py +++ b/packages/core/examples/cancel_authorization.py @@ -9,6 +9,7 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 +from examples.utils import add_zero_padding_to_hex, remove_decimals from src.jpyc import * from src.client import * @@ -29,7 +30,7 @@ def main(): domain = { "name": jpyc_0.contract.functions.name().call(), "version": "1", - "chainId": 31337, + "chainId": jpyc_0.client.w3.eth.chain_id, "verifyingContract": jpyc_0.contract.address, } nonce = f"0x{randbytes(32).hex()}" @@ -57,7 +58,7 @@ def main(): validAfter = 0 validBefore = int(time.time()) + 3600 - signature = Account.sign_typed_data( + signed_message_transfer = Account.sign_typed_data( KNOWN_ACCOUNTS[0].private_key, full_message={ "domain": domain, @@ -66,7 +67,7 @@ def main(): "message": { "from": from_, "to": to, - "value": value, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling "validAfter": validAfter, "validBefore": validBefore, "nonce": nonce, @@ -88,7 +89,7 @@ def main(): ], } - signature = Account.sign_typed_data( + signed_message_cancel = Account.sign_typed_data( KNOWN_ACCOUNTS[0].private_key, full_message={ "domain": domain, @@ -105,9 +106,9 @@ def main(): jpyc_0.cancel_authorization( authorizer=from_, nonce=nonce, - v=signature.v, - r=hex(signature.r), - s=hex(signature.s), + v=signed_message_cancel.v, + r=add_zero_padding_to_hex(hex(signed_message_cancel.r), 32), + s=add_zero_padding_to_hex(hex(signed_message_cancel.s), 32), ) # 6. Check if authorization has been cancelled (note that caller here is `KNOWN_ACCOUNTS[0]`) @@ -119,12 +120,14 @@ def main(): valid_after=validAfter, valid_before=validBefore, nonce=nonce, - v=signature.v, - r=hex(signature.r), - s=hex(signature.s), + v=signed_message_transfer.v, + r=add_zero_padding_to_hex(hex(signed_message_transfer.r), 32), + s=add_zero_padding_to_hex(hex(signed_message_transfer.s), 32), ) except Exception as e: - print(f"Authorization has been successfully cancelled: {e}") + print(f"Authorization has been cancelled successfully.") + else: + raise Exception("ERROR: authorization has not been cancelled.") if __name__ == "__main__": main() diff --git a/packages/core/examples/permit.py b/packages/core/examples/permit.py index deefbc7..af320b0 100644 --- a/packages/core/examples/permit.py +++ b/packages/core/examples/permit.py @@ -8,10 +8,10 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 +from examples.utils import add_zero_padding_to_hex, remove_decimals from src.jpyc import * from src.client import * -# WARNING: this is a broken code example (`EIP3009: invalid signature` is raised) def main(): # 0. Configure a minter jpyc_0.configure_minter( @@ -29,7 +29,7 @@ def main(): domain = { "name": jpyc_0.contract.functions.name().call(), "version": "1", - "chainId": 31337, + "chainId": jpyc_0.client.w3.eth.chain_id, "verifyingContract": jpyc_0.contract.address, } types = { @@ -43,6 +43,7 @@ def main(): { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" }, { "name": "value", "type": "uint256" }, + { "name": 'nonce', "type": 'uint256' }, { "name": "deadline", "type": "uint256" }, ], } @@ -50,10 +51,9 @@ def main(): spender = KNOWN_ACCOUNTS[1].address value = 3000 deadline = int(time.time()) + 3600 - nonce = hex(jpyc_0.nonces(owner=owner))[2:] - nonce_bytes32 = f"0x{nonce.zfill(64)}" + nonce = jpyc_0.nonces(owner=owner) - signature = Account.sign_typed_data( + signed_message = Account.sign_typed_data( KNOWN_ACCOUNTS[0].private_key, full_message={ "domain": domain, @@ -62,9 +62,9 @@ def main(): "message": { "owner": owner, "spender": spender, - "value": value, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling + "nonce": nonce, "deadline": deadline, - "nonce": nonce_bytes32, }, } ) @@ -75,9 +75,9 @@ def main(): spender=spender, value=value, deadline=deadline, - v=signature.v, - r=hex(signature.r), - s=hex(signature.s), + v=signed_message.v, + r=add_zero_padding_to_hex(hex(signed_message.r), 32), + s=add_zero_padding_to_hex(hex(signed_message.s), 32), ) # 4. Check allowance diff --git a/packages/core/examples/receive_with_authorization.py b/packages/core/examples/receive_with_authorization.py index 0234fcf..70be0b8 100644 --- a/packages/core/examples/receive_with_authorization.py +++ b/packages/core/examples/receive_with_authorization.py @@ -9,10 +9,10 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0, jpyc_1 +from examples.utils import add_zero_padding_to_hex, remove_decimals from src.jpyc import * from src.client import * -# WARNING: this is a broken code example (`EIP3009: invalid signature` is raised) def main(): # 0. Configure a minter jpyc_0.configure_minter( @@ -30,7 +30,7 @@ def main(): domain = { "name": jpyc_0.contract.functions.name().call(), "version": "1", - "chainId": 31337, + "chainId": jpyc_0.client.w3.eth.chain_id, "verifyingContract": jpyc_0.contract.address, } types = { @@ -56,7 +56,7 @@ def main(): validBefore = int(time.time()) + 3600 nonce = f"0x{randbytes(32).hex()}" - signature = Account.sign_typed_data( + signed_message = Account.sign_typed_data( KNOWN_ACCOUNTS[0].private_key, full_message={ "domain": domain, @@ -65,7 +65,7 @@ def main(): "message": { "from": from_, "to": to, - "value": value, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling "validAfter": validAfter, "validBefore": validBefore, "nonce": nonce, @@ -81,9 +81,9 @@ def main(): valid_after=validAfter, valid_before=validBefore, nonce=nonce, - v=signature.v, - r=hex(signature.r), - s=hex(signature.s), + v=signed_message.v, + r=add_zero_padding_to_hex(hex(signed_message.r), 32), + s=add_zero_padding_to_hex(hex(signed_message.s), 32), ) # 4. Check balances diff --git a/packages/core/examples/transfer_with_authorization.py b/packages/core/examples/transfer_with_authorization.py index 5a6836f..f0b84e5 100644 --- a/packages/core/examples/transfer_with_authorization.py +++ b/packages/core/examples/transfer_with_authorization.py @@ -9,10 +9,10 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 +from examples.utils import add_zero_padding_to_hex, remove_decimals from src.jpyc import * from src.client import * -# WARNING: this is a broken code example (`EIP3009: invalid signature` is raised) def main(): # 0. Configure a minter jpyc_0.configure_minter( @@ -30,7 +30,7 @@ def main(): domain = { "name": jpyc_0.contract.functions.name().call(), "version": "1", - "chainId": 31337, + "chainId": jpyc_0.client.w3.eth.chain_id, "verifyingContract": jpyc_0.contract.address, } types = { @@ -56,7 +56,7 @@ def main(): validBefore = int(time.time()) + 3600 nonce = f"0x{randbytes(32).hex()}" - signature = Account.sign_typed_data( + signed_message = Account.sign_typed_data( KNOWN_ACCOUNTS[0].private_key, full_message={ "domain": domain, @@ -65,7 +65,7 @@ def main(): "message": { "from": from_, "to": to, - "value": value, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling "validAfter": validAfter, "validBefore": validBefore, "nonce": nonce, @@ -81,9 +81,9 @@ def main(): valid_after=validAfter, valid_before=validBefore, nonce=nonce, - v=signature.v, - r=hex(signature.r), - s=hex(signature.s), + v=signed_message.v, + r=add_zero_padding_to_hex(hex(signed_message.r), 32), + s=add_zero_padding_to_hex(hex(signed_message.s), 32), ) # 4. Check balances diff --git a/packages/core/examples/utils.py b/packages/core/examples/utils.py new file mode 100644 index 0000000..a1c6cde --- /dev/null +++ b/packages/core/examples/utils.py @@ -0,0 +1,7 @@ +from web3 import Web3 + +def add_zero_padding_to_hex(hex_string: str, num_of_bytes: int): + return f"0x{hex_string[2:].zfill(num_of_bytes * 2)}" + +def remove_decimals(value: int) -> int: + return Web3.to_wei(value, 'ether') From 0dcf9449eb19e220d91e25ad5021a1302235c508 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Tue, 20 May 2025 21:05:47 +0900 Subject: [PATCH 29/56] Update 'examples/README' --- packages/core/examples/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/examples/README.md b/packages/core/examples/README.md index 23812a7..518b606 100644 --- a/packages/core/examples/README.md +++ b/packages/core/examples/README.md @@ -4,11 +4,9 @@ This directory contains a collection of code examples of using the SDK. ## 🌲 Directory Structure -> [!CAUTION] -> Code examples for the methods defined in [EIP-3009](https://eips.ethereum.org/EIPS/eip-3009) (`transfer_with_authorization`, `receive_with_authorization` and `cancel_authorization`) are currently broken. - | Module | Description | | ---------------: | :----------------------------------------------------- | +| [`main`](./main.py) | Code example that configures SDK clients. | | [`transfer`](./transfer.py) | Code example that uses `transfer` method. | | [`transfer_from`](./transfer_from.py) | Code example that uses `approve` & `transferFrom` methods. | | [`transfer_with_authorization`](./transfer_with_authorization.py) | Code example that uses `transferWithAuthorization` method. | @@ -16,3 +14,5 @@ This directory contains a collection of code examples of using the SDK. | [`cancel_authorization`](./cancel_authorization.py) | Code example that uses `cancelAuthorization` method. | | [`permit`](./permit.py) | Code example that uses `permit` method. | | [`mint`](./mint.py) | Code example that uses `mint` method. | +| [`constants`](./constants.py) | Some constants for code examples. | +| [`utils`](./utils.py) | Some utility functions for code examples. | From 658456fc97eb8cdf7244f1f5e0d1357f14ab474b Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 01:11:53 +0900 Subject: [PATCH 30/56] Configure ruff; apply linter & formatter --- packages/core/README.md | 35 ++++++++++++ packages/core/examples/__init__.py | 0 .../core/examples/cancel_authorization.py | 57 ++++++++++--------- packages/core/examples/constants.py | 6 +- packages/core/examples/main.py | 7 +-- packages/core/examples/mint.py | 6 +- packages/core/examples/permit.py | 37 ++++++------ .../examples/receive_with_authorization.py | 30 +++++----- packages/core/examples/transfer.py | 6 +- packages/core/examples/transfer_from.py | 16 ++++-- .../examples/transfer_with_authorization.py | 30 +++++----- packages/core/examples/utils.py | 4 +- packages/core/pyproject.toml | 8 +-- packages/core/src/client.py | 26 +++++---- packages/core/src/interfaces/client.py | 1 + packages/core/src/interfaces/jpyc.py | 31 +++++++--- packages/core/src/jpyc.py | 38 +++++++++---- packages/core/src/utils/__init__.py | 10 ++-- packages/core/src/utils/addresses.py | 11 +++- packages/core/src/utils/artifacts.py | 6 +- packages/core/src/utils/chains.py | 14 ++++- packages/core/src/utils/constants.py | 4 +- packages/core/src/utils/currencies.py | 7 ++- packages/core/src/utils/errors.py | 29 +++++++++- packages/core/src/utils/types.py | 6 +- packages/core/src/utils/validators.py | 18 +++++- 26 files changed, 293 insertions(+), 150 deletions(-) create mode 100644 packages/core/examples/__init__.py diff --git a/packages/core/README.md b/packages/core/README.md index e255c73..7d33f3b 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -3,6 +3,41 @@ > [!IMPORTANT] > TODO: README in English +## Package Management + +### Add packages + +```sh +# Add packages for production +$ uv add {package_name} +# Add packages for development +$ uv add --dev {package_name} +``` + +### Remove packages + +```sh +$ uv remove {package_name} +``` + ## Comments & Docstrings Docstrings should be written in the [Google-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). + +## Linting + +```sh +# Run linter without fixing +$ uv run riff check {dir_name} +# Run linter & auto-fix +$ uv run riff check {dir_name} --fix +``` + +## Formatting + +```sh +# Run formatter without fixing +$ uv run riff format {dir_name} --check +# Run formatter & auto-fix +$ uv run riff format {dir_name} +``` diff --git a/packages/core/examples/__init__.py b/packages/core/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/examples/cancel_authorization.py b/packages/core/examples/cancel_authorization.py index ae38af2..22973c2 100644 --- a/packages/core/examples/cancel_authorization.py +++ b/packages/core/examples/cancel_authorization.py @@ -1,7 +1,7 @@ -from pathlib import Path -from random import randbytes import sys import time +from pathlib import Path +from random import randbytes from eth_account import Account @@ -10,8 +10,7 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 from examples.utils import add_zero_padding_to_hex, remove_decimals -from src.jpyc import * -from src.client import * + def main(): # 0. Configure a minter @@ -20,7 +19,8 @@ def main(): minter_allowed_amount=1000000, ) - # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + # 1. Mint JPYC tokens + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` jpyc_0.mint( to=KNOWN_ACCOUNTS[0].address, amount=10000, @@ -38,18 +38,18 @@ def main(): # 3. Sign a typed message for`transferWithAuthorization` types = { "EIP712Domain": [ - { "name": "name", "type": "string" }, - { "name": "version", "type": "string" }, - { "name": "chainId", "type": "uint256" }, - { "name": "verifyingContract", "type": "address" }, + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, ], "TransferWithAuthorization": [ - { "name": "from", "type": "address" }, - { "name": "to", "type": "address" }, - { "name": "value", "type": "uint256" }, - { "name": "validAfter", "type": "uint256" }, - { "name": "validBefore", "type": "uint256" }, - { "name": "nonce", "type": "bytes32" }, + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, ], } from_ = KNOWN_ACCOUNTS[0].address @@ -72,20 +72,20 @@ def main(): "validBefore": validBefore, "nonce": nonce, }, - } + }, ) # 4. Sign a typed message for `cancelAuthorization` types = { "EIP712Domain": [ - { "name": "name", "type": "string" }, - { "name": "version", "type": "string" }, - { "name": "chainId", "type": "uint256" }, - { "name": "verifyingContract", "type": "address" }, + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, ], "CancelAuthorization": [ - { "name": "authorizer", "type": "address" }, - { "name": "nonce", "type": "bytes32" }, + {"name": "authorizer", "type": "address"}, + {"name": "nonce", "type": "bytes32"}, ], } @@ -99,10 +99,11 @@ def main(): "authorizer": from_, "nonce": nonce, }, - } + }, ) - # 5. Cancel authorization (note that caller here is `KNOWN_ACCOUNTS[0]`) + # 5. Cancel authorization + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` jpyc_0.cancel_authorization( authorizer=from_, nonce=nonce, @@ -111,7 +112,8 @@ def main(): s=add_zero_padding_to_hex(hex(signed_message_cancel.s), 32), ) - # 6. Check if authorization has been cancelled (note that caller here is `KNOWN_ACCOUNTS[0]`) + # 6. Check if authorization has been cancelled + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` try: jpyc_0.transfer_with_authorization( from_=from_, @@ -124,10 +126,11 @@ def main(): r=add_zero_padding_to_hex(hex(signed_message_transfer.r), 32), s=add_zero_padding_to_hex(hex(signed_message_transfer.s), 32), ) - except Exception as e: - print(f"Authorization has been cancelled successfully.") + except Exception: + print("Authorization has been cancelled successfully.") else: raise Exception("ERROR: authorization has not been cancelled.") + if __name__ == "__main__": main() diff --git a/packages/core/examples/constants.py b/packages/core/examples/constants.py index 70f16f6..ed794cc 100644 --- a/packages/core/examples/constants.py +++ b/packages/core/examples/constants.py @@ -1,13 +1,15 @@ from dataclasses import dataclass -from typing import Final, List +from typing import Final + @dataclass(frozen=True) class KnownAccount: address: str private_key: str + # A list of known accounts (DO NOT USE IN PRODUCTION) -KNOWN_ACCOUNTS: Final[List[KnownAccount]] = [ +KNOWN_ACCOUNTS: Final[list[KnownAccount]] = [ KnownAccount( "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", diff --git a/packages/core/examples/main.py b/packages/core/examples/main.py index 1a1ae30..a265b20 100644 --- a/packages/core/examples/main.py +++ b/packages/core/examples/main.py @@ -1,12 +1,11 @@ -from pathlib import Path import sys +from pathlib import Path sys.path.append(str(Path(__file__).parents[1])) -from src.jpyc import * -from src.client import * - from examples.constants import KNOWN_ACCOUNTS +from src.client import SdkClient +from src.jpyc import JPYC # SDK clients client_0 = SdkClient( diff --git a/packages/core/examples/mint.py b/packages/core/examples/mint.py index 0ae5b89..956a840 100644 --- a/packages/core/examples/mint.py +++ b/packages/core/examples/mint.py @@ -1,12 +1,11 @@ -from pathlib import Path import sys +from pathlib import Path sys.path.append(str(Path(__file__).parents[1])) from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 -from src.jpyc import * -from src.client import * + def main(): # 0. Check initial total supply of jpyc tokens @@ -44,5 +43,6 @@ def main(): total_supply = jpyc_0.total_supply() print(f"Total Supply (after minting): {total_supply}") + if __name__ == "__main__": main() diff --git a/packages/core/examples/permit.py b/packages/core/examples/permit.py index af320b0..454beae 100644 --- a/packages/core/examples/permit.py +++ b/packages/core/examples/permit.py @@ -1,6 +1,6 @@ -from pathlib import Path import sys import time +from pathlib import Path from eth_account import Account @@ -9,8 +9,7 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 from examples.utils import add_zero_padding_to_hex, remove_decimals -from src.jpyc import * -from src.client import * + def main(): # 0. Configure a minter @@ -19,7 +18,8 @@ def main(): minter_allowed_amount=1000000, ) - # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + # 1. Mint JPYC tokens + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` jpyc_0.mint( to=KNOWN_ACCOUNTS[0].address, amount=10000, @@ -34,17 +34,17 @@ def main(): } types = { "EIP712Domain": [ - { "name": "name", "type": "string" }, - { "name": "version", "type": "string" }, - { "name": "chainId", "type": "uint256" }, - { "name": "verifyingContract", "type": "address" }, + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, ], "Permit": [ - { "name": "owner", "type": "address" }, - { "name": "spender", "type": "address" }, - { "name": "value", "type": "uint256" }, - { "name": 'nonce', "type": 'uint256' }, - { "name": "deadline", "type": "uint256" }, + {"name": "owner", "type": "address"}, + {"name": "spender", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "nonce", "type": "uint256"}, + {"name": "deadline", "type": "uint256"}, ], } owner = KNOWN_ACCOUNTS[0].address @@ -66,10 +66,11 @@ def main(): "nonce": nonce, "deadline": deadline, }, - } + }, ) - # 3. Permit `spender` to transfer JPYC tokens on behalf of `owner` (note that caller here is `KNOWN_ACCOUNTS[0]`) + # 3. Permit `spender` to transfer JPYC tokens on behalf of `owner` + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` jpyc_0.permit( owner=owner, spender=spender, @@ -85,7 +86,11 @@ def main(): owner=KNOWN_ACCOUNTS[0].address, spender=KNOWN_ACCOUNTS[1].address, ) - print(f"Allowance of {KNOWN_ACCOUNTS[1].address} over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}") + print( + f"Allowance of {KNOWN_ACCOUNTS[1].address}" + f"over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}" + ) + if __name__ == "__main__": main() diff --git a/packages/core/examples/receive_with_authorization.py b/packages/core/examples/receive_with_authorization.py index 70be0b8..c4f92de 100644 --- a/packages/core/examples/receive_with_authorization.py +++ b/packages/core/examples/receive_with_authorization.py @@ -1,7 +1,7 @@ -from pathlib import Path -from random import randbytes import sys import time +from pathlib import Path +from random import randbytes from eth_account import Account @@ -10,8 +10,7 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0, jpyc_1 from examples.utils import add_zero_padding_to_hex, remove_decimals -from src.jpyc import * -from src.client import * + def main(): # 0. Configure a minter @@ -35,18 +34,18 @@ def main(): } types = { "EIP712Domain": [ - { "name": "name", "type": "string" }, - { "name": "version", "type": "string" }, - { "name": "chainId", "type": "uint256" }, - { "name": "verifyingContract", "type": "address" }, + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, ], "ReceiveWithAuthorization": [ - { "name": "from", "type": "address" }, - { "name": "to", "type": "address" }, - { "name": "value", "type": "uint256" }, - { "name": "validAfter", "type": "uint256" }, - { "name": "validBefore", "type": "uint256" }, - { "name": "nonce", "type": "bytes32" }, + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, ], } from_ = KNOWN_ACCOUNTS[0].address @@ -70,7 +69,7 @@ def main(): "validBefore": validBefore, "nonce": nonce, }, - } + }, ) # 3. Receive JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[1]`) @@ -96,5 +95,6 @@ def main(): balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + if __name__ == "__main__": main() diff --git a/packages/core/examples/transfer.py b/packages/core/examples/transfer.py index 89ad9ac..482e6ee 100644 --- a/packages/core/examples/transfer.py +++ b/packages/core/examples/transfer.py @@ -1,12 +1,11 @@ -from pathlib import Path import sys +from pathlib import Path sys.path.append(str(Path(__file__).parents[1])) from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 -from src.jpyc import * -from src.client import * + def main(): # 0. Configure a minter @@ -34,5 +33,6 @@ def main(): balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + if __name__ == "__main__": main() diff --git a/packages/core/examples/transfer_from.py b/packages/core/examples/transfer_from.py index c773e0d..992a8e4 100644 --- a/packages/core/examples/transfer_from.py +++ b/packages/core/examples/transfer_from.py @@ -1,12 +1,11 @@ -from pathlib import Path import sys +from pathlib import Path sys.path.append(str(Path(__file__).parents[1])) from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0, jpyc_1 -from src.jpyc import * -from src.client import * + def main(): # 0. Configure a minter @@ -15,13 +14,14 @@ def main(): minter_allowed_amount=1000000, ) - # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + # 1. Mint JPYC tokens + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` jpyc_0.mint( to=KNOWN_ACCOUNTS[0].address, amount=10000, ) - # 2. Approve `KNOWN_ACCOUNTS[1]` to transfer JPYC tokens on behalf of `KNOWN_ACCOUNTS[0]` + # 2. Approve `KNOWN_ACCOUNTS[1]` to transfer JPYC tokens jpyc_0.approve( spender=KNOWN_ACCOUNTS[1].address, value=5000, @@ -32,7 +32,10 @@ def main(): owner=KNOWN_ACCOUNTS[0].address, spender=KNOWN_ACCOUNTS[1].address, ) - print(f"Allowance of {KNOWN_ACCOUNTS[1].address} over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}") + print( + f"Allowance of {KNOWN_ACCOUNTS[1].address}" + f"over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}" + ) # 4. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[1]`) jpyc_1.transfer_from( @@ -51,5 +54,6 @@ def main(): balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + if __name__ == "__main__": main() diff --git a/packages/core/examples/transfer_with_authorization.py b/packages/core/examples/transfer_with_authorization.py index f0b84e5..69926d0 100644 --- a/packages/core/examples/transfer_with_authorization.py +++ b/packages/core/examples/transfer_with_authorization.py @@ -1,7 +1,7 @@ -from pathlib import Path -from random import randbytes import sys import time +from pathlib import Path +from random import randbytes from eth_account import Account @@ -10,8 +10,7 @@ from examples.constants import KNOWN_ACCOUNTS from examples.main import jpyc_0 from examples.utils import add_zero_padding_to_hex, remove_decimals -from src.jpyc import * -from src.client import * + def main(): # 0. Configure a minter @@ -35,18 +34,18 @@ def main(): } types = { "EIP712Domain": [ - { "name": "name", "type": "string" }, - { "name": "version", "type": "string" }, - { "name": "chainId", "type": "uint256" }, - { "name": "verifyingContract", "type": "address" }, + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, ], "TransferWithAuthorization": [ - { "name": "from", "type": "address" }, - { "name": "to", "type": "address" }, - { "name": "value", "type": "uint256" }, - { "name": "validAfter", "type": "uint256" }, - { "name": "validBefore", "type": "uint256" }, - { "name": "nonce", "type": "bytes32" }, + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, ], } from_ = KNOWN_ACCOUNTS[0].address @@ -70,7 +69,7 @@ def main(): "validBefore": validBefore, "nonce": nonce, }, - } + }, ) # 3. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) @@ -96,5 +95,6 @@ def main(): balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + if __name__ == "__main__": main() diff --git a/packages/core/examples/utils.py b/packages/core/examples/utils.py index a1c6cde..c637486 100644 --- a/packages/core/examples/utils.py +++ b/packages/core/examples/utils.py @@ -1,7 +1,9 @@ from web3 import Web3 + def add_zero_padding_to_hex(hex_string: str, num_of_bytes: int): return f"0x{hex_string[2:].zfill(num_of_bytes * 2)}" + def remove_decimals(value: int) -> int: - return Web3.to_wei(value, 'ether') + return Web3.to_wei(value, "ether") diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index dcdd33e..6b22374 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -34,6 +34,7 @@ maintainers = [ { name = "mameta", email = "mameta.zk@gmail.com" }, { name = "SeiyaKobayashi", email = "eng@seiya.work" }, ] +# Production dependencies dependencies = [ "eth-typing>=5.2.1", "pydantic>=2.11.4", @@ -45,9 +46,8 @@ repository = "https://github.com/jcam1/python-sdk" documentation = "https://github.com/jcam1/python-sdk/tree/main/docs" "Bug Tracker" = "https://github.com/jcam1/python-sdk/issues/new?template=bug_report.md" -# Dev dependencies - [dependency-groups] +# Development dependencies dev = [ "mypy>=1.15.0", "pytest>=8.3.5", @@ -66,8 +66,8 @@ line-length = 88 indent-width = 4 [tool.ruff.lint] -select = ["E4", "E7", "E9", "F"] -ignore = [] +select = ["B", "C4", "E", "F", "I", "UP", "W"] +ignore = ["B904"] fixable = ["ALL"] unfixable = [] dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" diff --git a/packages/core/src/client.py b/packages/core/src/client.py index 3353b96..314e0f3 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -19,6 +19,7 @@ RpcEndpoint, ) + class SdkClient(ISdkClient): """SDK client.""" @@ -33,8 +34,9 @@ def __init__( """Constructor that initializes SDK client. Notes: - - Either `chain_name` & `network_name` parameters or `rpc_endpoint` parameter are required. - - This constructor prioritizes `rpc_endpoint` parameter over \ + - Either `chain_name` & `network_name` parameters\ + or `rpc_endpoint` parameter are required. + - This constructor prioritizes `rpc_endpoint` parameter over\ `chain_name` & `network_name` parameters when configuring `rpc_endpoint`. Args: @@ -48,7 +50,11 @@ def __init__( InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form NetworkNotSupported: If the specified network is not supported by the SDK """ - rpc_endpoint = rpc_endpoint if rpc_endpoint is not None else get_default_rpc_endpoint(chain_name, network_name) + rpc_endpoint = ( + rpc_endpoint + if rpc_endpoint is not None + else get_default_rpc_endpoint(chain_name, network_name) + ) account = Account.from_key(private_key) if private_key is not None else None w3 = self.__configure_w3( rpc_endpoint=rpc_endpoint, @@ -64,9 +70,9 @@ def __init__( @staticmethod def __configure_w3( - rpc_endpoint: RpcEndpoint, - account: LocalAccount | None = None, - ) -> Web3: + rpc_endpoint: RpcEndpoint, + account: LocalAccount | None = None, + ) -> Web3: """Configure a web3 instance. Args: @@ -102,10 +108,7 @@ def set_default_provider(self, chain_name: str, network_name: str) -> Web3: @validate_call def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3: - self.w3 = self.__configure_w3( - rpc_endpoint=rpc_endpoint, - account=self.account - ) + self.w3 = self.__configure_w3(rpc_endpoint=rpc_endpoint, account=self.account) return self.w3 @@ -119,8 +122,7 @@ def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None: else: self.account = Account.from_key(private_key) self.w3 = self.__configure_w3( - rpc_endpoint=self.rpc_endpoint, - account=self.account + rpc_endpoint=self.rpc_endpoint, account=self.account ) return self.account diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index 5305ef2..d6492af 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -9,6 +9,7 @@ RpcEndpoint, ) + class ISdkClient(ABC): """Interface of SDK client.""" diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py index d122225..a3ea5fe 100644 --- a/packages/core/src/interfaces/jpyc.py +++ b/packages/core/src/interfaces/jpyc.py @@ -3,10 +3,11 @@ from ..utils.validators import ( Bytes32, ChecksumAddress, - Uint256, Uint8, + Uint256, ) + class IJPYC(ABC): """Interface of JPYC contracts.""" @@ -80,7 +81,8 @@ def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256 Uint256: Allowance of spender over owner's tokens Raises: - InvalidChecksumAddress: If supplied `owner` or `spender` is not in a valid form + InvalidChecksumAddress: If supplied `owner` or `spender`\ + is not in a valid form """ pass @@ -104,7 +106,9 @@ def nonces(self, owner: ChecksumAddress) -> Uint256: ###################### @abstractmethod - def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Uint256) -> Bytes32: + def configure_minter( + self, minter: ChecksumAddress, minter_allowed_amount: Uint256 + ) -> Bytes32: """Call `configureMinter` function. Args: @@ -164,7 +168,9 @@ def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: pass @abstractmethod - def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256) -> Bytes32: + def transfer_from( + self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256 + ) -> Bytes32: """Call `transferFrom` function. Args: @@ -217,7 +223,8 @@ def transfer_with_authorization( AccountNotInitialized: If account is not initialized InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form - InvalidUint256: If supplied `value` or `valid_after` or `valid_before` is not in a valid form + InvalidUint256: If supplied `value` or `valid_after` or `valid_before`\ + is not in a valid form InvalidUint8: If supplied `v` is not in a valid form TransactionFailed: If transaction fails TransactionSimulationFailed: If transaction simulation fails @@ -257,7 +264,8 @@ def receive_with_authorization( AccountNotInitialized: If account is not initialized InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form - InvalidUint256: If supplied `value` or `valid_after` or `valid_before` is not in a valid form + InvalidUint256: If supplied `value` or `valid_after` or `valid_before`\ + is not in a valid form InvalidUint8: If supplied `v` is not in a valid form TransactionFailed: If transaction fails TransactionSimulationFailed: If transaction simulation fails @@ -316,7 +324,9 @@ def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: pass @abstractmethod - def increase_allowance(self, spender: ChecksumAddress, increment: Uint256) -> Bytes32: + def increase_allowance( + self, spender: ChecksumAddress, increment: Uint256 + ) -> Bytes32: """Call `increaseAllowance` function. Args: @@ -336,7 +346,9 @@ def increase_allowance(self, spender: ChecksumAddress, increment: Uint256) -> By pass @abstractmethod - def decrease_allowance(self, spender: ChecksumAddress, decrement: Uint256) -> Bytes32: + def decrease_allowance( + self, spender: ChecksumAddress, decrement: Uint256 + ) -> Bytes32: """Call `decreaseAllowance` function. Args: @@ -383,7 +395,8 @@ def permit( Raises: AccountNotInitialized: If account is not initialized InvalidBytes32: If supplied `r` or `s` is not in a valid form - InvalidChecksumAddress: If supplied `owner` or `spender` is not in a valid form + InvalidChecksumAddress: If supplied `owner` or `spender`\ + is not in a valid form InvalidUint256: If supplied `value` or `deadline` is not in a valid form InvalidUint8: If supplied `v` is not in a valid form TransactionFailed: If transaction fails diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index cae340d..d203b47 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -24,7 +24,8 @@ TransactionSimulationFailed, ) from .utils.types import ContractVersion -from .utils.validators import Bytes32, ChecksumAddress, Uint256, Uint8 +from .utils.validators import Bytes32, ChecksumAddress, Uint8, Uint256 + class JPYC(IJPYC): """Implementation of IJPYC.""" @@ -41,14 +42,18 @@ def __init__( - If `client` parameter is configured to use localhost network,\ this deploys JPYC contracts to localhost network, initializes it,\ and sets its address to `address` attribute. - - If `contract_address` is supplied, this configures contract instance with that address. + - If `contract_address` is supplied,\ + this configures contract instance with that address. Args: client (ISdkClient): Configured SDK client contract_version (ContractVersion): Contract version contract_address (EthChecksumAddress, optional): Contract address """ - if (client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"] and contract_address is None): + if ( + client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"] + and contract_address is None + ): address = self.__deploy_contract( client=client, contract_version=contract_version, @@ -72,7 +77,8 @@ def __init__( ).transact() else: address = ( - contract_address if contract_address is not None + contract_address + if contract_address is not None else get_proxy_address(contract_version=contract_version) ) contract = self.__get_contract( @@ -98,7 +104,7 @@ def __deploy_contract( """Deploy contracts to the configured network. Note: - This helper method is mainly for development purposes.\ + This helper method is mainly for development purposes. \ Please use this method to deploy contracts to localhost network. Args: @@ -108,7 +114,7 @@ def __deploy_contract( Returns: ChecksumAddress: Address of the deployed contracts """ - file_path=resolve_artifacts_file_path(contract_version=contract_version) + file_path = resolve_artifacts_file_path(contract_version=contract_version) contract = client.w3.eth.contract( abi=get_artifacts(file_path, "abi"), bytecode=get_artifacts(file_path, "bytecode"), @@ -136,7 +142,9 @@ def __get_contract( return client.w3.eth.contract( address=contract_address, abi=get_artifacts( - file_path=resolve_artifacts_file_path(contract_version=contract_version), + file_path=resolve_artifacts_file_path( + contract_version=contract_version + ), artifact_type="abi", ), ) @@ -259,7 +267,9 @@ def nonces(self, owner: ChecksumAddress) -> Uint256: ###################### @validate_call - def configure_minter(self, minter: ChecksumAddress, minter_allowed_amount: Uint256) -> Bytes32: + def configure_minter( + self, minter: ChecksumAddress, minter_allowed_amount: Uint256 + ) -> Bytes32: tx_args = { "contract_func": self.contract.functions.configureMinter, "func_args": { @@ -295,7 +305,9 @@ def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: return self.__transact(**tx_args) @validate_call - def transfer_from(self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256) -> Bytes32: + def transfer_from( + self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256 + ) -> Bytes32: tx_args = { "contract_func": self.contract.functions.transferFrom, "func_args": { @@ -402,7 +414,9 @@ def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: return self.__transact(**tx_args) @validate_call - def increase_allowance(self, spender: ChecksumAddress, increment: Uint256) -> Bytes32: + def increase_allowance( + self, spender: ChecksumAddress, increment: Uint256 + ) -> Bytes32: tx_args = { "contract_func": self.contract.functions.increaseAllowance, "func_args": { @@ -414,7 +428,9 @@ def increase_allowance(self, spender: ChecksumAddress, increment: Uint256) -> By return self.__transact(**tx_args) @validate_call - def decrease_allowance(self, spender: ChecksumAddress, decrement: Uint256) -> Bytes32: + def decrease_allowance( + self, spender: ChecksumAddress, decrement: Uint256 + ) -> Bytes32: tx_args = { "contract_func": self.contract.functions.decreaseAllowance, "func_args": { diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 8442de1..1c3e886 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -4,16 +4,16 @@ resolve_artifacts_file_path, ) from .chains import ( + SUPPORTED_CHAINS, enumerate_supported_networks, get_default_rpc_endpoint, - SUPPORTED_CHAINS, ) from .constants import ( POA_MIDDLEWARE, SIGN_MIDDLEWARE, - UINT_MIN, - UINT256_MAX, UINT8_MAX, + UINT256_MAX, + UINT_MIN, ) from .currencies import ( remove_decimals, @@ -23,8 +23,8 @@ AccountNotInitialized, InvalidBytes32, InvalidChecksumAddress, - InvalidUint256, InvalidUint8, + InvalidUint256, NetworkNotSupported, TransactionFailed, TransactionSimulationFailed, @@ -38,8 +38,8 @@ Bytes32, ChecksumAddress, RpcEndpoint, - Uint256, Uint8, + Uint256, ) __all__ = [ diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py index 8f4f14b..b88ed37 100644 --- a/packages/core/src/utils/addresses.py +++ b/packages/core/src/utils/addresses.py @@ -14,6 +14,7 @@ # Address-related helper functions # #################################### + def calc_checksum_address(address: str) -> ChecksumAddress: """Calculates checksum address. @@ -25,6 +26,7 @@ def calc_checksum_address(address: str) -> ChecksumAddress: """ return ChecksumAddress(HexAddress(HexStr(address))) + def is_valid_address(address: str) -> bool: """Checks validity of address. @@ -36,11 +38,13 @@ def is_valid_address(address: str) -> bool: """ return Web3.is_checksum_address(address) + def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress: """Get proxy address from the specified version. Note: - Default address should be the address of the latest version (e.g., v2 as of May 2025). + Default address should be the address of the latest version\ + (e.g., v2 as of May 2025). Args: version (ContractVersion): Contract version @@ -54,11 +58,14 @@ def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress: case _: return V2_PROXY_ADDRESS + ###################### # Constant addresses # ###################### ZERO_ADDRESS: Final[ChecksumAddress] = calc_checksum_address(str(ADDRESS_ZERO)) """ChecksumAddress: Zero address.""" -V2_PROXY_ADDRESS: Final[ChecksumAddress] = calc_checksum_address("0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB") +V2_PROXY_ADDRESS: Final[ChecksumAddress] = calc_checksum_address( + "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB" +) """ChecksumAddress: JPYCv2 address.""" diff --git a/packages/core/src/utils/artifacts.py b/packages/core/src/utils/artifacts.py index e927d17..142d4bd 100644 --- a/packages/core/src/utils/artifacts.py +++ b/packages/core/src/utils/artifacts.py @@ -4,6 +4,7 @@ from .types import ArtifactType, ContractVersion + def resolve_artifacts_file_path(contract_version: ContractVersion) -> str: """Resolve the path of artifacts file from the specified contract version. @@ -13,10 +14,13 @@ def resolve_artifacts_file_path(contract_version: ContractVersion) -> str: Returns: str: Absolute path of artifacts file """ - path = Path(__file__).parent.parent.parent.joinpath("artifacts", f"v{contract_version}.json") + path = Path(__file__).parent.parent.parent.joinpath( + "artifacts", f"v{contract_version}.json" + ) return path.absolute() + def get_artifacts(file_path: str, artifact_type: ArtifactType) -> Any: """Get contract artifacts from the specified file path. diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py index 4465ad9..6d1048a 100644 --- a/packages/core/src/utils/chains.py +++ b/packages/core/src/utils/chains.py @@ -85,13 +85,18 @@ # Chain-related helper functions # ################################## + def enumerate_supported_networks() -> str: """Enumerate all the supported networks. Returns: str: supported networks """ - return ", ".join(f"'{chain}' => {list(networks.keys())}" for chain, networks in SUPPORTED_CHAINS.items()) + return ", ".join( + f"'{chain}' => {list(networks.keys())}" + for chain, networks in SUPPORTED_CHAINS.items() + ) + def is_supported_network(chain_name: str, network_name: str) -> bool: """Check if the specified network is supported by the SDK. @@ -103,7 +108,10 @@ def is_supported_network(chain_name: str, network_name: str) -> bool: Returns: bool: True if supported, false otherwise """ - return chain_name in SUPPORTED_CHAINS and network_name in SUPPORTED_CHAINS[chain_name] + return ( + chain_name in SUPPORTED_CHAINS and network_name in SUPPORTED_CHAINS[chain_name] + ) + def get_default_rpc_endpoint(chain_name: str, network_name: str) -> RpcEndpoint: """Get the default RPC endpoint for the specified network. @@ -119,6 +127,6 @@ def get_default_rpc_endpoint(chain_name: str, network_name: str) -> RpcEndpoint: NetworkNotSupported: If the specified network is not supported by the SDK """ if not is_supported_network(chain_name, network_name): - raise NetworkNotSupported(chain_name, network_name) + raise NetworkNotSupported(chain_name, network_name) return SUPPORTED_CHAINS[chain_name][network_name]["rpc_endpoints"][0] diff --git a/packages/core/src/utils/constants.py b/packages/core/src/utils/constants.py index 204059a..de2bc9f 100644 --- a/packages/core/src/utils/constants.py +++ b/packages/core/src/utils/constants.py @@ -8,7 +8,9 @@ """int: Minimum value of uint.""" UINT8_MAX: Final[int] = 255 """int: Maximum value of uint8.""" -UINT256_MAX: Final[int] = 115792089237316195423570985008687907853269984665640564039457584007913129639935 +UINT256_MAX: Final[int] = ( + 115792089237316195423570985008687907853269984665640564039457584007913129639935 +) """int: Maximum value of uint256.""" #################### diff --git a/packages/core/src/utils/currencies.py b/packages/core/src/utils/currencies.py index 370af55..ebbfb87 100644 --- a/packages/core/src/utils/currencies.py +++ b/packages/core/src/utils/currencies.py @@ -4,6 +4,7 @@ from .validators import Uint256 + def remove_decimals(value: Uint256 | Decimal) -> Uint256: """Remove decimals. @@ -13,12 +14,14 @@ def remove_decimals(value: Uint256 | Decimal) -> Uint256: Returns: Uint256: Value in wei """ - return Web3.to_wei(value, 'ether') + return Web3.to_wei(value, "ether") + def restore_decimals(func): """Decorator to restore decimals.""" + def wrapper(*args, **kwargs): result = func(*args, **kwargs) - return Web3.from_wei(result, 'ether') + return Web3.from_wei(result, "ether") return wrapper diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 466d4ac..8e71d57 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -1,5 +1,6 @@ class JpycSdkError(Exception): """A base class for any errors related to JPYC SDK.""" + def __init__(self, code: int, message: str): self.code = code """int: Custom error code""" @@ -7,10 +8,12 @@ def __init__(self, code: int, message: str): """str: Error message""" super().__init__(f"\nError Code: {code}\nMessage: {message}") + ################# # Config Errors # ################# + class NetworkNotSupported(JpycSdkError): """Raised when the specified network is not supported by the SDK. @@ -18,6 +21,7 @@ class NetworkNotSupported(JpycSdkError): chain_name (str): Chain name network_name (str): Network name """ + code = 100 def __init__(self, chain_name: str, network_name: str): @@ -26,11 +30,13 @@ def __init__(self, chain_name: str, network_name: str): super().__init__( code=NetworkNotSupported.code, message=f"Network '{chain_name}/{network_name}' is not supported. " - f"Supported networks are: {enumerate_supported_networks()}" + f"Supported networks are: {enumerate_supported_networks()}", ) + class AccountNotInitialized(JpycSdkError): """Raised when account is not initialized or hoisted to web3 instance.""" + code = 101 def __init__(self): @@ -39,21 +45,26 @@ def __init__(self): message="Account is not initialized.", ) + ##################### # Validation Errors # ##################### class InvalidChecksumAddress(JpycSdkError, TypeError): """Raised when the given address is not a valid checksum address.""" + code = 200 def __init__(self, message_: str): super().__init__( code=InvalidChecksumAddress.code, - message=f"Invalid checksum address: {message_}. Address must be compatible with EIP55.", + message=f"Invalid checksum address: {message_}. " + f"Address must be compatible with EIP55.", ) + class InvalidUint8(JpycSdkError, TypeError): """Raised when the given integer is not a valid uint8.""" + code = 201 def __init__(self, message_: str): @@ -62,18 +73,23 @@ def __init__(self, message_: str): message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.", ) + class InvalidUint256(JpycSdkError, TypeError): """Raised when the given integer is not a valid uint256.""" + code = 202 def __init__(self, message_: str): super().__init__( code=InvalidUint256.code, - message=f"Invalid uint256: {message_}. Integer must be between 0 ~ 2^256 - 1.", + message=f"Invalid uint256: {message_}. " + f"Integer must be between 0 ~ 2^256 - 1.", ) + class InvalidBytes32(JpycSdkError, TypeError): """Raised when the given byte string is not a valid bytes32.""" + code = 203 def __init__(self, message_: str): @@ -82,8 +98,10 @@ def __init__(self, message_: str): message=f"Invalid bytes32: {message_}.", ) + class InvalidRpcEndpoint(JpycSdkError, TypeError): """Raised when the given string is not a valid RPC endpoint.""" + code = 204 def __init__(self, message_: str): @@ -92,16 +110,19 @@ def __init__(self, message_: str): message=f"Invalid RPC endpoint: {message_}.", ) + ###################### # Transaction Errors # ###################### + class TransactionSimulationFailed(JpycSdkError): """Raised when transaction simulation fails. Attributes: message (str): Error message """ + code = 300 def __init__(self, message_: str): @@ -110,12 +131,14 @@ def __init__(self, message_: str): message=f"Failed to simulate a transaction locally: {message_}", ) + class TransactionFailed(JpycSdkError): """Raised when transaction fails. Attributes: message (str): Error message """ + code = 301 def __init__(self, message_: str): diff --git a/packages/core/src/utils/types.py b/packages/core/src/utils/types.py index d2041fd..60ee3eb 100644 --- a/packages/core/src/utils/types.py +++ b/packages/core/src/utils/types.py @@ -1,4 +1,4 @@ -from typing import List, Literal, TypeAlias, TypedDict +from typing import Literal, TypeAlias, TypedDict ########## # Chains # @@ -14,10 +14,12 @@ "local", ] + class NetworkMetadata(TypedDict): id: int name: str - rpc_endpoints: List[str] + rpc_endpoints: list[str] + ChainMetadata: TypeAlias = dict[ChainName, dict[str, NetworkMetadata]] """A type that contains metadata of chains.""" diff --git a/packages/core/src/utils/validators.py b/packages/core/src/utils/validators.py index fbb8610..e580f71 100644 --- a/packages/core/src/utils/validators.py +++ b/packages/core/src/utils/validators.py @@ -3,7 +3,7 @@ from pydantic.functional_validators import AfterValidator from web3 import Web3 -from .constants import UINT256_MAX, UINT8_MAX, UINT_MIN +from .constants import UINT8_MAX, UINT256_MAX, UINT_MIN from .errors import ( InvalidBytes32, InvalidChecksumAddress, @@ -12,6 +12,7 @@ InvalidUint256, ) + def validate_checksum_address(address: str) -> str: """Checks if the given address is a checksum address. @@ -29,8 +30,12 @@ def validate_checksum_address(address: str) -> str: return address + ChecksumAddress = Annotated[str, AfterValidator(validate_checksum_address)] -"""A type that contains a checksum address. See `EIP55 `_ for more details.""" +"""A type that contains a checksum address. \ +See `EIP55 `_ for more details. +""" + def validate_uint8(integer: int) -> int: """Checks if the given integer is a uint8. @@ -49,9 +54,11 @@ def validate_uint8(integer: int) -> int: return integer + Uint8 = Annotated[int, AfterValidator(validate_uint8)] """A type that contains a uint8.""" + def validate_uint256(integer: int) -> int: """Checks if the given integer is a uint256. @@ -69,9 +76,11 @@ def validate_uint256(integer: int) -> int: return integer + Uint256 = Annotated[int, AfterValidator(validate_uint256)] """A type that contains a uint256.""" + def validate_bytes32(string: str) -> str: """Checks if the given string is bytes32. @@ -92,9 +101,11 @@ def validate_bytes32(string: str) -> str: return string + Bytes32 = Annotated[str, AfterValidator(validate_bytes32)] """A type that contains a bytes32.""" + def validate_rpc_endpoint(string: str) -> str: """Checks if the given string is a valid RPC endpoint. @@ -108,11 +119,12 @@ def validate_rpc_endpoint(string: str) -> str: InvalidRpcEndpoint: If the string is not a valid RPC endpoint """ try: - assert string.startswith(("http")) == True + assert string.startswith("http") is True except Exception: raise InvalidRpcEndpoint(string) return string + RpcEndpoint = Annotated[str, AfterValidator(validate_rpc_endpoint)] """A type that contains a rpc endpoint.""" From 1f1d7df9c27226b35057bc8007e3b5f897fc4757 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 03:00:17 +0900 Subject: [PATCH 31/56] Configure & apply mypy --- .../core/examples/cancel_authorization.py | 2 +- packages/core/examples/mint.py | 2 +- packages/core/examples/permit.py | 2 +- .../examples/receive_with_authorization.py | 2 +- packages/core/examples/transfer.py | 2 +- packages/core/examples/transfer_from.py | 2 +- .../examples/transfer_with_authorization.py | 2 +- packages/core/examples/utils.py | 2 +- packages/core/pyproject.toml | 20 +- packages/core/src/client.py | 7 +- packages/core/src/interfaces/client.py | 3 +- packages/core/src/jpyc.py | 63 ++-- packages/core/src/utils/__init__.py | 2 + packages/core/src/utils/addresses.py | 2 - packages/core/src/utils/artifacts.py | 8 +- packages/core/src/utils/chains.py | 22 +- packages/core/src/utils/currencies.py | 4 +- packages/core/src/utils/errors.py | 23 +- packages/core/src/utils/types.py | 23 +- packages/core/src/utils/validators.py | 4 +- uv.lock | 279 +----------------- 21 files changed, 119 insertions(+), 357 deletions(-) diff --git a/packages/core/examples/cancel_authorization.py b/packages/core/examples/cancel_authorization.py index 22973c2..a27fcca 100644 --- a/packages/core/examples/cancel_authorization.py +++ b/packages/core/examples/cancel_authorization.py @@ -12,7 +12,7 @@ from examples.utils import add_zero_padding_to_hex, remove_decimals -def main(): +def main() -> None: # 0. Configure a minter jpyc_0.configure_minter( minter=KNOWN_ACCOUNTS[0].address, diff --git a/packages/core/examples/mint.py b/packages/core/examples/mint.py index 956a840..386a07d 100644 --- a/packages/core/examples/mint.py +++ b/packages/core/examples/mint.py @@ -7,7 +7,7 @@ from examples.main import jpyc_0 -def main(): +def main() -> None: # 0. Check initial total supply of jpyc tokens total_supply = jpyc_0.total_supply() print(f"Total Supply (before minting): {total_supply}") diff --git a/packages/core/examples/permit.py b/packages/core/examples/permit.py index 454beae..87c8fed 100644 --- a/packages/core/examples/permit.py +++ b/packages/core/examples/permit.py @@ -11,7 +11,7 @@ from examples.utils import add_zero_padding_to_hex, remove_decimals -def main(): +def main() -> None: # 0. Configure a minter jpyc_0.configure_minter( minter=KNOWN_ACCOUNTS[0].address, diff --git a/packages/core/examples/receive_with_authorization.py b/packages/core/examples/receive_with_authorization.py index c4f92de..ec60693 100644 --- a/packages/core/examples/receive_with_authorization.py +++ b/packages/core/examples/receive_with_authorization.py @@ -12,7 +12,7 @@ from examples.utils import add_zero_padding_to_hex, remove_decimals -def main(): +def main() -> None: # 0. Configure a minter jpyc_0.configure_minter( minter=KNOWN_ACCOUNTS[0].address, diff --git a/packages/core/examples/transfer.py b/packages/core/examples/transfer.py index 482e6ee..90b89f3 100644 --- a/packages/core/examples/transfer.py +++ b/packages/core/examples/transfer.py @@ -7,7 +7,7 @@ from examples.main import jpyc_0 -def main(): +def main() -> None: # 0. Configure a minter jpyc_0.configure_minter( minter=KNOWN_ACCOUNTS[0].address, diff --git a/packages/core/examples/transfer_from.py b/packages/core/examples/transfer_from.py index 992a8e4..8f0549b 100644 --- a/packages/core/examples/transfer_from.py +++ b/packages/core/examples/transfer_from.py @@ -7,7 +7,7 @@ from examples.main import jpyc_0, jpyc_1 -def main(): +def main() -> None: # 0. Configure a minter jpyc_0.configure_minter( minter=KNOWN_ACCOUNTS[0].address, diff --git a/packages/core/examples/transfer_with_authorization.py b/packages/core/examples/transfer_with_authorization.py index 69926d0..abc759d 100644 --- a/packages/core/examples/transfer_with_authorization.py +++ b/packages/core/examples/transfer_with_authorization.py @@ -12,7 +12,7 @@ from examples.utils import add_zero_padding_to_hex, remove_decimals -def main(): +def main() -> None: # 0. Configure a minter jpyc_0.configure_minter( minter=KNOWN_ACCOUNTS[0].address, diff --git a/packages/core/examples/utils.py b/packages/core/examples/utils.py index c637486..dff4cbd 100644 --- a/packages/core/examples/utils.py +++ b/packages/core/examples/utils.py @@ -1,7 +1,7 @@ from web3 import Web3 -def add_zero_padding_to_hex(hex_string: str, num_of_bytes: int): +def add_zero_padding_to_hex(hex_string: str, num_of_bytes: int) -> str: return f"0x{hex_string[2:].zfill(num_of_bytes * 2)}" diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 6b22374..a5746af 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "jpyc-core-sdk" version = "1.0.0" -requires-python = ">=3.11" +requires-python = ">=3.12" license = "MIT" description = "Python SDKs for JPYCv2 contracts" readme = "README.md" @@ -18,7 +18,6 @@ classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", @@ -61,7 +60,7 @@ dev = [ # Ruff [tool.ruff] -target-version = "py311" +target-version = "py312" line-length = 88 indent-width = 4 @@ -79,3 +78,18 @@ skip-magic-trailing-comma = false line-ending = "auto" docstring-code-format = true docstring-code-line-length = "dynamic" + +# mypy + +[tool.mypy] +python_version = "3.12" +warn_unused_configs = true +disallow_untyped_defs = true +disallow_incomplete_defs = true +check_untyped_defs = true +no_implicit_optional = true +warn_redundant_casts = true +warn_unused_ignores = true +warn_no_return = true +warn_unreachable = true +ignore_missing_imports = false diff --git a/packages/core/src/client.py b/packages/core/src/client.py index 314e0f3..d2e951d 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -13,6 +13,7 @@ SIGN_MIDDLEWARE, ) from .utils.errors import AccountNotInitialized +from .utils.types import ChainName from .utils.validators import ( Bytes32, ChecksumAddress, @@ -26,11 +27,11 @@ class SdkClient(ISdkClient): @validate_call def __init__( self, - chain_name: str | None = None, + chain_name: ChainName | None = None, network_name: str | None = None, rpc_endpoint: RpcEndpoint | None = None, private_key: Bytes32 | None = None, - ): + ) -> None: """Constructor that initializes SDK client. Notes: @@ -98,7 +99,7 @@ def __configure_w3( return w3 - def set_default_provider(self, chain_name: str, network_name: str) -> Web3: + def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3: self.w3 = self.__configure_w3( rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name), account=self.account, diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index d6492af..53e8b4c 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -3,6 +3,7 @@ from eth_account.signers.local import LocalAccount from web3 import Web3 +from ..utils.types import ChainName from ..utils.validators import ( Bytes32, ChecksumAddress, @@ -14,7 +15,7 @@ class ISdkClient(ABC): """Interface of SDK client.""" @abstractmethod - def set_default_provider(self, chain_name: str, network_name: str) -> Web3: + def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3: """Set provider using one of the default RPC endpoints. Args: diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index d203b47..8224474 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -4,7 +4,8 @@ from pydantic import validate_call from web3.contract.contract import Contract, ContractFunction -from .interfaces import IJPYC, ISdkClient +from .client import SdkClient +from .interfaces import IJPYC from .utils.addresses import ( get_proxy_address, ) @@ -23,7 +24,7 @@ TransactionFailed, TransactionSimulationFailed, ) -from .utils.types import ContractVersion +from .utils.types import ContractVersion, TransactionArgs from .utils.validators import Bytes32, ChecksumAddress, Uint8, Uint256 @@ -32,10 +33,10 @@ class JPYC(IJPYC): def __init__( self, - client: ISdkClient, + client: SdkClient, contract_version: ContractVersion = "2", contract_address: EthChecksumAddress | None = None, - ): + ) -> None: """Constructor that initializes JPYC client. Notes: @@ -46,7 +47,7 @@ def __init__( this configures contract instance with that address. Args: - client (ISdkClient): Configured SDK client + client (SdkClient): Configured SDK client contract_version (ContractVersion): Contract version contract_address (EthChecksumAddress, optional): Contract address """ @@ -98,7 +99,7 @@ def __init__( @staticmethod def __deploy_contract( - client: ISdkClient, + client: SdkClient, contract_version: ContractVersion = "2", ) -> ChecksumAddress: """Deploy contracts to the configured network. @@ -108,7 +109,7 @@ def __deploy_contract( Please use this method to deploy contracts to localhost network. Args: - client (ISdkClient): Configured SDK client + client (SdkClient): Configured SDK client contract_version (ContractVersion): Contract version Returns: @@ -121,25 +122,25 @@ def __deploy_contract( ) tx_hash = contract.constructor().transact() - return client.w3.eth.wait_for_transaction_receipt(tx_hash).contractAddress + return client.w3.eth.wait_for_transaction_receipt(tx_hash).contractAddress # type: ignore[attr-defined] @staticmethod def __get_contract( - client: ISdkClient, + client: SdkClient, contract_address: ChecksumAddress, contract_version: ContractVersion = "2", ) -> Contract: """Get contract instance from the configured network. Args: - client (ISdkClient): Configured SDK client + client (SdkClient): Configured SDK client contract_address (ChecksumAddress): Contract address contract_version (ContractVersion): Contract version Returns: Contract: Address of the deployed contracts """ - return client.w3.eth.contract( + return client.w3.eth.contract( # type: ignore[call-overload] address=contract_address, abi=get_artifacts( file_path=resolve_artifacts_file_path( @@ -164,7 +165,7 @@ def __account_initialized(self) -> None: @staticmethod def __simulate_transaction( contract_func: ContractFunction, - func_args: dict[Any], + func_args: dict[str, object], ) -> None: """Simulates a transaction locally. @@ -173,7 +174,7 @@ def __simulate_transaction( Args: contract_func (ContractFunction): Contract function - func_args (dict[Any]): Arguments of contract function + func_args (dict[str, object]): Arguments of contract function Raises: TransactionSimulationFailed: If transaction simulation fails @@ -181,18 +182,18 @@ def __simulate_transaction( try: contract_func(**func_args).call() except Exception as e: - raise TransactionSimulationFailed(e) + raise TransactionSimulationFailed(str(e)) @staticmethod def __send_transaction( contract_func: ContractFunction, - func_args: dict[Any], + func_args: dict[str, object], ) -> Any: """Sends a transaction to blockchain. Args: contract_func (ContractFunction): Contract function - func_args (dict[Any]): Arguments of contract function + func_args (dict[str, object]): Arguments of contract function Returns: Any: Response from the contract function @@ -203,14 +204,16 @@ def __send_transaction( try: return contract_func(**func_args).transact() except Exception as e: - raise TransactionFailed(e) + raise TransactionFailed(str(e)) - def __transact(self, contract_func: ContractFunction, func_args: dict[Any]) -> Any: + def __transact( + self, contract_func: ContractFunction, func_args: dict[str, object] + ) -> Any: """Helper method to prepare & send a transaction in one method. Args: contract_func (ContractFunction): Contract function - func_args (dict[Any]): Arguments of contract function + func_args (dict[str, object]): Arguments of contract function Returns: Any: Response from the contract function @@ -270,7 +273,7 @@ def nonces(self, owner: ChecksumAddress) -> Uint256: def configure_minter( self, minter: ChecksumAddress, minter_allowed_amount: Uint256 ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.configureMinter, "func_args": { "minter": minter, @@ -282,7 +285,7 @@ def configure_minter( @validate_call def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.mint, "func_args": { "_to": to, @@ -294,7 +297,7 @@ def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: @validate_call def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.transfer, "func_args": { "to": to, @@ -308,7 +311,7 @@ def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: def transfer_from( self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256 ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.transferFrom, "func_args": { "from": from_, @@ -332,7 +335,7 @@ def transfer_with_authorization( r: Bytes32, s: Bytes32, ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.transferWithAuthorization, "func_args": { "from": from_, @@ -362,7 +365,7 @@ def receive_with_authorization( r: Bytes32, s: Bytes32, ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.receiveWithAuthorization, "func_args": { "from": from_, @@ -388,7 +391,7 @@ def cancel_authorization( r: Bytes32, s: Bytes32, ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.cancelAuthorization, "func_args": { "authorizer": authorizer, @@ -403,7 +406,7 @@ def cancel_authorization( @validate_call def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.approve, "func_args": { "spender": spender, @@ -417,7 +420,7 @@ def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: def increase_allowance( self, spender: ChecksumAddress, increment: Uint256 ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.increaseAllowance, "func_args": { "spender": spender, @@ -431,7 +434,7 @@ def increase_allowance( def decrease_allowance( self, spender: ChecksumAddress, decrement: Uint256 ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.decreaseAllowance, "func_args": { "spender": spender, @@ -452,7 +455,7 @@ def permit( r: Bytes32, s: Bytes32, ) -> Bytes32: - tx_args = { + tx_args: TransactionArgs = { "contract_func": self.contract.functions.permit, "func_args": { "owner": owner, diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py index 1c3e886..a5be385 100644 --- a/packages/core/src/utils/__init__.py +++ b/packages/core/src/utils/__init__.py @@ -32,6 +32,7 @@ from .types import ( ArtifactType, ChainMetadata, + ChainName, ContractVersion, ) from .validators import ( @@ -73,6 +74,7 @@ # types "ArtifactType", "ChainMetadata", + "ChainName", "ContractVersion", # validators "Bytes32", diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py index b88ed37..43c95cb 100644 --- a/packages/core/src/utils/addresses.py +++ b/packages/core/src/utils/addresses.py @@ -55,8 +55,6 @@ def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress: match contract_version: case "2": return V2_PROXY_ADDRESS - case _: - return V2_PROXY_ADDRESS ###################### diff --git a/packages/core/src/utils/artifacts.py b/packages/core/src/utils/artifacts.py index 142d4bd..d728959 100644 --- a/packages/core/src/utils/artifacts.py +++ b/packages/core/src/utils/artifacts.py @@ -5,14 +5,14 @@ from .types import ArtifactType, ContractVersion -def resolve_artifacts_file_path(contract_version: ContractVersion) -> str: +def resolve_artifacts_file_path(contract_version: ContractVersion) -> Path: """Resolve the path of artifacts file from the specified contract version. Args: version (ContractVersion): Contract version Returns: - str: Absolute path of artifacts file + Path: Absolute path of artifacts file """ path = Path(__file__).parent.parent.parent.joinpath( "artifacts", f"v{contract_version}.json" @@ -21,11 +21,11 @@ def resolve_artifacts_file_path(contract_version: ContractVersion) -> str: return path.absolute() -def get_artifacts(file_path: str, artifact_type: ArtifactType) -> Any: +def get_artifacts(file_path: Path, artifact_type: ArtifactType) -> Any: """Get contract artifacts from the specified file path. Args: - file_path (str): absolute path of artifacts file + file_path (Path): absolute path of artifacts file Returns: Any: Artifacts of contracts diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py index 6d1048a..daec698 100644 --- a/packages/core/src/utils/chains.py +++ b/packages/core/src/utils/chains.py @@ -1,7 +1,7 @@ from typing import Final from .errors import NetworkNotSupported -from .types import ChainMetadata +from .types import ChainMetadata, ChainName from .validators import RpcEndpoint ################## @@ -98,12 +98,14 @@ def enumerate_supported_networks() -> str: ) -def is_supported_network(chain_name: str, network_name: str) -> bool: +def is_supported_network( + chain_name: ChainName | None, network_name: str | None +) -> bool: """Check if the specified network is supported by the SDK. Args: - chain_name (str): Chain name - network_name (str): Network name + chain_name (ChainName, optional): Chain name + network_name (str, optional): Network name Returns: bool: True if supported, false otherwise @@ -113,12 +115,14 @@ def is_supported_network(chain_name: str, network_name: str) -> bool: ) -def get_default_rpc_endpoint(chain_name: str, network_name: str) -> RpcEndpoint: +def get_default_rpc_endpoint( + chain_name: ChainName | None, network_name: str | None +) -> RpcEndpoint: """Get the default RPC endpoint for the specified network. Args: - chain_name (str): Chain name - network_name (str): Network name + chain_name (ChainName, optional): Chain name + network_name (str, optional): Network name Returns: RpcEndpoint: RPC endpoint @@ -127,6 +131,6 @@ def get_default_rpc_endpoint(chain_name: str, network_name: str) -> RpcEndpoint: NetworkNotSupported: If the specified network is not supported by the SDK """ if not is_supported_network(chain_name, network_name): - raise NetworkNotSupported(chain_name, network_name) + raise NetworkNotSupported(chain_name, network_name) # type: ignore[arg-type] - return SUPPORTED_CHAINS[chain_name][network_name]["rpc_endpoints"][0] + return SUPPORTED_CHAINS[chain_name][network_name]["rpc_endpoints"][0] # type: ignore[index] diff --git a/packages/core/src/utils/currencies.py b/packages/core/src/utils/currencies.py index ebbfb87..8c81f2f 100644 --- a/packages/core/src/utils/currencies.py +++ b/packages/core/src/utils/currencies.py @@ -17,10 +17,10 @@ def remove_decimals(value: Uint256 | Decimal) -> Uint256: return Web3.to_wei(value, "ether") -def restore_decimals(func): +def restore_decimals(func): # type: ignore[no-untyped-def] """Decorator to restore decimals.""" - def wrapper(*args, **kwargs): + def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] result = func(*args, **kwargs) return Web3.from_wei(result, "ether") diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py index 8e71d57..fa613e8 100644 --- a/packages/core/src/utils/errors.py +++ b/packages/core/src/utils/errors.py @@ -1,7 +1,10 @@ +from .types import ChainName + + class JpycSdkError(Exception): """A base class for any errors related to JPYC SDK.""" - def __init__(self, code: int, message: str): + def __init__(self, code: int, message: str) -> None: self.code = code """int: Custom error code""" self.message = message @@ -24,7 +27,7 @@ class NetworkNotSupported(JpycSdkError): code = 100 - def __init__(self, chain_name: str, network_name: str): + def __init__(self, chain_name: ChainName, network_name: str) -> None: from .chains import enumerate_supported_networks super().__init__( @@ -39,7 +42,7 @@ class AccountNotInitialized(JpycSdkError): code = 101 - def __init__(self): + def __init__(self) -> None: super().__init__( code=AccountNotInitialized.code, message="Account is not initialized.", @@ -54,7 +57,7 @@ class InvalidChecksumAddress(JpycSdkError, TypeError): code = 200 - def __init__(self, message_: str): + def __init__(self, message_: str) -> None: super().__init__( code=InvalidChecksumAddress.code, message=f"Invalid checksum address: {message_}. " @@ -67,7 +70,7 @@ class InvalidUint8(JpycSdkError, TypeError): code = 201 - def __init__(self, message_: str): + def __init__(self, message_: str) -> None: super().__init__( code=InvalidUint8.code, message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.", @@ -79,7 +82,7 @@ class InvalidUint256(JpycSdkError, TypeError): code = 202 - def __init__(self, message_: str): + def __init__(self, message_: str) -> None: super().__init__( code=InvalidUint256.code, message=f"Invalid uint256: {message_}. " @@ -92,7 +95,7 @@ class InvalidBytes32(JpycSdkError, TypeError): code = 203 - def __init__(self, message_: str): + def __init__(self, message_: str) -> None: super().__init__( code=InvalidBytes32.code, message=f"Invalid bytes32: {message_}.", @@ -104,7 +107,7 @@ class InvalidRpcEndpoint(JpycSdkError, TypeError): code = 204 - def __init__(self, message_: str): + def __init__(self, message_: str) -> None: super().__init__( code=InvalidRpcEndpoint.code, message=f"Invalid RPC endpoint: {message_}.", @@ -125,7 +128,7 @@ class TransactionSimulationFailed(JpycSdkError): code = 300 - def __init__(self, message_: str): + def __init__(self, message_: str) -> None: super().__init__( code=TransactionSimulationFailed.code, message=f"Failed to simulate a transaction locally: {message_}", @@ -141,7 +144,7 @@ class TransactionFailed(JpycSdkError): code = 301 - def __init__(self, message_: str): + def __init__(self, message_: str) -> None: super().__init__( code=TransactionFailed.code, message=f"Transaction failed: {message_}", diff --git a/packages/core/src/utils/types.py b/packages/core/src/utils/types.py index 60ee3eb..7b1ef98 100644 --- a/packages/core/src/utils/types.py +++ b/packages/core/src/utils/types.py @@ -1,17 +1,19 @@ -from typing import Literal, TypeAlias, TypedDict +from typing import Literal, TypedDict + +from web3.contract.contract import ContractFunction ########## # Chains # ########## -ChainName: TypeAlias = Literal[ +type ChainName = Literal[ "ethereum", "polygon", "gnosis", "avalanche", "astar", "shiden", - "local", + "localhost", ] @@ -21,14 +23,23 @@ class NetworkMetadata(TypedDict): rpc_endpoints: list[str] -ChainMetadata: TypeAlias = dict[ChainName, dict[str, NetworkMetadata]] +type ChainMetadata = dict[ChainName, dict[str, NetworkMetadata]] """A type that contains metadata of chains.""" ############# # Contracts # ############# -ContractVersion: TypeAlias = Literal["2"] +type ContractVersion = Literal["2"] """A type that contains available contract versions.""" -ArtifactType: TypeAlias = Literal["abi", "bytecode"] +type ArtifactType = Literal["abi", "bytecode"] """A type that contains types of contract artifacts.""" + +################ +# Transactions # +################ + + +class TransactionArgs(TypedDict): + contract_func: ContractFunction + func_args: dict[str, object] diff --git a/packages/core/src/utils/validators.py b/packages/core/src/utils/validators.py index e580f71..4c46c83 100644 --- a/packages/core/src/utils/validators.py +++ b/packages/core/src/utils/validators.py @@ -50,7 +50,7 @@ def validate_uint8(integer: int) -> int: InvalidUint8: If the integer is not a valid uint8 """ if integer < UINT_MIN or UINT8_MAX < integer: - raise InvalidUint8(integer) + raise InvalidUint8(str(integer)) return integer @@ -72,7 +72,7 @@ def validate_uint256(integer: int) -> int: InvalidUint256: If the integer is not a valid uint256 """ if integer < UINT_MIN or UINT256_MAX < integer: - raise InvalidUint256(integer) + raise InvalidUint256(str(integer)) return integer diff --git a/uv.lock b/uv.lock index b0b71b0..0dfa7ca 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 2 -requires-python = ">=3.11" +requires-python = ">=3.12" resolution-markers = [ "implementation_name == 'cpython'", "implementation_name == 'pypy'", @@ -37,22 +37,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload-time = "2025-04-21T09:43:09.191Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload-time = "2025-04-21T09:40:55.776Z" }, - { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload-time = "2025-04-21T09:40:57.301Z" }, - { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload-time = "2025-04-21T09:40:59.322Z" }, - { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload-time = "2025-04-21T09:41:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload-time = "2025-04-21T09:41:02.89Z" }, - { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload-time = "2025-04-21T09:41:04.461Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload-time = "2025-04-21T09:41:06.728Z" }, - { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload-time = "2025-04-21T09:41:08.293Z" }, - { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload-time = "2025-04-21T09:41:11.054Z" }, - { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload-time = "2025-04-21T09:41:13.213Z" }, - { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload-time = "2025-04-21T09:41:14.827Z" }, - { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload-time = "2025-04-21T09:41:17.168Z" }, - { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload-time = "2025-04-21T09:41:19.353Z" }, - { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload-time = "2025-04-21T09:41:21.868Z" }, - { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload-time = "2025-04-21T09:41:24.78Z" }, - { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload-time = "2025-04-21T09:41:26.48Z" }, { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload-time = "2025-04-21T09:41:28.021Z" }, { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload-time = "2025-04-21T09:41:29.783Z" }, { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload-time = "2025-04-21T09:41:31.327Z" }, @@ -141,20 +125,6 @@ version = "3.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/17/7b/148091d4696b38a0b14ce495e64736472cc04b0757cc8b5e7846a1cf78a9/bitarray-3.4.0.tar.gz", hash = "sha256:33eee090eade2c8303bfc01a9e104fea306d330035b18b5c50a04cb0cb76f08d", size = 141279, upload-time = "2025-05-06T23:02:48.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/f1/8765c11198b4db5355a72995ece87493de8f43573ce36f3398a98d515d8c/bitarray-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf924be7b97cc5bec88bf63c09732aa5c90bd00f3152cffebed259a49df351b0", size = 139312, upload-time = "2025-05-06T22:59:31.557Z" }, - { url = "https://files.pythonhosted.org/packages/5f/0e/d9313541dc94a1aa4826d99b65f357714e832eef0622866c75de950c9623/bitarray-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f02850724d3e6c57265246329eeb71893a4a6884521b7f18fc5d9ea467300fe", size = 136160, upload-time = "2025-05-06T22:59:32.707Z" }, - { url = "https://files.pythonhosted.org/packages/30/f2/90d50d7fec3a98df0ae4b4585045a0131658846e125bfc50ea1460c74e79/bitarray-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93b88fa7bd0f958d7172862dcbebbe7c96eff90f989c6ddd28ec6e28bbe3f768", size = 309027, upload-time = "2025-05-06T22:59:33.844Z" }, - { url = "https://files.pythonhosted.org/packages/23/64/e940a135275a7424b34dc54be4846427b4f13d837582c4c02f044bc3f795/bitarray-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:341104cb87536114dc30728231427a335db4f90ea7e9ab94d8b1a94ff253624f", size = 323993, upload-time = "2025-05-06T22:59:35.335Z" }, - { url = "https://files.pythonhosted.org/packages/7c/7d/55d4c81d762a018762ed29d98929d5155e8687c22577891dd933a4a3fccf/bitarray-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5af9d61f383335a52c28cac82b2a06ecf7ad72bb6a7e90711cb7534ce8c5fa07", size = 316992, upload-time = "2025-05-06T22:59:36.637Z" }, - { url = "https://files.pythonhosted.org/packages/41/a9/563e74ffcc0b2f44f2fd73eaf3e0ebf7d5176c9144cb299585606a30f044/bitarray-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77fd3e9c576f3952870b527c3a42795108946862ec11a3b17a723939dae76a12", size = 309113, upload-time = "2025-05-06T22:59:38.277Z" }, - { url = "https://files.pythonhosted.org/packages/00/56/e8ae194902df3ed3102e48bd1bcc36bebb2f555201723aa56a28473b49f9/bitarray-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12cc15dba08edb6e80c3a7f43cfaebba98dcbb89b120d534e32a42cd57c5f15f", size = 297274, upload-time = "2025-05-06T22:59:39.543Z" }, - { url = "https://files.pythonhosted.org/packages/73/c9/30530ade6c57cb40c37fe536457bf658397c2c3450ec9b5b756b2d11f96c/bitarray-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5e5fac8a9d1140ae55858f13914574ca63b48f968e424a02d918e46602569c02", size = 302445, upload-time = "2025-05-06T22:59:41.181Z" }, - { url = "https://files.pythonhosted.org/packages/61/fe/b972f335fc49c0d0a8cf11cc99f6b59b52c20eb50b680083112d4d8bed3c/bitarray-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01df531279959c95c0eb1eccd3e6121cb241ddcb821594f3eb07a94b086f71a0", size = 293261, upload-time = "2025-05-06T22:59:42.365Z" }, - { url = "https://files.pythonhosted.org/packages/b6/80/08c5264585f245a245e3540bb8c4ab3f7102fefb50fc3b82e27798532ce9/bitarray-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5811b9aeacc8c2b62ed0732649600405a7df5bf28eb7b7475f56822f702fc718", size = 318589, upload-time = "2025-05-06T22:59:44.136Z" }, - { url = "https://files.pythonhosted.org/packages/a2/e8/59e71b455bcf4fc55c426ccc88e2f2ca80c98e6a91f39cbc744d857e19d3/bitarray-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:437d983fb4b34874faa2c6a0247be770ec3935b4cedc16f65f8a4cbf8c970f03", size = 322502, upload-time = "2025-05-06T22:59:45.864Z" }, - { url = "https://files.pythonhosted.org/packages/98/91/c3f46b7da8d7be6ea79af36ae00269f08f769150b35826ac6fc5991a65ca/bitarray-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:332a373fe20fdba78968bbeeb1aa01f2d861a30d938bb986e7101246cf371500", size = 300757, upload-time = "2025-05-06T22:59:47.707Z" }, - { url = "https://files.pythonhosted.org/packages/b6/df/c277d5c0404f0090eea6b580519e5a3696c092c939b857c2c09e901af096/bitarray-3.4.0-cp311-cp311-win32.whl", hash = "sha256:15197c8a3ec258401f80bbcc64b942d82dfcf3d9549320147aef900c80bdf77b", size = 132306, upload-time = "2025-05-06T22:59:48.885Z" }, - { url = "https://files.pythonhosted.org/packages/3b/62/975e3fec5f6d32c744f0558245475fbac4bcb7dfc2151403c3fda0a13f13/bitarray-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:11fcc8e92699a2463055ceab63071ff2179a1f53d1284f4b7b9a405365065efa", size = 139175, upload-time = "2025-05-06T22:59:50.312Z" }, { url = "https://files.pythonhosted.org/packages/df/72/cb4d7c4377110aa4825c4f2971d66a856dddda229717b965ee75a5eb1845/bitarray-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef3f2dc1a95bec2af77c8685c847d41fc0c64d7329c994b6054c54462f835401", size = 139210, upload-time = "2025-05-06T22:59:51.546Z" }, { url = "https://files.pythonhosted.org/packages/01/74/69e2d97a9525fc06430fbc9a075fa76ce9772578e480c9cc8d3b0f041afa/bitarray-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:75df7335ed7324a1ee9002d747c36a37de42b6469601ac39fef00c6bd80a4cb4", size = 136227, upload-time = "2025-05-06T22:59:52.727Z" }, { url = "https://files.pythonhosted.org/packages/a7/eb/fc23c954e9f67c8a7116610fd204dbfed79be98ed40221cfe668aaed13c9/bitarray-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d089a0570e2acfabac9dd40ee7bfbc36ec48ff73c9312f3e61ebf31b315d05d", size = 311845, upload-time = "2025-05-06T22:59:53.935Z" }, @@ -209,19 +179,6 @@ version = "3.4.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, @@ -257,15 +214,6 @@ version = "2.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/55/df/f6db8e83bd4594c1ea685cd37fb81d5399e55765aae16d1a8a9502598f4e/ckzg-2.1.1.tar.gz", hash = "sha256:d6b306b7ec93a24e4346aa53d07f7f75053bc0afc7398e35fa649e5f9d48fcc4", size = 1120500, upload-time = "2025-03-31T21:24:12.324Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/2c/44120b2d9dcb0246d67a1f28b9eaa625c499014d4d42561467e28eedd285/ckzg-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:465e2b71cf9dc383f66f1979269420a0da9274a3a9e98b1a4455e84927dfe491", size = 116378, upload-time = "2025-03-31T21:22:36.96Z" }, - { url = "https://files.pythonhosted.org/packages/23/88/c5b89ba9a730fee5e089be9e0c7048fb6707c1a0e4b6c30fcf725c3eef44/ckzg-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ee2f26f17a64ad0aab833d637b276f28486b82a29e34f32cf54b237b8f8ab72d", size = 100202, upload-time = "2025-03-31T21:22:37.799Z" }, - { url = "https://files.pythonhosted.org/packages/ee/11/b0a473e80346db52ad9a629bc9fd8f773c718ed78932ea3a70392306ffc3/ckzg-2.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99cc2c4e9fb8c62e3e0862c7f4df9142f07ba640da17fded5f6e0fd09f75909f", size = 175595, upload-time = "2025-03-31T21:22:39.013Z" }, - { url = "https://files.pythonhosted.org/packages/52/fa/17a7e125d07a96dd6dce4db7262231f7583856b2be5d5b7df59e04bfa188/ckzg-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773dd016693d74aca1f5d7982db2bad7dde2e147563aeb16a783f7e5f69c01fe", size = 161681, upload-time = "2025-03-31T21:22:40.257Z" }, - { url = "https://files.pythonhosted.org/packages/57/bd/46d6b90bf53da732f9adab7593d132a0834ed4f2f7659b4c7414d8f78d39/ckzg-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af2b2144f87ba218d8db01382a961b3ecbdde5ede4fa0d9428d35f8c8a595ba", size = 170471, upload-time = "2025-03-31T21:22:41.513Z" }, - { url = "https://files.pythonhosted.org/packages/9d/98/113c7704749d037d75f23240ffc5c46dfe8416de574b946438587835715f/ckzg-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f55e63d3f7c934a2cb53728ed1d815479e177aca8c84efe991c2920977cff6", size = 173595, upload-time = "2025-03-31T21:22:42.534Z" }, - { url = "https://files.pythonhosted.org/packages/2f/d5/05fca6dcb5a19327be491157794eafc3d7498daf615c2ff5a5b745852945/ckzg-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ecb42aaa0ffa427ff14a9dde9356ba69e5ae6014650b397af55b31bdae7a9b6e", size = 188417, upload-time = "2025-03-31T21:22:43.466Z" }, - { url = "https://files.pythonhosted.org/packages/72/36/131ae2dfc82d0fdc98fae8e3bbfe71ff14265bb434b23bd07b585afc6d61/ckzg-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5a01514239f12fb1a7ad9009c20062a4496e13b09541c1a65f97e295da648c70", size = 183286, upload-time = "2025-03-31T21:22:44.732Z" }, - { url = "https://files.pythonhosted.org/packages/c5/6a/d371b27024422b25228fc11fa57b1ba7756a94cc9fb0c75da292c235fdaa/ckzg-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:6516b9684aae262c85cf7fddd8b585b8139ad20e08ec03994e219663abbb0916", size = 98819, upload-time = "2025-03-31T21:22:45.57Z" }, { url = "https://files.pythonhosted.org/packages/93/a1/9c07513dd0ea01e5db727e67bd2660f3b300a4511281cdb8d5e04afa1cfd/ckzg-2.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c60e8903344ce98ce036f0fabacce952abb714cad4607198b2f0961c28b8aa72", size = 116421, upload-time = "2025-03-31T21:22:46.434Z" }, { url = "https://files.pythonhosted.org/packages/27/04/b69a0dfbb2722a14c98a52973f276679151ec56a14178cb48e6f2e1697bc/ckzg-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4299149dd72448e5a8d2d1cc6cc7472c92fc9d9f00b1377f5b017c089d9cd92", size = 100216, upload-time = "2025-03-31T21:22:47.633Z" }, { url = "https://files.pythonhosted.org/packages/2e/24/9cc850d0b8ead395ad5064de67c7c91adacaf31b6b35292ab53fbd93270b/ckzg-2.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:025dd31ffdcc799f3ff842570a2a6683b6c5b01567da0109c0c05d11768729c4", size = 175764, upload-time = "2025-03-31T21:22:48.768Z" }, @@ -284,12 +232,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2e/f0/aff87c3ed80713453cb6c84fe6fbb7582d86a7a5e4460fda2a497d47f489/ckzg-2.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9f5556e6675866040cc4335907be6c537051e7f668da289fa660fdd8a30c9ddb", size = 188722, upload-time = "2025-03-31T21:23:02.966Z" }, { url = "https://files.pythonhosted.org/packages/44/d9/1f08bfb8fd1cbb8c7513e7ad3fb76bbb5c3fb446238c1eba582276e4d905/ckzg-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55b2ba30c5c9daac0c55f1aac851f1b7bf1f7aa0028c2db4440e963dd5b866d6", size = 183686, upload-time = "2025-03-31T21:23:03.905Z" }, { url = "https://files.pythonhosted.org/packages/a3/ff/434f6d2893cbdfad00c20d17e9a52d426ca042f5e980d5c3db96bc6b6e15/ckzg-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:10d201601fc8f28c0e8cec3406676797024dd374c367bbeec5a7a9eac9147237", size = 98817, upload-time = "2025-03-31T21:23:05.2Z" }, - { url = "https://files.pythonhosted.org/packages/7f/ba/7d9c1f9cec7e0e382653c72165896194a05743e589b1dae2aa80236aa87f/ckzg-2.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4b0c850bd6cad22ac79b2a2ab884e0e7cd2b54a67d643cd616c145ebdb535a11", size = 113188, upload-time = "2025-03-31T21:23:46.337Z" }, - { url = "https://files.pythonhosted.org/packages/2f/92/9728f5ccc1c5e87c6c5ae7941250a447b61fd5a63aadbc15249e29c21bcf/ckzg-2.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:26951f36bb60c9150bbd38110f5e1625596f9779dad54d1d492d8ec38bc84e3a", size = 96208, upload-time = "2025-03-31T21:23:47.255Z" }, - { url = "https://files.pythonhosted.org/packages/39/63/5e27d587bd224fee70cb66b022e7c4ef95d0e091e08ee76c25ec12094b0d/ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe12445e49c4bee67746b7b958e90a973b0de116d0390749b0df351d94e9a8c", size = 126158, upload-time = "2025-03-31T21:23:48.195Z" }, - { url = "https://files.pythonhosted.org/packages/43/98/e0a45946575a7b823d8ee0b47afb104b6017e54e1208f07da2529bc01900/ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71c5d4f66f09de4a99271acac74d2acb3559a77de77a366b34a91e99e8822667", size = 102812, upload-time = "2025-03-31T21:23:49.16Z" }, - { url = "https://files.pythonhosted.org/packages/cb/50/718ca7b03e4b89b18cdf99cc3038050105b0acbf9b612c23cd513093c6de/ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42673c1d007372a4e8b48f6ef8f0ce31a9688a463317a98539757d1e2fb1ecc7", size = 111327, upload-time = "2025-03-31T21:23:50.126Z" }, - { url = "https://files.pythonhosted.org/packages/29/c5/80e5a0c6967d02d801150104320484a258e5a49bd191e198643e74039320/ckzg-2.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:57a7dc41ec6b69c1d9117eb61cf001295e6b4f67a736020442e71fb4367fb1a5", size = 98847, upload-time = "2025-03-31T21:23:51.084Z" }, ] [[package]] @@ -307,16 +249,6 @@ version = "7.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872, upload-time = "2025-03-30T20:36:45.376Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/77/074d201adb8383addae5784cb8e2dac60bb62bfdf28b2b10f3a3af2fda47/coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27", size = 211493, upload-time = "2025-03-30T20:35:12.286Z" }, - { url = "https://files.pythonhosted.org/packages/a9/89/7a8efe585750fe59b48d09f871f0e0c028a7b10722b2172dfe021fa2fdd4/coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea", size = 211921, upload-time = "2025-03-30T20:35:14.18Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ef/96a90c31d08a3f40c49dbe897df4f1fd51fb6583821a1a1c5ee30cc8f680/coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7", size = 244556, upload-time = "2025-03-30T20:35:15.616Z" }, - { url = "https://files.pythonhosted.org/packages/89/97/dcd5c2ce72cee9d7b0ee8c89162c24972fb987a111b92d1a3d1d19100c61/coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040", size = 242245, upload-time = "2025-03-30T20:35:18.648Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7b/b63cbb44096141ed435843bbb251558c8e05cc835c8da31ca6ffb26d44c0/coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543", size = 244032, upload-time = "2025-03-30T20:35:20.131Z" }, - { url = "https://files.pythonhosted.org/packages/97/e3/7fa8c2c00a1ef530c2a42fa5df25a6971391f92739d83d67a4ee6dcf7a02/coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2", size = 243679, upload-time = "2025-03-30T20:35:21.636Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b3/e0a59d8df9150c8a0c0841d55d6568f0a9195692136c44f3d21f1842c8f6/coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318", size = 241852, upload-time = "2025-03-30T20:35:23.525Z" }, - { url = "https://files.pythonhosted.org/packages/9b/82/db347ccd57bcef150c173df2ade97976a8367a3be7160e303e43dd0c795f/coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9", size = 242389, upload-time = "2025-03-30T20:35:25.09Z" }, - { url = "https://files.pythonhosted.org/packages/21/f6/3f7d7879ceb03923195d9ff294456241ed05815281f5254bc16ef71d6a20/coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c", size = 213997, upload-time = "2025-03-30T20:35:26.914Z" }, - { url = "https://files.pythonhosted.org/packages/28/87/021189643e18ecf045dbe1e2071b2747901f229df302de01c998eeadf146/coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78", size = 214911, upload-time = "2025-03-30T20:35:28.498Z" }, { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684, upload-time = "2025-03-30T20:35:29.959Z" }, { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935, upload-time = "2025-03-30T20:35:31.912Z" }, { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994, upload-time = "2025-03-30T20:35:33.455Z" }, @@ -347,15 +279,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116, upload-time = "2025-03-30T20:36:18.033Z" }, { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909, upload-time = "2025-03-30T20:36:19.644Z" }, { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068, upload-time = "2025-03-30T20:36:21.282Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f1/1da77bb4c920aa30e82fa9b6ea065da3467977c2e5e032e38e66f1c57ffd/coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd", size = 203443, upload-time = "2025-03-30T20:36:41.959Z" }, { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435, upload-time = "2025-03-30T20:36:43.61Z" }, ] -[package.optional-dependencies] -toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, -] - [[package]] name = "cytoolz" version = "1.0.1" @@ -365,20 +291,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/a7/f9/3243eed3a6545c2a33a21f74f655e3fcb5d2192613cd3db81a93369eb339/cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6", size = 626652, upload-time = "2024-12-13T05:47:36.672Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/ea/8131ae39119820b8867cddc23716fa9f681f2b3bbce6f693e68dfb36b55b/cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6", size = 406162, upload-time = "2024-12-13T05:45:01.196Z" }, - { url = "https://files.pythonhosted.org/packages/26/18/3d9bd4c146f6ea6e51300c242b20cb416966b21d481dac230e1304f1e54b/cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab", size = 384961, upload-time = "2024-12-13T05:45:02.387Z" }, - { url = "https://files.pythonhosted.org/packages/e4/73/9034827907c7f85c7c484c9494e905d022fb8174526004e9ef332570349e/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30", size = 2091698, upload-time = "2024-12-13T05:45:04.353Z" }, - { url = "https://files.pythonhosted.org/packages/74/af/d5c2733b0fde1a08254ff1a8a8d567874040c9eb1606363cfebc0713c73f/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b", size = 2188452, upload-time = "2024-12-13T05:45:05.748Z" }, - { url = "https://files.pythonhosted.org/packages/6a/bb/77c71fa9c217260b4056a732d754748903423c2cdd82a673d6064741e375/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41", size = 2174203, upload-time = "2024-12-13T05:45:07.777Z" }, - { url = "https://files.pythonhosted.org/packages/fc/a9/a5b4a3ff5d22faa1b60293bfe97362e2caf4a830c26d37ab5557f60d04b2/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd", size = 2099831, upload-time = "2024-12-13T05:45:11.477Z" }, - { url = "https://files.pythonhosted.org/packages/35/08/7f6869ea1ff31ce5289a7d58d0e7090acfe7058baa2764473048ff61ea3c/cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3", size = 1996744, upload-time = "2024-12-13T05:45:14.172Z" }, - { url = "https://files.pythonhosted.org/packages/46/b4/9ac424c994b51763fd1bbed62d95f8fba8fa0e45c8c3c583904fdaf8f51d/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7", size = 2013733, upload-time = "2024-12-13T05:45:16.912Z" }, - { url = "https://files.pythonhosted.org/packages/3e/99/03009765c4b87d742d5b5a8670abb56a8c7ede033c2cdaa4be8662d3b001/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61", size = 1994850, upload-time = "2024-12-13T05:45:18.414Z" }, - { url = "https://files.pythonhosted.org/packages/40/9a/8458af9a5557e177ea42f8cf7e477bede518b0bbef564e28c4151feaa52c/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3", size = 2155352, upload-time = "2024-12-13T05:45:19.763Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5c/2a701423e001fcbec288b4f3fc2bf67557d114c2388237fc1ae67e1e2686/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580", size = 2163515, upload-time = "2024-12-13T05:45:21.08Z" }, - { url = "https://files.pythonhosted.org/packages/36/16/ee2e06e65d9d533bc05cd52a0b355ba9072fc8f60d77289e529c6d2e3750/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052", size = 2054431, upload-time = "2024-12-13T05:45:22.521Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d5/2fac8315f210fa1bc7106e27c19e1211580aa25bb7fa17dfd79505e5baf2/cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead", size = 322004, upload-time = "2024-12-13T05:45:24.048Z" }, - { url = "https://files.pythonhosted.org/packages/a9/9e/0b70b641850a95f9ff90adde9d094a4b1d81ec54dadfd97fec0a2aaf440e/cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c", size = 365358, upload-time = "2024-12-13T05:45:25.383Z" }, { url = "https://files.pythonhosted.org/packages/d8/e8/218098344ed2cb5f8441fade9b2428e435e7073962374a9c71e59ac141a7/cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4", size = 414121, upload-time = "2024-12-13T05:45:26.588Z" }, { url = "https://files.pythonhosted.org/packages/de/27/4d729a5653718109262b758fec1a959aa9facb74c15460d9074dc76d6635/cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662", size = 390904, upload-time = "2024-12-13T05:45:27.718Z" }, { url = "https://files.pythonhosted.org/packages/72/c0/cbabfa788bab9c6038953bf9478adaec06e88903a726946ea7c88092f5c4/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3", size = 2090734, upload-time = "2024-12-13T05:45:30.515Z" }, @@ -582,23 +494,6 @@ version = "1.6.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload-time = "2025-04-17T22:38:53.099Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload-time = "2025-04-17T22:36:17.235Z" }, - { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload-time = "2025-04-17T22:36:18.735Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload-time = "2025-04-17T22:36:20.6Z" }, - { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload-time = "2025-04-17T22:36:22.088Z" }, - { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload-time = "2025-04-17T22:36:24.247Z" }, - { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload-time = "2025-04-17T22:36:26.291Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload-time = "2025-04-17T22:36:27.909Z" }, - { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload-time = "2025-04-17T22:36:29.448Z" }, - { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload-time = "2025-04-17T22:36:31.55Z" }, - { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload-time = "2025-04-17T22:36:33.078Z" }, - { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload-time = "2025-04-17T22:36:34.688Z" }, - { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload-time = "2025-04-17T22:36:36.363Z" }, - { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload-time = "2025-04-17T22:36:38.16Z" }, - { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload-time = "2025-04-17T22:36:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload-time = "2025-04-17T22:36:42.045Z" }, - { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload-time = "2025-04-17T22:36:44.067Z" }, - { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload-time = "2025-04-17T22:36:45.465Z" }, { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload-time = "2025-04-17T22:36:47.382Z" }, { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload-time = "2025-04-17T22:36:49.401Z" }, { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload-time = "2025-04-17T22:36:51.899Z" }, @@ -751,19 +646,6 @@ version = "1.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/96/e3/42c87871920602a3c8300915bd0292f76eccc66c38f782397acbf8a62088/lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b", size = 13123, upload-time = "2023-11-06T01:40:12.951Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/c9/6fac0cb67160f0efa3cc76a6a7d04d5e21a516eeb991ebba08f4f8f01ec5/lru_dict-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:20c595764695d20bdc3ab9b582e0cc99814da183544afb83783a36d6741a0dac", size = 17750, upload-time = "2023-11-06T01:38:52.667Z" }, - { url = "https://files.pythonhosted.org/packages/61/14/f90dee4bc547ae266dbeffd4e11611234bb6af511dea48f3bc8dac1de478/lru_dict-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d9b30a8f50c3fa72a494eca6be5810a1b5c89e4f0fda89374f0d1c5ad8d37d51", size = 11055, upload-time = "2023-11-06T01:38:53.798Z" }, - { url = "https://files.pythonhosted.org/packages/4e/63/a0ae20525f9d52f62ac0def47935f8a2b3b6fcd2c145218b9a27fc1fb910/lru_dict-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9710737584650a4251b9a566cbb1a86f83437adb209c9ba43a4e756d12faf0d7", size = 11330, upload-time = "2023-11-06T01:38:54.847Z" }, - { url = "https://files.pythonhosted.org/packages/e9/c6/8c2b81b61e5206910c81b712500736227289aefe4ccfb36137aa21807003/lru_dict-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b84c321ae34f2f40aae80e18b6fa08b31c90095792ab64bb99d2e385143effaa", size = 31793, upload-time = "2023-11-06T01:38:56.163Z" }, - { url = "https://files.pythonhosted.org/packages/f9/d7/af9733f94df67a2e9e31ef47d4c41aff1836024f135cdbda4743eb628452/lru_dict-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eed24272b4121b7c22f234daed99899817d81d671b3ed030c876ac88bc9dc890", size = 33090, upload-time = "2023-11-06T01:38:57.091Z" }, - { url = "https://files.pythonhosted.org/packages/5b/6e/5b09b069a70028bcf05dbdc57a301fbe8b3bafecf916f2ed5a3065c79a71/lru_dict-1.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd13af06dab7c6ee92284fd02ed9a5613a07d5c1b41948dc8886e7207f86dfd", size = 29795, upload-time = "2023-11-06T01:38:58.278Z" }, - { url = "https://files.pythonhosted.org/packages/21/92/4690daefc2602f7c3429ecf54572d37a9e3c372d370344d2185daa4d5ecc/lru_dict-1.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1efc59bfba6aac33684d87b9e02813b0e2445b2f1c444dae2a0b396ad0ed60c", size = 31586, upload-time = "2023-11-06T01:38:59.363Z" }, - { url = "https://files.pythonhosted.org/packages/3c/67/0a29a91087196b02f278d8765120ee4e7486f1f72a4c505fd1cd3109e627/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfaf75ac574447afcf8ad998789071af11d2bcf6f947643231f692948839bd98", size = 36662, upload-time = "2023-11-06T01:39:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/8d56c514cd2333b652bd44c8f1962ab986cbe68e8ad7258c9e0f360cddb6/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c95f8751e2abd6f778da0399c8e0239321d560dbc58cb063827123137d213242", size = 35118, upload-time = "2023-11-06T01:39:01.883Z" }, - { url = "https://files.pythonhosted.org/packages/f5/9a/c7a175d10d503b86974cb07141ca175947145dd1c7370fcda86fbbcaf326/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:abd0c284b26b5c4ee806ca4f33ab5e16b4bf4d5ec9e093e75a6f6287acdde78e", size = 38198, upload-time = "2023-11-06T01:39:03.306Z" }, - { url = "https://files.pythonhosted.org/packages/fd/59/2e5086c8e8a05a7282a824a2a37e3c45cd5714e7b83d8bc0267cb3bb5b4f/lru_dict-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a47740652b25900ac5ce52667b2eade28d8b5fdca0ccd3323459df710e8210a", size = 36542, upload-time = "2023-11-06T01:39:04.751Z" }, - { url = "https://files.pythonhosted.org/packages/12/52/80d0a06e5f45fe7c278dd662da6ea5b39f2ff003248f448189932f6b71c2/lru_dict-1.3.0-cp311-cp311-win32.whl", hash = "sha256:a690c23fc353681ed8042d9fe8f48f0fb79a57b9a45daea2f0be1eef8a1a4aa4", size = 12533, upload-time = "2023-11-06T01:39:05.838Z" }, - { url = "https://files.pythonhosted.org/packages/ce/fe/1f12f33513310860ec6d722709ec4ad8256d9dcc3385f6ae2a244e6e66f5/lru_dict-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:efd3f4e0385d18f20f7ea6b08af2574c1bfaa5cb590102ef1bee781bdfba84bc", size = 13651, upload-time = "2023-11-06T01:39:06.871Z" }, { url = "https://files.pythonhosted.org/packages/fc/5c/385f080747eb3083af87d8e4c9068f3c4cab89035f6982134889940dafd8/lru_dict-1.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c279068f68af3b46a5d649855e1fb87f5705fe1f744a529d82b2885c0e1fc69d", size = 17174, upload-time = "2023-11-06T01:39:07.923Z" }, { url = "https://files.pythonhosted.org/packages/3c/de/5ef2ed75ce55d7059d1b96177ba04fa7ee1f35564f97bdfcd28fccfbe9d2/lru_dict-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:350e2233cfee9f326a0d7a08e309372d87186565e43a691b120006285a0ac549", size = 10742, upload-time = "2023-11-06T01:39:08.871Z" }, { url = "https://files.pythonhosted.org/packages/ca/05/f69a6abb0062d2cf2ce0aaf0284b105b97d1da024ca6d3d0730e6151242e/lru_dict-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eafb188a84483b3231259bf19030859f070321b00326dcb8e8c6cbf7db4b12f", size = 11079, upload-time = "2023-11-06T01:39:09.766Z" }, @@ -785,16 +667,6 @@ version = "3.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, @@ -833,23 +705,6 @@ version = "6.4.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload-time = "2025-04-10T22:20:17.956Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload-time = "2025-04-10T22:17:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload-time = "2025-04-10T22:18:01.202Z" }, - { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload-time = "2025-04-10T22:18:02.276Z" }, - { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload-time = "2025-04-10T22:18:03.436Z" }, - { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload-time = "2025-04-10T22:18:04.922Z" }, - { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload-time = "2025-04-10T22:18:06.274Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload-time = "2025-04-10T22:18:07.742Z" }, - { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload-time = "2025-04-10T22:18:09.095Z" }, - { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload-time = "2025-04-10T22:18:10.474Z" }, - { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload-time = "2025-04-10T22:18:11.793Z" }, - { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload-time = "2025-04-10T22:18:13.153Z" }, - { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload-time = "2025-04-10T22:18:14.654Z" }, - { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload-time = "2025-04-10T22:18:16.236Z" }, - { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload-time = "2025-04-10T22:18:17.979Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload-time = "2025-04-10T22:18:19.362Z" }, - { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload-time = "2025-04-10T22:18:20.728Z" }, - { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload-time = "2025-04-10T22:18:22.001Z" }, { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload-time = "2025-04-10T22:18:23.174Z" }, { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload-time = "2025-04-10T22:18:24.834Z" }, { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload-time = "2025-04-10T22:18:26.069Z" }, @@ -914,12 +769,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload-time = "2025-02-05T03:50:34.655Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338, upload-time = "2025-02-05T03:50:17.287Z" }, - { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540, upload-time = "2025-02-05T03:49:51.21Z" }, - { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051, upload-time = "2025-02-05T03:50:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751, upload-time = "2025-02-05T03:49:42.408Z" }, - { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783, upload-time = "2025-02-05T03:49:07.707Z" }, - { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618, upload-time = "2025-02-05T03:49:54.581Z" }, { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981, upload-time = "2025-02-05T03:50:28.25Z" }, { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175, upload-time = "2025-02-05T03:50:13.411Z" }, { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675, upload-time = "2025-02-05T03:50:31.421Z" }, @@ -980,22 +829,6 @@ version = "0.3.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload-time = "2025-03-26T03:06:12.05Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload-time = "2025-03-26T03:04:01.912Z" }, - { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload-time = "2025-03-26T03:04:03.704Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload-time = "2025-03-26T03:04:05.257Z" }, - { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload-time = "2025-03-26T03:04:07.044Z" }, - { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload-time = "2025-03-26T03:04:08.676Z" }, - { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload-time = "2025-03-26T03:04:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload-time = "2025-03-26T03:04:11.616Z" }, - { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload-time = "2025-03-26T03:04:13.102Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload-time = "2025-03-26T03:04:14.658Z" }, - { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload-time = "2025-03-26T03:04:16.207Z" }, - { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload-time = "2025-03-26T03:04:18.11Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload-time = "2025-03-26T03:04:19.562Z" }, - { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload-time = "2025-03-26T03:04:21.065Z" }, - { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload-time = "2025-03-26T03:04:22.718Z" }, - { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload-time = "2025-03-26T03:04:24.039Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload-time = "2025-03-26T03:04:25.211Z" }, { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload-time = "2025-03-26T03:04:26.436Z" }, { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload-time = "2025-03-26T03:04:27.932Z" }, { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload-time = "2025-03-26T03:04:30.659Z" }, @@ -1139,20 +972,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, - { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, - { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, - { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, - { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, - { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, - { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, - { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, @@ -1184,15 +1003,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, - { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, - { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, - { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, - { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, - { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, - { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] [[package]] @@ -1224,7 +1034,7 @@ name = "pytest-cov" version = "6.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", extra = ["toml"] }, + { name = "coverage" }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857, upload-time = "2025-04-05T14:07:51.592Z" } @@ -1255,9 +1065,6 @@ name = "pywin32" version = "310" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload-time = "2025-03-17T00:55:53.124Z" }, - { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload-time = "2025-03-17T00:55:55.203Z" }, - { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload-time = "2025-03-17T00:55:57.048Z" }, { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload-time = "2025-03-17T00:55:58.807Z" }, { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload-time = "2025-03-17T00:56:00.8Z" }, { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload-time = "2025-03-17T00:56:02.601Z" }, @@ -1272,21 +1079,6 @@ version = "2024.11.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload-time = "2024-11-06T20:12:31.635Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669, upload-time = "2024-11-06T20:09:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684, upload-time = "2024-11-06T20:09:32.915Z" }, - { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589, upload-time = "2024-11-06T20:09:35.504Z" }, - { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121, upload-time = "2024-11-06T20:09:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275, upload-time = "2024-11-06T20:09:40.371Z" }, - { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257, upload-time = "2024-11-06T20:09:43.059Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727, upload-time = "2024-11-06T20:09:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667, upload-time = "2024-11-06T20:09:49.828Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963, upload-time = "2024-11-06T20:09:51.819Z" }, - { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700, upload-time = "2024-11-06T20:09:53.982Z" }, - { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592, upload-time = "2024-11-06T20:09:56.222Z" }, - { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929, upload-time = "2024-11-06T20:09:58.642Z" }, - { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213, upload-time = "2024-11-06T20:10:00.867Z" }, - { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734, upload-time = "2024-11-06T20:10:03.361Z" }, - { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052, upload-time = "2024-11-06T20:10:05.179Z" }, { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781, upload-time = "2024-11-06T20:10:07.07Z" }, { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455, upload-time = "2024-11-06T20:10:09.117Z" }, { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759, upload-time = "2024-11-06T20:10:11.155Z" }, @@ -1495,45 +1287,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, ] -[[package]] -name = "tomli" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, -] - [[package]] name = "toolz" version = "1.0.0" @@ -1638,17 +1391,6 @@ version = "15.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, @@ -1685,23 +1427,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload-time = "2025-04-17T00:45:14.661Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload-time = "2025-04-17T00:42:04.511Z" }, - { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload-time = "2025-04-17T00:42:06.43Z" }, - { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload-time = "2025-04-17T00:42:07.976Z" }, - { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload-time = "2025-04-17T00:42:09.902Z" }, - { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload-time = "2025-04-17T00:42:11.768Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload-time = "2025-04-17T00:42:13.983Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload-time = "2025-04-17T00:42:16.386Z" }, - { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload-time = "2025-04-17T00:42:18.622Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload-time = "2025-04-17T00:42:20.9Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload-time = "2025-04-17T00:42:22.926Z" }, - { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload-time = "2025-04-17T00:42:25.145Z" }, - { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload-time = "2025-04-17T00:42:27.475Z" }, - { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload-time = "2025-04-17T00:42:29.333Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload-time = "2025-04-17T00:42:31.668Z" }, - { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload-time = "2025-04-17T00:42:33.523Z" }, - { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload-time = "2025-04-17T00:42:35.873Z" }, - { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload-time = "2025-04-17T00:42:37.586Z" }, { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload-time = "2025-04-17T00:42:39.602Z" }, { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload-time = "2025-04-17T00:42:41.469Z" }, { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload-time = "2025-04-17T00:42:43.666Z" }, From ba5e570c4f927524831aed02e2c143c2510c0670 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 03:01:02 +0900 Subject: [PATCH 32/56] Enable pre-commit --- .pre-commit-config.yaml | 15 +++++ pyproject.toml | 5 ++ uv.lock | 120 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..4f1872d --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,15 @@ +repos: + - repo: https://github.com/astral-sh/uv-pre-commit + rev: 0.7.3 + hooks: + - id: uv-lock + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.10 + hooks: + - id: ruff-check + args: [ --fix ] + - id: ruff-format + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.15.0 + hooks: + - id: mypy diff --git a/pyproject.toml b/pyproject.toml index 043a491..1d300b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,3 +10,8 @@ core = { workspace = true } [tool.uv.workspace] members = ["packages/*"] + +[dependency-groups] +dev = [ + "pre-commit>=4.2.0", +] diff --git a/uv.lock b/uv.lock index 0dfa7ca..9e49ef6 100644 --- a/uv.lock +++ b/uv.lock @@ -173,6 +173,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, ] +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.2" @@ -321,6 +330,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297", size = 362898, upload-time = "2024-12-13T05:46:12.771Z" }, ] +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload-time = "2024-10-09T18:35:47.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, +] + [[package]] name = "docutils" version = "0.21.2" @@ -488,6 +506,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/c6/0417a92e6a3fc9b85f5a8380d9f9d43b69ba836a90e45f79f9ae74d41e53/eth_utils-5.3.0-py3-none-any.whl", hash = "sha256:ac184883ab299d923428bbe25dae5e356979a3993e0ef695a864db0a20bc262d", size = 102531, upload-time = "2025-04-14T19:35:55.176Z" }, ] +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, +] + [[package]] name = "frozenlist" version = "1.6.0" @@ -557,6 +584,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/96/035871b535a728700d3cc5b94cf883706f345c5a088253f26f0bee0b7939/hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c", size = 4902, upload-time = "2025-01-13T20:43:44.905Z" }, ] +[[package]] +name = "identify" +version = "2.6.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/83/b6ea0334e2e7327084a46aaaf71f2146fc061a192d6518c0d020120cd0aa/identify-2.6.10.tar.gz", hash = "sha256:45e92fd704f3da71cc3880036633f48b4b7265fd4de2b57627cb157216eb7eb8", size = 99201, upload-time = "2025-04-19T15:10:38.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/d3/85feeba1d097b81a44bcffa6a0beab7b4dfffe78e82fc54978d3ac380736/identify-2.6.10-py2.py3-none-any.whl", hash = "sha256:5f34248f54136beed1a7ba6a6b5c4b6cf21ff495aac7c359e1ef831ae3b8ab25", size = 99101, upload-time = "2025-04-19T15:10:36.701Z" }, +] + [[package]] name = "idna" version = "3.10" @@ -640,6 +676,16 @@ name = "jpyc-python-sdks" version = "1.0.0" source = { virtual = "." } +[package.dev-dependencies] +dev = [ + { name = "pre-commit" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [{ name = "pre-commit", specifier = ">=4.2.0" }] + [[package]] name = "lru-dict" version = "1.3.0" @@ -793,6 +839,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + [[package]] name = "packaging" version = "23.2" @@ -814,6 +869,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/0f/c8b64d9b54ea631fcad4e9e3c8dbe8c11bb32a623be94f22974c88e71eaf/parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f", size = 48427, upload-time = "2022-09-03T17:01:13.814Z" }, ] +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +] + [[package]] name = "pluggy" version = "1.5.0" @@ -823,6 +887,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, ] +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, +] + [[package]] name = "propcache" version = "0.3.1" @@ -1073,6 +1153,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + [[package]] name = "regex" version = "2024.11.6" @@ -1354,6 +1460,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, ] +[[package]] +name = "virtualenv" +version = "20.31.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload-time = "2025-05-08T17:58:23.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload-time = "2025-05-08T17:58:21.15Z" }, +] + [[package]] name = "web3" version = "7.11.0" From 9d0aa974563cc45c39f71d1ed7b6c2f6f6de5ab7 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 03:10:18 +0900 Subject: [PATCH 33/56] Update 'gitignore's --- .gitignore | 6 ++++++ packages/core/.gitignore | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index dac8d9a..a9670c0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,11 @@ dist *.egg-info __pycache__ +# mypy +.mypy_cache + +# ruff +.ruff_cache + # misc cspell.json diff --git a/packages/core/.gitignore b/packages/core/.gitignore index c91af9b..f1b907e 100644 --- a/packages/core/.gitignore +++ b/packages/core/.gitignore @@ -3,5 +3,11 @@ dist *.egg-info __pycache__ +# mypy +.mypy_cache + +# ruff +.ruff_cache + # misc DS_STORE From a32ba394c6e899e84dc93ced96e63692c8883b13 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 12:38:29 +0900 Subject: [PATCH 34/56] Update pre-commit config --- .pre-commit-config.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4f1872d..0148e19 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/uv-pre-commit - rev: 0.7.3 + rev: 0.7.6 hooks: - id: uv-lock - repo: https://github.com/astral-sh/ruff-pre-commit @@ -13,3 +13,4 @@ repos: rev: v1.15.0 hooks: - id: mypy + args: [ packages/core ] From 531a2902696af6c9c3a6ac661eb714870e6f135e Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 12:39:03 +0900 Subject: [PATCH 35/56] Update '.gitignore's --- .gitignore | 5 +++++ packages/core/.gitignore | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index a9670c0..3652ddf 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,10 @@ __pycache__ # ruff .ruff_cache +# pytest +.pytest_cache +.coverage + # misc +*_cache cspell.json diff --git a/packages/core/.gitignore b/packages/core/.gitignore index f1b907e..5ff391e 100644 --- a/packages/core/.gitignore +++ b/packages/core/.gitignore @@ -9,5 +9,9 @@ __pycache__ # ruff .ruff_cache +# pytest +.pytest_cache +.coverage + # misc DS_STORE From 3649cab117fb9219ee744354690815c0b77bc8a8 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 13:12:44 +0900 Subject: [PATCH 36/56] Add unit tests for 'utils' modules; fix pre-commit hooks --- .pre-commit-config.yaml | 2 +- packages/core/pyproject.toml | 7 +++ packages/core/src/utils/addresses.py | 6 +- packages/core/src/utils/artifacts.py | 3 +- tests/{.gitkeep => __init__.py} | 0 tests/core/__init__.py | 0 tests/core/utils/__init__.py | 0 tests/core/utils/test_addresses.py | 76 ++++++++++++++++++++++++ tests/core/utils/test_artifacts.py | 36 ++++++++++++ tests/core/utils/test_chains.py | 87 ++++++++++++++++++++++++++++ tests/core/utils/test_currencies.py | 48 +++++++++++++++ 11 files changed, 260 insertions(+), 5 deletions(-) rename tests/{.gitkeep => __init__.py} (100%) create mode 100644 tests/core/__init__.py create mode 100644 tests/core/utils/__init__.py create mode 100644 tests/core/utils/test_addresses.py create mode 100644 tests/core/utils/test_artifacts.py create mode 100644 tests/core/utils/test_chains.py create mode 100644 tests/core/utils/test_currencies.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0148e19..ff212d0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,4 +13,4 @@ repos: rev: v1.15.0 hooks: - id: mypy - args: [ packages/core ] + files: ^packages/core/ diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index a5746af..da834d9 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -57,6 +57,13 @@ dev = [ "web3[tester]>=7.11.0", ] +# pytest + +[tool.pytest.ini_options] +testpaths = ["../../tests"] +python_files = "test_*.py" +python_functions = "test_*" + # Ruff [tool.ruff] diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py index 43c95cb..5a5b7fa 100644 --- a/packages/core/src/utils/addresses.py +++ b/packages/core/src/utils/addresses.py @@ -24,7 +24,7 @@ def calc_checksum_address(address: str) -> ChecksumAddress: Returns: ChecksumAddress: Checksum address """ - return ChecksumAddress(HexAddress(HexStr(address))) + return ChecksumAddress(HexAddress(HexStr(Web3.to_checksum_address(address)))) def is_valid_address(address: str) -> bool: @@ -43,11 +43,11 @@ def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress: """Get proxy address from the specified version. Note: - Default address should be the address of the latest version\ + Default address should be the address of the latest version \ (e.g., v2 as of May 2025). Args: - version (ContractVersion): Contract version + contract_version (ContractVersion): Contract version Returns: ChecksumAddress: Checksum address of proxy contract diff --git a/packages/core/src/utils/artifacts.py b/packages/core/src/utils/artifacts.py index d728959..d1b029c 100644 --- a/packages/core/src/utils/artifacts.py +++ b/packages/core/src/utils/artifacts.py @@ -9,7 +9,7 @@ def resolve_artifacts_file_path(contract_version: ContractVersion) -> Path: """Resolve the path of artifacts file from the specified contract version. Args: - version (ContractVersion): Contract version + contract_version (ContractVersion): Contract version Returns: Path: Absolute path of artifacts file @@ -26,6 +26,7 @@ def get_artifacts(file_path: Path, artifact_type: ArtifactType) -> Any: Args: file_path (Path): absolute path of artifacts file + artifact_type (ArtifactType): type of artifacts Returns: Any: Artifacts of contracts diff --git a/tests/.gitkeep b/tests/__init__.py similarity index 100% rename from tests/.gitkeep rename to tests/__init__.py diff --git a/tests/core/__init__.py b/tests/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/core/utils/__init__.py b/tests/core/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/core/utils/test_addresses.py b/tests/core/utils/test_addresses.py new file mode 100644 index 0000000..76b26a0 --- /dev/null +++ b/tests/core/utils/test_addresses.py @@ -0,0 +1,76 @@ +import pytest + +from packages.core.src.utils.addresses import ( + calc_checksum_address, + get_proxy_address, + is_valid_address, +) + + +VALID_CHECKSUM_ADDRESS = "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB" +INVALID_CHECKSUM_ADDRESS = "0x431d5dff03120afa4bdf332c61a6e1766ef37bdb" +VALID_ADDRESS_IN_INTEGER = 383157291474631222722397742278122605068030278619 +INVALID_ADDRESS_IN_INTEGER = 0 + + +@pytest.mark.parametrize( + [ + "address", + ], + [ + pytest.param( + VALID_CHECKSUM_ADDRESS, + id="valid checksum address", + ), + pytest.param( + INVALID_CHECKSUM_ADDRESS, + id="invalid checksum address", + ), + pytest.param( + VALID_ADDRESS_IN_INTEGER, + id="valid address in integer", + ), + ], +) +def test_calc_checksum_address(address): + checksum_address = calc_checksum_address(address=address) + + assert type(checksum_address) is str + assert checksum_address == VALID_CHECKSUM_ADDRESS + + +def test_calc_checksum_address_failures(): + with pytest.raises(ValueError): + calc_checksum_address(address=INVALID_ADDRESS_IN_INTEGER) + + +@pytest.mark.parametrize( + [ + "address", + "response", + ], + [ + pytest.param(VALID_CHECKSUM_ADDRESS, True, id="valid address"), + pytest.param(INVALID_CHECKSUM_ADDRESS, False, id="invalid address"), + pytest.param(VALID_ADDRESS_IN_INTEGER, False, id="valid address in integer"), + pytest.param( + INVALID_ADDRESS_IN_INTEGER, False, id="invalid address in integer" + ), + ], +) +def test_is_valid_address(address, response): + assert is_valid_address(address=address) is response + + +@pytest.mark.parametrize( + [ + "contract_version", + "response", + ], + [ + pytest.param("2", VALID_CHECKSUM_ADDRESS, id="valid contract version"), + pytest.param("3", None, id="invalid contract version"), + ], +) +def test_get_proxy_address(contract_version, response): + assert get_proxy_address(contract_version=contract_version) == response diff --git a/tests/core/utils/test_artifacts.py b/tests/core/utils/test_artifacts.py new file mode 100644 index 0000000..821386e --- /dev/null +++ b/tests/core/utils/test_artifacts.py @@ -0,0 +1,36 @@ +import pytest + +from packages.core.src.utils.artifacts import ( + get_artifacts, + resolve_artifacts_file_path, +) + + +def test_resolve_artifacts_file_path(): + path = resolve_artifacts_file_path(contract_version="2") + assert str(path).endswith("v2.json") is True + + +@pytest.mark.parametrize( + [ + "artifact_type", + "return_type", + ], + [ + pytest.param( + "abi", + list, + id="get abi", + ), + pytest.param( + "bytecode", + str, + id="get bytecode", + ), + ], +) +def test_get_artifacts(artifact_type, return_type): + path = resolve_artifacts_file_path(contract_version="2") + + artifact = get_artifacts(file_path=path, artifact_type=artifact_type) + assert type(artifact) is return_type diff --git a/tests/core/utils/test_chains.py b/tests/core/utils/test_chains.py new file mode 100644 index 0000000..574a501 --- /dev/null +++ b/tests/core/utils/test_chains.py @@ -0,0 +1,87 @@ +import pytest + +from packages.core.src.utils.chains import ( + enumerate_supported_networks, + get_default_rpc_endpoint, + is_supported_network, +) +from packages.core.src.utils.errors import ( + NetworkNotSupported, +) + + +def test_enumerate_supported_networks(): + supported_networks = enumerate_supported_networks() + assert ( + supported_networks == "'ethereum' => ['mainnet', 'sepolia'], " + "'polygon' => ['mainnet', 'amoy'], " + "'gnosis' => ['mainnet', 'chiado'], " + "'avalanche' => ['mainnet', 'fuji'], " + "'astar' => ['mainnet'], " + "'shiden' => ['mainnet'], " + "'localhost' => ['devnet']" + ) + + +@pytest.mark.parametrize( + ["chain_name", "network_name", "response"], + [ + pytest.param( + "ethereum", + "mainnet", + True, + id="ethereum mainnet", + ), + pytest.param( + "localhost", + "devnet", + True, + id="localhost devnet", + ), + pytest.param( + "solana", + "mainnet", + False, + id="solana mainnet", + ), + ], +) +def test_is_supported_network(chain_name, network_name, response): + network_supported = is_supported_network( + chain_name=chain_name, + network_name=network_name, + ) + assert network_supported is response + + +@pytest.mark.parametrize( + ["chain_name", "network_name", "response"], + [ + pytest.param( + "ethereum", + "mainnet", + "https://ethereum-rpc.publicnode.com", + id="ethereum mainnet", + ), + pytest.param( + "polygon", + "amoy", + "https://rpc-amoy.polygon.technology", + id="polygon amoy", + ), + ], +) +def test_get_default_rpc_endpoint(chain_name, network_name, response): + rpc_endpoint = get_default_rpc_endpoint( + chain_name=chain_name, + network_name=network_name, + ) + assert rpc_endpoint == response + + +def test_get_default_rpc_endpoint_failures(): + with pytest.raises(NetworkNotSupported): + get_default_rpc_endpoint( + chain_name="ethereum", + network_name="goerli", + ) diff --git a/tests/core/utils/test_currencies.py b/tests/core/utils/test_currencies.py new file mode 100644 index 0000000..7459a5a --- /dev/null +++ b/tests/core/utils/test_currencies.py @@ -0,0 +1,48 @@ +from decimal import Decimal + +import pytest + +from packages.core.src.utils.currencies import ( + remove_decimals, + restore_decimals, +) + + +@pytest.mark.parametrize( + ["value", "response"], + [ + pytest.param( + 10000, + 10000000000000000000000, + id="integer", + ), + pytest.param( + 0.05, + 50000000000000000, + id="decimal", + ), + ], +) +def test_remove_decimals(value, response): + on_chain_value = remove_decimals(value=value) + assert on_chain_value == response + + +@pytest.mark.parametrize( + ["value", "response"], + [ + pytest.param( + 10000000000000000000000, + 10000, + id="integer", + ), + pytest.param( + 50000000000000000, + Decimal("0.05"), + id="decimal", + ), + ], +) +def test_restore_decimals(value, response): + off_chain_value = restore_decimals(func=lambda v: v)(value) + assert off_chain_value == response From 52e3958c893c0cd0c79b51a0521ac1a3b2e47ed6 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Wed, 21 May 2025 16:49:47 +0900 Subject: [PATCH 37/56] Add unit tests for 'client' module --- packages/core/src/client.py | 4 + packages/core/src/interfaces/client.py | 1 + tests/core/conftest.py | 44 +++++ tests/core/test_client.py | 260 +++++++++++++++++++++++++ 4 files changed, 309 insertions(+) create mode 100644 tests/core/conftest.py create mode 100644 tests/core/test_client.py diff --git a/packages/core/src/client.py b/packages/core/src/client.py index d2e951d..01ee77b 100644 --- a/packages/core/src/client.py +++ b/packages/core/src/client.py @@ -50,6 +50,7 @@ def __init__( InvalidBytes32: If the supplied `private_key` is not in a valid form InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form NetworkNotSupported: If the specified network is not supported by the SDK + ValidationError: If pydantic validation fails """ rpc_endpoint = ( rpc_endpoint @@ -96,9 +97,12 @@ def __configure_w3( name=SIGN_MIDDLEWARE, layer=0, ) + else: + w3.eth.default_account = None # type: ignore[assignment] return w3 + @validate_call def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3: self.w3 = self.__configure_w3( rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name), diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py index 53e8b4c..bcc3a30 100644 --- a/packages/core/src/interfaces/client.py +++ b/packages/core/src/interfaces/client.py @@ -27,6 +27,7 @@ def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3 Raises: NetworkNotSupported: If the specified network is not supported by the SDK + ValidationError: If pydantic validation fails """ pass diff --git a/tests/core/conftest.py b/tests/core/conftest.py new file mode 100644 index 0000000..ed95e1b --- /dev/null +++ b/tests/core/conftest.py @@ -0,0 +1,44 @@ +from dataclasses import dataclass + +import pytest + +from packages.core.src.client import SdkClient + + +@dataclass(frozen=True) +class KnownAccount: + address: str + private_key: str + + +KNOWN_ACCOUNTS = [ + KnownAccount( + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + ), + KnownAccount( + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + ), + KnownAccount( + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", + ), +] + + +@pytest.fixture(scope="function") +def sdk_client(): + return SdkClient( + chain_name="localhost", + network_name="devnet", + private_key=KNOWN_ACCOUNTS[0].private_key, + ) + + +@pytest.fixture(scope="session") +def sdk_client_without_account(): + return SdkClient( + chain_name="localhost", + network_name="devnet", + ) diff --git a/tests/core/test_client.py b/tests/core/test_client.py new file mode 100644 index 0000000..7521aca --- /dev/null +++ b/tests/core/test_client.py @@ -0,0 +1,260 @@ +from eth_account.signers.local import LocalAccount +from pydantic import ValidationError +import pytest +from web3 import Web3 + +from packages.core.src.client import SdkClient +from packages.core.src.utils.chains import get_default_rpc_endpoint +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidRpcEndpoint, + NetworkNotSupported, +) + +from .conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "chain_name", + "network_name", + "rpc_endpoint", + "private_key", + "num_of_middlewares", + "address", + ], + [ + pytest.param( + "ethereum", + "mainnet", + None, + None, + 6, + None, + id="valid default network; without account", + ), + pytest.param( + "ethereum", + "mainnet", + "http://127.0.0.1:8545/", + None, + 6, + None, + id="valid custom network; without account", + ), + pytest.param( + "ethereum", + "mainnet", + None, + KNOWN_ACCOUNTS[0].private_key, + 7, + KNOWN_ACCOUNTS[0].address, + id="valid network; with account", + ), + ], +) +def test_constructor( + chain_name, + network_name, + rpc_endpoint, + private_key, + num_of_middlewares, + address, +): + client = SdkClient( + chain_name=chain_name, + network_name=network_name, + rpc_endpoint=rpc_endpoint, + private_key=private_key, + ) + + assert isinstance(client.w3, Web3) + assert len(client.w3.middleware_onion.middleware) == num_of_middlewares + assert client.rpc_endpoint == ( + get_default_rpc_endpoint(chain_name, network_name) + if rpc_endpoint is None + else rpc_endpoint + ) + if private_key is None: + assert client.account is None + else: + assert isinstance(client.account, LocalAccount) + assert client.account.address == address + assert client.w3.eth.default_account == address + + +@pytest.mark.parametrize( + [ + "chain_name", + "network_name", + "rpc_endpoint", + "private_key", + "exception_class", + ], + [ + pytest.param( + "solana", + "mainnet", + None, + None, + ValidationError, + id="invalid chain_name", + ), + pytest.param( + "localhost", + "mainnet", + None, + None, + NetworkNotSupported, + id="invalid network configuration", + ), + pytest.param( + "ethereum", + "mainnet", + "invalid_uri", + None, + InvalidRpcEndpoint, + id="invalid rpc_endpoint", + ), + pytest.param( + "ethereum", + "mainnet", + None, + "invalid_private_key", + InvalidBytes32, + id="invalid private_key", + ), + ], +) +def test_constructor_failures( + chain_name, + network_name, + rpc_endpoint, + private_key, + exception_class, +): + with pytest.raises(exception_class): + SdkClient( + chain_name=chain_name, + network_name=network_name, + rpc_endpoint=rpc_endpoint, + private_key=private_key, + ) + + +def test_set_default_provider(sdk_client): + sdk_client.set_default_provider( + chain_name="ethereum", + network_name="mainnet", + ) + + assert sdk_client.w3.provider.endpoint_uri == "https://ethereum-rpc.publicnode.com" + assert sdk_client.w3.eth.default_account == KNOWN_ACCOUNTS[0].address + + +@pytest.mark.parametrize( + [ + "chain_name", + "network_name", + "exception_class", + ], + [ + pytest.param( + "solana", + "mainnet", + ValidationError, + id="invalid chain_name", + ), + pytest.param( + "localhost", + "mainnet", + NetworkNotSupported, + id="invalid network configuration", + ), + ], +) +def test_set_default_provider_failures( + sdk_client, + chain_name, + network_name, + exception_class, +): + with pytest.raises(exception_class): + sdk_client.set_default_provider( + chain_name=chain_name, + network_name=network_name, + ) + + +def test_set_custom_provider(sdk_client): + rpc_endpoint = "https://ethereum-rpc.publicnode.com" + + sdk_client.set_custom_provider( + rpc_endpoint=rpc_endpoint, + ) + + assert sdk_client.w3.provider.endpoint_uri == rpc_endpoint + assert sdk_client.w3.eth.default_account == KNOWN_ACCOUNTS[0].address + + +def test_set_custom_provider_failures(sdk_client): + with pytest.raises(InvalidRpcEndpoint): + sdk_client.set_custom_provider( + rpc_endpoint="invalid_uri", + ) + + +@pytest.mark.parametrize( + [ + "private_key", + "address", + ], + [ + pytest.param( + KNOWN_ACCOUNTS[1].private_key, + KNOWN_ACCOUNTS[1].address, + id="set new account to account", + ), + pytest.param( + None, + None, + id="set None to account", + ), + ], +) +def test_set_account( + sdk_client, + private_key, + address, +): + account = sdk_client.set_account( + private_key=private_key, + ) + + assert sdk_client.w3.provider.endpoint_uri == "http://127.0.0.1:8545/" + + if account is not None: + assert account.address == address + assert sdk_client.w3.eth.default_account == address + else: + assert account is None + assert sdk_client.w3.eth.default_account is None + + +def test_set_account_failures(sdk_client): + with pytest.raises(InvalidBytes32): + sdk_client.set_account( + private_key="invalid_private_key", + ) + + +def test_get_account_address(sdk_client): + address = sdk_client.get_account_address() + + assert address == KNOWN_ACCOUNTS[0].address + + +def test_get_account_address_failures(sdk_client_without_account): + with pytest.raises(AccountNotInitialized): + sdk_client_without_account.get_account_address() From 354a9e28780363a90dba4ef334408db3c7a22fb9 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 12:56:03 +0900 Subject: [PATCH 38/56] Refactor jpyc client --- packages/core/src/jpyc.py | 40 +++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py index 8224474..9a5eb8e 100644 --- a/packages/core/src/jpyc.py +++ b/packages/core/src/jpyc.py @@ -64,18 +64,10 @@ def __init__( contract_address=address, contract_version=contract_version, ) - owner_address = client.get_account_address() - contract.functions.initialize( - "JPY Coin", - "JPYC", - "Yen", - 18, - owner_address, - owner_address, - owner_address, - owner_address, - owner_address, - ).transact() + self.__initialize_contract( + client=client, + contract=contract, + ) else: address = ( contract_address @@ -150,6 +142,30 @@ def __get_contract( ), ) + @staticmethod + def __initialize_contract( + client: SdkClient, + contract: Contract, + ) -> None: + """Initialize contract. + + Args: + client (SdkClient): Configured SDK client + contract (Contract): Configured contract instance + """ + owner_address = client.get_account_address() + contract.functions.initialize( + "JPY Coin", + "JPYC", + "Yen", + 18, + owner_address, + owner_address, + owner_address, + owner_address, + owner_address, + ).transact() + def __account_initialized(self) -> None: """Checks if account is initialized. From 9912a37bdd3caa71b0b681b1a94472953cdedec6 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 12:56:27 +0900 Subject: [PATCH 39/56] Fix typos in 'examples' modules --- packages/core/examples/cancel_authorization.py | 12 ++++++------ packages/core/examples/receive_with_authorization.py | 12 ++++++------ .../core/examples/transfer_with_authorization.py | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/core/examples/cancel_authorization.py b/packages/core/examples/cancel_authorization.py index a27fcca..cf39930 100644 --- a/packages/core/examples/cancel_authorization.py +++ b/packages/core/examples/cancel_authorization.py @@ -55,8 +55,8 @@ def main() -> None: from_ = KNOWN_ACCOUNTS[0].address to = KNOWN_ACCOUNTS[2].address value = 3000 - validAfter = 0 - validBefore = int(time.time()) + 3600 + valid_after = 0 + valid_before = int(time.time()) + 3600 signed_message_transfer = Account.sign_typed_data( KNOWN_ACCOUNTS[0].private_key, @@ -68,8 +68,8 @@ def main() -> None: "from": from_, "to": to, "value": remove_decimals(value), # NOTE: Don't forget decimals handling - "validAfter": validAfter, - "validBefore": validBefore, + "validAfter": valid_after, + "validBefore": valid_before, "nonce": nonce, }, }, @@ -119,8 +119,8 @@ def main() -> None: from_=from_, to=to, value=value, - valid_after=validAfter, - valid_before=validBefore, + valid_after=valid_after, + valid_before=valid_before, nonce=nonce, v=signed_message_transfer.v, r=add_zero_padding_to_hex(hex(signed_message_transfer.r), 32), diff --git a/packages/core/examples/receive_with_authorization.py b/packages/core/examples/receive_with_authorization.py index ec60693..fa68a12 100644 --- a/packages/core/examples/receive_with_authorization.py +++ b/packages/core/examples/receive_with_authorization.py @@ -51,8 +51,8 @@ def main() -> None: from_ = KNOWN_ACCOUNTS[0].address to = KNOWN_ACCOUNTS[1].address value = 3000 - validAfter = 0 - validBefore = int(time.time()) + 3600 + valid_after = 0 + valid_before = int(time.time()) + 3600 nonce = f"0x{randbytes(32).hex()}" signed_message = Account.sign_typed_data( @@ -65,8 +65,8 @@ def main() -> None: "from": from_, "to": to, "value": remove_decimals(value), # NOTE: Don't forget decimals handling - "validAfter": validAfter, - "validBefore": validBefore, + "validAfter": valid_after, + "validBefore": valid_before, "nonce": nonce, }, }, @@ -77,8 +77,8 @@ def main() -> None: from_=from_, to=to, value=value, - valid_after=validAfter, - valid_before=validBefore, + valid_after=valid_after, + valid_before=valid_before, nonce=nonce, v=signed_message.v, r=add_zero_padding_to_hex(hex(signed_message.r), 32), diff --git a/packages/core/examples/transfer_with_authorization.py b/packages/core/examples/transfer_with_authorization.py index abc759d..b8aabc0 100644 --- a/packages/core/examples/transfer_with_authorization.py +++ b/packages/core/examples/transfer_with_authorization.py @@ -51,8 +51,8 @@ def main() -> None: from_ = KNOWN_ACCOUNTS[0].address to = KNOWN_ACCOUNTS[2].address value = 3000 - validAfter = 0 - validBefore = int(time.time()) + 3600 + valid_after = 0 + valid_before = int(time.time()) + 3600 nonce = f"0x{randbytes(32).hex()}" signed_message = Account.sign_typed_data( @@ -65,8 +65,8 @@ def main() -> None: "from": from_, "to": to, "value": remove_decimals(value), # NOTE: Don't forget decimals handling - "validAfter": validAfter, - "validBefore": validBefore, + "validAfter": valid_after, + "validBefore": valid_before, "nonce": nonce, }, }, @@ -77,8 +77,8 @@ def main() -> None: from_=from_, to=to, value=value, - valid_after=validAfter, - valid_before=validBefore, + valid_after=valid_after, + valid_before=valid_before, nonce=nonce, v=signed_message.v, r=add_zero_padding_to_hex(hex(signed_message.r), 32), From 8e372e02bea0103fcb3d952515a1bfa36b6f3918 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 12:56:54 +0900 Subject: [PATCH 40/56] Add more tests --- tests/core/conftest.py | 158 ++++++++- tests/core/jpyc_methods/__init__.py | 0 tests/core/jpyc_methods/test_allowance.py | 72 ++++ tests/core/jpyc_methods/test_approve.py | 81 +++++ tests/core/jpyc_methods/test_balance_of.py | 42 +++ .../jpyc_methods/test_cancel_authorization.py | 180 ++++++++++ .../jpyc_methods/test_configure_minter.py | 86 +++++ .../jpyc_methods/test_decrease_allowance.py | 81 +++++ .../jpyc_methods/test_increase_allowance.py | 81 +++++ tests/core/jpyc_methods/test_is_minter.py | 38 +++ tests/core/jpyc_methods/test_mint.py | 81 +++++ .../jpyc_methods/test_minter_allowance.py | 42 +++ tests/core/jpyc_methods/test_nonces.py | 40 +++ tests/core/jpyc_methods/test_permit.py | 239 +++++++++++++ .../test_receive_with_authorization.py | 315 ++++++++++++++++++ tests/core/jpyc_methods/test_total_supply.py | 26 ++ tests/core/jpyc_methods/test_transfer.py | 81 +++++ tests/core/jpyc_methods/test_transfer_from.py | 92 +++++ .../test_transfer_with_authorization.py | 315 ++++++++++++++++++ tests/core/test_client.py | 11 +- tests/core/test_jpyc.py | 116 +++++++ 21 files changed, 2171 insertions(+), 6 deletions(-) create mode 100644 tests/core/jpyc_methods/__init__.py create mode 100644 tests/core/jpyc_methods/test_allowance.py create mode 100644 tests/core/jpyc_methods/test_approve.py create mode 100644 tests/core/jpyc_methods/test_balance_of.py create mode 100644 tests/core/jpyc_methods/test_cancel_authorization.py create mode 100644 tests/core/jpyc_methods/test_configure_minter.py create mode 100644 tests/core/jpyc_methods/test_decrease_allowance.py create mode 100644 tests/core/jpyc_methods/test_increase_allowance.py create mode 100644 tests/core/jpyc_methods/test_is_minter.py create mode 100644 tests/core/jpyc_methods/test_mint.py create mode 100644 tests/core/jpyc_methods/test_minter_allowance.py create mode 100644 tests/core/jpyc_methods/test_nonces.py create mode 100644 tests/core/jpyc_methods/test_permit.py create mode 100644 tests/core/jpyc_methods/test_receive_with_authorization.py create mode 100644 tests/core/jpyc_methods/test_total_supply.py create mode 100644 tests/core/jpyc_methods/test_transfer.py create mode 100644 tests/core/jpyc_methods/test_transfer_from.py create mode 100644 tests/core/jpyc_methods/test_transfer_with_authorization.py create mode 100644 tests/core/test_jpyc.py diff --git a/tests/core/conftest.py b/tests/core/conftest.py index ed95e1b..43128dc 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -1,8 +1,17 @@ from dataclasses import dataclass +import time +from random import randbytes import pytest +from pytest_mock import MockFixture +from web3.contract.contract import ( + ContractConstructor, + ContractFunction, +) +from web3.eth import Eth from packages.core.src.client import SdkClient +from packages.core.src.jpyc import JPYC @dataclass(frozen=True) @@ -27,8 +36,24 @@ class KnownAccount: ] +V2_PROXY_ADDRESS = "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB" + + +def add_zero_padding_to_hex(hex_string: str, num_of_bytes: int) -> str: + return f"0x{hex_string[2:].zfill(num_of_bytes * 2)}" + + @pytest.fixture(scope="function") def sdk_client(): + return SdkClient( + chain_name="ethereum", + network_name="mainnet", + private_key=KNOWN_ACCOUNTS[0].private_key, + ) + + +@pytest.fixture(scope="function") +def sdk_client_localhost(): return SdkClient( chain_name="localhost", network_name="devnet", @@ -39,6 +64,135 @@ def sdk_client(): @pytest.fixture(scope="session") def sdk_client_without_account(): return SdkClient( - chain_name="localhost", - network_name="devnet", + chain_name="ethereum", + network_name="mainnet", + ) + + +@pytest.fixture(scope="function") +def jpyc_client(sdk_client, mocker: MockFixture): + mocker.patch.object( + Eth, + "chain_id", + new_callable=mocker.PropertyMock, + return_value=1, + ) + return JPYC( + client=sdk_client, + contract_address=V2_PROXY_ADDRESS, + ) + + +@pytest.fixture(scope="function") +def jpyc_client_without_account(sdk_client_without_account, mocker: MockFixture): + mocker.patch.object( + Eth, + "chain_id", + new_callable=mocker.PropertyMock, + return_value=1, + ) + return JPYC( + client=sdk_client_without_account, + contract_address=V2_PROXY_ADDRESS, + ) + + +@pytest.fixture(scope="function") +def eip712_domain_separator(): + return { + "name": "JPY Coin", + "version": "1", + "chainId": 1, + "verifyingContract": V2_PROXY_ADDRESS, + } + + +@pytest.fixture(scope="function") +def eip712_domain_types(): + return [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ] + + +@pytest.fixture(scope="function") +def valid_before(): + return int(time.time()) + 3600 + + +@pytest.fixture(scope="function") +def nonce(): + return f"0x{randbytes(32).hex()}" + + +@pytest.fixture(scope="function") +def mocked_eth_chain_id(mocker: MockFixture, request): + return mocker.patch.object( + Eth, + "chain_id", + new_callable=mocker.PropertyMock, + return_value=request.param["chain_id"], + ) + + +@pytest.fixture(scope="function") +def mocked_eth_contract_constructor_transact(mocker: MockFixture): + return mocker.patch.object( + ContractConstructor, + "transact", + return_value="0x", + ) + + +@pytest.fixture(scope="function") +def mocked_eth_wait_for_transaction_receipt(mocker: MockFixture, request): + @dataclass() + class TxReceipt: + contractAddress: str + + return mocker.patch.object( + Eth, + "wait_for_transaction_receipt", + return_value=TxReceipt( + contractAddress=request.param["address"], + ), + ) + + +@pytest.fixture(scope="function") +def mocked_eth_contract_functions_transact(mocker: MockFixture): + return mocker.patch.object( + ContractFunction, + "transact", + return_value="0x", + ) + + +@pytest.fixture(scope="function") +def mocked_eth_contract_functions( + mocker: MockFixture, + jpyc_client, + request, +): + if "return_value" in request.param: + return mocker.patch.object( + jpyc_client.contract.functions, + request.param["func_name"], + return_value=( + getattr( + jpyc_client.contract.functions, + request.param["func_name"], + )(*request.param["func_args"]) + if "func_args" in request.param + else getattr( + jpyc_client.contract.functions, + request.param["func_name"], + )() + ), + ) + return mocker.patch.object( + jpyc_client.contract.functions, + request.param["func_name"], ) diff --git a/tests/core/jpyc_methods/__init__.py b/tests/core/jpyc_methods/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/core/jpyc_methods/test_allowance.py b/tests/core/jpyc_methods/test_allowance.py new file mode 100644 index 0000000..5630a24 --- /dev/null +++ b/tests/core/jpyc_methods/test_allowance.py @@ -0,0 +1,72 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "allowance", + "func_args": [ + KNOWN_ACCOUNTS[0].address, + KNOWN_ACCOUNTS[1].address, + ], + "return_value": 1000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + owner = KNOWN_ACCOUNTS[0].address + spender = KNOWN_ACCOUNTS[1].address + + jpyc_client.allowance( + owner=owner, + spender=spender, + ) + + mocked_eth_contract_functions.assert_called_once_with(owner, spender) + + +@pytest.mark.parametrize( + [ + "owner", + "spender", + ], + [ + pytest.param( + "invalid_address", + KNOWN_ACCOUNTS[1].address, + id="invalid owner", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + "invalid_address", + id="invalid spender", + ), + ], +) +def test_allowance_failures( + jpyc_client, + owner, + spender, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.allowance( + owner=owner, + spender=spender, + ) diff --git a/tests/core/jpyc_methods/test_approve.py b/tests/core/jpyc_methods/test_approve.py new file mode 100644 index 0000000..a46ec07 --- /dev/null +++ b/tests/core/jpyc_methods/test_approve.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "approve"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_approve( + jpyc_client, + mocked_eth_contract_functions, +): + spender = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.approve( + spender=spender, + value=value, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + spender=spender, + value=value * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "spender", + "value", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid spender", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid value", + ), + ], +) +def test_approve_failures( + jpyc_client, + spender, + value, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.approve( + spender=spender, + value=value, + ) + + +def test_approve_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.approve( + spender=KNOWN_ACCOUNTS[1].address, + value=1000, + ) diff --git a/tests/core/jpyc_methods/test_balance_of.py b/tests/core/jpyc_methods/test_balance_of.py new file mode 100644 index 0000000..a970e5c --- /dev/null +++ b/tests/core/jpyc_methods/test_balance_of.py @@ -0,0 +1,42 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "balanceOf", + "func_args": [KNOWN_ACCOUNTS[0].address], + "return_value": 1000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_balance_of( + jpyc_client, + mocked_eth_contract_functions, +): + account = KNOWN_ACCOUNTS[0].address + + jpyc_client.balance_of(account=account) + + mocked_eth_contract_functions.assert_called_once_with(account) + + +def test_balance_of_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.balance_of(account="invalid_address") diff --git a/tests/core/jpyc_methods/test_cancel_authorization.py b/tests/core/jpyc_methods/test_cancel_authorization.py new file mode 100644 index 0000000..44bbd6f --- /dev/null +++ b/tests/core/jpyc_methods/test_cancel_authorization.py @@ -0,0 +1,180 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_cancel( + eip712_domain_separator, + eip712_domain_types, + nonce, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "CancelAuthorization": [ + {"name": "authorizer", "type": "address"}, + {"name": "nonce", "type": "bytes32"}, + ], + }, + "primaryType": "CancelAuthorization", + "message": { + "authorizer": KNOWN_ACCOUNTS[0].address, + "nonce": nonce, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_cancel_v(signed_message_cancel): + return signed_message_cancel.v + + +@pytest.fixture(scope="function") +def signed_message_cancel_r(signed_message_cancel): + return add_zero_padding_to_hex(hex(signed_message_cancel.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_cancel_s(signed_message_cancel): + return add_zero_padding_to_hex(hex(signed_message_cancel.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "cancelAuthorization"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_cancel_authorization( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, + mocked_eth_contract_functions, +): + authorizer = KNOWN_ACCOUNTS[0].address + + jpyc_client.cancel_authorization( + authorizer=authorizer, + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_cancel_authorization_invalid_authorizer( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.cancel_authorization( + authorizer="invalid_address", + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_nonce( + jpyc_client, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce="0x", + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_v( + jpyc_client, + nonce, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=-1, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_r( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=signed_message_cancel_v, + r="0x", + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_s( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s="0x", + ) + + +def test_cancel_authorization_account_not_initialized( + jpyc_client_without_account, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) diff --git a/tests/core/jpyc_methods/test_configure_minter.py b/tests/core/jpyc_methods/test_configure_minter.py new file mode 100644 index 0000000..b7a0fa5 --- /dev/null +++ b/tests/core/jpyc_methods/test_configure_minter.py @@ -0,0 +1,86 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "configureMinter", + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_configure_minter( + jpyc_client, + mocked_eth_contract_functions, +): + minter = KNOWN_ACCOUNTS[0].address + minter_allowed_amount = 10000 + + jpyc_client.configure_minter( + minter=minter, + minter_allowed_amount=minter_allowed_amount, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + minter=minter, + minterAllowedAmount=minter_allowed_amount * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "minter", + "minter_allowed_amount", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid minter", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + -1, + InvalidUint256, + id="invalid minter_allowed_amount", + ), + ], +) +def test_configure_minter_failures( + jpyc_client, + minter, + minter_allowed_amount, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.configure_minter( + minter=minter, minter_allowed_amount=minter_allowed_amount + ) + + +def test_configure_minter_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=10000, + ) diff --git a/tests/core/jpyc_methods/test_decrease_allowance.py b/tests/core/jpyc_methods/test_decrease_allowance.py new file mode 100644 index 0000000..2e1df83 --- /dev/null +++ b/tests/core/jpyc_methods/test_decrease_allowance.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "decreaseAllowance"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_decrease_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + spender = KNOWN_ACCOUNTS[1].address + decrement = 1000 + + jpyc_client.decrease_allowance( + spender=spender, + decrement=decrement, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + spender=spender, + decrement=decrement * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "spender", + "decrement", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 1000, + InvalidChecksumAddress, + id="invalid spender", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid decrement", + ), + ], +) +def test_decrease_allowance_failures( + jpyc_client, + spender, + decrement, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.decrease_allowance( + spender=spender, + decrement=decrement, + ) + + +def test_decrease_allowance_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.decrease_allowance( + spender=KNOWN_ACCOUNTS[1].address, + decrement=1000, + ) diff --git a/tests/core/jpyc_methods/test_increase_allowance.py b/tests/core/jpyc_methods/test_increase_allowance.py new file mode 100644 index 0000000..4a82e06 --- /dev/null +++ b/tests/core/jpyc_methods/test_increase_allowance.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "increaseAllowance"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_increase_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + spender = KNOWN_ACCOUNTS[1].address + increment = 1000 + + jpyc_client.increase_allowance( + spender=spender, + increment=increment, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + spender=spender, + increment=increment * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "spender", + "increment", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 1000, + InvalidChecksumAddress, + id="invalid spender", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid increment", + ), + ], +) +def test_increase_allowance_failures( + jpyc_client, + spender, + increment, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.increase_allowance( + spender=spender, + increment=increment, + ) + + +def test_increase_allowance_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.increase_allowance( + spender=KNOWN_ACCOUNTS[1].address, + increment=1000, + ) diff --git a/tests/core/jpyc_methods/test_is_minter.py b/tests/core/jpyc_methods/test_is_minter.py new file mode 100644 index 0000000..248adec --- /dev/null +++ b/tests/core/jpyc_methods/test_is_minter.py @@ -0,0 +1,38 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + {"func_name": "isMinter"}, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_is_minter( + jpyc_client, + mocked_eth_contract_functions, +): + account = KNOWN_ACCOUNTS[0].address + + jpyc_client.is_minter(account=account) + + mocked_eth_contract_functions.assert_called_once_with(account) + + +def test_is_minter_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.is_minter(account="invalid_address") diff --git a/tests/core/jpyc_methods/test_mint.py b/tests/core/jpyc_methods/test_mint.py new file mode 100644 index 0000000..105286a --- /dev/null +++ b/tests/core/jpyc_methods/test_mint.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "mint"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_mint( + jpyc_client, + mocked_eth_contract_functions, +): + to = KNOWN_ACCOUNTS[0].address + amount = 10000 + + jpyc_client.mint( + to=to, + amount=amount, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + _to=to, + _amount=amount * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "to", + "amount", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid to", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + -1, + InvalidUint256, + id="invalid amount", + ), + ], +) +def test_mint_failures( + jpyc_client, + to, + amount, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.mint( + to=to, + amount=amount, + ) + + +def test_mint_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.mint( + to=KNOWN_ACCOUNTS[1].address, + amount=1000, + ) diff --git a/tests/core/jpyc_methods/test_minter_allowance.py b/tests/core/jpyc_methods/test_minter_allowance.py new file mode 100644 index 0000000..74dee63 --- /dev/null +++ b/tests/core/jpyc_methods/test_minter_allowance.py @@ -0,0 +1,42 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "minterAllowance", + "func_args": [KNOWN_ACCOUNTS[0].address], + "return_value": 1000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_minter_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + minter = KNOWN_ACCOUNTS[0].address + + jpyc_client.minter_allowance(minter=minter) + + mocked_eth_contract_functions.assert_called_once_with(minter) + + +def test_minter_allowance_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.minter_allowance(minter="invalid_address") diff --git a/tests/core/jpyc_methods/test_nonces.py b/tests/core/jpyc_methods/test_nonces.py new file mode 100644 index 0000000..dc6d998 --- /dev/null +++ b/tests/core/jpyc_methods/test_nonces.py @@ -0,0 +1,40 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "nonces", + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_nonces( + jpyc_client, + mocked_eth_contract_functions, +): + owner = KNOWN_ACCOUNTS[0].address + + jpyc_client.nonces(owner=owner) + + mocked_eth_contract_functions.assert_called_once_with(owner) + + +def test_nonces_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.nonces(owner="invalid_address") diff --git a/tests/core/jpyc_methods/test_permit.py b/tests/core/jpyc_methods/test_permit.py new file mode 100644 index 0000000..56314af --- /dev/null +++ b/tests/core/jpyc_methods/test_permit.py @@ -0,0 +1,239 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint256, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_permit( + eip712_domain_separator, + eip712_domain_types, + valid_before, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "Permit": [ + {"name": "owner", "type": "address"}, + {"name": "spender", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "deadline", "type": "uint256"}, + ], + }, + "primaryType": "Permit", + "message": { + "owner": KNOWN_ACCOUNTS[0].address, + "spender": KNOWN_ACCOUNTS[1].address, + "value": 10000 * 10**18, + "deadline": valid_before, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_permit_v(signed_message_permit): + return signed_message_permit.v + + +@pytest.fixture(scope="function") +def signed_message_permit_r(signed_message_permit): + return add_zero_padding_to_hex(hex(signed_message_permit.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_permit_s(signed_message_permit): + return add_zero_padding_to_hex(hex(signed_message_permit.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "permit"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_permit( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, + mocked_eth_contract_functions, +): + owner = KNOWN_ACCOUNTS[0].address + spender = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.permit( + owner=owner, + spender=spender, + value=value, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_permit_invalid_owner( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.permit( + owner="invalid_address", + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_spender( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender="invalid_address", + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_value( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=-1, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_deadline( + jpyc_client, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=-1, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_v( + jpyc_client, + valid_before, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=-1, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_r( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r="0x", + s=signed_message_permit_s, + ) + + +def test_permit_invalid_s( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s="0x", + ) + + +def test_permit_account_not_initialized( + jpyc_client_without_account, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) diff --git a/tests/core/jpyc_methods/test_receive_with_authorization.py b/tests/core/jpyc_methods/test_receive_with_authorization.py new file mode 100644 index 0000000..3df7786 --- /dev/null +++ b/tests/core/jpyc_methods/test_receive_with_authorization.py @@ -0,0 +1,315 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint256, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_receive( + eip712_domain_separator, + eip712_domain_types, + valid_before, + nonce, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "ReceiveWithAuthorization": [ + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, + ], + }, + "primaryType": "ReceiveWithAuthorization", + "message": { + "from": KNOWN_ACCOUNTS[0].address, + "to": KNOWN_ACCOUNTS[1].address, + "value": 10000 * 10**18, + "validAfter": 0, + "validBefore": valid_before, + "nonce": nonce, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_receive_v(signed_message_receive): + return signed_message_receive.v + + +@pytest.fixture(scope="function") +def signed_message_receive_r(signed_message_receive): + return add_zero_padding_to_hex(hex(signed_message_receive.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_receive_s(signed_message_receive): + return add_zero_padding_to_hex(hex(signed_message_receive.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "receiveWithAuthorization"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_receive_with_authorization( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, + mocked_eth_contract_functions, +): + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 10000 + valid_after = 0 + + jpyc_client.receive_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=valid_after, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_receive_with_authorization_invalid_from( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.receive_with_authorization( + from_="invalid_address", + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_to( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to="invalid_address", + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_value( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=-1, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_valid_after( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=-1, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_valid_before( + jpyc_client, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=-1, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_nonce( + jpyc_client, + valid_before, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce="0x", + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_v( + jpyc_client, + valid_before, + nonce, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=-1, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_r( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r="0x", + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_s( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s="0x", + ) + + +def test_receive_with_authorization_account_not_initialized( + jpyc_client_without_account, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) diff --git a/tests/core/jpyc_methods/test_total_supply.py b/tests/core/jpyc_methods/test_total_supply.py new file mode 100644 index 0000000..29d2193 --- /dev/null +++ b/tests/core/jpyc_methods/test_total_supply.py @@ -0,0 +1,26 @@ +import pytest + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "totalSupply", + "return_value": 100000000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_total_supply( + jpyc_client, + mocked_eth_contract_functions, +): + jpyc_client.total_supply() + + mocked_eth_contract_functions.assert_called_once() diff --git a/tests/core/jpyc_methods/test_transfer.py b/tests/core/jpyc_methods/test_transfer.py new file mode 100644 index 0000000..45e1630 --- /dev/null +++ b/tests/core/jpyc_methods/test_transfer.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "transfer"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_transfer( + jpyc_client, + mocked_eth_contract_functions, +): + to = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.transfer( + to=to, + value=value, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + to=to, + value=value * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "to", + "value", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid to", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid value", + ), + ], +) +def test_transfer_failures( + jpyc_client, + to, + value, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.transfer( + to=to, + value=value, + ) + + +def test_transfer_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.transfer( + to=KNOWN_ACCOUNTS[1].address, + value=1000, + ) diff --git a/tests/core/jpyc_methods/test_transfer_from.py b/tests/core/jpyc_methods/test_transfer_from.py new file mode 100644 index 0000000..3f085db --- /dev/null +++ b/tests/core/jpyc_methods/test_transfer_from.py @@ -0,0 +1,92 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "transferFrom"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_transfer_from( + jpyc_client, + mocked_eth_contract_functions, +): + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.transfer_from( + from_=from_, + to=to, + value=value, + ) + + mocked_eth_contract_functions.call_count == 2 + + +@pytest.mark.parametrize( + [ + "from_", + "to", + "value", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + KNOWN_ACCOUNTS[1].address, + 10000, + InvalidChecksumAddress, + id="invalid from", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid to", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid value", + ), + ], +) +def test_transfer_from_failures( + jpyc_client, + from_, + to, + value, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.transfer_from( + from_=from_, + to=to, + value=value, + ) + + +def test_transfer_from_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.transfer_from( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=1000, + ) diff --git a/tests/core/jpyc_methods/test_transfer_with_authorization.py b/tests/core/jpyc_methods/test_transfer_with_authorization.py new file mode 100644 index 0000000..8785f5d --- /dev/null +++ b/tests/core/jpyc_methods/test_transfer_with_authorization.py @@ -0,0 +1,315 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint256, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_transfer( + eip712_domain_separator, + eip712_domain_types, + valid_before, + nonce, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "TransferWithAuthorization": [ + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, + ], + }, + "primaryType": "TransferWithAuthorization", + "message": { + "from": KNOWN_ACCOUNTS[0].address, + "to": KNOWN_ACCOUNTS[1].address, + "value": 10000 * 10**18, + "validAfter": 0, + "validBefore": valid_before, + "nonce": nonce, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_transfer_v(signed_message_transfer): + return signed_message_transfer.v + + +@pytest.fixture(scope="function") +def signed_message_transfer_r(signed_message_transfer): + return add_zero_padding_to_hex(hex(signed_message_transfer.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_transfer_s(signed_message_transfer): + return add_zero_padding_to_hex(hex(signed_message_transfer.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "transferWithAuthorization"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_transfer_with_authorization( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, + mocked_eth_contract_functions, +): + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 10000 + valid_after = 0 + + jpyc_client.transfer_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=valid_after, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_transfer_with_authorization_invalid_from( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.transfer_with_authorization( + from_="invalid_address", + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_to( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to="invalid_address", + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_value( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=-1, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_valid_after( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=-1, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_valid_before( + jpyc_client, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=-1, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_nonce( + jpyc_client, + valid_before, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce="0x", + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_v( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=-1, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_r( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r="0x", + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_s( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s="0x", + ) + + +def test_transfer_with_authorization_account_not_initialized( + jpyc_client_without_account, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) diff --git a/tests/core/test_client.py b/tests/core/test_client.py index 7521aca..9c751bf 100644 --- a/tests/core/test_client.py +++ b/tests/core/test_client.py @@ -146,10 +146,13 @@ def test_constructor_failures( def test_set_default_provider(sdk_client): sdk_client.set_default_provider( chain_name="ethereum", - network_name="mainnet", + network_name="sepolia", ) - assert sdk_client.w3.provider.endpoint_uri == "https://ethereum-rpc.publicnode.com" + assert ( + sdk_client.w3.provider.endpoint_uri + == "https://ethereum-sepolia-rpc.publicnode.com" + ) assert sdk_client.w3.eth.default_account == KNOWN_ACCOUNTS[0].address @@ -188,7 +191,7 @@ def test_set_default_provider_failures( def test_set_custom_provider(sdk_client): - rpc_endpoint = "https://ethereum-rpc.publicnode.com" + rpc_endpoint = "https://astar.public.blastapi.io" sdk_client.set_custom_provider( rpc_endpoint=rpc_endpoint, @@ -232,7 +235,7 @@ def test_set_account( private_key=private_key, ) - assert sdk_client.w3.provider.endpoint_uri == "http://127.0.0.1:8545/" + assert sdk_client.w3.provider.endpoint_uri == "https://ethereum-rpc.publicnode.com" if account is not None: assert account.address == address diff --git a/tests/core/test_jpyc.py b/tests/core/test_jpyc.py new file mode 100644 index 0000000..1b69c51 --- /dev/null +++ b/tests/core/test_jpyc.py @@ -0,0 +1,116 @@ +import pytest +from web3.contract.contract import Contract + +from packages.core.src.jpyc import JPYC + +from .conftest import V2_PROXY_ADDRESS + + +@pytest.mark.parametrize( + [ + "contract_address", + "mocked_eth_chain_id", + ], + [ + pytest.param( + None, + {"chain_id": 1}, + id="default contract address", + ), + pytest.param( + "0xC8CD2BE653759aed7B0996315821AAe71e1FEAdF", + {"chain_id": 1}, + id="custom contract address", + ), + ], + indirect=[ + "mocked_eth_chain_id", + ], +) +def test_constructor( + sdk_client, + contract_address, + mocked_eth_chain_id, +): + address = V2_PROXY_ADDRESS if contract_address is None else contract_address + + jpyc = JPYC( + client=sdk_client, + contract_address=address, + ) + + mocked_eth_chain_id.assert_called_once() + + assert jpyc.client == sdk_client + assert isinstance(jpyc.contract, Contract) + assert jpyc.contract.address == address + + +@pytest.mark.parametrize( + [ + "mocked_eth_chain_id", + ], + [ + pytest.param( + {"chain_id": 31337}, + id="default contract address", + ), + ], + indirect=[ + "mocked_eth_chain_id", + ], +) +def test_constructor_localhost( + sdk_client_localhost, + mocked_eth_chain_id, +): + address = "0xC8CD2BE653759aed7B0996315821AAe71e1FEAdF" + + jpyc = JPYC( + client=sdk_client_localhost, + contract_address=address, + ) + + mocked_eth_chain_id.assert_called_once() + + assert jpyc.client == sdk_client_localhost + assert isinstance(jpyc.contract, Contract) + assert jpyc.contract.address == address + + +@pytest.mark.parametrize( + [ + "mocked_eth_chain_id", + "mocked_eth_wait_for_transaction_receipt", + ], + [ + pytest.param( + {"chain_id": 31337}, + {"address": V2_PROXY_ADDRESS}, + id="default contract address", + ), + ], + indirect=[ + "mocked_eth_chain_id", + "mocked_eth_wait_for_transaction_receipt", + ], +) +def test_constructor_localhost_with_deployment( + sdk_client_localhost, + mocked_eth_chain_id, + mocked_eth_contract_constructor_transact, + mocked_eth_wait_for_transaction_receipt, + mocked_eth_contract_functions_transact, +): + jpyc = JPYC( + client=sdk_client_localhost, + ) + + mocked_eth_chain_id.assert_called_once() + mocked_eth_contract_constructor_transact.assert_called_once() + mocked_eth_wait_for_transaction_receipt.assert_called_once() + mocked_eth_contract_functions_transact.assert_called_once() + + assert jpyc.client == sdk_client_localhost + assert isinstance(jpyc.contract, Contract) + assert jpyc.contract.address == V2_PROXY_ADDRESS From 44f3d630105c5efa70e1f010944a49cd82684245 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 12:57:22 +0900 Subject: [PATCH 41/56] Remove unnecessary packages --- packages/core/pyproject.toml | 3 +- uv.lock | 183 ++--------------------------------- 2 files changed, 10 insertions(+), 176 deletions(-) diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index da834d9..95852f2 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -51,10 +51,9 @@ dev = [ "mypy>=1.15.0", "pytest>=8.3.5", "pytest-cov>=6.1.1", - "python-dotenv>=1.1.0", + "pytest-mock>=3.14.0", "ruff>=0.11.9", "sphinx>=8.2.3", - "web3[tester]>=7.11.0", ] # pytest diff --git a/uv.lock b/uv.lock index 9e49ef6..b618192 100644 --- a/uv.lock +++ b/uv.lock @@ -155,15 +155,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f3/18/b69e211181f90f8a3b4ef8c7022fcdf0ebe1ad5701b68f60382195f48f66/bitarray-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:340dd788dad07ad004b591925e4b906786aaefb6632ea9d9ac616913f3cafa4e", size = 139440, upload-time = "2025-05-06T23:00:32.716Z" }, ] -[[package]] -name = "cached-property" -version = "2.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/4b/3d870836119dbe9a5e3c9a61af8cc1a8b69d75aea564572e385882d5aefb/cached_property-2.0.1.tar.gz", hash = "sha256:484d617105e3ee0e4f1f58725e72a8ef9e93deee462222dbd51cd91230897641", size = 10574, upload-time = "2024-10-25T15:43:55.667Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/0e/7d8225aab3bc1a0f5811f8e1b557aa034ac04bdf641925b30d3caf586b28/cached_property-2.0.1-py3-none-any.whl", hash = "sha256:f617d70ab1100b7bcf6e42228f9ddcb78c676ffa167278d9f730d1c2fba69ccb", size = 7428, upload-time = "2024-10-25T15:43:54.711Z" }, -] - [[package]] name = "certifi" version = "2025.4.26" @@ -383,18 +374,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/18/088fb250018cbe665bc2111974301b2d59f294a565aff7564c4df6878da2/eth_account-0.13.7-py3-none-any.whl", hash = "sha256:39727de8c94d004ff61d10da7587509c04d2dc7eac71e04830135300bdfc6d24", size = 587452, upload-time = "2025-04-21T21:11:18.346Z" }, ] -[[package]] -name = "eth-bloom" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-hash", extra = ["pycryptodome"] }, -] -sdist = { url = "https://files.pythonhosted.org/packages/89/d6/9c345601de27b536dc8b0f4c1d6cb84fe76a47de9ac02753f58deae59c86/eth_bloom-3.1.0.tar.gz", hash = "sha256:4bc918f6fde44334e92b23cfb345db961e2e3af620535cbc872444f7a143cb88", size = 9807, upload-time = "2025-01-08T19:05:18.945Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/e5/251bda1d3f3cff230fa39e95d41141c1b44e8f55c101c5f593ccf5a31b63/eth_bloom-3.1.0-py3-none-any.whl", hash = "sha256:c96b2dd6cafa407373bca1a9d74b650378ba672d5b17f2771bf7d3c3aaa7651c", size = 5785, upload-time = "2025-01-08T19:05:17.757Z" }, -] - [[package]] name = "eth-hash" version = "0.7.1" @@ -408,9 +387,6 @@ wheels = [ pycryptodome = [ { name = "pycryptodome" }, ] -pysha3 = [ - { name = "safe-pysha3", marker = "implementation_name == 'cpython'" }, -] [[package]] name = "eth-keyfile" @@ -453,31 +429,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/3b/57efe2bc2df0980680d57c01a36516cd3171d2319ceb30e675de19fc2cc5/eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47", size = 4446, upload-time = "2025-02-04T21:51:05.823Z" }, ] -[[package]] -name = "eth-tester" -version = "0.13.0b1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-abi" }, - { name = "eth-account" }, - { name = "eth-keys" }, - { name = "eth-utils" }, - { name = "rlp" }, - { name = "semantic-version" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/3d/d9b8191fd252b3c99c86f939d2fbe5c3cd259984e61505052ccf2a91bc85/eth_tester-0.13.0b1.tar.gz", hash = "sha256:87fb561d450cd3639ce82eed52e566c902a0ac241f3e9581c6b7545690fcece5", size = 102766, upload-time = "2025-04-23T21:02:29.906Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/81/809ff0b461a7f7688925675cb99071b272bf3863e8d16e01a91434f03633/eth_tester-0.13.0b1-py3-none-any.whl", hash = "sha256:872108cea7df1340f56bab25b9ed5cf0f835aa467c1a8195d0891238c0e73ab3", size = 76168, upload-time = "2025-04-23T21:02:28.67Z" }, -] - -[package.optional-dependencies] -py-evm = [ - { name = "eth-hash", marker = "implementation_name == 'cpython' or implementation_name == 'pypy'" }, - { name = "eth-hash", extra = ["pycryptodome"], marker = "implementation_name == 'pypy'" }, - { name = "eth-hash", extra = ["pysha3"], marker = "implementation_name == 'cpython'" }, - { name = "py-evm" }, -] - [[package]] name = "eth-typing" version = "5.2.1" @@ -647,10 +598,9 @@ dev = [ { name = "mypy" }, { name = "pytest" }, { name = "pytest-cov" }, - { name = "python-dotenv" }, + { name = "pytest-mock" }, { name = "ruff" }, { name = "sphinx" }, - { name = "web3", extra = ["tester"] }, ] [package.metadata] @@ -665,10 +615,9 @@ dev = [ { name = "mypy", specifier = ">=1.15.0" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-cov", specifier = ">=6.1.1" }, - { name = "python-dotenv", specifier = ">=1.1.0" }, + { name = "pytest-mock", specifier = ">=3.14.0" }, { name = "ruff", specifier = ">=0.11.9" }, { name = "sphinx", specifier = ">=8.2.3" }, - { name = "web3", extras = ["tester"], specifier = ">=7.11.0" }, ] [[package]] @@ -686,27 +635,6 @@ dev = [ [package.metadata.requires-dev] dev = [{ name = "pre-commit", specifier = ">=4.2.0" }] -[[package]] -name = "lru-dict" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/e3/42c87871920602a3c8300915bd0292f76eccc66c38f782397acbf8a62088/lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b", size = 13123, upload-time = "2023-11-06T01:40:12.951Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/5c/385f080747eb3083af87d8e4c9068f3c4cab89035f6982134889940dafd8/lru_dict-1.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c279068f68af3b46a5d649855e1fb87f5705fe1f744a529d82b2885c0e1fc69d", size = 17174, upload-time = "2023-11-06T01:39:07.923Z" }, - { url = "https://files.pythonhosted.org/packages/3c/de/5ef2ed75ce55d7059d1b96177ba04fa7ee1f35564f97bdfcd28fccfbe9d2/lru_dict-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:350e2233cfee9f326a0d7a08e309372d87186565e43a691b120006285a0ac549", size = 10742, upload-time = "2023-11-06T01:39:08.871Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/f69a6abb0062d2cf2ce0aaf0284b105b97d1da024ca6d3d0730e6151242e/lru_dict-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eafb188a84483b3231259bf19030859f070321b00326dcb8e8c6cbf7db4b12f", size = 11079, upload-time = "2023-11-06T01:39:09.766Z" }, - { url = "https://files.pythonhosted.org/packages/ea/59/cf891143abe58a455b8eaa9175f0e80f624a146a2bf9a1ca842ee0ef930a/lru_dict-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73593791047e36b37fdc0b67b76aeed439fcea80959c7d46201240f9ec3b2563", size = 32469, upload-time = "2023-11-06T01:39:11.091Z" }, - { url = "https://files.pythonhosted.org/packages/59/88/d5976e9f70107ce11e45d93c6f0c2d5eaa1fc30bb3c8f57525eda4510dff/lru_dict-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1958cb70b9542773d6241974646e5410e41ef32e5c9e437d44040d59bd80daf2", size = 33496, upload-time = "2023-11-06T01:39:12.463Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f8/94d6e910d54fc1fa05c0ee1cd608c39401866a18cf5e5aff238449b33c11/lru_dict-1.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1cd3ed2cee78a47f11f3b70be053903bda197a873fd146e25c60c8e5a32cd6", size = 29914, upload-time = "2023-11-06T01:39:13.395Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b9/9db79780c8a3cfd66bba6847773061e5cf8a3746950273b9985d47bbfe53/lru_dict-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82eb230d48eaebd6977a92ddaa6d788f14cf4f4bcf5bbffa4ddfd60d051aa9d4", size = 32241, upload-time = "2023-11-06T01:39:14.612Z" }, - { url = "https://files.pythonhosted.org/packages/9b/b6/08a623019daec22a40c4d6d2c40851dfa3d129a53b2f9469db8eb13666c1/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5ad659cbc349d0c9ba8e536b5f40f96a70c360f43323c29f4257f340d891531c", size = 37320, upload-time = "2023-11-06T01:39:15.875Z" }, - { url = "https://files.pythonhosted.org/packages/70/0b/d3717159c26155ff77679cee1b077d22e1008bf45f19921e193319cd8e46/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba490b8972531d153ac0d4e421f60d793d71a2f4adbe2f7740b3c55dce0a12f1", size = 35054, upload-time = "2023-11-06T01:39:17.063Z" }, - { url = "https://files.pythonhosted.org/packages/04/74/f2ae00de7c27984a19b88d2b09ac877031c525b01199d7841ec8fa657fd6/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:c0131351b8a7226c69f1eba5814cbc9d1d8daaf0fdec1ae3f30508e3de5262d4", size = 38613, upload-time = "2023-11-06T01:39:18.136Z" }, - { url = "https://files.pythonhosted.org/packages/5a/0b/e30236aafe31b4247aa9ae61ba8aac6dde75c3ea0e47a8fb7eef53f6d5ce/lru_dict-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0e88dba16695f17f41701269fa046197a3fd7b34a8dba744c8749303ddaa18df", size = 37143, upload-time = "2023-11-06T01:39:19.571Z" }, - { url = "https://files.pythonhosted.org/packages/1c/28/b59bcebb8d76ba8147a784a8be7eab6a4ad3395b9236e73740ff675a5a52/lru_dict-1.3.0-cp312-cp312-win32.whl", hash = "sha256:6ffaf595e625b388babc8e7d79b40f26c7485f61f16efe76764e32dce9ea17fc", size = 12653, upload-time = "2023-11-06T01:39:20.574Z" }, - { url = "https://files.pythonhosted.org/packages/bd/18/06d9710cb0a0d3634f8501e4bdcc07abe64a32e404d82895a6a36fab97f6/lru_dict-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf9da32ef2582434842ab6ba6e67290debfae72771255a8e8ab16f3e006de0aa", size = 13811, upload-time = "2023-11-06T01:39:21.599Z" }, -] - [[package]] name = "markupsafe" version = "3.0.2" @@ -960,56 +888,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload-time = "2025-03-26T03:06:10.5Z" }, ] -[[package]] -name = "py-ecc" -version = "8.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-typing" }, - { name = "eth-utils" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/96/e73075d5c885274efada2fbc5db6377022036c2f5b4b470dbcf4106e07d5/py_ecc-8.0.0.tar.gz", hash = "sha256:56aca19e5dc37294f60c1cc76666c03c2276e7666412b9a559fa0145d099933d", size = 51193, upload-time = "2025-04-14T16:14:03.29Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/58/383335eac96d2f1aba78741c6ce128c54e7eba2ea1dc47408257d751d35c/py_ecc-8.0.0-py3-none-any.whl", hash = "sha256:c0b2dfc4bde67a55122a392591a10e851a986d5128f680628c80b405f7663e13", size = 47814, upload-time = "2025-04-14T16:14:01.827Z" }, -] - -[[package]] -name = "py-evm" -version = "0.12.1b1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cached-property" }, - { name = "ckzg" }, - { name = "eth-bloom" }, - { name = "eth-keys" }, - { name = "eth-typing" }, - { name = "eth-utils" }, - { name = "lru-dict" }, - { name = "py-ecc" }, - { name = "rlp" }, - { name = "trie" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/57/a0a84d991bac43058200245d853de9e7e819d216b56e22f66654fdf596d5/py_evm-0.12.1b1.tar.gz", hash = "sha256:7bcd9935a3ac2989c8f068b2006f136189281ebc6e279663405cb2c5397ed890", size = 851927, upload-time = "2025-05-14T17:25:14.686Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/be/1e0de8a1f1dbe3911ccae2d598a2c60610e2f4984a918690b5469e8c8774/py_evm-0.12.1b1-py3-none-any.whl", hash = "sha256:015ebc8dd95925030be87ce4b3fd31e3c70df626c5ad8665fb06cd611c73eb68", size = 798589, upload-time = "2025-05-14T17:25:12.707Z" }, -] - -[[package]] -name = "py-geth" -version = "5.6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "requests" }, - { name = "semantic-version" }, - { name = "types-requests" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/30/b6bf796d652d9d48be91012e06aa98376318c933eb2f7e2446af6671dcef/py_geth-5.6.0.tar.gz", hash = "sha256:c2d22bd06ebd39861e683fb5210a13a0f496025f05c9a7638c234966f5499396", size = 36386, upload-time = "2025-05-07T17:01:59.897Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/84/bf5cb7b900aad875199459fd1da253cda018bdbe39aaa8689b13c2bd7b53/py_geth-5.6.0-py3-none-any.whl", hash = "sha256:77663217ccd394c58811406585b1d314b5bf983e7d4e4356701cc022ab603fa7", size = 28235, upload-time = "2025-05-07T17:01:58.31Z" }, -] - [[package]] name = "pycryptodome" version = "3.22.0" @@ -1123,12 +1001,15 @@ wheels = [ ] [[package]] -name = "python-dotenv" -version = "1.1.0" +name = "pytest-mock" +version = "3.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814, upload-time = "2024-03-21T22:14:04.964Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863, upload-time = "2024-03-21T22:14:02.694Z" }, ] [[package]] @@ -1278,21 +1159,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/f7/70aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417/ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca", size = 10741080, upload-time = "2025-05-09T16:19:39.605Z" }, ] -[[package]] -name = "safe-pysha3" -version = "1.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/73/67ba7ed2177b0b17d10665418fb5deafa03d76b8d4b2cb30883b81b00edf/safe-pysha3-1.0.4.tar.gz", hash = "sha256:e429146b1edd198b2ca934a2046a65656c5d31b0ec894bbd6055127f4deaff17", size = 827688, upload-time = "2023-05-04T10:43:09.971Z" } - -[[package]] -name = "semantic-version" -version = "2.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, -] - [[package]] name = "snowballstemmer" version = "3.0.1" @@ -1302,15 +1168,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] -[[package]] -name = "sortedcontainers" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, -] - [[package]] name = "sphinx" version = "8.2.3" @@ -1402,22 +1259,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383, upload-time = "2024-10-04T16:17:01.533Z" }, ] -[[package]] -name = "trie" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eth-hash" }, - { name = "eth-utils" }, - { name = "hexbytes" }, - { name = "rlp" }, - { name = "sortedcontainers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a6/2f/5ec6be52952de47e79b1d250c00a922365a76503e3c75605c1cd890c61aa/trie-3.1.0.tar.gz", hash = "sha256:b31fd3376d6dccfe8ad13b525e233f2c268d5c48afb90a4de09672423d4b1026", size = 72800, upload-time = "2025-01-29T17:51:26.309Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/85/79/e6e105236eb1bb0c3ac82c968c143de456a3192c17d60df2f8c528eb3323/trie-3.1.0-py3-none-any.whl", hash = "sha256:dfc3e6ac0e76f0efa900ec1bfd082f0f1ba87f95cbfd81cc12338b03f4c679c4", size = 38940, upload-time = "2025-01-29T17:51:24.21Z" }, -] - [[package]] name = "types-requests" version = "2.32.0.20250328" @@ -1499,12 +1340,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/d8/afd0fc2919177d1c1f4e7e30e2dc83eb5be71d29046497b80892e3a978cf/web3-7.11.0-py3-none-any.whl", hash = "sha256:bbc844e4ea8d5769aa7be28cd737693cab41c4c52dc3d28c32d91718bfddfb91", size = 1367624, upload-time = "2025-04-29T17:28:26.766Z" }, ] -[package.optional-dependencies] -tester = [ - { name = "eth-tester", extra = ["py-evm"] }, - { name = "py-geth" }, -] - [[package]] name = "websockets" version = "15.0.1" From bd68d6d97aa8286dc9ae49d9e6fc4d7079d53319 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 12:57:41 +0900 Subject: [PATCH 42/56] Update 'core/README' --- packages/core/README.md | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 7d33f3b..5122a95 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -20,11 +20,20 @@ $ uv add --dev {package_name} $ uv remove {package_name} ``` -## Comments & Docstrings +## Testing -Docstrings should be written in the [Google-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). +```sh +# Run unit tests +$ uv run pytest -v +# Run unit tests with coverage info +$ uv run pytest -v --cov --cov-branch +# Run unit tests ignoring deprecation warnings +$ uv run pytest -W ignore::DeprecationWarning +``` + +## Static Code Analysis -## Linting +### Linting ```sh # Run linter without fixing @@ -33,7 +42,7 @@ $ uv run riff check {dir_name} $ uv run riff check {dir_name} --fix ``` -## Formatting +### Formatting ```sh # Run formatter without fixing @@ -41,3 +50,23 @@ $ uv run riff format {dir_name} --check # Run formatter & auto-fix $ uv run riff format {dir_name} ``` + +### Type Checking + +```sh +# Run mypy +$ uv run mypy {dir_name} +``` + +### Pre-Commit Hooks + +Pre-commit script is configured at [`.pre-commit-config.yaml`](../../.pre-commit-config.yaml). This automatically runs the configured hooks before executing any `git commit` commands. + +```sh +# Simulate pre-commit hooks without creating an actual commit +$ uv run pre-commit run --all-files +``` + +## Comments & Docstrings + +Docstrings should be written in the [Google-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). From 698de934015e2e8e2549d0ae60b51f99fd1e5a72 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 13:23:05 +0900 Subject: [PATCH 43/56] Add github workflows & composite-actions --- .github/actions/.gitkeep | 0 .github/actions/install-packages/action.yml | 15 ++++ .github/actions/publish-package/action.yml | 13 ++++ .github/workflows/check.yml | 49 ++++++++++++ .github/workflows/publish.yml | 84 +++++++++++++++++++++ 5 files changed, 161 insertions(+) delete mode 100644 .github/actions/.gitkeep create mode 100644 .github/actions/install-packages/action.yml create mode 100644 .github/actions/publish-package/action.yml create mode 100644 .github/workflows/check.yml create mode 100644 .github/workflows/publish.yml diff --git a/.github/actions/.gitkeep b/.github/actions/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/.github/actions/install-packages/action.yml b/.github/actions/install-packages/action.yml new file mode 100644 index 0000000..a0b9e5e --- /dev/null +++ b/.github/actions/install-packages/action.yml @@ -0,0 +1,15 @@ +name: install packages +description: set up uv & install packages + +runs: + using: composite + steps: + - uses: astral-sh/setup-uv@v5 + with: + version: "0.7.6" + - uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + - name: Install packages + shell: bash + run: uv sync --locked --all-extras --dev diff --git a/.github/actions/publish-package/action.yml b/.github/actions/publish-package/action.yml new file mode 100644 index 0000000..9e725b9 --- /dev/null +++ b/.github/actions/publish-package/action.yml @@ -0,0 +1,13 @@ +name: publish package +description: publish a package to PyPI +inputs: + pypi-auth-token: + description: 'PyPI token for authorization' + required: true + +runs: + using: composite + steps: + - name: Publish package + shell: bash + run: uv publish --token ${{ inputs.pypi-auth-token }} diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..f672f08 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,49 @@ +name: check + +on: + push: + branches: + - main + - develop + - fix/develop # temp + pull_request: + branches: + - main + - develop + +jobs: + detect-changes: + runs-on: ubuntu-latest + timeout-minutes: 3 + permissions: + pull-requests: read + outputs: + core: ${{ steps.filter.outputs.core }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + core: + - 'packages/core/**' + + check-core: + needs: detect-changes + if: ${{ needs.detect-changes.outputs.core == 'true' }} + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/core + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-packages + - name: Lint + run: uv run ruff check . + - name: Format + run: uv run ruff format --check . + - name: Run mypy + run: uv run mypy . + - name: Run tests + run: yarn run pytest -v --cov -W ignore::DeprecationWarning diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..6448950 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,84 @@ +name: check + +on: + push: + branches: + - main + paths: + - 'packages/**' + +jobs: + detect-changes: + runs-on: ubuntu-latest + timeout-minutes: 3 + permissions: + pull-requests: read + outputs: + core: ${{ steps.filter.outputs.core }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + core: + - 'packages/core/**' + + push-git-tag: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./ + timeout-minutes: 3 + outputs: + tag-name: ${{ 'v' }}${{ env.GIT_TAG_VERSION }} + tag-version: ${{ env.GIT_TAG_VERSION }} + tag-exists: ${{ steps.create-tag.outputs.tag_exists }} + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-packages + - name: get version from `pyproject.toml` + run: GIT_TAG_VERSION=uv version >> $GITHUB_ENV + - uses: rickstaa/action-create-tag@v1 + id: create-tag + with: + tag: ${{ 'v' }}${{ env.GIT_TAG_VERSION }} + + publish-release-note: + needs: push-git-tag + if: ${{ needs.push-git-tag.outputs.tag-exists == 'false' }} + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./ + timeout-minutes: 5 + permissions: + contents: write + pull-requests: read + steps: + - uses: actions/checkout@v4 + - uses: release-drafter/release-drafter@v6 + with: + name: ${{ needs.push-git-tag.outputs.tag-name }} + tag: ${{ needs.push-git-tag.outputs.tag-name }} + version: ${{ needs.push-git-tag.outputs.tag-version }} + publish: 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish-core: + needs: [detect-changes, publish-release-note] + if: ${{ needs.detect-changes.outputs.core == 'true' }} + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/core + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-packages + - name: Build package + run: uv build + - uses: ./.github/actions/publish-package + with: + pypi-auth-token: ${{ secrets.PYPI_TOKEN }} From d763325e611add402545059bc98b4ebf86c2b007 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 13:32:40 +0900 Subject: [PATCH 44/56] Fix 'check' workflow --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index f672f08..8cb4e89 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -46,4 +46,4 @@ jobs: - name: Run mypy run: uv run mypy . - name: Run tests - run: yarn run pytest -v --cov -W ignore::DeprecationWarning + run: uv run pytest -v --cov -W ignore::DeprecationWarning From be01413e926088f294eb0079ebf54c1884dd4d8d Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 13:47:30 +0900 Subject: [PATCH 45/56] Remove temp filter --- .github/workflows/check.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 8cb4e89..ad4bc32 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -5,7 +5,6 @@ on: branches: - main - develop - - fix/develop # temp pull_request: branches: - main From 05fbc9b72f0e504a79d77e498218aeffe14dc859 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 18:48:31 +0900 Subject: [PATCH 46/56] Add dev docs --- docs/.gitkeep | 0 docs/README.md | 21 + docs/core/index.html | 7 + docs/core/search.js | 46 + docs/core/src.html | 2254 ++++++++++++++++++++++++++++++++++++++ docs/core/src/utils.html | 1501 +++++++++++++++++++++++++ 6 files changed, 3829 insertions(+) delete mode 100644 docs/.gitkeep create mode 100644 docs/README.md create mode 100644 docs/core/index.html create mode 100644 docs/core/search.js create mode 100644 docs/core/src.html create mode 100644 docs/core/src/utils.html diff --git a/docs/.gitkeep b/docs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..55baa2e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,21 @@ +# Docs + +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains the auto-generated documentation for the SDK. + +## 📄 Build + +Run the following commands that generate a collection of documents under [`./docs`](./) directory. + +```sh +# cd into the root directory +$ cd python-sdk +# generate documentation from the google-styled docstrings +$ uv run pdoc ./packages/core/src -o ./docs/core -d google +``` + +## 🔍 UI + +Type `{absolute_path_of_any_parent_directories}/python-sdk/docs/index.html` into your browser to see the contents. diff --git a/docs/core/index.html b/docs/core/index.html new file mode 100644 index 0000000..0ef869b --- /dev/null +++ b/docs/core/index.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/core/search.js b/docs/core/search.js new file mode 100644 index 0000000..a11c391 --- /dev/null +++ b/docs/core/search.js @@ -0,0 +1,46 @@ +window.pdocSearch = (function(){ +/** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o

\n"}, "src.SdkClient": {"fullname": "src.SdkClient", "modulename": "src", "qualname": "SdkClient", "kind": "class", "doc": "

SDK client.

\n", "bases": "src.interfaces.client.ISdkClient"}, "src.SdkClient.__init__": {"fullname": "src.SdkClient.__init__", "modulename": "src", "qualname": "SdkClient.__init__", "kind": "function", "doc": "

Constructor that initializes SDK client.

\n\n
Notes:
\n\n
\n
    \n
  • Either chain_name & network_name parameters or rpc_endpoint parameter are required.
  • \n
  • This constructor prioritizes rpc_endpoint parameter over chain_name & network_name parameters when configuring rpc_endpoint.
  • \n
\n
\n\n
Arguments:
\n\n
    \n
  • chain_name (str, optional): Chain name
  • \n
  • network_name (str, optional): Network name
  • \n
  • rpc_endpoint (RpcEndpoint, optional): RPC endpoint
  • \n
  • private_key (Bytes32, optional): private key of EOA
  • \n
\n\n
Raises:
\n\n
    \n
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • \n
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • \n
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • \n
  • ValidationError: If pydantic validation fails
  • \n
\n", "signature": "(\tchain_name: ChainName | None = None,\tnetwork_name: str | None = None,\trpc_endpoint: Optional[Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]] = None,\tprivate_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]] = None)"}, "src.SdkClient.w3": {"fullname": "src.SdkClient.w3", "modulename": "src", "qualname": "SdkClient.w3", "kind": "variable", "doc": "

Web3: Configured web3 instance

\n"}, "src.SdkClient.rpc_endpoint": {"fullname": "src.SdkClient.rpc_endpoint", "modulename": "src", "qualname": "SdkClient.rpc_endpoint", "kind": "variable", "doc": "

str: RPC endpoint

\n"}, "src.SdkClient.account": {"fullname": "src.SdkClient.account", "modulename": "src", "qualname": "SdkClient.account", "kind": "variable", "doc": "

LocalAccount | None: Account instance

\n"}, "src.SdkClient.set_default_provider": {"fullname": "src.SdkClient.set_default_provider", "modulename": "src", "qualname": "SdkClient.set_default_provider", "kind": "function", "doc": "

Set provider using one of the default RPC endpoints.

\n\n
Arguments:
\n\n
    \n
  • chain_name (str): Chain name
  • \n
  • network_name (str): Network name
  • \n
\n\n
Returns:
\n\n
\n

Web3: Configured web3 instance

\n
\n\n
Raises:
\n\n
    \n
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • \n
  • ValidationError: If pydantic validation fails
  • \n
\n", "signature": "(self, chain_name: ChainName, network_name: str) -> web3.main.Web3:", "funcdef": "def"}, "src.SdkClient.set_custom_provider": {"fullname": "src.SdkClient.set_custom_provider", "modulename": "src", "qualname": "SdkClient.set_custom_provider", "kind": "function", "doc": "

Set provider using a custom RPC endpoint.

\n\n
Arguments:
\n\n
    \n
  • rpc_endpoint (RpcEndpoint): Custom RPC endpoint
  • \n
\n\n
Returns:
\n\n
\n

Web3: Configured web3 instance

\n
\n\n
Raises:
\n\n
    \n
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • \n
\n", "signature": "(\tself,\trpc_endpoint: Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]) -> web3.main.Web3:", "funcdef": "def"}, "src.SdkClient.set_account": {"fullname": "src.SdkClient.set_account", "modulename": "src", "qualname": "SdkClient.set_account", "kind": "function", "doc": "

Set account with a private key.

\n\n
Notes:
\n\n
\n

If private_key parameter is set to None, this method removes account from the configured web3 instance.

\n
\n\n
Arguments:
\n\n
    \n
  • private_key (Bytes32, optional): Private key of account
  • \n
\n\n
Returns:
\n\n
\n

LocalAccount | None: Configured account instance

\n
\n\n
Raises:
\n\n
    \n
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • \n
\n", "signature": "(\tself,\tprivate_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]]) -> eth_account.signers.local.LocalAccount | None:", "funcdef": "def"}, "src.SdkClient.get_account_address": {"fullname": "src.SdkClient.get_account_address", "modulename": "src", "qualname": "SdkClient.get_account_address", "kind": "function", "doc": "

Get address of the configured account.

\n\n
Returns:
\n\n
\n

ChecksumAddress: Public address of account

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
\n", "signature": "(\tself) -> Annotated[str, AfterValidator(func=<function validate_checksum_address at 0x1086211c0>)]:", "funcdef": "def"}, "src.JPYC": {"fullname": "src.JPYC", "modulename": "src", "qualname": "JPYC", "kind": "class", "doc": "

Implementation of IJPYC.

\n", "bases": "src.interfaces.jpyc.IJPYC"}, "src.JPYC.__init__": {"fullname": "src.JPYC.__init__", "modulename": "src", "qualname": "JPYC.__init__", "kind": "function", "doc": "

Constructor that initializes JPYC client.

\n\n
Notes:
\n\n
\n
    \n
  • If client parameter is configured to use localhost network, this deploys JPYC contracts to localhost network, initializes it, and sets its address to address attribute.
  • \n
  • If contract_address is supplied, this configures contract instance with that address.
  • \n
\n
\n\n
Arguments:
\n\n
    \n
  • client (SdkClient): Configured SDK client
  • \n
  • contract_version (ContractVersion): Contract version
  • \n
  • contract_address (EthChecksumAddress, optional): Contract address
  • \n
\n", "signature": "(\tclient: src.client.SdkClient,\tcontract_version: ContractVersion = '2',\tcontract_address: Optional[eth_typing.evm.ChecksumAddress] = None)"}, "src.JPYC.client": {"fullname": "src.JPYC.client", "modulename": "src", "qualname": "JPYC.client", "kind": "variable", "doc": "

ISdkClient: Configured SDK client

\n"}, "src.JPYC.contract": {"fullname": "src.JPYC.contract", "modulename": "src", "qualname": "JPYC.contract", "kind": "variable", "doc": "

Contract: Configured contract instance

\n"}, "src.JPYC.is_minter": {"fullname": "src.JPYC.is_minter", "modulename": "src", "qualname": "JPYC.is_minter", "kind": "function", "doc": "

Call isMinter function.

\n\n
Arguments:
\n\n
    \n
  • account (ChecksumAddress): Account address
  • \n
\n\n
Returns:
\n\n
\n

bool: True if account is a minter, false otherwise

\n
\n\n
Raises:
\n\n
    \n
  • InvalidChecksumAddress: If supplied account is not in a valid form
  • \n
\n", "signature": "(\tself,\taccount: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> bool:", "funcdef": "def"}, "src.JPYC.minter_allowance": {"fullname": "src.JPYC.minter_allowance", "modulename": "src", "qualname": "JPYC.minter_allowance", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.total_supply": {"fullname": "src.JPYC.total_supply", "modulename": "src", "qualname": "JPYC.total_supply", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.balance_of": {"fullname": "src.JPYC.balance_of", "modulename": "src", "qualname": "JPYC.balance_of", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.allowance": {"fullname": "src.JPYC.allowance", "modulename": "src", "qualname": "JPYC.allowance", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.nonces": {"fullname": "src.JPYC.nonces", "modulename": "src", "qualname": "JPYC.nonces", "kind": "function", "doc": "

Call nonces function.

\n\n
Arguments:
\n\n
    \n
  • owner (ChecksumAddress): Owner address
  • \n
\n\n
Returns:
\n\n
\n

Uint256: Nonce for EIP2612's permit.

\n
\n\n
Raises:
\n\n
    \n
  • InvalidChecksumAddress: If supplied owner is not in a valid form
  • \n
\n", "signature": "(\tself,\towner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]:", "funcdef": "def"}, "src.JPYC.configure_minter": {"fullname": "src.JPYC.configure_minter", "modulename": "src", "qualname": "JPYC.configure_minter", "kind": "function", "doc": "

Call configureMinter function.

\n\n
Arguments:
\n\n
    \n
  • minter (ChecksumAddress): Minter address
  • \n
  • minter_allowed_amount (Uint256): Minter allowance
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied minter is not in a valid form
  • \n
  • InvalidUint256: If supplied minter_allowed_amount is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tminter: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tminter_allowed_amount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.mint": {"fullname": "src.JPYC.mint", "modulename": "src", "qualname": "JPYC.mint", "kind": "function", "doc": "

Call mint function.

\n\n
Arguments:
\n\n
    \n
  • to (ChecksumAddress): Receiver address
  • \n
  • amount (Uint256): Amount of tokens to mint
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • \n
  • InvalidUint256: If supplied amount is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tamount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.transfer": {"fullname": "src.JPYC.transfer", "modulename": "src", "qualname": "JPYC.transfer", "kind": "function", "doc": "

Call transfer function.

\n\n
Arguments:
\n\n
    \n
  • to (ChecksumAddress): Receiver address
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • \n
  • InvalidUint256: If supplied value is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.transfer_from": {"fullname": "src.JPYC.transfer_from", "modulename": "src", "qualname": "JPYC.transfer_from", "kind": "function", "doc": "

Call transferFrom function.

\n\n
Arguments:
\n\n
    \n
  • from_ (ChecksumAddress): Owner address
  • \n
  • to (ChecksumAddress): Receiver address
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • \n
  • InvalidUint256: If supplied value is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tfrom_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.transfer_with_authorization": {"fullname": "src.JPYC.transfer_with_authorization", "modulename": "src", "qualname": "JPYC.transfer_with_authorization", "kind": "function", "doc": "

Call transferWithAuthorization function.

\n\n
Arguments:
\n\n
    \n
  • from_ (ChecksumAddress): Owner address
  • \n
  • to (ChecksumAddress): Receiver allowance
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
  • valid_after (Uint256): Unix time when transaction becomes valid
  • \n
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • \n
  • nonce (Bytes32): Unique nonce
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • \n
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tfrom_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tnonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.receive_with_authorization": {"fullname": "src.JPYC.receive_with_authorization", "modulename": "src", "qualname": "JPYC.receive_with_authorization", "kind": "function", "doc": "

Call receiveWithAuthorization function.

\n\n
Arguments:
\n\n
    \n
  • from_ (ChecksumAddress): Owner address
  • \n
  • to (ChecksumAddress): Receiver allowance
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
  • valid_after (Uint256): Unix time when transaction becomes valid
  • \n
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • \n
  • nonce (Bytes32): Unique nonce
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • \n
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tfrom_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tnonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.cancel_authorization": {"fullname": "src.JPYC.cancel_authorization", "modulename": "src", "qualname": "JPYC.cancel_authorization", "kind": "function", "doc": "

Call cancelAuthorization function.

\n\n
Arguments:
\n\n
    \n
  • authorizer (ChecksumAddress): Owner address
  • \n
  • nonce (Bytes32): Unique nonce
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied authorizer is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tauthorizer: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tnonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.approve": {"fullname": "src.JPYC.approve", "modulename": "src", "qualname": "JPYC.approve", "kind": "function", "doc": "

Call approve function.

\n\n
Arguments:
\n\n
    \n
  • spender (ChecksumAddress): Spender address
  • \n
  • value (Uint256): Amount of allowance
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • \n
  • InvalidUint256: If supplied value is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.increase_allowance": {"fullname": "src.JPYC.increase_allowance", "modulename": "src", "qualname": "JPYC.increase_allowance", "kind": "function", "doc": "

Call increaseAllowance function.

\n\n
Arguments:
\n\n
    \n
  • spender (ChecksumAddress): Spender address
  • \n
  • increment (Uint256): Amount of allowance to increase
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • \n
  • InvalidUint256: If supplied increment is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tincrement: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.decrease_allowance": {"fullname": "src.JPYC.decrease_allowance", "modulename": "src", "qualname": "JPYC.decrease_allowance", "kind": "function", "doc": "

Call decreaseAllowance function.

\n\n
Arguments:
\n\n
    \n
  • spender (ChecksumAddress): Spender address
  • \n
  • decrement (Uint256): Amount of allowance to decrease
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • \n
  • InvalidUint256: If supplied decrement is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tdecrement: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.permit": {"fullname": "src.JPYC.permit", "modulename": "src", "qualname": "JPYC.permit", "kind": "function", "doc": "

Call permit function.

\n\n
Arguments:
\n\n
    \n
  • owner (ChecksumAddress): Owner address
  • \n
  • spender (ChecksumAddress): Spender address
  • \n
  • value (Uint256): Amount of allowance
  • \n
  • deadline (Uint256): Unix time when transaction becomes invalid
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied owner or spender is not in a valid form
  • \n
  • InvalidUint256: If supplied value or deadline is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\towner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tdeadline: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.utils": {"fullname": "src.utils", "modulename": "src.utils", "kind": "module", "doc": "

\n"}, "src.utils.get_proxy_address": {"fullname": "src.utils.get_proxy_address", "modulename": "src.utils", "qualname": "get_proxy_address", "kind": "function", "doc": "

Get proxy address from the specified version.

\n\n
Note:
\n\n
\n

Default address should be the address of the latest version (e.g., v2 as of May 2025).

\n
\n\n
Arguments:
\n\n
    \n
  • contract_version (ContractVersion): Contract version
  • \n
\n\n
Returns:
\n\n
\n

ChecksumAddress: Checksum address of proxy contract

\n
\n", "signature": "(contract_version: ContractVersion) -> eth_typing.evm.ChecksumAddress:", "funcdef": "def"}, "src.utils.get_artifacts": {"fullname": "src.utils.get_artifacts", "modulename": "src.utils", "qualname": "get_artifacts", "kind": "function", "doc": "

Get contract artifacts from the specified file path.

\n\n
Arguments:
\n\n
    \n
  • file_path (Path): absolute path of artifacts file
  • \n
  • artifact_type (ArtifactType): type of artifacts
  • \n
\n\n
Returns:
\n\n
\n

Any: Artifacts of contracts

\n
\n", "signature": "(file_path: pathlib._local.Path, artifact_type: ArtifactType) -> Any:", "funcdef": "def"}, "src.utils.resolve_artifacts_file_path": {"fullname": "src.utils.resolve_artifacts_file_path", "modulename": "src.utils", "qualname": "resolve_artifacts_file_path", "kind": "function", "doc": "

Resolve the path of artifacts file from the specified contract version.

\n\n
Arguments:
\n\n
    \n
  • contract_version (ContractVersion): Contract version
  • \n
\n\n
Returns:
\n\n
\n

Path: Absolute path of artifacts file

\n
\n", "signature": "(contract_version: ContractVersion) -> pathlib._local.Path:", "funcdef": "def"}, "src.utils.enumerate_supported_networks": {"fullname": "src.utils.enumerate_supported_networks", "modulename": "src.utils", "qualname": "enumerate_supported_networks", "kind": "function", "doc": "

Enumerate all the supported networks.

\n\n
Returns:
\n\n
\n

str: supported networks

\n
\n", "signature": "() -> str:", "funcdef": "def"}, "src.utils.get_default_rpc_endpoint": {"fullname": "src.utils.get_default_rpc_endpoint", "modulename": "src.utils", "qualname": "get_default_rpc_endpoint", "kind": "function", "doc": "

Get the default RPC endpoint for the specified network.

\n\n
Arguments:
\n\n
    \n
  • chain_name (ChainName, optional): Chain name
  • \n
  • network_name (str, optional): Network name
  • \n
\n\n
Returns:
\n\n
\n

RpcEndpoint: RPC endpoint

\n
\n\n
Raises:
\n\n
    \n
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • \n
\n", "signature": "(\tchain_name: ChainName | None,\tnetwork_name: str | None) -> Annotated[str, AfterValidator(func=<function validate_rpc_endpoint at 0x108621620>)]:", "funcdef": "def"}, "src.utils.SUPPORTED_CHAINS": {"fullname": "src.utils.SUPPORTED_CHAINS", "modulename": "src.utils", "qualname": "SUPPORTED_CHAINS", "kind": "variable", "doc": "

\n", "default_value": "{'ethereum': {'mainnet': {'id': 1, 'name': 'Ethereum Mainnet', 'rpc_endpoints': ['https://ethereum-rpc.publicnode.com']}, 'sepolia': {'id': 11155111, 'name': 'Ethereum Sepolia Testnet', 'rpc_endpoints': ['https://ethereum-sepolia-rpc.publicnode.com']}}, 'polygon': {'mainnet': {'id': 137, 'name': 'Polygon Mainnet', 'rpc_endpoints': ['https://polygon-rpc.com']}, 'amoy': {'id': 80002, 'name': 'Polygon Amoy Testnet', 'rpc_endpoints': ['https://rpc-amoy.polygon.technology']}}, 'gnosis': {'mainnet': {'id': 100, 'name': 'Gnosis Chain', 'rpc_endpoints': ['https://rpc.gnosischain.com']}, 'chiado': {'id': 10200, 'name': 'Gnosis Chiado Testnet', 'rpc_endpoints': ['https://rpc.chiadochain.net']}}, 'avalanche': {'mainnet': {'id': 43114, 'name': 'Avalanche C-Chain', 'rpc_endpoints': ['https://api.avax.network/ext/bc/C/rpc']}, 'fuji': {'id': 43113, 'name': 'Avalanche Fuji Testnet', 'rpc_endpoints': ['https://api.avax-test.network/ext/bc/C/rpc']}}, 'astar': {'mainnet': {'id': 592, 'name': 'Astar Network', 'rpc_endpoints': ['https://astar.public.blastapi.io']}}, 'shiden': {'mainnet': {'id': 336, 'name': 'Shiden Network', 'rpc_endpoints': ['https://shiden.public.blastapi.io']}}, 'localhost': {'devnet': {'id': 31337, 'name': 'Localhost Network', 'rpc_endpoints': ['http://127.0.0.1:8545/']}}}"}, "src.utils.POA_MIDDLEWARE": {"fullname": "src.utils.POA_MIDDLEWARE", "modulename": "src.utils", "qualname": "POA_MIDDLEWARE", "kind": "variable", "doc": "

\n", "default_value": "'poa_middleware'"}, "src.utils.SIGN_MIDDLEWARE": {"fullname": "src.utils.SIGN_MIDDLEWARE", "modulename": "src.utils", "qualname": "SIGN_MIDDLEWARE", "kind": "variable", "doc": "

\n", "default_value": "'sign_middleware'"}, "src.utils.UINT_MIN": {"fullname": "src.utils.UINT_MIN", "modulename": "src.utils", "qualname": "UINT_MIN", "kind": "variable", "doc": "

\n", "default_value": "0"}, "src.utils.UINT256_MAX": {"fullname": "src.utils.UINT256_MAX", "modulename": "src.utils", "qualname": "UINT256_MAX", "kind": "variable", "doc": "

\n", "default_value": "115792089237316195423570985008687907853269984665640564039457584007913129639935"}, "src.utils.UINT8_MAX": {"fullname": "src.utils.UINT8_MAX", "modulename": "src.utils", "qualname": "UINT8_MAX", "kind": "variable", "doc": "

\n", "default_value": "255"}, "src.utils.remove_decimals": {"fullname": "src.utils.remove_decimals", "modulename": "src.utils", "qualname": "remove_decimals", "kind": "function", "doc": "

Remove decimals.

\n\n
Arguments:
\n\n
    \n
  • value (Uint256 | Decimal): Value in ether
  • \n
\n\n
Returns:
\n\n
\n

Uint256: Value in wei

\n
\n", "signature": "(\tvalue: Union[Annotated[int, AfterValidator(func=<function validate_uint256>)], decimal.Decimal]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]:", "funcdef": "def"}, "src.utils.restore_decimals": {"fullname": "src.utils.restore_decimals", "modulename": "src.utils", "qualname": "restore_decimals", "kind": "function", "doc": "

Decorator to restore decimals.

\n", "signature": "(func):", "funcdef": "def"}, "src.utils.AccountNotInitialized": {"fullname": "src.utils.AccountNotInitialized", "modulename": "src.utils", "qualname": "AccountNotInitialized", "kind": "class", "doc": "

Raised when account is not initialized or hoisted to web3 instance.

\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.AccountNotInitialized.code": {"fullname": "src.utils.AccountNotInitialized.code", "modulename": "src.utils", "qualname": "AccountNotInitialized.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "101"}, "src.utils.InvalidBytes32": {"fullname": "src.utils.InvalidBytes32", "modulename": "src.utils", "qualname": "InvalidBytes32", "kind": "class", "doc": "

Raised when the given byte string is not a valid bytes32.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidBytes32.__init__": {"fullname": "src.utils.InvalidBytes32.__init__", "modulename": "src.utils", "qualname": "InvalidBytes32.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidBytes32.code": {"fullname": "src.utils.InvalidBytes32.code", "modulename": "src.utils", "qualname": "InvalidBytes32.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "203"}, "src.utils.InvalidChecksumAddress": {"fullname": "src.utils.InvalidChecksumAddress", "modulename": "src.utils", "qualname": "InvalidChecksumAddress", "kind": "class", "doc": "

Raised when the given address is not a valid checksum address.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidChecksumAddress.__init__": {"fullname": "src.utils.InvalidChecksumAddress.__init__", "modulename": "src.utils", "qualname": "InvalidChecksumAddress.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidChecksumAddress.code": {"fullname": "src.utils.InvalidChecksumAddress.code", "modulename": "src.utils", "qualname": "InvalidChecksumAddress.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "200"}, "src.utils.InvalidUint8": {"fullname": "src.utils.InvalidUint8", "modulename": "src.utils", "qualname": "InvalidUint8", "kind": "class", "doc": "

Raised when the given integer is not a valid uint8.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidUint8.__init__": {"fullname": "src.utils.InvalidUint8.__init__", "modulename": "src.utils", "qualname": "InvalidUint8.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidUint8.code": {"fullname": "src.utils.InvalidUint8.code", "modulename": "src.utils", "qualname": "InvalidUint8.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "201"}, "src.utils.InvalidUint256": {"fullname": "src.utils.InvalidUint256", "modulename": "src.utils", "qualname": "InvalidUint256", "kind": "class", "doc": "

Raised when the given integer is not a valid uint256.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidUint256.__init__": {"fullname": "src.utils.InvalidUint256.__init__", "modulename": "src.utils", "qualname": "InvalidUint256.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidUint256.code": {"fullname": "src.utils.InvalidUint256.code", "modulename": "src.utils", "qualname": "InvalidUint256.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "202"}, "src.utils.NetworkNotSupported": {"fullname": "src.utils.NetworkNotSupported", "modulename": "src.utils", "qualname": "NetworkNotSupported", "kind": "class", "doc": "

Raised when the specified network is not supported by the SDK.

\n\n
Attributes:
\n\n
    \n
  • chain_name (str): Chain name
  • \n
  • network_name (str): Network name
  • \n
\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.NetworkNotSupported.__init__": {"fullname": "src.utils.NetworkNotSupported.__init__", "modulename": "src.utils", "qualname": "NetworkNotSupported.__init__", "kind": "function", "doc": "

\n", "signature": "(chain_name: ChainName, network_name: str)"}, "src.utils.NetworkNotSupported.code": {"fullname": "src.utils.NetworkNotSupported.code", "modulename": "src.utils", "qualname": "NetworkNotSupported.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "100"}, "src.utils.TransactionFailed": {"fullname": "src.utils.TransactionFailed", "modulename": "src.utils", "qualname": "TransactionFailed", "kind": "class", "doc": "

Raised when transaction fails.

\n\n
Attributes:
\n\n
    \n
  • message (str): Error message
  • \n
\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.TransactionFailed.__init__": {"fullname": "src.utils.TransactionFailed.__init__", "modulename": "src.utils", "qualname": "TransactionFailed.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.TransactionFailed.code": {"fullname": "src.utils.TransactionFailed.code", "modulename": "src.utils", "qualname": "TransactionFailed.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "301"}, "src.utils.TransactionSimulationFailed": {"fullname": "src.utils.TransactionSimulationFailed", "modulename": "src.utils", "qualname": "TransactionSimulationFailed", "kind": "class", "doc": "

Raised when transaction simulation fails.

\n\n
Attributes:
\n\n
    \n
  • message (str): Error message
  • \n
\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.TransactionSimulationFailed.__init__": {"fullname": "src.utils.TransactionSimulationFailed.__init__", "modulename": "src.utils", "qualname": "TransactionSimulationFailed.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.TransactionSimulationFailed.code": {"fullname": "src.utils.TransactionSimulationFailed.code", "modulename": "src.utils", "qualname": "TransactionSimulationFailed.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "300"}, "src.utils.ArtifactType": {"fullname": "src.utils.ArtifactType", "modulename": "src.utils", "qualname": "ArtifactType", "kind": "variable", "doc": "

\n", "default_value": "Literal['abi', 'bytecode']"}, "src.utils.ChainMetadata": {"fullname": "src.utils.ChainMetadata", "modulename": "src.utils", "qualname": "ChainMetadata", "kind": "variable", "doc": "

\n", "default_value": "dict[ChainName, dict[str, src.utils.types.NetworkMetadata]]"}, "src.utils.ChainName": {"fullname": "src.utils.ChainName", "modulename": "src.utils", "qualname": "ChainName", "kind": "variable", "doc": "

\n", "default_value": "Literal['ethereum', 'polygon', 'gnosis', 'avalanche', 'astar', 'shiden', 'localhost']"}, "src.utils.ContractVersion": {"fullname": "src.utils.ContractVersion", "modulename": "src.utils", "qualname": "ContractVersion", "kind": "variable", "doc": "

\n", "default_value": "Literal['2']"}, "src.utils.Bytes32": {"fullname": "src.utils.Bytes32", "modulename": "src.utils", "qualname": "Bytes32", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[str, AfterValidator(func=<function validate_bytes32>)]"}, "src.utils.ChecksumAddress": {"fullname": "src.utils.ChecksumAddress", "modulename": "src.utils", "qualname": "ChecksumAddress", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[str, AfterValidator(func=<function validate_checksum_address>)]"}, "src.utils.RpcEndpoint": {"fullname": "src.utils.RpcEndpoint", "modulename": "src.utils", "qualname": "RpcEndpoint", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]"}, "src.utils.Uint256": {"fullname": "src.utils.Uint256", "modulename": "src.utils", "qualname": "Uint256", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[int, AfterValidator(func=<function validate_uint256>)]"}, "src.utils.Uint8": {"fullname": "src.utils.Uint8", "modulename": "src.utils", "qualname": "Uint8", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[int, AfterValidator(func=<function validate_uint8>)]"}}, "docInfo": {"src": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "src.SdkClient": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 5}, "src.SdkClient.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 165, "bases": 0, "doc": 189}, "src.SdkClient.w3": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "src.SdkClient.rpc_endpoint": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 5}, "src.SdkClient.account": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "src.SdkClient.set_default_provider": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 46, "bases": 0, "doc": 83}, "src.SdkClient.set_custom_provider": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 70, "bases": 0, "doc": 66}, "src.SdkClient.set_account": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 85, "bases": 0, "doc": 102}, "src.SdkClient.get_account_address": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 54, "bases": 0, "doc": 40}, "src.JPYC": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 6}, "src.JPYC.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 84, "bases": 0, "doc": 106}, "src.JPYC.client": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "src.JPYC.contract": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "src.JPYC.is_minter": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 59, "bases": 0, "doc": 67}, "src.JPYC.minter_allowance": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.total_supply": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.balance_of": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.allowance": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.nonces": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 97, "bases": 0, "doc": 65}, "src.JPYC.configure_minter": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 142, "bases": 0, "doc": 115}, "src.JPYC.mint": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.transfer": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.transfer_from": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 185, "bases": 0, "doc": 128}, "src.JPYC.transfer_with_authorization": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 445, "bases": 0, "doc": 245}, "src.JPYC.receive_with_authorization": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 445, "bases": 0, "doc": 245}, "src.JPYC.cancel_authorization": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 269, "bases": 0, "doc": 165}, "src.JPYC.approve": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 112}, "src.JPYC.increase_allowance": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.decrease_allowance": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.permit": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 356, "bases": 0, "doc": 208}, "src.utils": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "src.utils.get_proxy_address": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 31, "bases": 0, "doc": 69}, "src.utils.get_artifacts": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 42, "bases": 0, "doc": 55}, "src.utils.resolve_artifacts_file_path": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 31, "bases": 0, "doc": 46}, "src.utils.enumerate_supported_networks": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 20}, "src.utils.get_default_rpc_endpoint": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 84, "bases": 0, "doc": 75}, "src.utils.SUPPORTED_CHAINS": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 379, "signature": 0, "bases": 0, "doc": 3}, "src.utils.POA_MIDDLEWARE": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 6, "signature": 0, "bases": 0, "doc": 3}, "src.utils.SIGN_MIDDLEWARE": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 6, "signature": 0, "bases": 0, "doc": 3}, "src.utils.UINT_MIN": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "src.utils.UINT256_MAX": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "src.utils.UINT8_MAX": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "src.utils.remove_decimals": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 105, "bases": 0, "doc": 37}, "src.utils.restore_decimals": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "src.utils.AccountNotInitialized": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 14}, "src.utils.AccountNotInitialized.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidBytes32": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 14}, "src.utils.InvalidBytes32.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidBytes32.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidChecksumAddress": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 14}, "src.utils.InvalidChecksumAddress.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidChecksumAddress.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidUint8": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 13}, "src.utils.InvalidUint8.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidUint8.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidUint256": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 13}, "src.utils.InvalidUint256.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidUint256.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.NetworkNotSupported": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 41}, "src.utils.NetworkNotSupported.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 3}, "src.utils.NetworkNotSupported.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.TransactionFailed": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 23}, "src.utils.TransactionFailed.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.TransactionFailed.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.TransactionSimulationFailed": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 24}, "src.utils.TransactionSimulationFailed.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.TransactionSimulationFailed.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.ArtifactType": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ChainMetadata": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 6, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ChainName": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 23, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ContractVersion": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "src.utils.Bytes32": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 10, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ChecksumAddress": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 11, "signature": 0, "bases": 0, "doc": 3}, "src.utils.RpcEndpoint": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 11, "signature": 0, "bases": 0, "doc": 3}, "src.utils.Uint256": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 10, "signature": 0, "bases": 0, "doc": 3}, "src.utils.Uint8": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 10, "signature": 0, "bases": 0, "doc": 3}}, "length": 77, "save": true}, "index": {"qualname": {"root": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.w3": {"tf": 1}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 9}}}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 3}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}}}}}}}}}}, "s": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}, "w": {"3": {"docs": {"src.SdkClient.w3": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.RpcEndpoint": {"tf": 1}}, "df": 1}}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 3, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}}, "df": 4}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.approve": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}}, "df": 2}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.permit": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.client": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.contract": {"tf": 1}}, "df": 1, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.ContractVersion": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ChainName": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 4}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 21}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1, "t": {"docs": {"src.JPYC.mint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}}, "df": 3}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 2}}}}}}}}}, "a": {"docs": {}, "df": 0, "x": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}}, "df": 3}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}}, "df": 3}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.Bytes32": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.Uint256": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.UINT8_MAX": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 2}, "docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1}}}}}}, "fullname": {"root": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9, "s": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {"src": {"tf": 1}, "src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.w3": {"tf": 1}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}, "src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}, "src.utils.UINT_MIN": {"tf": 1}, "src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}, "src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainMetadata": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}, "src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 77}}, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.w3": {"tf": 1}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 9}}}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 3}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}}}}}}}}}}, "s": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}, "w": {"3": {"docs": {"src.SdkClient.w3": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.RpcEndpoint": {"tf": 1}}, "df": 1}}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 3, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}}, "df": 4}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.approve": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}}, "df": 2}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.permit": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.client": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.contract": {"tf": 1}}, "df": 1, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.ContractVersion": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ChainName": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 4}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 21}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1, "t": {"docs": {"src.JPYC.mint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}}, "df": 3}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 2}}}}}}}}}, "a": {"docs": {}, "df": 0, "x": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}}, "df": 3}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}}, "df": 3}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.Bytes32": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}, "src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}, "src.utils.UINT_MIN": {"tf": 1}, "src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}, "src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainMetadata": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}, "src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 46}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.Uint256": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.UINT8_MAX": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 2}, "docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"0": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.UINT_MIN": {"tf": 1}}, "df": 2}, "1": {"0": {"0": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}}, "df": 2}, "1": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}}, "df": 1}, "2": {"0": {"0": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"1": {"5": {"5": {"1": {"1": {"1": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"7": {"9": {"2": {"0": {"8": {"9": {"2": {"3": {"7": {"3": {"1": {"6": {"1": {"9": {"5": {"4": {"2": {"3": {"5": {"7": {"0": {"9": {"8": {"5": {"0": {"0": {"8": {"6": {"8": {"7": {"9": {"0": {"7": {"8": {"5": {"3": {"2": {"6": {"9": {"9": {"8": {"4": {"6": {"6": {"5": {"6": {"4": {"0": {"5": {"6": {"4": {"0": {"3": {"9": {"4": {"5": {"7": {"5": {"8": {"4": {"0": {"0": {"7": {"9": {"1": {"3": {"1": {"2": {"9": {"6": {"3": {"9": {"9": {"3": {"5": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, ":": {"8": {"5": {"4": {"5": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "2": {"0": {"0": {"docs": {"src.utils.InvalidChecksumAddress.code": {"tf": 1}}, "df": 1}, "1": {"docs": {"src.utils.InvalidUint8.code": {"tf": 1}}, "df": 1}, "2": {"docs": {"src.utils.InvalidUint256.code": {"tf": 1}}, "df": 1}, "3": {"docs": {"src.utils.InvalidBytes32.code": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "5": {"5": {"docs": {"src.utils.UINT8_MAX": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"src.utils.ContractVersion": {"tf": 1}}, "df": 1}, "3": {"0": {"0": {"docs": {"src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 1}, "1": {"docs": {"src.utils.TransactionFailed.code": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "1": {"3": {"3": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"6": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"3": {"1": {"1": {"3": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "4": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"9": {"2": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"0": {"0": {"0": {"2": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 9.591663046625438}, "src.utils.POA_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}, "src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 11, "x": {"2": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 12.083045973594572}, "src.utils.POA_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.ArtifactType": {"tf": 2}, "src.utils.ChainName": {"tf": 3.7416573867739413}, "src.utils.ContractVersion": {"tf": 1.4142135623730951}}, "df": 6}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.RpcEndpoint": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.3166247903554}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2.8284271247461903}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 2}}}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.3166247903554}}, "df": 1}, "o": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.3166247903554}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.7416573867739413}, "src.utils.RpcEndpoint": {"tf": 1}}, "df": 2}}}, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}}, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"1": {"2": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}, "a": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2}}, "df": 1}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}}, "x": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}}, "t": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}}}, "s": {"3": {"2": {"docs": {"src.utils.Bytes32": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}}, "df": 3}}}}}}, "t": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.Uint256": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.Uint8": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}}}}}, "signature": {"root": {"0": {"docs": {}, "df": 0, "x": {"1": {"0": {"8": {"6": {"2": {"1": {"1": {"docs": {}, "df": 0, "c": {"0": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "4": {"docs": {}, "df": 0, "e": {"0": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}}, "5": {"8": {"0": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"2": {"0": {"docs": {"src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "2": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}, "3": {"9": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"src.SdkClient.__init__": {"tf": 11.313708498984761}, "src.SdkClient.set_default_provider": {"tf": 6}, "src.SdkClient.set_custom_provider": {"tf": 7.3484692283495345}, "src.SdkClient.set_account": {"tf": 8.12403840463596}, "src.SdkClient.get_account_address": {"tf": 6.4031242374328485}, "src.JPYC.__init__": {"tf": 8.12403840463596}, "src.JPYC.is_minter": {"tf": 6.782329983125268}, "src.JPYC.minter_allowance": {"tf": 4.242640687119285}, "src.JPYC.total_supply": {"tf": 4.242640687119285}, "src.JPYC.balance_of": {"tf": 4.242640687119285}, "src.JPYC.allowance": {"tf": 4.242640687119285}, "src.JPYC.nonces": {"tf": 8.602325267042627}, "src.JPYC.configure_minter": {"tf": 10.344080432788601}, "src.JPYC.mint": {"tf": 10.344080432788601}, "src.JPYC.transfer": {"tf": 10.344080432788601}, "src.JPYC.transfer_from": {"tf": 11.874342087037917}, "src.JPYC.transfer_with_authorization": {"tf": 18.411952639521967}, "src.JPYC.receive_with_authorization": {"tf": 18.411952639521967}, "src.JPYC.cancel_authorization": {"tf": 14.352700094407323}, "src.JPYC.approve": {"tf": 10.344080432788601}, "src.JPYC.increase_allowance": {"tf": 10.344080432788601}, "src.JPYC.decrease_allowance": {"tf": 10.344080432788601}, "src.JPYC.permit": {"tf": 16.492422502470642}, "src.utils.get_proxy_address": {"tf": 4.898979485566356}, "src.utils.get_artifacts": {"tf": 5.744562646538029}, "src.utils.resolve_artifacts_file_path": {"tf": 5}, "src.utils.enumerate_supported_networks": {"tf": 3}, "src.utils.get_default_rpc_endpoint": {"tf": 8}, "src.utils.remove_decimals": {"tf": 9}, "src.utils.restore_decimals": {"tf": 3.1622776601683795}, "src.utils.InvalidBytes32.__init__": {"tf": 3.605551275463989}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 3.605551275463989}, "src.utils.InvalidUint8.__init__": {"tf": 3.605551275463989}, "src.utils.InvalidUint256.__init__": {"tf": 3.605551275463989}, "src.utils.NetworkNotSupported.__init__": {"tf": 4.47213595499958}, "src.utils.TransactionFailed.__init__": {"tf": 3.605551275463989}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 3.605551275463989}}, "df": 37, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}}, "df": 4, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}}, "df": 4}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}}, "df": 14, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported.__init__": {"tf": 1.4142135623730951}}, "df": 4}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 2.449489742783178}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 4}, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}}, "df": 4}}}}}}}, "s": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.449489742783178}, "src.JPYC.receive_with_authorization": {"tf": 2.449489742783178}, "src.JPYC.cancel_authorization": {"tf": 2.23606797749979}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2.23606797749979}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 27}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 17}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 3}}, "v": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 3}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 2}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}}}, "y": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}}, "df": 2}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}}, "df": 15}}}}}}, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 15}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 4}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}, "src.utils.restore_decimals": {"tf": 1}}, "df": 20, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "v": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}}, "df": 2, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 7}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3}}}}}}}, "g": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.get_artifacts": {"tf": 1.4142135623730951}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 2}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 4}}}}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 13}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2}}}}}}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "b": {"3": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}}, "df": 2}, "docs": {}, "df": 0}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.configure_minter": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 6}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 5}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 13}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 12}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4}, "docs": {}, "df": 0}}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.permit": {"tf": 1}}, "df": 1}}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient": {"tf": 1}, "src.JPYC": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 10}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient": {"tf": 1}, "src.JPYC": {"tf": 1}}, "df": 2}}}}}}}}}, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}}, "df": 1}}}}}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}}, "df": 1}}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 4}}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 4}}}}}}}}}}}, "doc": {"root": {"2": {"0": {"2": {"5": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"src": {"tf": 1.7320508075688772}, "src.SdkClient": {"tf": 1.7320508075688772}, "src.SdkClient.__init__": {"tf": 9.219544457292887}, "src.SdkClient.w3": {"tf": 1.4142135623730951}, "src.SdkClient.rpc_endpoint": {"tf": 1.4142135623730951}, "src.SdkClient.account": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 6.4031242374328485}, "src.SdkClient.set_custom_provider": {"tf": 5.830951894845301}, "src.SdkClient.set_account": {"tf": 7.0710678118654755}, "src.SdkClient.get_account_address": {"tf": 4.58257569495584}, "src.JPYC": {"tf": 1.7320508075688772}, "src.JPYC.__init__": {"tf": 6.782329983125268}, "src.JPYC.client": {"tf": 1.4142135623730951}, "src.JPYC.contract": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 6.164414002968976}, "src.JPYC.minter_allowance": {"tf": 1.7320508075688772}, "src.JPYC.total_supply": {"tf": 1.7320508075688772}, "src.JPYC.balance_of": {"tf": 1.7320508075688772}, "src.JPYC.allowance": {"tf": 1.7320508075688772}, "src.JPYC.nonces": {"tf": 6.244997998398398}, "src.JPYC.configure_minter": {"tf": 7.681145747868608}, "src.JPYC.mint": {"tf": 7.681145747868608}, "src.JPYC.transfer": {"tf": 7.681145747868608}, "src.JPYC.transfer_from": {"tf": 8.18535277187245}, "src.JPYC.transfer_with_authorization": {"tf": 10.816653826391969}, "src.JPYC.receive_with_authorization": {"tf": 10.816653826391969}, "src.JPYC.cancel_authorization": {"tf": 9.16515138991168}, "src.JPYC.approve": {"tf": 7.681145747868608}, "src.JPYC.increase_allowance": {"tf": 7.681145747868608}, "src.JPYC.decrease_allowance": {"tf": 7.681145747868608}, "src.JPYC.permit": {"tf": 10.099504938362077}, "src.utils": {"tf": 1.7320508075688772}, "src.utils.get_proxy_address": {"tf": 5.5677643628300215}, "src.utils.get_artifacts": {"tf": 5.196152422706632}, "src.utils.resolve_artifacts_file_path": {"tf": 4.69041575982343}, "src.utils.enumerate_supported_networks": {"tf": 3.3166247903554}, "src.utils.get_default_rpc_endpoint": {"tf": 6.082762530298219}, "src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.POA_MIDDLEWARE": {"tf": 1.7320508075688772}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1.7320508075688772}, "src.utils.UINT_MIN": {"tf": 1.7320508075688772}, "src.utils.UINT256_MAX": {"tf": 1.7320508075688772}, "src.utils.UINT8_MAX": {"tf": 1.7320508075688772}, "src.utils.remove_decimals": {"tf": 4.795831523312719}, "src.utils.restore_decimals": {"tf": 1.7320508075688772}, "src.utils.AccountNotInitialized": {"tf": 1.7320508075688772}, "src.utils.AccountNotInitialized.code": {"tf": 1.4142135623730951}, "src.utils.InvalidBytes32": {"tf": 1.7320508075688772}, "src.utils.InvalidBytes32.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidBytes32.code": {"tf": 1.4142135623730951}, "src.utils.InvalidChecksumAddress": {"tf": 1.7320508075688772}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidChecksumAddress.code": {"tf": 1.4142135623730951}, "src.utils.InvalidUint8": {"tf": 1.7320508075688772}, "src.utils.InvalidUint8.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidUint8.code": {"tf": 1.4142135623730951}, "src.utils.InvalidUint256": {"tf": 1.7320508075688772}, "src.utils.InvalidUint256.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidUint256.code": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported": {"tf": 4.358898943540674}, "src.utils.NetworkNotSupported.__init__": {"tf": 1.7320508075688772}, "src.utils.NetworkNotSupported.code": {"tf": 1.4142135623730951}, "src.utils.TransactionFailed": {"tf": 3.7416573867739413}, "src.utils.TransactionFailed.__init__": {"tf": 1.7320508075688772}, "src.utils.TransactionFailed.code": {"tf": 1.4142135623730951}, "src.utils.TransactionSimulationFailed": {"tf": 3.7416573867739413}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1.7320508075688772}, "src.utils.TransactionSimulationFailed.code": {"tf": 1.4142135623730951}, "src.utils.ArtifactType": {"tf": 1.7320508075688772}, "src.utils.ChainMetadata": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1.7320508075688772}, "src.utils.ContractVersion": {"tf": 1.7320508075688772}, "src.utils.Bytes32": {"tf": 1.7320508075688772}, "src.utils.ChecksumAddress": {"tf": 1.7320508075688772}, "src.utils.RpcEndpoint": {"tf": 1.7320508075688772}, "src.utils.Uint256": {"tf": 1.7320508075688772}, "src.utils.Uint8": {"tf": 1.7320508075688772}}, "df": 77, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 5, "d": {"docs": {}, "df": 0, "k": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 7, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1.4142135623730951}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}}, "df": 17}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 5}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 7}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}}, "df": 3, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 4}}}}}}}, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 12}}}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 2}, "src.JPYC.client": {"tf": 1}}, "df": 4}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": null}, "src.JPYC.__init__": {"tf": null}}, "df": 2}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.w3": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}}, "df": 8}, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 2.449489742783178}, "src.JPYC.contract": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1.7320508075688772}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1.7320508075688772}}, "df": 5, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}}, "df": 2}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported": {"tf": 1.4142135623730951}}, "df": 4, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.get_proxy_address": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}}, "df": 2, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 15}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 9}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 13}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 2}}, "i": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 3}}, "e": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_default_provider": {"tf": 1.7320508075688772}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1.4142135623730951}, "src.JPYC.total_supply": {"tf": 1.4142135623730951}, "src.JPYC.balance_of": {"tf": 1.4142135623730951}, "src.JPYC.allowance": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1.7320508075688772}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 2}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1.4142135623730951}}, "df": 19}}, "o": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 11, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 5}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 13, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}}}}}}}}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 4, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1.4142135623730951}}, "df": 5}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}}, "df": 3}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 17, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 2}, "d": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 13}}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 3, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 6}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 13}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 10}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4}, "docs": {}, "df": 0}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.w3": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 8}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.increase_allowance": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "t": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 1.4142135623730951}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 2.23606797749979}, "src.JPYC.mint": {"tf": 2.23606797749979}, "src.JPYC.transfer": {"tf": 2.23606797749979}, "src.JPYC.transfer_from": {"tf": 2.23606797749979}, "src.JPYC.transfer_with_authorization": {"tf": 2.6457513110645907}, "src.JPYC.receive_with_authorization": {"tf": 2.6457513110645907}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 2.23606797749979}, "src.JPYC.increase_allowance": {"tf": 2.23606797749979}, "src.JPYC.decrease_allowance": {"tf": 2.23606797749979}, "src.JPYC.permit": {"tf": 2.6457513110645907}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 20}, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 1.4142135623730951}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.23606797749979}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 26, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.client": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.23606797749979}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 25, "e": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 3}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 6}, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}}, "df": 4, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 2.8284271247461903}, "src.SdkClient.set_default_provider": {"tf": 2}, "src.utils.get_default_rpc_endpoint": {"tf": 2}, "src.utils.NetworkNotSupported": {"tf": 2}}, "df": 4}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"src.SdkClient.__init__": {"tf": 2.23606797749979}, "src.SdkClient.set_default_provider": {"tf": 1.7320508075688772}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 2}, "src.utils.NetworkNotSupported": {"tf": 1.7320508075688772}}, "df": 5, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}}}}}}}}, "s": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "e": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}}, "p": {"2": {"6": {"1": {"2": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 2.449489742783178}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 2}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 4, "s": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 10}}}}}, "a": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 1.4142135623730951}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 20, "m": {"docs": {}, "df": 0, "p": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}}, "df": 1}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 10}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 23}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.get_artifacts": {"tf": 2}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}}, "df": 2}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 2}, "src.SdkClient.get_account_address": {"tf": 1.7320508075688772}, "src.JPYC.is_minter": {"tf": 2}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 16, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 12}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1.4142135623730951}, "src.JPYC.__init__": {"tf": 2.449489742783178}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 2}, "src.utils.InvalidChecksumAddress": {"tf": 1.4142135623730951}}, "df": 17}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}, "y": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 3}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1.4142135623730951}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 7}}}}}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.approve": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}, "b": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 3, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.get_artifacts": {"tf": 2}, "src.utils.resolve_artifacts_file_path": {"tf": 1.7320508075688772}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_account": {"tf": 2.23606797749979}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1.4142135623730951}}, "df": 1}}}}, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}}, "df": 2}}}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 2}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1.7320508075688772}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 7}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 4}}}}}}}, "f": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1.4142135623730951}, "src.JPYC": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 2}, "src.utils.get_proxy_address": {"tf": 1.7320508075688772}, "src.utils.get_artifacts": {"tf": 1.7320508075688772}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}}, "df": 22}, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.nonces": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 6}}}}}, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 2.449489742783178}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 2}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 5, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}}}}}}, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 23}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1, "s": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 5}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 19}, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 12}}}, "e": {"docs": {}, "df": 0, "b": {"3": {"docs": {"src.SdkClient.w3": {"tf": 1.4142135623730951}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "i": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_account": {"tf": 2.23606797749979}}, "df": 2}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}}, "df": 1, "s": {"3": {"2": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}, "src.utils.InvalidBytes32": {"tf": 1}}, "df": 14}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "v": {"2": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}, "docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 3}, "src.JPYC.receive_with_authorization": {"tf": 3}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 20, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.remove_decimals": {"tf": 1.7320508075688772}}, "df": 7}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 2}, "src.utils.resolve_artifacts_file_path": {"tf": 1.7320508075688772}}, "df": 3}}}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2, "m": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}}, "df": 16}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1.4142135623730951}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 15}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 7}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 13}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1.7320508075688772}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 2}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 13}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}}, "df": 3}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.permit": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.TransactionFailed": {"tf": 1.4142135623730951}, "src.utils.TransactionSimulationFailed": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.mint": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 2.449489742783178}}, "df": 2}}}}}, "a": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}, "g": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 4}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 4}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}}}, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}}, "df": 1}}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + + // mirrored in build-search-index.js (part 1) + // Also split on html tags. this is a cheap heuristic, but good enough. + elasticlunr.tokenizer.setSeperator(/[\s\-.;&_'"=,()]+|<[^>]*>/); + + let searchIndex; + if (docs._isPrebuiltIndex) { + console.info("using precompiled search index"); + searchIndex = elasticlunr.Index.load(docs); + } else { + console.time("building search index"); + // mirrored in build-search-index.js (part 2) + searchIndex = elasticlunr(function () { + this.pipeline.remove(elasticlunr.stemmer); + this.pipeline.remove(elasticlunr.stopWordFilter); + this.addField("qualname"); + this.addField("fullname"); + this.addField("annotation"); + this.addField("default_value"); + this.addField("signature"); + this.addField("bases"); + this.addField("doc"); + this.setRef("fullname"); + }); + for (let doc of docs) { + searchIndex.addDoc(doc); + } + console.timeEnd("building search index"); + } + + return (term) => searchIndex.search(term, { + fields: { + qualname: {boost: 4}, + fullname: {boost: 2}, + annotation: {boost: 2}, + default_value: {boost: 2}, + signature: {boost: 2}, + bases: {boost: 2}, + doc: {boost: 1}, + }, + expand: true + }); +})(); \ No newline at end of file diff --git a/docs/core/src.html b/docs/core/src.html new file mode 100644 index 0000000..4cf8845 --- /dev/null +++ b/docs/core/src.html @@ -0,0 +1,2254 @@ + + + + + + + src API documentation + + + + + + + + + +
+
+

+src

+ + + + + + +
 1# from importlib.metadata import version
+ 2
+ 3from .client import SdkClient
+ 4from .jpyc import JPYC
+ 5
+ 6# __version__ = version("jpyc-core-sdk")
+ 7__all__ = [
+ 8    # "__version__",
+ 9    # client
+10    "SdkClient",
+11    # jpyc
+12    "JPYC",
+13    # utils
+14    "utils",
+15]
+
+ + +
+
+ +
+ + class + SdkClient(src.interfaces.client.ISdkClient): + + + +
+ +
 25class SdkClient(ISdkClient):
+ 26    """SDK client."""
+ 27
+ 28    @validate_call
+ 29    def __init__(
+ 30        self,
+ 31        chain_name: ChainName | None = None,
+ 32        network_name: str | None = None,
+ 33        rpc_endpoint: RpcEndpoint | None = None,
+ 34        private_key: Bytes32 | None = None,
+ 35    ) -> None:
+ 36        """Constructor that initializes SDK client.
+ 37
+ 38        Notes:
+ 39            - Either `chain_name` & `network_name` parameters\
+ 40              or `rpc_endpoint` parameter are required.
+ 41            - This constructor prioritizes `rpc_endpoint` parameter over\
+ 42            `chain_name` & `network_name` parameters when configuring `rpc_endpoint`.
+ 43
+ 44        Args:
+ 45            chain_name (str, optional): Chain name
+ 46            network_name (str, optional): Network name
+ 47            rpc_endpoint (RpcEndpoint, optional): RPC endpoint
+ 48            private_key (Bytes32, optional): private key of EOA
+ 49
+ 50        Raises:
+ 51            InvalidBytes32: If the supplied `private_key` is not in a valid form
+ 52            InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form
+ 53            NetworkNotSupported: If the specified network is not supported by the SDK
+ 54            ValidationError: If pydantic validation fails
+ 55        """
+ 56        rpc_endpoint = (
+ 57            rpc_endpoint
+ 58            if rpc_endpoint is not None
+ 59            else get_default_rpc_endpoint(chain_name, network_name)
+ 60        )
+ 61        account = Account.from_key(private_key) if private_key is not None else None
+ 62        w3 = self.__configure_w3(
+ 63            rpc_endpoint=rpc_endpoint,
+ 64            account=account,
+ 65        )
+ 66
+ 67        self.w3 = w3
+ 68        """Web3: Configured web3 instance"""
+ 69        self.rpc_endpoint = rpc_endpoint
+ 70        """str: RPC endpoint"""
+ 71        self.account = account
+ 72        """LocalAccount | None: Account instance"""
+ 73
+ 74    @staticmethod
+ 75    def __configure_w3(
+ 76        rpc_endpoint: RpcEndpoint,
+ 77        account: LocalAccount | None = None,
+ 78    ) -> Web3:
+ 79        """Configure a web3 instance.
+ 80
+ 81        Args:
+ 82            rpc_endpoint (RpcEndpoint): RPC endpoint
+ 83            account (LocalAccount, optional): Account instance
+ 84
+ 85        Returns:
+ 86            Web3: Configured web3 instance
+ 87        """
+ 88        w3 = Web3(HTTPProvider(rpc_endpoint))
+ 89        w3.middleware_onion.inject(
+ 90            ExtraDataToPOAMiddleware,
+ 91            name=POA_MIDDLEWARE,
+ 92            layer=0,
+ 93        )
+ 94        if account is not None:
+ 95            w3.eth.default_account = account.address
+ 96            w3.middleware_onion.inject(
+ 97                SignAndSendRawMiddlewareBuilder.build(account),
+ 98                name=SIGN_MIDDLEWARE,
+ 99                layer=0,
+100            )
+101        else:
+102            w3.eth.default_account = None  # type: ignore[assignment]
+103
+104        return w3
+105
+106    @validate_call
+107    def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3:
+108        self.w3 = self.__configure_w3(
+109            rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name),
+110            account=self.account,
+111        )
+112
+113        return self.w3
+114
+115    @validate_call
+116    def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3:
+117        self.w3 = self.__configure_w3(rpc_endpoint=rpc_endpoint, account=self.account)
+118
+119        return self.w3
+120
+121    @validate_call
+122    def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None:
+123        if private_key is None:
+124            self.account = None
+125            self.w3 = self.__configure_w3(
+126                rpc_endpoint=self.rpc_endpoint,
+127            )
+128        else:
+129            self.account = Account.from_key(private_key)
+130            self.w3 = self.__configure_w3(
+131                rpc_endpoint=self.rpc_endpoint, account=self.account
+132            )
+133
+134        return self.account
+135
+136    def get_account_address(self) -> ChecksumAddress:
+137        if self.account is None:
+138            raise AccountNotInitialized()
+139
+140        return self.account.address
+
+ + +

SDK client.

+
+ + +
+ +
+
@validate_call
+ + SdkClient( chain_name: ChainName | None = None, network_name: str | None = None, rpc_endpoint: Optional[Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]] = None, private_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]] = None) + + + +
+ +
28    @validate_call
+29    def __init__(
+30        self,
+31        chain_name: ChainName | None = None,
+32        network_name: str | None = None,
+33        rpc_endpoint: RpcEndpoint | None = None,
+34        private_key: Bytes32 | None = None,
+35    ) -> None:
+36        """Constructor that initializes SDK client.
+37
+38        Notes:
+39            - Either `chain_name` & `network_name` parameters\
+40              or `rpc_endpoint` parameter are required.
+41            - This constructor prioritizes `rpc_endpoint` parameter over\
+42            `chain_name` & `network_name` parameters when configuring `rpc_endpoint`.
+43
+44        Args:
+45            chain_name (str, optional): Chain name
+46            network_name (str, optional): Network name
+47            rpc_endpoint (RpcEndpoint, optional): RPC endpoint
+48            private_key (Bytes32, optional): private key of EOA
+49
+50        Raises:
+51            InvalidBytes32: If the supplied `private_key` is not in a valid form
+52            InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form
+53            NetworkNotSupported: If the specified network is not supported by the SDK
+54            ValidationError: If pydantic validation fails
+55        """
+56        rpc_endpoint = (
+57            rpc_endpoint
+58            if rpc_endpoint is not None
+59            else get_default_rpc_endpoint(chain_name, network_name)
+60        )
+61        account = Account.from_key(private_key) if private_key is not None else None
+62        w3 = self.__configure_w3(
+63            rpc_endpoint=rpc_endpoint,
+64            account=account,
+65        )
+66
+67        self.w3 = w3
+68        """Web3: Configured web3 instance"""
+69        self.rpc_endpoint = rpc_endpoint
+70        """str: RPC endpoint"""
+71        self.account = account
+72        """LocalAccount | None: Account instance"""
+
+ + +

Constructor that initializes SDK client.

+ +
Notes:
+ +
+
    +
  • Either chain_name & network_name parameters or rpc_endpoint parameter are required.
  • +
  • This constructor prioritizes rpc_endpoint parameter over chain_name & network_name parameters when configuring rpc_endpoint.
  • +
+
+ +
Arguments:
+ +
    +
  • chain_name (str, optional): Chain name
  • +
  • network_name (str, optional): Network name
  • +
  • rpc_endpoint (RpcEndpoint, optional): RPC endpoint
  • +
  • private_key (Bytes32, optional): private key of EOA
  • +
+ +
Raises:
+ +
    +
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • +
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • +
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • +
  • ValidationError: If pydantic validation fails
  • +
+
+ + +
+
+
+ w3 + + +
+ + +

Web3: Configured web3 instance

+
+ + +
+
+
+ rpc_endpoint + + +
+ + +

str: RPC endpoint

+
+ + +
+
+
+ account + + +
+ + +

LocalAccount | None: Account instance

+
+ + +
+
+ +
+
@validate_call
+ + def + set_default_provider(self, chain_name: ChainName, network_name: str) -> web3.main.Web3: + + + +
+ +
106    @validate_call
+107    def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3:
+108        self.w3 = self.__configure_w3(
+109            rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name),
+110            account=self.account,
+111        )
+112
+113        return self.w3
+
+ + +

Set provider using one of the default RPC endpoints.

+ +
Arguments:
+ +
    +
  • chain_name (str): Chain name
  • +
  • network_name (str): Network name
  • +
+ +
Returns:
+ +
+

Web3: Configured web3 instance

+
+ +
Raises:
+ +
    +
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • +
  • ValidationError: If pydantic validation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + set_custom_provider( self, rpc_endpoint: Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]) -> web3.main.Web3: + + + +
+ +
115    @validate_call
+116    def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3:
+117        self.w3 = self.__configure_w3(rpc_endpoint=rpc_endpoint, account=self.account)
+118
+119        return self.w3
+
+ + +

Set provider using a custom RPC endpoint.

+ +
Arguments:
+ +
    +
  • rpc_endpoint (RpcEndpoint): Custom RPC endpoint
  • +
+ +
Returns:
+ +
+

Web3: Configured web3 instance

+
+ +
Raises:
+ +
    +
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + set_account( self, private_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]]) -> eth_account.signers.local.LocalAccount | None: + + + +
+ +
121    @validate_call
+122    def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None:
+123        if private_key is None:
+124            self.account = None
+125            self.w3 = self.__configure_w3(
+126                rpc_endpoint=self.rpc_endpoint,
+127            )
+128        else:
+129            self.account = Account.from_key(private_key)
+130            self.w3 = self.__configure_w3(
+131                rpc_endpoint=self.rpc_endpoint, account=self.account
+132            )
+133
+134        return self.account
+
+ + +

Set account with a private key.

+ +
Notes:
+ +
+

If private_key parameter is set to None, this method removes account from the configured web3 instance.

+
+ +
Arguments:
+ +
    +
  • private_key (Bytes32, optional): Private key of account
  • +
+ +
Returns:
+ +
+

LocalAccount | None: Configured account instance

+
+ +
Raises:
+ +
    +
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • +
+
+ + +
+
+ +
+ + def + get_account_address( self) -> Annotated[str, AfterValidator(func=<function validate_checksum_address at 0x1086211c0>)]: + + + +
+ +
136    def get_account_address(self) -> ChecksumAddress:
+137        if self.account is None:
+138            raise AccountNotInitialized()
+139
+140        return self.account.address
+
+ + +

Get address of the configured account.

+ +
Returns:
+ +
+

ChecksumAddress: Public address of account

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
+
+ + +
+
+
+ +
+ + class + JPYC(src.interfaces.jpyc.IJPYC): + + + +
+ +
 32class JPYC(IJPYC):
+ 33    """Implementation of IJPYC."""
+ 34
+ 35    def __init__(
+ 36        self,
+ 37        client: SdkClient,
+ 38        contract_version: ContractVersion = "2",
+ 39        contract_address: EthChecksumAddress | None = None,
+ 40    ) -> None:
+ 41        """Constructor that initializes JPYC client.
+ 42
+ 43        Notes:
+ 44            - If `client` parameter is configured to use localhost network,\
+ 45            this deploys JPYC contracts to localhost network, initializes it,\
+ 46            and sets its address to `address` attribute.
+ 47            - If `contract_address` is supplied,\
+ 48            this configures contract instance with that address.
+ 49
+ 50        Args:
+ 51            client (SdkClient): Configured SDK client
+ 52            contract_version (ContractVersion): Contract version
+ 53            contract_address (EthChecksumAddress, optional): Contract address
+ 54        """
+ 55        if (
+ 56            client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"]
+ 57            and contract_address is None
+ 58        ):
+ 59            address = self.__deploy_contract(
+ 60                client=client,
+ 61                contract_version=contract_version,
+ 62            )
+ 63            contract = self.__get_contract(
+ 64                client=client,
+ 65                contract_address=address,
+ 66                contract_version=contract_version,
+ 67            )
+ 68            self.__initialize_contract(
+ 69                client=client,
+ 70                contract=contract,
+ 71            )
+ 72        else:
+ 73            address = (
+ 74                contract_address
+ 75                if contract_address is not None
+ 76                else get_proxy_address(contract_version=contract_version)
+ 77            )
+ 78            contract = self.__get_contract(
+ 79                client=client,
+ 80                contract_address=address,
+ 81                contract_version=contract_version,
+ 82            )
+ 83
+ 84        self.client = client
+ 85        """ISdkClient: Configured SDK client"""
+ 86        self.contract = contract
+ 87        """Contract: Configured contract instance"""
+ 88
+ 89    ##################
+ 90    # Helper methods #
+ 91    ##################
+ 92
+ 93    @staticmethod
+ 94    def __deploy_contract(
+ 95        client: SdkClient,
+ 96        contract_version: ContractVersion = "2",
+ 97    ) -> ChecksumAddress:
+ 98        """Deploy contracts to the configured network.
+ 99
+100        Note:
+101            This helper method is mainly for development purposes. \
+102            Please use this method to deploy contracts to localhost network.
+103
+104        Args:
+105            client (SdkClient): Configured SDK client
+106            contract_version (ContractVersion): Contract version
+107
+108        Returns:
+109            ChecksumAddress: Address of the deployed contracts
+110        """
+111        file_path = resolve_artifacts_file_path(contract_version=contract_version)
+112        contract = client.w3.eth.contract(
+113            abi=get_artifacts(file_path, "abi"),
+114            bytecode=get_artifacts(file_path, "bytecode"),
+115        )
+116        tx_hash = contract.constructor().transact()
+117
+118        return client.w3.eth.wait_for_transaction_receipt(tx_hash).contractAddress  # type: ignore[attr-defined]
+119
+120    @staticmethod
+121    def __get_contract(
+122        client: SdkClient,
+123        contract_address: ChecksumAddress,
+124        contract_version: ContractVersion = "2",
+125    ) -> Contract:
+126        """Get contract instance from the configured network.
+127
+128        Args:
+129            client (SdkClient): Configured SDK client
+130            contract_address (ChecksumAddress): Contract address
+131            contract_version (ContractVersion): Contract version
+132
+133        Returns:
+134            Contract: Address of the deployed contracts
+135        """
+136        return client.w3.eth.contract(  # type: ignore[call-overload]
+137            address=contract_address,
+138            abi=get_artifacts(
+139                file_path=resolve_artifacts_file_path(
+140                    contract_version=contract_version
+141                ),
+142                artifact_type="abi",
+143            ),
+144        )
+145
+146    @staticmethod
+147    def __initialize_contract(
+148        client: SdkClient,
+149        contract: Contract,
+150    ) -> None:
+151        """Initialize contract.
+152
+153        Args:
+154            client (SdkClient): Configured SDK client
+155            contract (Contract): Configured contract instance
+156        """
+157        owner_address = client.get_account_address()
+158        contract.functions.initialize(
+159            "JPY Coin",
+160            "JPYC",
+161            "Yen",
+162            18,
+163            owner_address,
+164            owner_address,
+165            owner_address,
+166            owner_address,
+167            owner_address,
+168        ).transact()
+169
+170    def __account_initialized(self) -> None:
+171        """Checks if account is initialized.
+172
+173        Note:
+174            An account must be set to web3 instance to send transactions.
+175
+176        Raises:
+177            AccountNotInitialized: If account is not initialized
+178        """
+179        if SIGN_MIDDLEWARE not in self.client.w3.middleware_onion:
+180            raise AccountNotInitialized()
+181
+182    @staticmethod
+183    def __simulate_transaction(
+184        contract_func: ContractFunction,
+185        func_args: dict[str, object],
+186    ) -> None:
+187        """Simulates a transaction locally.
+188
+189        Note:
+190            This method should be called before sending actual transactions.
+191
+192        Args:
+193            contract_func (ContractFunction): Contract function
+194            func_args (dict[str, object]): Arguments of contract function
+195
+196        Raises:
+197            TransactionSimulationFailed: If transaction simulation fails
+198        """
+199        try:
+200            contract_func(**func_args).call()
+201        except Exception as e:
+202            raise TransactionSimulationFailed(str(e))
+203
+204    @staticmethod
+205    def __send_transaction(
+206        contract_func: ContractFunction,
+207        func_args: dict[str, object],
+208    ) -> Any:
+209        """Sends a transaction to blockchain.
+210
+211        Args:
+212            contract_func (ContractFunction): Contract function
+213            func_args (dict[str, object]): Arguments of contract function
+214
+215        Returns:
+216            Any: Response from the contract function
+217
+218        Raises:
+219            TransactionFailed: If transaction fails
+220        """
+221        try:
+222            return contract_func(**func_args).transact()
+223        except Exception as e:
+224            raise TransactionFailed(str(e))
+225
+226    def __transact(
+227        self, contract_func: ContractFunction, func_args: dict[str, object]
+228    ) -> Any:
+229        """Helper method to prepare & send a transaction in one method.
+230
+231        Args:
+232            contract_func (ContractFunction): Contract function
+233            func_args (dict[str, object]): Arguments of contract function
+234
+235        Returns:
+236            Any: Response from the contract function
+237
+238        Raises:
+239            AccountNotInitialized: If account is not initialized
+240            TransactionSimulationFailed: If transaction simulation fails
+241            TransactionFailed: If transaction fails
+242        """
+243
+244        self.__account_initialized()
+245        self.__simulate_transaction(
+246            contract_func,
+247            func_args,
+248        )
+249        return self.__send_transaction(
+250            contract_func,
+251            func_args,
+252        )
+253
+254    ##################
+255    # View functions #
+256    ##################
+257
+258    @validate_call
+259    def is_minter(self, account: ChecksumAddress) -> bool:
+260        return self.contract.functions.isMinter(account).call()
+261
+262    @restore_decimals
+263    @validate_call
+264    def minter_allowance(self, minter: ChecksumAddress) -> Uint256:
+265        return self.contract.functions.minterAllowance(minter).call()
+266
+267    @restore_decimals
+268    def total_supply(self) -> Uint256:
+269        return self.contract.functions.totalSupply().call()
+270
+271    @restore_decimals
+272    @validate_call
+273    def balance_of(self, account: ChecksumAddress) -> Uint256:
+274        return self.contract.functions.balanceOf(account).call()
+275
+276    @restore_decimals
+277    @validate_call
+278    def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256:
+279        return self.contract.functions.allowance(owner, spender).call()
+280
+281    @validate_call
+282    def nonces(self, owner: ChecksumAddress) -> Uint256:
+283        return self.contract.functions.nonces(owner).call()
+284
+285    ######################
+286    # Mutation functions #
+287    ######################
+288
+289    @validate_call
+290    def configure_minter(
+291        self, minter: ChecksumAddress, minter_allowed_amount: Uint256
+292    ) -> Bytes32:
+293        tx_args: TransactionArgs = {
+294            "contract_func": self.contract.functions.configureMinter,
+295            "func_args": {
+296                "minter": minter,
+297                "minterAllowedAmount": remove_decimals(minter_allowed_amount),
+298            },
+299        }
+300
+301        return self.__transact(**tx_args)
+302
+303    @validate_call
+304    def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32:
+305        tx_args: TransactionArgs = {
+306            "contract_func": self.contract.functions.mint,
+307            "func_args": {
+308                "_to": to,
+309                "_amount": remove_decimals(amount),
+310            },
+311        }
+312
+313        return self.__transact(**tx_args)
+314
+315    @validate_call
+316    def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32:
+317        tx_args: TransactionArgs = {
+318            "contract_func": self.contract.functions.transfer,
+319            "func_args": {
+320                "to": to,
+321                "value": remove_decimals(value),
+322            },
+323        }
+324
+325        return self.__transact(**tx_args)
+326
+327    @validate_call
+328    def transfer_from(
+329        self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256
+330    ) -> Bytes32:
+331        tx_args: TransactionArgs = {
+332            "contract_func": self.contract.functions.transferFrom,
+333            "func_args": {
+334                "from": from_,
+335                "to": to,
+336                "value": remove_decimals(value),
+337            },
+338        }
+339
+340        return self.__transact(**tx_args)
+341
+342    @validate_call
+343    def transfer_with_authorization(
+344        self,
+345        from_: ChecksumAddress,
+346        to: ChecksumAddress,
+347        value: Uint256,
+348        valid_after: Uint256,
+349        valid_before: Uint256,
+350        nonce: Bytes32,
+351        v: Uint8,
+352        r: Bytes32,
+353        s: Bytes32,
+354    ) -> Bytes32:
+355        tx_args: TransactionArgs = {
+356            "contract_func": self.contract.functions.transferWithAuthorization,
+357            "func_args": {
+358                "from": from_,
+359                "to": to,
+360                "value": remove_decimals(value),
+361                "validAfter": valid_after,
+362                "validBefore": valid_before,
+363                "nonce": nonce,
+364                "v": v,
+365                "r": r,
+366                "s": s,
+367            },
+368        }
+369
+370        return self.__transact(**tx_args)
+371
+372    @validate_call
+373    def receive_with_authorization(
+374        self,
+375        from_: ChecksumAddress,
+376        to: ChecksumAddress,
+377        value: Uint256,
+378        valid_after: Uint256,
+379        valid_before: Uint256,
+380        nonce: Bytes32,
+381        v: Uint8,
+382        r: Bytes32,
+383        s: Bytes32,
+384    ) -> Bytes32:
+385        tx_args: TransactionArgs = {
+386            "contract_func": self.contract.functions.receiveWithAuthorization,
+387            "func_args": {
+388                "from": from_,
+389                "to": to,
+390                "value": remove_decimals(value),
+391                "validAfter": valid_after,
+392                "validBefore": valid_before,
+393                "nonce": nonce,
+394                "v": v,
+395                "r": r,
+396                "s": s,
+397            },
+398        }
+399
+400        return self.__transact(**tx_args)
+401
+402    @validate_call
+403    def cancel_authorization(
+404        self,
+405        authorizer: ChecksumAddress,
+406        nonce: Bytes32,
+407        v: Uint8,
+408        r: Bytes32,
+409        s: Bytes32,
+410    ) -> Bytes32:
+411        tx_args: TransactionArgs = {
+412            "contract_func": self.contract.functions.cancelAuthorization,
+413            "func_args": {
+414                "authorizer": authorizer,
+415                "nonce": nonce,
+416                "v": v,
+417                "r": r,
+418                "s": s,
+419            },
+420        }
+421
+422        return self.__transact(**tx_args)
+423
+424    @validate_call
+425    def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32:
+426        tx_args: TransactionArgs = {
+427            "contract_func": self.contract.functions.approve,
+428            "func_args": {
+429                "spender": spender,
+430                "value": remove_decimals(value),
+431            },
+432        }
+433
+434        return self.__transact(**tx_args)
+435
+436    @validate_call
+437    def increase_allowance(
+438        self, spender: ChecksumAddress, increment: Uint256
+439    ) -> Bytes32:
+440        tx_args: TransactionArgs = {
+441            "contract_func": self.contract.functions.increaseAllowance,
+442            "func_args": {
+443                "spender": spender,
+444                "increment": remove_decimals(increment),
+445            },
+446        }
+447
+448        return self.__transact(**tx_args)
+449
+450    @validate_call
+451    def decrease_allowance(
+452        self, spender: ChecksumAddress, decrement: Uint256
+453    ) -> Bytes32:
+454        tx_args: TransactionArgs = {
+455            "contract_func": self.contract.functions.decreaseAllowance,
+456            "func_args": {
+457                "spender": spender,
+458                "decrement": remove_decimals(decrement),
+459            },
+460        }
+461
+462        return self.__transact(**tx_args)
+463
+464    @validate_call
+465    def permit(
+466        self,
+467        owner: ChecksumAddress,
+468        spender: ChecksumAddress,
+469        value: Uint256,
+470        deadline: Uint256,
+471        v: Uint8,
+472        r: Bytes32,
+473        s: Bytes32,
+474    ) -> Bytes32:
+475        tx_args: TransactionArgs = {
+476            "contract_func": self.contract.functions.permit,
+477            "func_args": {
+478                "owner": owner,
+479                "spender": spender,
+480                "value": remove_decimals(value),
+481                "deadline": deadline,
+482                "v": v,
+483                "r": r,
+484                "s": s,
+485            },
+486        }
+487
+488        return self.__transact(**tx_args)
+
+ + +

Implementation of IJPYC.

+
+ + +
+ +
+ + JPYC( client: SdkClient, contract_version: ContractVersion = '2', contract_address: Optional[eth_typing.evm.ChecksumAddress] = None) + + + +
+ +
35    def __init__(
+36        self,
+37        client: SdkClient,
+38        contract_version: ContractVersion = "2",
+39        contract_address: EthChecksumAddress | None = None,
+40    ) -> None:
+41        """Constructor that initializes JPYC client.
+42
+43        Notes:
+44            - If `client` parameter is configured to use localhost network,\
+45            this deploys JPYC contracts to localhost network, initializes it,\
+46            and sets its address to `address` attribute.
+47            - If `contract_address` is supplied,\
+48            this configures contract instance with that address.
+49
+50        Args:
+51            client (SdkClient): Configured SDK client
+52            contract_version (ContractVersion): Contract version
+53            contract_address (EthChecksumAddress, optional): Contract address
+54        """
+55        if (
+56            client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"]
+57            and contract_address is None
+58        ):
+59            address = self.__deploy_contract(
+60                client=client,
+61                contract_version=contract_version,
+62            )
+63            contract = self.__get_contract(
+64                client=client,
+65                contract_address=address,
+66                contract_version=contract_version,
+67            )
+68            self.__initialize_contract(
+69                client=client,
+70                contract=contract,
+71            )
+72        else:
+73            address = (
+74                contract_address
+75                if contract_address is not None
+76                else get_proxy_address(contract_version=contract_version)
+77            )
+78            contract = self.__get_contract(
+79                client=client,
+80                contract_address=address,
+81                contract_version=contract_version,
+82            )
+83
+84        self.client = client
+85        """ISdkClient: Configured SDK client"""
+86        self.contract = contract
+87        """Contract: Configured contract instance"""
+
+ + +

Constructor that initializes JPYC client.

+ +
Notes:
+ +
+
    +
  • If client parameter is configured to use localhost network, this deploys JPYC contracts to localhost network, initializes it, and sets its address to address attribute.
  • +
  • If contract_address is supplied, this configures contract instance with that address.
  • +
+
+ +
Arguments:
+ +
    +
  • client (SdkClient): Configured SDK client
  • +
  • contract_version (ContractVersion): Contract version
  • +
  • contract_address (EthChecksumAddress, optional): Contract address
  • +
+
+ + +
+
+
+ client + + +
+ + +

ISdkClient: Configured SDK client

+
+ + +
+
+
+ contract + + +
+ + +

Contract: Configured contract instance

+
+ + +
+
+ +
+
@validate_call
+ + def + is_minter( self, account: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> bool: + + + +
+ +
258    @validate_call
+259    def is_minter(self, account: ChecksumAddress) -> bool:
+260        return self.contract.functions.isMinter(account).call()
+
+ + +

Call isMinter function.

+ +
Arguments:
+ +
    +
  • account (ChecksumAddress): Account address
  • +
+ +
Returns:
+ +
+

bool: True if account is a minter, false otherwise

+
+ +
Raises:
+ +
    +
  • InvalidChecksumAddress: If supplied account is not in a valid form
  • +
+
+ + +
+
+ +
+ + def + minter_allowance(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+ + def + total_supply(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+ + def + balance_of(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+ + def + allowance(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+
@validate_call
+ + def + nonces( self, owner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]: + + + +
+ +
281    @validate_call
+282    def nonces(self, owner: ChecksumAddress) -> Uint256:
+283        return self.contract.functions.nonces(owner).call()
+
+ + +

Call nonces function.

+ +
Arguments:
+ +
    +
  • owner (ChecksumAddress): Owner address
  • +
+ +
Returns:
+ +
+

Uint256: Nonce for EIP2612's permit.

+
+ +
Raises:
+ +
    +
  • InvalidChecksumAddress: If supplied owner is not in a valid form
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + configure_minter( self, minter: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], minter_allowed_amount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
289    @validate_call
+290    def configure_minter(
+291        self, minter: ChecksumAddress, minter_allowed_amount: Uint256
+292    ) -> Bytes32:
+293        tx_args: TransactionArgs = {
+294            "contract_func": self.contract.functions.configureMinter,
+295            "func_args": {
+296                "minter": minter,
+297                "minterAllowedAmount": remove_decimals(minter_allowed_amount),
+298            },
+299        }
+300
+301        return self.__transact(**tx_args)
+
+ + +

Call configureMinter function.

+ +
Arguments:
+ +
    +
  • minter (ChecksumAddress): Minter address
  • +
  • minter_allowed_amount (Uint256): Minter allowance
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied minter is not in a valid form
  • +
  • InvalidUint256: If supplied minter_allowed_amount is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + mint( self, to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], amount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
303    @validate_call
+304    def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32:
+305        tx_args: TransactionArgs = {
+306            "contract_func": self.contract.functions.mint,
+307            "func_args": {
+308                "_to": to,
+309                "_amount": remove_decimals(amount),
+310            },
+311        }
+312
+313        return self.__transact(**tx_args)
+
+ + +

Call mint function.

+ +
Arguments:
+ +
    +
  • to (ChecksumAddress): Receiver address
  • +
  • amount (Uint256): Amount of tokens to mint
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • +
  • InvalidUint256: If supplied amount is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + transfer( self, to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
315    @validate_call
+316    def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32:
+317        tx_args: TransactionArgs = {
+318            "contract_func": self.contract.functions.transfer,
+319            "func_args": {
+320                "to": to,
+321                "value": remove_decimals(value),
+322            },
+323        }
+324
+325        return self.__transact(**tx_args)
+
+ + +

Call transfer function.

+ +
Arguments:
+ +
    +
  • to (ChecksumAddress): Receiver address
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • +
  • InvalidUint256: If supplied value is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + transfer_from( self, from_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
327    @validate_call
+328    def transfer_from(
+329        self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256
+330    ) -> Bytes32:
+331        tx_args: TransactionArgs = {
+332            "contract_func": self.contract.functions.transferFrom,
+333            "func_args": {
+334                "from": from_,
+335                "to": to,
+336                "value": remove_decimals(value),
+337            },
+338        }
+339
+340        return self.__transact(**tx_args)
+
+ + +

Call transferFrom function.

+ +
Arguments:
+ +
    +
  • from_ (ChecksumAddress): Owner address
  • +
  • to (ChecksumAddress): Receiver address
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • +
  • InvalidUint256: If supplied value is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + transfer_with_authorization( self, from_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)], nonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
342    @validate_call
+343    def transfer_with_authorization(
+344        self,
+345        from_: ChecksumAddress,
+346        to: ChecksumAddress,
+347        value: Uint256,
+348        valid_after: Uint256,
+349        valid_before: Uint256,
+350        nonce: Bytes32,
+351        v: Uint8,
+352        r: Bytes32,
+353        s: Bytes32,
+354    ) -> Bytes32:
+355        tx_args: TransactionArgs = {
+356            "contract_func": self.contract.functions.transferWithAuthorization,
+357            "func_args": {
+358                "from": from_,
+359                "to": to,
+360                "value": remove_decimals(value),
+361                "validAfter": valid_after,
+362                "validBefore": valid_before,
+363                "nonce": nonce,
+364                "v": v,
+365                "r": r,
+366                "s": s,
+367            },
+368        }
+369
+370        return self.__transact(**tx_args)
+
+ + +

Call transferWithAuthorization function.

+ +
Arguments:
+ +
    +
  • from_ (ChecksumAddress): Owner address
  • +
  • to (ChecksumAddress): Receiver allowance
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
  • valid_after (Uint256): Unix time when transaction becomes valid
  • +
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • +
  • nonce (Bytes32): Unique nonce
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • +
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + receive_with_authorization( self, from_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)], nonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
372    @validate_call
+373    def receive_with_authorization(
+374        self,
+375        from_: ChecksumAddress,
+376        to: ChecksumAddress,
+377        value: Uint256,
+378        valid_after: Uint256,
+379        valid_before: Uint256,
+380        nonce: Bytes32,
+381        v: Uint8,
+382        r: Bytes32,
+383        s: Bytes32,
+384    ) -> Bytes32:
+385        tx_args: TransactionArgs = {
+386            "contract_func": self.contract.functions.receiveWithAuthorization,
+387            "func_args": {
+388                "from": from_,
+389                "to": to,
+390                "value": remove_decimals(value),
+391                "validAfter": valid_after,
+392                "validBefore": valid_before,
+393                "nonce": nonce,
+394                "v": v,
+395                "r": r,
+396                "s": s,
+397            },
+398        }
+399
+400        return self.__transact(**tx_args)
+
+ + +

Call receiveWithAuthorization function.

+ +
Arguments:
+ +
    +
  • from_ (ChecksumAddress): Owner address
  • +
  • to (ChecksumAddress): Receiver allowance
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
  • valid_after (Uint256): Unix time when transaction becomes valid
  • +
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • +
  • nonce (Bytes32): Unique nonce
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • +
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + cancel_authorization( self, authorizer: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], nonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
402    @validate_call
+403    def cancel_authorization(
+404        self,
+405        authorizer: ChecksumAddress,
+406        nonce: Bytes32,
+407        v: Uint8,
+408        r: Bytes32,
+409        s: Bytes32,
+410    ) -> Bytes32:
+411        tx_args: TransactionArgs = {
+412            "contract_func": self.contract.functions.cancelAuthorization,
+413            "func_args": {
+414                "authorizer": authorizer,
+415                "nonce": nonce,
+416                "v": v,
+417                "r": r,
+418                "s": s,
+419            },
+420        }
+421
+422        return self.__transact(**tx_args)
+
+ + +

Call cancelAuthorization function.

+ +
Arguments:
+ +
    +
  • authorizer (ChecksumAddress): Owner address
  • +
  • nonce (Bytes32): Unique nonce
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied authorizer is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + approve( self, spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
424    @validate_call
+425    def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32:
+426        tx_args: TransactionArgs = {
+427            "contract_func": self.contract.functions.approve,
+428            "func_args": {
+429                "spender": spender,
+430                "value": remove_decimals(value),
+431            },
+432        }
+433
+434        return self.__transact(**tx_args)
+
+ + +

Call approve function.

+ +
Arguments:
+ +
    +
  • spender (ChecksumAddress): Spender address
  • +
  • value (Uint256): Amount of allowance
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • +
  • InvalidUint256: If supplied value is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + increase_allowance( self, spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], increment: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
436    @validate_call
+437    def increase_allowance(
+438        self, spender: ChecksumAddress, increment: Uint256
+439    ) -> Bytes32:
+440        tx_args: TransactionArgs = {
+441            "contract_func": self.contract.functions.increaseAllowance,
+442            "func_args": {
+443                "spender": spender,
+444                "increment": remove_decimals(increment),
+445            },
+446        }
+447
+448        return self.__transact(**tx_args)
+
+ + +

Call increaseAllowance function.

+ +
Arguments:
+ +
    +
  • spender (ChecksumAddress): Spender address
  • +
  • increment (Uint256): Amount of allowance to increase
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • +
  • InvalidUint256: If supplied increment is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + decrease_allowance( self, spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], decrement: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
450    @validate_call
+451    def decrease_allowance(
+452        self, spender: ChecksumAddress, decrement: Uint256
+453    ) -> Bytes32:
+454        tx_args: TransactionArgs = {
+455            "contract_func": self.contract.functions.decreaseAllowance,
+456            "func_args": {
+457                "spender": spender,
+458                "decrement": remove_decimals(decrement),
+459            },
+460        }
+461
+462        return self.__transact(**tx_args)
+
+ + +

Call decreaseAllowance function.

+ +
Arguments:
+ +
    +
  • spender (ChecksumAddress): Spender address
  • +
  • decrement (Uint256): Amount of allowance to decrease
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • +
  • InvalidUint256: If supplied decrement is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + permit( self, owner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)], deadline: Annotated[int, AfterValidator(func=<function validate_uint256>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
464    @validate_call
+465    def permit(
+466        self,
+467        owner: ChecksumAddress,
+468        spender: ChecksumAddress,
+469        value: Uint256,
+470        deadline: Uint256,
+471        v: Uint8,
+472        r: Bytes32,
+473        s: Bytes32,
+474    ) -> Bytes32:
+475        tx_args: TransactionArgs = {
+476            "contract_func": self.contract.functions.permit,
+477            "func_args": {
+478                "owner": owner,
+479                "spender": spender,
+480                "value": remove_decimals(value),
+481                "deadline": deadline,
+482                "v": v,
+483                "r": r,
+484                "s": s,
+485            },
+486        }
+487
+488        return self.__transact(**tx_args)
+
+ + +

Call permit function.

+ +
Arguments:
+ +
    +
  • owner (ChecksumAddress): Owner address
  • +
  • spender (ChecksumAddress): Spender address
  • +
  • value (Uint256): Amount of allowance
  • +
  • deadline (Uint256): Unix time when transaction becomes invalid
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied owner or spender is not in a valid form
  • +
  • InvalidUint256: If supplied value or deadline is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+
+ + \ No newline at end of file diff --git a/docs/core/src/utils.html b/docs/core/src/utils.html new file mode 100644 index 0000000..7def8d2 --- /dev/null +++ b/docs/core/src/utils.html @@ -0,0 +1,1501 @@ + + + + + + + src.utils API documentation + + + + + + + + + +
+
+

+src.utils

+ + + + + + +
 1from .addresses import get_proxy_address
+ 2from .artifacts import (
+ 3    get_artifacts,
+ 4    resolve_artifacts_file_path,
+ 5)
+ 6from .chains import (
+ 7    SUPPORTED_CHAINS,
+ 8    enumerate_supported_networks,
+ 9    get_default_rpc_endpoint,
+10)
+11from .constants import (
+12    POA_MIDDLEWARE,
+13    SIGN_MIDDLEWARE,
+14    UINT8_MAX,
+15    UINT256_MAX,
+16    UINT_MIN,
+17)
+18from .currencies import (
+19    remove_decimals,
+20    restore_decimals,
+21)
+22from .errors import (
+23    AccountNotInitialized,
+24    InvalidBytes32,
+25    InvalidChecksumAddress,
+26    InvalidUint8,
+27    InvalidUint256,
+28    NetworkNotSupported,
+29    TransactionFailed,
+30    TransactionSimulationFailed,
+31)
+32from .types import (
+33    ArtifactType,
+34    ChainMetadata,
+35    ChainName,
+36    ContractVersion,
+37)
+38from .validators import (
+39    Bytes32,
+40    ChecksumAddress,
+41    RpcEndpoint,
+42    Uint8,
+43    Uint256,
+44)
+45
+46__all__ = [
+47    # addresses
+48    "get_proxy_address",
+49    # artifacts
+50    "get_artifacts",
+51    "resolve_artifacts_file_path",
+52    # chains
+53    "enumerate_supported_networks",
+54    "get_default_rpc_endpoint",
+55    "SUPPORTED_CHAINS",
+56    # constants
+57    "POA_MIDDLEWARE",
+58    "SIGN_MIDDLEWARE",
+59    "UINT_MIN",
+60    "UINT256_MAX",
+61    "UINT8_MAX",
+62    # currencies
+63    "remove_decimals",
+64    "restore_decimals",
+65    # errors
+66    "AccountNotInitialized",
+67    "InvalidBytes32",
+68    "InvalidChecksumAddress",
+69    "InvalidUint8",
+70    "InvalidUint256",
+71    "NetworkNotSupported",
+72    "TransactionFailed",
+73    "TransactionSimulationFailed",
+74    # types
+75    "ArtifactType",
+76    "ChainMetadata",
+77    "ChainName",
+78    "ContractVersion",
+79    # validators
+80    "Bytes32",
+81    "ChecksumAddress",
+82    "RpcEndpoint",
+83    "Uint256",
+84    "Uint8",
+85]
+
+ + +
+
+ +
+ + def + get_proxy_address(contract_version: ContractVersion) -> eth_typing.evm.ChecksumAddress: + + + +
+ +
43def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress:
+44    """Get proxy address from the specified version.
+45
+46    Note:
+47        Default address should be the address of the latest version \
+48        (e.g., v2 as of May 2025).
+49
+50    Args:
+51        contract_version (ContractVersion): Contract version
+52
+53    Returns:
+54        ChecksumAddress: Checksum address of proxy contract
+55    """
+56    match contract_version:
+57        case "2":
+58            return V2_PROXY_ADDRESS
+
+ + +

Get proxy address from the specified version.

+ +
Note:
+ +
+

Default address should be the address of the latest version (e.g., v2 as of May 2025).

+
+ +
Arguments:
+ +
    +
  • contract_version (ContractVersion): Contract version
  • +
+ +
Returns:
+ +
+

ChecksumAddress: Checksum address of proxy contract

+
+
+ + +
+
+ +
+ + def + get_artifacts(file_path: pathlib._local.Path, artifact_type: ArtifactType) -> Any: + + + +
+ +
25def get_artifacts(file_path: Path, artifact_type: ArtifactType) -> Any:
+26    """Get contract artifacts from the specified file path.
+27
+28    Args:
+29        file_path (Path): absolute path of artifacts file
+30        artifact_type (ArtifactType): type of artifacts
+31
+32    Returns:
+33        Any: Artifacts of contracts
+34    """
+35    with open(file_path) as f:
+36        return json.load(f)[artifact_type]
+
+ + +

Get contract artifacts from the specified file path.

+ +
Arguments:
+ +
    +
  • file_path (Path): absolute path of artifacts file
  • +
  • artifact_type (ArtifactType): type of artifacts
  • +
+ +
Returns:
+ +
+

Any: Artifacts of contracts

+
+
+ + +
+
+ +
+ + def + resolve_artifacts_file_path(contract_version: ContractVersion) -> pathlib._local.Path: + + + +
+ +
 9def resolve_artifacts_file_path(contract_version: ContractVersion) -> Path:
+10    """Resolve the path of artifacts file from the specified contract version.
+11
+12    Args:
+13        contract_version (ContractVersion): Contract version
+14
+15    Returns:
+16        Path: Absolute path of artifacts file
+17    """
+18    path = Path(__file__).parent.parent.parent.joinpath(
+19        "artifacts", f"v{contract_version}.json"
+20    )
+21
+22    return path.absolute()
+
+ + +

Resolve the path of artifacts file from the specified contract version.

+ +
Arguments:
+ +
    +
  • contract_version (ContractVersion): Contract version
  • +
+ +
Returns:
+ +
+

Path: Absolute path of artifacts file

+
+
+ + +
+
+ +
+ + def + enumerate_supported_networks() -> str: + + + +
+ +
90def enumerate_supported_networks() -> str:
+91    """Enumerate all the supported networks.
+92
+93    Returns:
+94        str: supported networks
+95    """
+96    return ", ".join(
+97        f"'{chain}' => {list(networks.keys())}"
+98        for chain, networks in SUPPORTED_CHAINS.items()
+99    )
+
+ + +

Enumerate all the supported networks.

+ +
Returns:
+ +
+

str: supported networks

+
+
+ + +
+
+ +
+ + def + get_default_rpc_endpoint( chain_name: ChainName | None, network_name: str | None) -> Annotated[str, AfterValidator(func=<function validate_rpc_endpoint at 0x108621620>)]: + + + +
+ +
119def get_default_rpc_endpoint(
+120    chain_name: ChainName | None, network_name: str | None
+121) -> RpcEndpoint:
+122    """Get the default RPC endpoint for the specified network.
+123
+124    Args:
+125        chain_name (ChainName, optional): Chain name
+126        network_name (str, optional): Network name
+127
+128    Returns:
+129        RpcEndpoint: RPC endpoint
+130
+131    Raises:
+132        NetworkNotSupported: If the specified network is not supported by the SDK
+133    """
+134    if not is_supported_network(chain_name, network_name):
+135        raise NetworkNotSupported(chain_name, network_name)  # type: ignore[arg-type]
+136
+137    return SUPPORTED_CHAINS[chain_name][network_name]["rpc_endpoints"][0]  # type: ignore[index]
+
+ + +

Get the default RPC endpoint for the specified network.

+ +
Arguments:
+ +
    +
  • chain_name (ChainName, optional): Chain name
  • +
  • network_name (str, optional): Network name
  • +
+ +
Returns:
+ +
+

RpcEndpoint: RPC endpoint

+
+ +
Raises:
+ +
    +
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • +
+
+ + +
+
+
+ SUPPORTED_CHAINS = + + {'ethereum': {'mainnet': {'id': 1, 'name': 'Ethereum Mainnet', 'rpc_endpoints': ['https://ethereum-rpc.publicnode.com']}, 'sepolia': {'id': 11155111, 'name': 'Ethereum Sepolia Testnet', 'rpc_endpoints': ['https://ethereum-sepolia-rpc.publicnode.com']}}, 'polygon': {'mainnet': {'id': 137, 'name': 'Polygon Mainnet', 'rpc_endpoints': ['https://polygon-rpc.com']}, 'amoy': {'id': 80002, 'name': 'Polygon Amoy Testnet', 'rpc_endpoints': ['https://rpc-amoy.polygon.technology']}}, 'gnosis': {'mainnet': {'id': 100, 'name': 'Gnosis Chain', 'rpc_endpoints': ['https://rpc.gnosischain.com']}, 'chiado': {'id': 10200, 'name': 'Gnosis Chiado Testnet', 'rpc_endpoints': ['https://rpc.chiadochain.net']}}, 'avalanche': {'mainnet': {'id': 43114, 'name': 'Avalanche C-Chain', 'rpc_endpoints': ['https://api.avax.network/ext/bc/C/rpc']}, 'fuji': {'id': 43113, 'name': 'Avalanche Fuji Testnet', 'rpc_endpoints': ['https://api.avax-test.network/ext/bc/C/rpc']}}, 'astar': {'mainnet': {'id': 592, 'name': 'Astar Network', 'rpc_endpoints': ['https://astar.public.blastapi.io']}}, 'shiden': {'mainnet': {'id': 336, 'name': 'Shiden Network', 'rpc_endpoints': ['https://shiden.public.blastapi.io']}}, 'localhost': {'devnet': {'id': 31337, 'name': 'Localhost Network', 'rpc_endpoints': ['http://127.0.0.1:8545/']}}} + + +
+ + + + +
+
+
+ POA_MIDDLEWARE = +'poa_middleware' + + +
+ + + + +
+
+
+ SIGN_MIDDLEWARE = +'sign_middleware' + + +
+ + + + +
+
+
+ UINT_MIN = +0 + + +
+ + + + +
+
+
+ UINT256_MAX = +115792089237316195423570985008687907853269984665640564039457584007913129639935 + + +
+ + + + +
+
+
+ UINT8_MAX = +255 + + +
+ + + + +
+
+ +
+ + def + remove_decimals( value: Union[Annotated[int, AfterValidator(func=<function validate_uint256>)], decimal.Decimal]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]: + + + +
+ +
 9def remove_decimals(value: Uint256 | Decimal) -> Uint256:
+10    """Remove decimals.
+11
+12    Args:
+13        value (Uint256 | Decimal): Value in ether
+14
+15    Returns:
+16        Uint256: Value in wei
+17    """
+18    return Web3.to_wei(value, "ether")
+
+ + +

Remove decimals.

+ +
Arguments:
+ +
    +
  • value (Uint256 | Decimal): Value in ether
  • +
+ +
Returns:
+ +
+

Uint256: Value in wei

+
+
+ + +
+
+ +
+ + def + restore_decimals(func): + + + +
+ +
21def restore_decimals(func):  # type: ignore[no-untyped-def]
+22    """Decorator to restore decimals."""
+23
+24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+27
+28    return wrapper
+
+ + +

Decorator to restore decimals.

+
+ + +
+
+ +
+ + class + AccountNotInitialized(src.utils.errors.JpycSdkError): + + + +
+ +
41class AccountNotInitialized(JpycSdkError):
+42    """Raised when account is not initialized or hoisted to web3 instance."""
+43
+44    code = 101
+45
+46    def __init__(self) -> None:
+47        super().__init__(
+48            code=AccountNotInitialized.code,
+49            message="Account is not initialized.",
+50        )
+
+ + +

Raised when account is not initialized or hoisted to web3 instance.

+
+ + +
+
+ code = +101 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidBytes32(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
 94class InvalidBytes32(JpycSdkError, TypeError):
+ 95    """Raised when the given byte string is not a valid bytes32."""
+ 96
+ 97    code = 203
+ 98
+ 99    def __init__(self, message_: str) -> None:
+100        super().__init__(
+101            code=InvalidBytes32.code,
+102            message=f"Invalid bytes32: {message_}.",
+103        )
+
+ + +

Raised when the given byte string is not a valid bytes32.

+
+ + +
+ +
+ + InvalidBytes32(message_: str) + + + +
+ +
 99    def __init__(self, message_: str) -> None:
+100        super().__init__(
+101            code=InvalidBytes32.code,
+102            message=f"Invalid bytes32: {message_}.",
+103        )
+
+ + + + +
+
+
+ code = +203 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidChecksumAddress(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
56class InvalidChecksumAddress(JpycSdkError, TypeError):
+57    """Raised when the given address is not a valid checksum address."""
+58
+59    code = 200
+60
+61    def __init__(self, message_: str) -> None:
+62        super().__init__(
+63            code=InvalidChecksumAddress.code,
+64            message=f"Invalid checksum address: {message_}. "
+65            f"Address must be compatible with EIP55.",
+66        )
+
+ + +

Raised when the given address is not a valid checksum address.

+
+ + +
+ +
+ + InvalidChecksumAddress(message_: str) + + + +
+ +
61    def __init__(self, message_: str) -> None:
+62        super().__init__(
+63            code=InvalidChecksumAddress.code,
+64            message=f"Invalid checksum address: {message_}. "
+65            f"Address must be compatible with EIP55.",
+66        )
+
+ + + + +
+
+
+ code = +200 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidUint8(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
69class InvalidUint8(JpycSdkError, TypeError):
+70    """Raised when the given integer is not a valid uint8."""
+71
+72    code = 201
+73
+74    def __init__(self, message_: str) -> None:
+75        super().__init__(
+76            code=InvalidUint8.code,
+77            message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.",
+78        )
+
+ + +

Raised when the given integer is not a valid uint8.

+
+ + +
+ +
+ + InvalidUint8(message_: str) + + + +
+ +
74    def __init__(self, message_: str) -> None:
+75        super().__init__(
+76            code=InvalidUint8.code,
+77            message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.",
+78        )
+
+ + + + +
+
+
+ code = +201 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidUint256(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
81class InvalidUint256(JpycSdkError, TypeError):
+82    """Raised when the given integer is not a valid uint256."""
+83
+84    code = 202
+85
+86    def __init__(self, message_: str) -> None:
+87        super().__init__(
+88            code=InvalidUint256.code,
+89            message=f"Invalid uint256: {message_}. "
+90            f"Integer must be between 0 ~ 2^256 - 1.",
+91        )
+
+ + +

Raised when the given integer is not a valid uint256.

+
+ + +
+ +
+ + InvalidUint256(message_: str) + + + +
+ +
86    def __init__(self, message_: str) -> None:
+87        super().__init__(
+88            code=InvalidUint256.code,
+89            message=f"Invalid uint256: {message_}. "
+90            f"Integer must be between 0 ~ 2^256 - 1.",
+91        )
+
+ + + + +
+
+
+ code = +202 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + NetworkNotSupported(src.utils.errors.JpycSdkError): + + + +
+ +
21class NetworkNotSupported(JpycSdkError):
+22    """Raised when the specified network is not supported by the SDK.
+23
+24    Attributes:
+25        chain_name (str): Chain name
+26        network_name (str): Network name
+27    """
+28
+29    code = 100
+30
+31    def __init__(self, chain_name: ChainName, network_name: str) -> None:
+32        from .chains import enumerate_supported_networks
+33
+34        super().__init__(
+35            code=NetworkNotSupported.code,
+36            message=f"Network '{chain_name}/{network_name}' is not supported. "
+37            f"Supported networks are: {enumerate_supported_networks()}",
+38        )
+
+ + +

Raised when the specified network is not supported by the SDK.

+ +
Attributes:
+ +
    +
  • chain_name (str): Chain name
  • +
  • network_name (str): Network name
  • +
+
+ + +
+ +
+ + NetworkNotSupported(chain_name: ChainName, network_name: str) + + + +
+ +
31    def __init__(self, chain_name: ChainName, network_name: str) -> None:
+32        from .chains import enumerate_supported_networks
+33
+34        super().__init__(
+35            code=NetworkNotSupported.code,
+36            message=f"Network '{chain_name}/{network_name}' is not supported. "
+37            f"Supported networks are: {enumerate_supported_networks()}",
+38        )
+
+ + + + +
+
+
+ code = +100 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + TransactionFailed(src.utils.errors.JpycSdkError): + + + +
+ +
139class TransactionFailed(JpycSdkError):
+140    """Raised when transaction fails.
+141
+142    Attributes:
+143        message (str): Error message
+144    """
+145
+146    code = 301
+147
+148    def __init__(self, message_: str) -> None:
+149        super().__init__(
+150            code=TransactionFailed.code,
+151            message=f"Transaction failed: {message_}",
+152        )
+
+ + +

Raised when transaction fails.

+ +
Attributes:
+ +
    +
  • message (str): Error message
  • +
+
+ + +
+ +
+ + TransactionFailed(message_: str) + + + +
+ +
148    def __init__(self, message_: str) -> None:
+149        super().__init__(
+150            code=TransactionFailed.code,
+151            message=f"Transaction failed: {message_}",
+152        )
+
+ + + + +
+
+
+ code = +301 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + TransactionSimulationFailed(src.utils.errors.JpycSdkError): + + + +
+ +
123class TransactionSimulationFailed(JpycSdkError):
+124    """Raised when transaction simulation fails.
+125
+126    Attributes:
+127        message (str): Error message
+128    """
+129
+130    code = 300
+131
+132    def __init__(self, message_: str) -> None:
+133        super().__init__(
+134            code=TransactionSimulationFailed.code,
+135            message=f"Failed to simulate a transaction locally: {message_}",
+136        )
+
+ + +

Raised when transaction simulation fails.

+ +
Attributes:
+ +
    +
  • message (str): Error message
  • +
+
+ + +
+ +
+ + TransactionSimulationFailed(message_: str) + + + +
+ +
132    def __init__(self, message_: str) -> None:
+133        super().__init__(
+134            code=TransactionSimulationFailed.code,
+135            message=f"Failed to simulate a transaction locally: {message_}",
+136        )
+
+ + + + +
+
+
+ code = +300 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+
+ type ArtifactType = +Literal['abi', 'bytecode'] + + +
+ + + + +
+
+
+ type ChainMetadata = +dict[ChainName, dict[str, src.utils.types.NetworkMetadata]] + + +
+ + + + +
+
+
+ type ChainName = +Literal['ethereum', 'polygon', 'gnosis', 'avalanche', 'astar', 'shiden', 'localhost'] + + +
+ + + + +
+
+
+ type ContractVersion = +Literal['2'] + + +
+ + + + +
+
+
+ Bytes32 = +typing.Annotated[str, AfterValidator(func=<function validate_bytes32>)] + + +
+ + + + +
+
+
+ ChecksumAddress = +typing.Annotated[str, AfterValidator(func=<function validate_checksum_address>)] + + +
+ + + + +
+
+
+ RpcEndpoint = +typing.Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)] + + +
+ + + + +
+
+
+ Uint256 = +typing.Annotated[int, AfterValidator(func=<function validate_uint256>)] + + +
+ + + + +
+
+
+ Uint8 = +typing.Annotated[int, AfterValidator(func=<function validate_uint8>)] + + +
+ + + + +
+
+ + \ No newline at end of file From b99d416320f000bfd3dabad320c2cb4ed383e547 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 18:51:59 +0900 Subject: [PATCH 47/56] Remove unnecessary packages --- packages/core/pyproject.toml | 4 +- pyproject.toml | 1 + uv.lock | 158 +++++------------------------------ 3 files changed, 23 insertions(+), 140 deletions(-) diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 95852f2..21a5b00 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -53,7 +53,6 @@ dev = [ "pytest-cov>=6.1.1", "pytest-mock>=3.14.0", "ruff>=0.11.9", - "sphinx>=8.2.3", ] # pytest @@ -62,6 +61,9 @@ dev = [ testpaths = ["../../tests"] python_files = "test_*.py" python_functions = "test_*" +filterwarnings = [ + "ignore::DeprecationWarning", +] # Ruff diff --git a/pyproject.toml b/pyproject.toml index 1d300b4..36d6a15 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,5 +13,6 @@ members = ["packages/*"] [dependency-groups] dev = [ + "pdoc>=15.0.3", "pre-commit>=4.2.0", ] diff --git a/uv.lock b/uv.lock index b618192..18fa018 100644 --- a/uv.lock +++ b/uv.lock @@ -83,15 +83,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload-time = "2024-12-13T17:10:38.469Z" }, ] -[[package]] -name = "alabaster" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, -] - [[package]] name = "annotated-types" version = "0.7.0" @@ -110,15 +101,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, ] -[[package]] -name = "babel" -version = "2.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, -] - [[package]] name = "bitarray" version = "3.4.0" @@ -330,15 +312,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, ] -[[package]] -name = "docutils" -version = "0.21.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, -] - [[package]] name = "eth-abi" version = "5.2.0" @@ -553,15 +526,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] -[[package]] -name = "imagesize" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, -] - [[package]] name = "iniconfig" version = "2.1.0" @@ -600,7 +564,6 @@ dev = [ { name = "pytest-cov" }, { name = "pytest-mock" }, { name = "ruff" }, - { name = "sphinx" }, ] [package.metadata] @@ -617,7 +580,6 @@ dev = [ { name = "pytest-cov", specifier = ">=6.1.1" }, { name = "pytest-mock", specifier = ">=3.14.0" }, { name = "ruff", specifier = ">=0.11.9" }, - { name = "sphinx", specifier = ">=8.2.3" }, ] [[package]] @@ -627,13 +589,17 @@ source = { virtual = "." } [package.dev-dependencies] dev = [ + { name = "pdoc" }, { name = "pre-commit" }, ] [package.metadata] [package.metadata.requires-dev] -dev = [{ name = "pre-commit", specifier = ">=4.2.0" }] +dev = [ + { name = "pdoc", specifier = ">=15.0.3" }, + { name = "pre-commit", specifier = ">=4.2.0" }, +] [[package]] name = "markupsafe" @@ -797,6 +763,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/0f/c8b64d9b54ea631fcad4e9e3c8dbe8c11bb32a623be94f22974c88e71eaf/parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f", size = 48427, upload-time = "2022-09-03T17:01:13.814Z" }, ] +[[package]] +name = "pdoc" +version = "15.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/e9/66ab0fc39276a1818dea6302858ec9558964d8d9f1c90dd1facfe395d216/pdoc-15.0.3.tar.gz", hash = "sha256:6482d8ebbd40185fea5e6aec2f1592f4be92e93cf6bf70b9e2a00378bbaf3252", size = 155384, upload-time = "2025-04-21T12:55:47.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/37/bc3189471c63c84e15f7dc42d4b712747e9662ffbcfacfc4b6a93e6c3bc6/pdoc-15.0.3-py3-none-any.whl", hash = "sha256:686c921ef2622f166de5f73b7241935a4ddac79c8d10dbfa43def8c1fca86550", size = 145950, upload-time = "2025-04-21T12:55:46.178Z" }, +] + [[package]] name = "platformdirs" version = "4.3.8" @@ -1125,15 +1105,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/fb/e4c0ced9893b84ac95b7181d69a9786ce5879aeb3bbbcbba80a164f85d6a/rlp-4.1.0-py3-none-any.whl", hash = "sha256:8eca394c579bad34ee0b937aecb96a57052ff3716e19c7a578883e767bc5da6f", size = 19973, upload-time = "2025-02-04T22:05:57.05Z" }, ] -[[package]] -name = "roman-numerals-py" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, -] - [[package]] name = "ruff" version = "0.11.9" @@ -1159,97 +1130,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/f7/70aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417/ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca", size = 10741080, upload-time = "2025-05-09T16:19:39.605Z" }, ] -[[package]] -name = "snowballstemmer" -version = "3.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, -] - -[[package]] -name = "sphinx" -version = "8.2.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils" }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "roman-numerals-py" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, -] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, -] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, -] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, -] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, -] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, -] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, -] - [[package]] name = "toolz" version = "1.0.0" From 5f05ecb204c879fa75599cfe0ec662104b7a548a Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 18:52:12 +0900 Subject: [PATCH 48/56] Add 'README's --- packages/core/README.md | 122 +++++++++++++++++++------ packages/core/artifacts/README.md | 13 ++- packages/core/examples/README.md | 35 ++++--- packages/core/src/__init__.py | 2 + packages/core/src/interfaces/README.md | 15 ++- packages/core/src/utils/README.md | 23 +++-- tests/README.md | 30 ++++++ 7 files changed, 180 insertions(+), 60 deletions(-) create mode 100644 tests/README.md diff --git a/packages/core/README.md b/packages/core/README.md index 5122a95..0ed82ed 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -1,72 +1,136 @@ # Core SDK +Python SDK to interact with [the JPYCv2's core contracts](https://github.com/jcam1/JPYCv2/blob/main/contracts/v1/FiatTokenV1.sol). Ideal for those who want to interact with JPYC protocol in any Python-backend environments. + +## 🪄 Usage + +First, configure clients for the SDK. + +```py +from jpyc-core-sdk.client import SdkClient +from jpyc-core-sdk.jpyc import JPYC + +# Configure SDK client using default RPC endpoint +client = SdkClient( + chain_name="ethereum", + network_name="mainnet", + private_key={PRIVATE_KEY}, +) + +# Or configure SDK client using custom RPC endpoint +client = SdkClient( + chain_name="ethereum", + network_name="mainnet", + private_key={PRIVATE_KEY}, + rpc_endpoint={CUSTOM_RPC_ENDPOINT}, +) + +# Configure JPYC client +jpyc = JPYC(client=client) +``` + +Then, use the configured JPYC client to call JPYC's contract functions wherever you would like. + +```py +from {CONFIG_FILE} import jpyc + +# Call a contract function (e.g., transfer) +jpyc.transfer( + to={TO_ADDRESS}, + value=2025, +) +``` + +> [!NOTE] +> More code examples are available at [`examples` directory](./examples/). +> More detailed development documentation is available at [`docs` directory](../../docs/core/). + +## ⛓️ Supported Networks + +Please use one of the combinations of chain-network names when configuring the SDK clients. + +> [!TIP] +> For local testing & development, you could use `localhost`-`devnet` pair. + +| Chain Name | Network Names | +| ----------: | :------------------- | +| `ethereum` | `mainnet`, `sepolia` | +| `polygon` | `mainnet`, `amoy` | +| `gnosis` | `mainnet`, `chiado` | +| `avalanche` | `mainnet`, `fuji` | +| `astar` | `mainnet` | +| `shiden` | `mainnet` | +| `localhost` | `devnet` | + +## 💬 Supported Providers + +**We're currently supporting `HTTPProvider` (the most simple & widely-used one) only.** More providers (notably `WebSocketProvider`) are to be supported in the near future, so stay tuned! + +## 🛠 Development + > [!IMPORTANT] -> TODO: README in English +> Sections below are mainly for the advanced users (e.g., contributors of this repo). -## Package Management +### 📦 Package Management -### Add packages +#### Add packages ```sh -# Add packages for production +# add packages for production $ uv add {package_name} -# Add packages for development +# add packages for development $ uv add --dev {package_name} ``` -### Remove packages +#### Remove packages ```sh +# remove production packages $ uv remove {package_name} +# remove development packages +$ uv remove --dev {package_name} ``` -## Testing +### 🔎 Testing -```sh -# Run unit tests -$ uv run pytest -v -# Run unit tests with coverage info -$ uv run pytest -v --cov --cov-branch -# Run unit tests ignoring deprecation warnings -$ uv run pytest -W ignore::DeprecationWarning -``` +Please see [`README` at `tests` directory](../../tests/README.md). -## Static Code Analysis +### ✅ Static Code Analysis -### Linting +#### Linting ```sh -# Run linter without fixing +# run linter without fixing $ uv run riff check {dir_name} -# Run linter & auto-fix +# run linter & auto-fix (if available) $ uv run riff check {dir_name} --fix ``` -### Formatting +#### Formatting ```sh -# Run formatter without fixing +# run formatter without fixing $ uv run riff format {dir_name} --check -# Run formatter & auto-fix +# run formatter & auto-fix $ uv run riff format {dir_name} ``` -### Type Checking +#### Type Checking ```sh -# Run mypy +# run mypy $ uv run mypy {dir_name} ``` -### Pre-Commit Hooks +#### Pre-Commit Hooks -Pre-commit script is configured at [`.pre-commit-config.yaml`](../../.pre-commit-config.yaml). This automatically runs the configured hooks before executing any `git commit` commands. +Pre-commit script is configured at [`.pre-commit-config.yaml`](../../.pre-commit-config.yaml). This automatically runs the configured hooks before executing any `git commit` commands. You could also simulate the hooks by running the following. ```sh -# Simulate pre-commit hooks without creating an actual commit +# simulate pre-commit hooks without creating an actual commit $ uv run pre-commit run --all-files ``` -## Comments & Docstrings +### 📝 Comments & Docstrings -Docstrings should be written in the [Google-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). +Docstrings should be written in [the Google-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). diff --git a/packages/core/artifacts/README.md b/packages/core/artifacts/README.md index f757b5a..9c6e40d 100644 --- a/packages/core/artifacts/README.md +++ b/packages/core/artifacts/README.md @@ -1,10 +1,13 @@ # Artifacts -This directory contains the auto-generated artifacts of JPYC's [core contracts](https://github.com/jcam1/JPYCv2). +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains the auto-generated artifacts of [JPYC's core contracts](https://github.com/jcam1/JPYCv2). ## 📚 Available Versions -| Version | File | Description | -| ---------------: | :----------------------------------------------------- | :----------------------------------------------------- | -| `v3` | n/a | Coming Soon | -| `v2` | [`v2.json`](./v2.json) | Artifacts of JPYCv2 contracts (**latest**) | +| Version | File | Description | +| ------: | :--------------------- | :----------------------------------------- | +| `v3` | n/a | Coming Soon | +| `v2` | [`v2.json`](./v2.json) | Artifacts of JPYCv2 contracts (**latest**) | diff --git a/packages/core/examples/README.md b/packages/core/examples/README.md index 518b606..d574c61 100644 --- a/packages/core/examples/README.md +++ b/packages/core/examples/README.md @@ -2,17 +2,28 @@ This directory contains a collection of code examples of using the SDK. +## 🏃🏻 Run Code Examples + +Before running any examples, please make sure to start a blockchain network (i.e., execution client) on localhost. You can use some framework (e.g., [Foundry](https://book.getfoundry.sh/), [Hardhat](https://hardhat.org/)) or some direct client (e.g., [Geth](https://geth.ethereum.org/docs)). + +```sh +# cd into one of the package directories (e.g., `core`) +$ cd python-sdk/packages/core +# run a python file (e.g., `transfer`) +$ uv run examples/transfer.py +``` + ## 🌲 Directory Structure -| Module | Description | -| ---------------: | :----------------------------------------------------- | -| [`main`](./main.py) | Code example that configures SDK clients. | -| [`transfer`](./transfer.py) | Code example that uses `transfer` method. | -| [`transfer_from`](./transfer_from.py) | Code example that uses `approve` & `transferFrom` methods. | -| [`transfer_with_authorization`](./transfer_with_authorization.py) | Code example that uses `transferWithAuthorization` method. | -| [`receive_with_authorization`](./receive_with_authorization.py) | Code example that uses `receiveWithAuthorization` method. | -| [`cancel_authorization`](./cancel_authorization.py) | Code example that uses `cancelAuthorization` method. | -| [`permit`](./permit.py) | Code example that uses `permit` method. | -| [`mint`](./mint.py) | Code example that uses `mint` method. | -| [`constants`](./constants.py) | Some constants for code examples. | -| [`utils`](./utils.py) | Some utility functions for code examples. | +| Module | Description | +| ----------------------------------------------------------------: | :--------------------------------------------------------- | +| [`main`](./main.py) | Code example that configures SDK clients. | +| [`transfer`](./transfer.py) | Code example that uses `transfer` method. | +| [`transfer_from`](./transfer_from.py) | Code example that uses `approve` & `transferFrom` methods. | +| [`transfer_with_authorization`](./transfer_with_authorization.py) | Code example that uses `transferWithAuthorization` method. | +| [`receive_with_authorization`](./receive_with_authorization.py) | Code example that uses `receiveWithAuthorization` method. | +| [`cancel_authorization`](./cancel_authorization.py) | Code example that uses `cancelAuthorization` method. | +| [`permit`](./permit.py) | Code example that uses `permit` method. | +| [`mint`](./mint.py) | Code example that uses `mint` method. | +| [`constants`](./constants.py) | Some constants for code examples. | +| [`utils`](./utils.py) | Some utility functions for code examples. | diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py index 5c0ec42..c8f2b3a 100644 --- a/packages/core/src/__init__.py +++ b/packages/core/src/__init__.py @@ -10,4 +10,6 @@ "SdkClient", # jpyc "JPYC", + # utils + "utils", ] diff --git a/packages/core/src/interfaces/README.md b/packages/core/src/interfaces/README.md index 83aa6df..7a609c1 100644 --- a/packages/core/src/interfaces/README.md +++ b/packages/core/src/interfaces/README.md @@ -1,10 +1,17 @@ # Interfaces +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + This directory contains the interfaces of the SDK. +## 👨🏻‍💻 Implementation + +Please modify interface classes (expressed as [Python's abstract classes](https://docs.python.org/3/library/abc.html)) before modifying implementation classes. Comments should be written in [the Google-style docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). + ## 🌲 Directory Structure -| Module | Description | -| ---------------: | :----------------------------------------------------- | -| [`client`](./client.py) | Interface of SDK client. | -| [`jpyc`](./jpyc.py) | Interface of JPYC contracts. | +| Module | Description | +| ----------------------: | :--------------------------- | +| [`client`](./client.py) | Interface of SDK client. | +| [`jpyc`](./jpyc.py) | Interface of JPYC contracts. | diff --git a/packages/core/src/utils/README.md b/packages/core/src/utils/README.md index 58de36d..e067a0f 100644 --- a/packages/core/src/utils/README.md +++ b/packages/core/src/utils/README.md @@ -1,16 +1,19 @@ # Utils +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + This directory contains a collection of utility tools (e.g., functions, type definitions, constants) for the SDK. ## 🌲 Directory Structure -| Module | Description | -| ---------------: | :----------------------------------------------------- | -| [`addresses`](./addresses.py) | Address constants & helper functions for address-related operations. | -| [`artifacts`](./artifacts.py) | Helper functions to load contract artifacts. | -| [`chains`](./chains.py) | Chain constants & helper functions for chain-related operations. | -| [`constants`](./constants.py) | Common constants among modules. | -| [`currencies`](./currencies.py) | Helper functions for converting units of currencies. | -| [`errors`](./errors.py) | Custom error classes. | -| [`types`](./types.py) | Custom types. | -| [`validators`](./validators.py) | Pydantic validators. | +| Module | Description | +| ------------------------------: | :------------------------------------------------------------------- | +| [`addresses`](./addresses.py) | Address constants & helper functions for address-related operations. | +| [`artifacts`](./artifacts.py) | Helper functions to load contract artifacts. | +| [`chains`](./chains.py) | Chain constants & helper functions for chain-related operations. | +| [`constants`](./constants.py) | Common constants among modules. | +| [`currencies`](./currencies.py) | Helper functions for converting units of currencies. | +| [`errors`](./errors.py) | Custom error classes. | +| [`types`](./types.py) | Custom types. | +| [`validators`](./validators.py) | Pydantic validators & validator-enabled types. | diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..fd1999f --- /dev/null +++ b/tests/README.md @@ -0,0 +1,30 @@ +# Tests + +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains test code of the SDK. + +## 🏃🏻 Run Tests + +Run one of the following commands to run tests. Please run `uv run pytest --help` for other available CLI options. + +> [!NOTE] +> Testing results are also to be checked on our [CI workflow](../.github/workflows/check.yml). + +```sh +# cd into one of the package directories (e.g., `core`) +$ cd python-sdk/packages/core +# run tests with default config +$ uv run pytest +# run tests with verbosity +$ uv run pytest -v +# run tests with coverage info +$ uv run pytest --cov --cov-branch +``` + +## 🌲 Directory Structure + +| Module | Description | +| ---------------: | :---------------------------- | +| [`core`](./core) | Unit tests of `core` package. | From d0cb9054816241f1943c1b9f90200431d84929a4 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 19:23:42 +0900 Subject: [PATCH 49/56] Add contributing guidelines --- CONTRIBUTING.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..fee89c2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing Guidelines + +We appreciate your interest to contribute to this project! Please read the following to see how you could contribute. + +## 📝 Create an Issue + +The first thing to do is to create a new issue. Feel free to create new issues from [here](https://github.com/jcam1/python-sdk/issues/new/choose) to propose/request new features or report any bugs you found. + +## ⬇️ Clone This Repo + +Next, clone this repository. Our default branch is set to `develop`. + +```sh +git clone https://github.com/jcam1/python-sdk.git +``` + +## ⚡ Checkout to a New Branch + +You then need to `checkout` to a new branch (name whatever you would like) from the cloned `develop` branch. + +```sh +git checkout -b ${your_branch_name} +``` + +## 🛠 Write Code + +Now, write code to implement the proposed features and/or to fix bugs. Please refer to `README`s of respective SDKs for more details. + +## 🌟 Open a Pull Request + +Finally, open a new PR from your branch to `develop` branch, and describe what you'll have done following [our PR template](./.github/pull_request_template.md). From d4ced7a46c28c8d1539983f4e3a8d43e6cbe3901 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Thu, 22 May 2025 19:23:56 +0900 Subject: [PATCH 50/56] Update 'REAEME's --- README.md | 32 +++++++++++++++++++++++++++++++- packages/core/README.md | 3 +++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 95953c4..3626a01 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,34 @@ # JPYC Python SDK +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) +[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/jcam1/python-sdk/issues/new/choose) + +Monorepo for JPYC Python SDKs. + +## 💫 Available SDKs + +Please refer to `README`s of respective SDKs for more details. + +| name | `README` | +| -----: | :----------------------------------------- | +| `core` | [packages/core](./packages/core/README.md) | + +## ⬇️ Installation + +### Repository + +```sh +# clone this repo +$ git clone https://github.com/jcam1/python-sdk.git +# cd into the repo +$ cd python-sdk +``` + +### uv + > [!IMPORTANT] -> TODO: README in English +> This repo uses `uv` for package management purposes. If not installed, please read & follow [uv's official instructions](https://docs.astral.sh/uv/getting-started/installation/) to install any necessary software for development. + +## 💪🏻 Contributing + +Please refer to [CONTRIBUTING.md](./CONTRIBUTING.md). diff --git a/packages/core/README.md b/packages/core/README.md index 0ed82ed..fc7a90e 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -1,5 +1,8 @@ # Core SDK +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) +![build](https://github.com/jcam1/python-sdk/actions/workflows/check.yml/badge.svg) + Python SDK to interact with [the JPYCv2's core contracts](https://github.com/jcam1/JPYCv2/blob/main/contracts/v1/FiatTokenV1.sol). Ideal for those who want to interact with JPYC protocol in any Python-backend environments. ## 🪄 Usage From 742b30bfc4870b59812b8b89396a15a2b5e21157 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Fri, 23 May 2025 02:54:32 +0900 Subject: [PATCH 51/56] Modify workflows --- .github/actions/install-packages/action.yml | 2 +- .github/actions/publish-package/action.yml | 13 ------------- .github/workflows/publish.yml | 13 +++++++------ 3 files changed, 8 insertions(+), 20 deletions(-) delete mode 100644 .github/actions/publish-package/action.yml diff --git a/.github/actions/install-packages/action.yml b/.github/actions/install-packages/action.yml index a0b9e5e..e845bf2 100644 --- a/.github/actions/install-packages/action.yml +++ b/.github/actions/install-packages/action.yml @@ -4,7 +4,7 @@ description: set up uv & install packages runs: using: composite steps: - - uses: astral-sh/setup-uv@v5 + - uses: astral-sh/setup-uv@v6 with: version: "0.7.6" - uses: actions/setup-python@v5 diff --git a/.github/actions/publish-package/action.yml b/.github/actions/publish-package/action.yml deleted file mode 100644 index 9e725b9..0000000 --- a/.github/actions/publish-package/action.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: publish package -description: publish a package to PyPI -inputs: - pypi-auth-token: - description: 'PyPI token for authorization' - required: true - -runs: - using: composite - steps: - - name: Publish package - shell: bash - run: uv publish --token ${{ inputs.pypi-auth-token }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6448950..671d221 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,4 @@ -name: check +name: publish on: push: @@ -38,7 +38,9 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/install-packages - name: get version from `pyproject.toml` - run: GIT_TAG_VERSION=uv version >> $GITHUB_ENV + run: | + package_version=($(uv version)) + echo "GIT_TAG_VERSION=$package_version[2]" >> $GITHUB_ENV - uses: rickstaa/action-create-tag@v1 id: create-tag with: @@ -78,7 +80,6 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/install-packages - name: Build package - run: uv build - - uses: ./.github/actions/publish-package - with: - pypi-auth-token: ${{ secrets.PYPI_TOKEN }} + run: uv build --no-cache + - name: Publish package to PyPI + run: uv publish --no-cache From 9f83ab267b25ae2d58254a3dfecf85448c19922a Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Fri, 23 May 2025 02:54:57 +0900 Subject: [PATCH 52/56] Update 'core/pyproject.toml' --- packages/core/pyproject.toml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 21a5b00..3cdfcb1 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -3,7 +3,7 @@ name = "jpyc-core-sdk" version = "1.0.0" requires-python = ">=3.12" license = "MIT" -description = "Python SDKs for JPYCv2 contracts" +description = "A Python SDK for interacting with JPYCv2 contracts" readme = "README.md" keywords = [ "jpyc", @@ -42,7 +42,7 @@ dependencies = [ [project.urls] repository = "https://github.com/jcam1/python-sdk" -documentation = "https://github.com/jcam1/python-sdk/tree/main/docs" +documentation = "https://github.com/jcam1/python-sdk/tree/main/docs/core" "Bug Tracker" = "https://github.com/jcam1/python-sdk/issues/new?template=bug_report.md" [dependency-groups] @@ -55,6 +55,10 @@ dev = [ "ruff>=0.11.9", ] +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + # pytest [tool.pytest.ini_options] From def77decc7c6758ebf8f8e8f9499e570cb8275ce Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Fri, 23 May 2025 02:55:13 +0900 Subject: [PATCH 53/56] Update 'README's --- README-ja.md | 4 ---- README.md | 17 +++++++++++++---- docs/README.md | 6 +++++- packages/core/README.md | 22 +++++++++++++--------- 4 files changed, 31 insertions(+), 18 deletions(-) delete mode 100644 README-ja.md diff --git a/README-ja.md b/README-ja.md deleted file mode 100644 index bbbb123..0000000 --- a/README-ja.md +++ /dev/null @@ -1,4 +0,0 @@ -# JPYC Python SDK - -> [!IMPORTANT] -> TODO: README in Japanese diff --git a/README.md b/README.md index 3626a01..478138d 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Please refer to `README`s of respective SDKs for more details. ## ⬇️ Installation -### Repository +### 1. Clone Repository ```sh # clone this repo @@ -24,10 +24,19 @@ $ git clone https://github.com/jcam1/python-sdk.git $ cd python-sdk ``` -### uv +### 2. Install `uv` -> [!IMPORTANT] -> This repo uses `uv` for package management purposes. If not installed, please read & follow [uv's official instructions](https://docs.astral.sh/uv/getting-started/installation/) to install any necessary software for development. +This repo uses `uv` for package management purposes. If not installed, please read & follow [uv's official instructions](https://docs.astral.sh/uv/getting-started/installation/) to install any necessary software for development. For example, the following command installs `uv` on MacOS. + +```sh +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +### 3. Install packages + +```sh +uv sync +``` ## 💪🏻 Contributing diff --git a/docs/README.md b/docs/README.md index 55baa2e..46c7d60 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,4 +18,8 @@ $ uv run pdoc ./packages/core/src -o ./docs/core -d google ## 🔍 UI -Type `{absolute_path_of_any_parent_directories}/python-sdk/docs/index.html` into your browser to see the contents. +Type the following into your browser to see the contents. + +```sh +{absolute_path_of_any_parent_directories}/python-sdk/docs/core/index.html +``` diff --git a/packages/core/README.md b/packages/core/README.md index fc7a90e..6aad575 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -10,8 +10,8 @@ Python SDK to interact with [the JPYCv2's core contracts](https://github.com/jca First, configure clients for the SDK. ```py -from jpyc-core-sdk.client import SdkClient -from jpyc-core-sdk.jpyc import JPYC +from jpyc_core_sdk.client import SdkClient +from jpyc_core_sdk.jpyc import JPYC # Configure SDK client using default RPC endpoint client = SdkClient( @@ -44,9 +44,10 @@ jpyc.transfer( ) ``` -> [!NOTE] -> More code examples are available at [`examples` directory](./examples/). -> More detailed development documentation is available at [`docs` directory](../../docs/core/). +> [!NOTE] +> +> - More code examples are available at [`examples` directory](./examples/). +> - More detailed development documentation is available at [`docs` directory](../../docs/core/). ## ⛓️ Supported Networks @@ -100,22 +101,25 @@ Please see [`README` at `tests` directory](../../tests/README.md). ### ✅ Static Code Analysis +> [!NOTE] +> Analysis results are also to be checked on our [CI workflow](../../.github/workflows/check.yml). + #### Linting ```sh # run linter without fixing -$ uv run riff check {dir_name} +$ uv run ruff check {dir_name} # run linter & auto-fix (if available) -$ uv run riff check {dir_name} --fix +$ uv run ruff check {dir_name} --fix ``` #### Formatting ```sh # run formatter without fixing -$ uv run riff format {dir_name} --check +$ uv run ruff format {dir_name} --check # run formatter & auto-fix -$ uv run riff format {dir_name} +$ uv run ruff format {dir_name} ``` #### Type Checking From c8423d5b7ca1e777409c97a35461236de680d2c9 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Fri, 23 May 2025 02:57:42 +0900 Subject: [PATCH 54/56] Update 'uv.lock' --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 18fa018..163c261 100644 --- a/uv.lock +++ b/uv.lock @@ -550,7 +550,7 @@ wheels = [ [[package]] name = "jpyc-core-sdk" version = "1.0.0" -source = { virtual = "packages/core" } +source = { editable = "packages/core" } dependencies = [ { name = "eth-typing" }, { name = "pydantic" }, From c55d3c00f88f75e980a2fe8ca34b570b5d598f35 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Fri, 23 May 2025 12:06:15 +0900 Subject: [PATCH 55/56] Fix 'README' --- packages/core/README.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 6aad575..c683d87 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -3,11 +3,22 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) ![build](https://github.com/jcam1/python-sdk/actions/workflows/check.yml/badge.svg) -Python SDK to interact with [the JPYCv2's core contracts](https://github.com/jcam1/JPYCv2/blob/main/contracts/v1/FiatTokenV1.sol). Ideal for those who want to interact with JPYC protocol in any Python-backend environments. +A Python SDK to interact with [the JPYCv2's core contracts](https://github.com/jcam1/JPYCv2/blob/main/contracts/v1/FiatTokenV1.sol). Ideal for those who want to interact with JPYC protocol in any Python-backend environments. ## 🪄 Usage -First, configure clients for the SDK. +### 1. Install `jpyc_core_sdk` Package + +```sh +# uv +$ uv add jpyc_core_sdk +# poetry +$ poetry add jpyc_core_sdk +# pip +$ pip install jpyc_core_sdk +``` + +### 2. Configure SDK Clients ```py from jpyc_core_sdk.client import SdkClient @@ -32,16 +43,20 @@ client = SdkClient( jpyc = JPYC(client=client) ``` -Then, use the configured JPYC client to call JPYC's contract functions wherever you would like. +### 3. Call JPYC Contracts + +Use the configured JPYC client to call JPYC's contract functions wherever you would like. ```py from {CONFIG_FILE} import jpyc +... # Call a contract function (e.g., transfer) -jpyc.transfer( +tx_hash = jpyc.transfer( to={TO_ADDRESS}, value=2025, ) +... ``` > [!NOTE] From dce5275347927b049e83a434c54e2709acdc9864 Mon Sep 17 00:00:00 2001 From: SeiyaKobayashi Date: Sat, 24 May 2025 19:29:00 +0900 Subject: [PATCH 56/56] Update 'core/README' --- packages/core/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/README.md b/packages/core/README.md index c683d87..f67cdc4 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -43,6 +43,9 @@ client = SdkClient( jpyc = JPYC(client=client) ``` +> [!TIP] +> As for sensitive data such as private keys or api keys, we strongly recommend using some secure storage and read them from the securely embedded environment variables. This reflects our design decision of not using any environment variables within the SDK itself, aiming to make it as flexible as possible for the developers. Also, using some arbitrary environmental variables often results in unexpected behaviors (e.g., naming conflicts). + ### 3. Call JPYC Contracts Use the configured JPYC client to call JPYC's contract functions wherever you would like.