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\nNotes: \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\nArguments: \n\n\nchain_name (str, optional): Chain name \nnetwork_name (str, optional): Network name \nrpc_endpoint (RpcEndpoint, optional): RPC endpoint \nprivate_key (Bytes32, optional): private key of EOA \n \n\nRaises: \n\n\nInvalidBytes32: If the supplied private_key is not in a valid form \nInvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form \nNetworkNotSupported: If the specified network is not supported by the SDK \nValidationError: 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\nArguments: \n\n\nchain_name (str): Chain name \nnetwork_name (str): Network name \n \n\nReturns: \n\n\n Web3: Configured web3 instance
\n \n\nRaises: \n\n\nNetworkNotSupported: If the specified network is not supported by the SDK \nValidationError: 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\nArguments: \n\n\nrpc_endpoint (RpcEndpoint): Custom RPC endpoint \n \n\nReturns: \n\n\n Web3: Configured web3 instance
\n \n\nRaises: \n\n\nInvalidRpcEndpoint: 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\nNotes: \n\n\n If private_key parameter is set to None, this method removes account from the configured web3 instance.
\n \n\nArguments: \n\n\nprivate_key (Bytes32, optional): Private key of account \n \n\nReturns: \n\n\n LocalAccount | None: Configured account instance
\n \n\nRaises: \n\n\nInvalidBytes32: 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\nReturns: \n\n\n ChecksumAddress: Public address of account
\n \n\nRaises: \n\n\nAccountNotInitialized: 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\nNotes: \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\nArguments: \n\n\nclient (SdkClient): Configured SDK client \ncontract_version (ContractVersion): Contract version \ncontract_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\nArguments: \n\n\naccount (ChecksumAddress): Account address \n \n\nReturns: \n\n\n bool: True if account is a minter, false otherwise
\n \n\nRaises: \n\n\nInvalidChecksumAddress: 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\nArguments: \n\n\nowner (ChecksumAddress): Owner address \n \n\nReturns: \n\n\n Uint256: Nonce for EIP2612's permit.
\n \n\nRaises: \n\n\nInvalidChecksumAddress: 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\nArguments: \n\n\nminter (ChecksumAddress): Minter address \nminter_allowed_amount (Uint256): Minter allowance \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidChecksumAddress: If supplied minter is not in a valid form \nInvalidUint256: If supplied minter_allowed_amount is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nto (ChecksumAddress): Receiver address \namount (Uint256): Amount of tokens to mint \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidChecksumAddress: If supplied to is not in a valid form \nInvalidUint256: If supplied amount is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nto (ChecksumAddress): Receiver address \nvalue (Uint256): Amount of tokens to transfer \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidChecksumAddress: If supplied to is not in a valid form \nInvalidUint256: If supplied value is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nfrom_ (ChecksumAddress): Owner address \nto (ChecksumAddress): Receiver address \nvalue (Uint256): Amount of tokens to transfer \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidChecksumAddress: If supplied from_ or to is not in a valid form \nInvalidUint256: If supplied value is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nfrom_ (ChecksumAddress): Owner address \nto (ChecksumAddress): Receiver allowance \nvalue (Uint256): Amount of tokens to transfer \nvalid_after (Uint256): Unix time when transaction becomes valid \nvalid_before (Uint256): Unix time when transaction becomes invalid \nnonce (Bytes32): Unique nonce \nv (Uint8): v of ECDSA \nr (Bytes32): r of ECDSA \ns (Bytes32): s of ECDSA \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidBytes32: If supplied nonce or r or s is not in a valid form \nInvalidChecksumAddress: If supplied from_ or to is not in a valid form \nInvalidUint256: If supplied value or valid_after or valid_before is not in a valid form \nInvalidUint8: If supplied v is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nfrom_ (ChecksumAddress): Owner address \nto (ChecksumAddress): Receiver allowance \nvalue (Uint256): Amount of tokens to transfer \nvalid_after (Uint256): Unix time when transaction becomes valid \nvalid_before (Uint256): Unix time when transaction becomes invalid \nnonce (Bytes32): Unique nonce \nv (Uint8): v of ECDSA \nr (Bytes32): r of ECDSA \ns (Bytes32): s of ECDSA \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidBytes32: If supplied nonce or r or s is not in a valid form \nInvalidChecksumAddress: If supplied from_ or to is not in a valid form \nInvalidUint256: If supplied value or valid_after or valid_before is not in a valid form \nInvalidUint8: If supplied v is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nauthorizer (ChecksumAddress): Owner address \nnonce (Bytes32): Unique nonce \nv (Uint8): v of ECDSA \nr (Bytes32): r of ECDSA \ns (Bytes32): s of ECDSA \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidBytes32: If supplied nonce or r or s is not in a valid form \nInvalidChecksumAddress: If supplied authorizer is not in a valid form \nInvalidUint8: If supplied v is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nspender (ChecksumAddress): Spender address \nvalue (Uint256): Amount of allowance \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidChecksumAddress: If supplied spender is not in a valid form \nInvalidUint256: If supplied value is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nspender (ChecksumAddress): Spender address \nincrement (Uint256): Amount of allowance to increase \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidChecksumAddress: If supplied spender is not in a valid form \nInvalidUint256: If supplied increment is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nspender (ChecksumAddress): Spender address \ndecrement (Uint256): Amount of allowance to decrease \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidChecksumAddress: If supplied spender is not in a valid form \nInvalidUint256: If supplied decrement is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nArguments: \n\n\nowner (ChecksumAddress): Owner address \nspender (ChecksumAddress): Spender address \nvalue (Uint256): Amount of allowance \ndeadline (Uint256): Unix time when transaction becomes invalid \nv (Uint8): v of ECDSA \nr (Bytes32): r of ECDSA \ns (Bytes32): s of ECDSA \n \n\nReturns: \n\n\n Bytes32: Transaction hash
\n \n\nRaises: \n\n\nAccountNotInitialized: If account is not initialized \nInvalidBytes32: If supplied r or s is not in a valid form \nInvalidChecksumAddress: If supplied owner or spender is not in a valid form \nInvalidUint256: If supplied value or deadline is not in a valid form \nInvalidUint8: If supplied v is not in a valid form \nTransactionFailed: If transaction fails \nTransactionSimulationFailed: 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\nNote: \n\n\n Default address should be the address of the latest version (e.g., v2 as of May 2025).
\n \n\nArguments: \n\n\ncontract_version (ContractVersion): Contract version \n \n\nReturns: \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\nArguments: \n\n\nfile_path (Path): absolute path of artifacts file \nartifact_type (ArtifactType): type of artifacts \n \n\nReturns: \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\nArguments: \n\n\ncontract_version (ContractVersion): Contract version \n \n\nReturns: \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\nReturns: \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\nArguments: \n\n\nchain_name (ChainName, optional): Chain name \nnetwork_name (str, optional): Network name \n \n\nReturns: \n\n\n RpcEndpoint: RPC endpoint
\n \n\nRaises: \n\n\nNetworkNotSupported: 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\nArguments: \n\n\nvalue (Uint256 | Decimal): Value in ether \n \n\nReturns: \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\nAttributes: \n\n\nchain_name (str): Chain name \nnetwork_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\nAttributes: \n\n\nmessage (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\nAttributes: \n\n\nmessage (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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ SdkClient (src.interfaces.client.ISdkClient ):
+
+ View Source
+
+
+
+ 25 class 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
+
+
+
+
+
+
+
+
+
+
@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 )
+
+
View Source
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+ account
+
+
+
+
+
+
LocalAccount | None: Account instance
+
+
+
+
+
+
+
+
@validate_call
+
+
def
+
set_default_provider (self , chain_name : ChainName , network_name : str ) -> web3 . main . Web3 :
+
+
View Source
+
+
+
+
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 :
+
+
View Source
+
+
+
+
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 :
+
+
View Source
+
+
+
+
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 > )] :
+
+ View Source
+
+
+
+
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 ):
+
+ View Source
+
+
+
+ 32 class 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 )
+
+
View Source
+
+
+
+
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 :
+
+
View Source
+
+
+
+
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 ):
+
+ View Source
+
+
+
+
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 ):
+
+ View Source
+
+
+
+
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 ):
+
+ View Source
+
+
+
+
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 ):
+
+ View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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 > )] :
+
+
View Source
+
+
+
+
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
+
+
+
+
+ View Source
+
+ 1 from .addresses import get_proxy_address
+ 2 from .artifacts import (
+ 3 get_artifacts ,
+ 4 resolve_artifacts_file_path ,
+ 5 )
+ 6 from .chains import (
+ 7 SUPPORTED_CHAINS ,
+ 8 enumerate_supported_networks ,
+ 9 get_default_rpc_endpoint ,
+10 )
+11 from .constants import (
+12 POA_MIDDLEWARE ,
+13 SIGN_MIDDLEWARE ,
+14 UINT8_MAX ,
+15 UINT256_MAX ,
+16 UINT_MIN ,
+17 )
+18 from .currencies import (
+19 remove_decimals ,
+20 restore_decimals ,
+21 )
+22 from .errors import (
+23 AccountNotInitialized ,
+24 InvalidBytes32 ,
+25 InvalidChecksumAddress ,
+26 InvalidUint8 ,
+27 InvalidUint256 ,
+28 NetworkNotSupported ,
+29 TransactionFailed ,
+30 TransactionSimulationFailed ,
+31 )
+32 from .types import (
+33 ArtifactType ,
+34 ChainMetadata ,
+35 ChainName ,
+36 ContractVersion ,
+37 )
+38 from .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 :
+
+ View Source
+
+
+
+ 43 def 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 :
+
+ View Source
+
+
+
+ 25 def 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 :
+
+ View Source
+
+
+
+ 9 def 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 :
+
+ View Source
+
+
+
+ 90 def 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 > )] :
+
+ View Source
+
+
+
+ 119 def 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 > )] :
+
+ View Source
+
+
+
+ 9 def 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 ):
+
+ View Source
+
+
+
+ 21 def 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 ):
+
+ View Source
+
+
+
+ 41 class 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ InvalidBytes32 (src.utils.errors.JpycSdkError , builtins.TypeError ):
+
+ View Source
+
+
+
+ 94 class 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 )
+
+ View Source
+
+
+
+
99 def __init__ ( self , message_ : str ) -> None :
+100 super () . __init__ (
+101 code = InvalidBytes32 . code ,
+102 message = f "Invalid bytes32: { message_ } ." ,
+103 )
+
+
+
+
+
+
+
+
+ code =
+203
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ InvalidChecksumAddress (src.utils.errors.JpycSdkError , builtins.TypeError ):
+
+ View Source
+
+
+
+ 56 class 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 )
+
+ View Source
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ InvalidUint8 (src.utils.errors.JpycSdkError , builtins.TypeError ):
+
+ View Source
+
+
+
+ 69 class 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 )
+
+ View Source
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ InvalidUint256 (src.utils.errors.JpycSdkError , builtins.TypeError ):
+
+ View Source
+
+
+
+ 81 class 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 )
+
+ View Source
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ NetworkNotSupported (src.utils.errors.JpycSdkError ):
+
+ View Source
+
+
+
+ 21 class 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 )
+
+ View Source
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ TransactionFailed (src.utils.errors.JpycSdkError ):
+
+ View Source
+
+
+
+ 139 class 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 )
+
+ View Source
+
+
+
+
148 def __init__ ( self , message_ : str ) -> None :
+149 super () . __init__ (
+150 code = TransactionFailed . code ,
+151 message = f "Transaction failed: { message_ } " ,
+152 )
+
+
+
+
+
+
+
+
+ code =
+301
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class
+ TransactionSimulationFailed (src.utils.errors.JpycSdkError ):
+
+ View Source
+
+
+
+ 123 class 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 )
+
+ View Source
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+ type ArtifactType =
+Literal['abi', 'bytecode']
+
+
+
+
+
+
+
+
+
+
+
+ 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)
+[](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)
+
+
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)

-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.