phala-cloud 0.1.3__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. phala_cloud-0.2.0/.pdm-python +1 -0
  2. phala_cloud-0.2.0/CHANGELOG.md +2 -0
  3. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/PKG-INFO +2 -1
  4. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/pdm.lock +251 -4
  5. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/pyproject.toml +2 -1
  6. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/__init__.py +8 -0
  7. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/action_responses.py +44 -1
  8. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/actions.py +30 -0
  9. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/client.py +96 -4
  10. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/error_codes.py +1 -0
  11. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/full_client.py +69 -22
  12. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/__init__.py +22 -0
  13. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/cvms.py +81 -4
  14. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/kms.py +49 -0
  15. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/nodes.py +8 -0
  16. phala_cloud-0.2.0/src/phala_cloud/utils.py +133 -0
  17. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_action_matrix_async.py +17 -1
  18. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_action_matrix_sync.py +16 -1
  19. phala_cloud-0.2.0/tests/test_client_sync.py +106 -0
  20. phala_cloud-0.2.0/tests/test_kms_contract.py +88 -0
  21. phala_cloud-0.2.0/tests/test_mr_config_id.py +125 -0
  22. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/uv.lock +10 -2
  23. phala_cloud-0.1.3/.pdm-python +0 -1
  24. phala_cloud-0.1.3/src/phala_cloud/utils.py +0 -51
  25. phala_cloud-0.1.3/tests/test_client_sync.py +0 -42
  26. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/.gitignore +0 -0
  27. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/.python-version +0 -0
  28. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/Makefile +0 -0
  29. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/README.md +0 -0
  30. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/examples/repl.py +0 -0
  31. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/blockchains.py +0 -0
  32. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/errors.py +0 -0
  33. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/apps.py +0 -0
  34. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/auth.py +0 -0
  35. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/base.py +0 -0
  36. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/models/os_images.py +0 -0
  37. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/result.py +0 -0
  38. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/src/phala_cloud/webhook.py +0 -0
  39. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_465_structured_error.py +0 -0
  40. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_actions_module.py +0 -0
  41. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_client_async.py +0 -0
  42. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_create_app_instance.py +0 -0
  43. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_cvm_hashid_version_contract.py +0 -0
  44. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_cvm_kms_info_chain.py +0 -0
  45. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_e2e_all_interfaces.py +0 -0
  46. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_provision_compose_update.py +0 -0
  47. {phala_cloud-0.1.3 → phala_cloud-0.2.0}/tests/test_webhook.py +0 -0
@@ -0,0 +1 @@
1
+ /Users/leechael/workshop/phala/teehouse/sdks/python/.venv/bin/python
@@ -0,0 +1,2 @@
1
+ # Changelog
2
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phala-cloud
3
- Version: 0.1.3
3
+ Version: 0.2.0
4
4
  Summary: Python SDK for Phala Cloud API (sync/async, pydantic, REPL-friendly)
5
5
  Project-URL: Homepage, https://github.com/Phala-Network/phala-cloud
6
6
  Project-URL: Repository, https://github.com/Phala-Network/phala-cloud
@@ -21,6 +21,7 @@ Requires-Python: >=3.10
21
21
  Requires-Dist: dstack-sdk>=0.5.4
22
22
  Requires-Dist: httpx[socks]>=0.27.0
23
23
  Requires-Dist: pydantic>=2.7.0
24
+ Requires-Dist: pysha3>=1.0.2
24
25
  Provides-Extra: dev
25
26
  Requires-Dist: mypy>=1.10.0; extra == 'dev'
26
27
  Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
@@ -5,7 +5,7 @@
5
5
  groups = ["default", "dev"]
6
6
  strategy = ["inherit_metadata"]
7
7
  lock_version = "4.5.0"
8
- content_hash = "sha256:e3f978a33ec9d42d70d09bbd241e8137c5c7b5a45208b634db76260e53531d12"
8
+ content_hash = "sha256:d7f5bdc878ebfe4c09a45f90c29cf1a16f623fc7639b1d2978cc0b1d287d4056"
9
9
 
10
10
  [[metadata.targets]]
11
11
  requires_python = ">=3.10"
@@ -234,21 +234,247 @@ files = [
234
234
  {file = "cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5"},
235
235
  ]
236
236
 
237
+ [[package]]
238
+ name = "cytoolz"
239
+ version = "1.1.0"
240
+ requires_python = ">=3.9"
241
+ summary = "Cython implementation of Toolz: High performance functional utilities"
242
+ groups = ["default"]
243
+ marker = "implementation_name == \"cpython\""
244
+ dependencies = [
245
+ "toolz>=0.8.0",
246
+ ]
247
+ files = [
248
+ {file = "cytoolz-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:72d7043a88ea5e61ba9d17ea0d1c1eff10f645d7edfcc4e56a31ef78be287644"},
249
+ {file = "cytoolz-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d759e9ed421bacfeb456d47af8d734c057b9912b5f2441f95b27ca35e5efab07"},
250
+ {file = "cytoolz-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fdb5be8fbcc0396141189022724155a4c1c93712ac4aef8c03829af0c2a816d7"},
251
+ {file = "cytoolz-1.1.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c8c0a513dc89bc05cc72893609118815bced5ef201f1a317b4cc3423b3a0e750"},
252
+ {file = "cytoolz-1.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce94db4f8ebe842c30c0ece42ff5de977c47859088c2c363dede5a68f6906484"},
253
+ {file = "cytoolz-1.1.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b622d4f54e370c853ded94a668f94fe72c6d70e06ac102f17a2746661c27ab52"},
254
+ {file = "cytoolz-1.1.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:375a65baa5a5b4ff6a0c5ff17e170cf23312e4c710755771ca966144c24216b5"},
255
+ {file = "cytoolz-1.1.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c0d51bcdb3203a062a78f66bbe33db5e3123048e24a5f0e1402422d79df8ee2d"},
256
+ {file = "cytoolz-1.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1010869529bb05dc9802b6d776a34ca1b6d48b9deec70ad5e2918ae175be5c2f"},
257
+ {file = "cytoolz-1.1.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11a8f2e83295bdb33f35454d6bafcb7845b03b5881dcaed66ecbd726c7f16772"},
258
+ {file = "cytoolz-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0499c5e0a8e688ed367a2e51cc13792ae8f08226c15f7d168589fc44b9b9cada"},
259
+ {file = "cytoolz-1.1.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:87d44e6033d4c5e95a7d39ba59b8e105ba1c29b1ccd1d215f26477cc1d64be39"},
260
+ {file = "cytoolz-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a68cef396a7de237f7b97422a6a450dfb111722296ba217ba5b34551832f1f6e"},
261
+ {file = "cytoolz-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:06ad4c95b258141f138a93ebfdc1d76ac087afc1a82f1401100a1f44b44ba656"},
262
+ {file = "cytoolz-1.1.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ada59a4b3c59d4ac7162e0ed08667ffa78abf48e975c8a9f9d5b9bc50720f4fd"},
263
+ {file = "cytoolz-1.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a8957bcaea1ba01327a9b219d2adb84144377684f51444253890dab500ca171f"},
264
+ {file = "cytoolz-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6d8cdc299d67eb0f3b9ecdafeeb55eb3b7b7470e2d950ac34b05ed4c7a5572b8"},
265
+ {file = "cytoolz-1.1.0-cp310-cp310-win32.whl", hash = "sha256:d8e08464c5cdea4f6df31e84b11ed6bfd79cedb99fbcbfdc15eb9361a6053c5a"},
266
+ {file = "cytoolz-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:7e49922a7ed54262d41960bf3b835a7700327bf79cff1e9bfc73d79021132ff8"},
267
+ {file = "cytoolz-1.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:943a662d2e72ffc4438d43ab5a1de8d852237775a423236594a3b3e381b8032c"},
268
+ {file = "cytoolz-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dba8e5a8c6e3c789d27b0eb5e7ce5ed7d032a7a9aae17ca4ba5147b871f6e327"},
269
+ {file = "cytoolz-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44b31c05addb0889167a720123b3b497b28dd86f8a0aeaf3ae4ffa11e2c85d55"},
270
+ {file = "cytoolz-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:653cb18c4fc5d8a8cfce2bce650aabcbe82957cd0536827367d10810566d5294"},
271
+ {file = "cytoolz-1.1.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:853a5b4806915020c890e1ce70cc056bbc1dd8bc44f2d74d555cccfd7aefba7d"},
272
+ {file = "cytoolz-1.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7b44e9de86bea013fe84fd8c399d6016bbb96c37c5290769e5c99460b9c53e5"},
273
+ {file = "cytoolz-1.1.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:098d628a801dc142e9740126be5624eb7aef1d732bc7a5719f60a2095547b485"},
274
+ {file = "cytoolz-1.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:779ee4096ed7a82cffab89372ffc339631c285079dbf33dbe7aff1f6174985df"},
275
+ {file = "cytoolz-1.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f2ce18dd99533d077e9712f9faa852f389f560351b1efd2f2bdb193a95eddde2"},
276
+ {file = "cytoolz-1.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac266a34437812cf841cecbfe19f355ab9c3dd1ef231afc60415d40ff12a76e4"},
277
+ {file = "cytoolz-1.1.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1920b9b9c13d60d0bb6cd14594b3bce0870022eccb430618c37156da5f2b7a55"},
278
+ {file = "cytoolz-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47caa376dafd2bdc29f8a250acf59c810ec9105cd6f7680b9a9d070aae8490ec"},
279
+ {file = "cytoolz-1.1.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5ab2c97d8aaa522b038cca9187b1153347af22309e7c998b14750c6fdec7b1cb"},
280
+ {file = "cytoolz-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4bce006121b120e8b359244ee140bb0b1093908efc8b739db8dbaa3f8fb42139"},
281
+ {file = "cytoolz-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fc0f1e4e9bb384d26e73c6657bbc26abdae4ff66a95933c00f3d578be89181b"},
282
+ {file = "cytoolz-1.1.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:dd3f894ff972da1994d06ac6157d74e40dda19eb31fe5e9b7863ca4278c3a167"},
283
+ {file = "cytoolz-1.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0846f49cf8a4496bd42659040e68bd0484ce6af819709cae234938e039203ba0"},
284
+ {file = "cytoolz-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:16a3af394ade1973226d64bb2f9eb3336adbdea03ed5b134c1bbec5a3b20028e"},
285
+ {file = "cytoolz-1.1.0-cp311-cp311-win32.whl", hash = "sha256:b786c9c8aeab76cc2f76011e986f7321a23a56d985b77d14f155d5e5514ea781"},
286
+ {file = "cytoolz-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:ebf06d1c5344fb22fee71bf664234733e55db72d74988f2ecb7294b05e4db30c"},
287
+ {file = "cytoolz-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:b63f5f025fac893393b186e132e3e242de8ee7265d0cd3f5bdd4dda93f6616c9"},
288
+ {file = "cytoolz-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:99f8e134c9be11649342853ec8c90837af4089fc8ff1e8f9a024a57d1fa08514"},
289
+ {file = "cytoolz-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0a6f44cf9319c30feb9a50aa513d777ef51efec16f31c404409e7deb8063df64"},
290
+ {file = "cytoolz-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:945580dc158c557172fca899a35a99a16fbcebf6db0c77cb6621084bc82189f9"},
291
+ {file = "cytoolz-1.1.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:257905ec050d04f2f856854620d1e25556fd735064cebd81b460f54939b9f9d5"},
292
+ {file = "cytoolz-1.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82779049f352fb3ab5e8c993ab45edbb6e02efb1f17f0b50f4972c706cc51d76"},
293
+ {file = "cytoolz-1.1.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7d3e405e435320e08c5a1633afaf285a392e2d9cef35c925d91e2a31dfd7a688"},
294
+ {file = "cytoolz-1.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:923df8f5591e0d20543060c29909c149ab1963a7267037b39eee03a83dbc50a8"},
295
+ {file = "cytoolz-1.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:25db9e4862f22ea0ae2e56c8bec9fc9fd756b655ae13e8c7b5625d7ed1c582d4"},
296
+ {file = "cytoolz-1.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7a98deb11ccd8e5d9f9441ef2ff3352aab52226a2b7d04756caaa53cd612363"},
297
+ {file = "cytoolz-1.1.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dce4ee9fc99104bc77efdea80f32ca5a650cd653bcc8a1d984a931153d3d9b58"},
298
+ {file = "cytoolz-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80d6da158f7d20c15819701bbda1c041f0944ede2f564f5c739b1bc80a9ffb8b"},
299
+ {file = "cytoolz-1.1.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3b5c5a192abda123ad45ef716ec9082b4cf7d95e9ada8291c5c2cc5558be858b"},
300
+ {file = "cytoolz-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5b399ce7d967b1cb6280250818b786be652aa8ddffd3c0bb5c48c6220d945ab5"},
301
+ {file = "cytoolz-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e7e29a1a03f00b4322196cfe8e2c38da9a6c8d573566052c586df83aacc5663c"},
302
+ {file = "cytoolz-1.1.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5291b117d71652a817ec164e7011f18e6a51f8a352cc9a70ed5b976c51102fda"},
303
+ {file = "cytoolz-1.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8caef62f846a9011676c51bda9189ae394cdd6bb17f2946ecaedc23243268320"},
304
+ {file = "cytoolz-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:de425c5a8e3be7bb3a195e19191d28d9eb3c2038046064a92edc4505033ec9cb"},
305
+ {file = "cytoolz-1.1.0-cp312-cp312-win32.whl", hash = "sha256:296440a870e8d1f2e1d1edf98f60f1532b9d3ab8dfbd4b25ec08cd76311e79e5"},
306
+ {file = "cytoolz-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:07156987f224c6dac59aa18fb8bf91e1412f5463961862716a3381bf429c8699"},
307
+ {file = "cytoolz-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:23e616b38f5b3160c7bb45b0f84a8f3deb4bd26b29fb2dfc716f241c738e27b8"},
308
+ {file = "cytoolz-1.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:76c9b58555300be6dde87a41faf1f97966d79b9a678b7a526fcff75d28ef4945"},
309
+ {file = "cytoolz-1.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d1d638b10d3144795655e9395566ce35807df09219fd7cacd9e6acbdef67946a"},
310
+ {file = "cytoolz-1.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:26801c1a165e84786a99e03c9c9973356caaca002d66727b761fb1042878ef06"},
311
+ {file = "cytoolz-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a9a464542912d3272f6dccc5142df057c71c6a5cbd30439389a732df401afb7"},
312
+ {file = "cytoolz-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed6104fa942aa5784bf54f339563de637557e3443b105760bc4de8f16a7fc79b"},
313
+ {file = "cytoolz-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56161f0ab60dc4159ec343509abaf809dc88e85c7e420e354442c62e3e7cbb77"},
314
+ {file = "cytoolz-1.1.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:832bd36cc9123535f1945acf6921f8a2a15acc19cfe4065b1c9b985a28671886"},
315
+ {file = "cytoolz-1.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1842636b6e034f229bf084c2bcdcfd36c8437e752eefd2c74ce9e2f10415cb6e"},
316
+ {file = "cytoolz-1.1.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:823df012ab90d2f2a0f92fea453528539bf71ac1879e518524cd0c86aa6df7b9"},
317
+ {file = "cytoolz-1.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f1fcf9e7e7b3487883ff3f815abc35b89dcc45c4cf81c72b7ee457aa72d197b"},
318
+ {file = "cytoolz-1.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4cdb3fa1772116827f263f25b0cdd44c663b6701346a56411960534a06c082de"},
319
+ {file = "cytoolz-1.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1b5c95041741b81430454db65183e133976f45ac3c03454cfa8147952568529"},
320
+ {file = "cytoolz-1.1.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b2079fd9f1a65f4c61e6278c8a6d4f85edf30c606df8d5b32f1add88cbbe2286"},
321
+ {file = "cytoolz-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a92a320d72bef1c7e2d4c6d875125cf57fc38be45feb3fac1bfa64ea401f54a4"},
322
+ {file = "cytoolz-1.1.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06d1c79aa51e6a92a90b0e456ebce2288f03dd6a76c7f582bfaa3eda7692e8a5"},
323
+ {file = "cytoolz-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e1d7be25f6971e986a52b6d3a0da28e1941850985417c35528f6823aef2cfec5"},
324
+ {file = "cytoolz-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:964b248edc31efc50a65e9eaa0c845718503823439d2fa5f8d2c7e974c2b5409"},
325
+ {file = "cytoolz-1.1.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c9ff2b3c57c79b65cb5be14a18c6fd4a06d5036fb3f33e973a9f70e9ac13ca28"},
326
+ {file = "cytoolz-1.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:22290b73086af600042d99f5ce52a43d4ad9872c382610413176e19fc1d4fd2d"},
327
+ {file = "cytoolz-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a2ade74fccd080ea793382968913ee38d7a35c921df435bbf0a6aeecf0d17574"},
328
+ {file = "cytoolz-1.1.0-cp313-cp313-win32.whl", hash = "sha256:db5dbcfda1c00e937426cbf9bdc63c24ebbc358c3263bfcbc1ab4a88dc52aa8e"},
329
+ {file = "cytoolz-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9e2d3fe3b45c3eb7233746f7aca37789be3dceec3e07dcc406d3e045ea0f7bdc"},
330
+ {file = "cytoolz-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:32c559f95ff44a9ebcbd934acaa1e6dc8f3e6ffce4762a79a88528064873d6d5"},
331
+ {file = "cytoolz-1.1.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9e2cd93b28f667c5870a070ab2b8bb4397470a85c4b204f2454b0ad001cd1ca3"},
332
+ {file = "cytoolz-1.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f494124e141a9361f31d79875fe7ea459a3be2b9dadd90480427c0c52a0943d4"},
333
+ {file = "cytoolz-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53a3262bf221f19437ed544bf8c0e1980c81ac8e2a53d87a9bc075dba943d36f"},
334
+ {file = "cytoolz-1.1.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:47663e57d3f3f124921f38055e86a1022d0844c444ede2e8f090d3bbf80deb65"},
335
+ {file = "cytoolz-1.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5a8755c4104ee4e3d5ba434c543b5f85fdee6a1f1df33d93f518294da793a60"},
336
+ {file = "cytoolz-1.1.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4d96ff3d381423af1b105295f97de86d1db51732c9566eb37378bab6670c5010"},
337
+ {file = "cytoolz-1.1.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0ec96b3d537cdf47d4e76ded199f7440715f4c71029b45445cff92c1248808c2"},
338
+ {file = "cytoolz-1.1.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:208e2f2ef90a32b0acbff3303d90d89b13570a228d491d2e622a7883a3c68148"},
339
+ {file = "cytoolz-1.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d416a81bb0bd517558668e49d30a7475b5445f9bbafaab7dcf066f1e9adba36"},
340
+ {file = "cytoolz-1.1.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f32e94c91ffe49af04835ee713ebd8e005c85ebe83e7e1fdcc00f27164c2d636"},
341
+ {file = "cytoolz-1.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15d0c6405efc040499c46df44056a5c382f551a7624a41cf3e4c84a96b988a15"},
342
+ {file = "cytoolz-1.1.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:bf069c5381d757debae891401b88b3a346ba3a28ca45ba9251103b282463fad8"},
343
+ {file = "cytoolz-1.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d5cf15892e63411ec1bd67deff0e84317d974e6ab2cdfefdd4a7cea2989df66"},
344
+ {file = "cytoolz-1.1.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3e3872c21170f8341656f8692f8939e8800dcee6549ad2474d4c817bdefd62cd"},
345
+ {file = "cytoolz-1.1.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b9ddeff8e8fd65eb1fcefa61018100b2b627e759ea6ad275d2e2a93ffac147bf"},
346
+ {file = "cytoolz-1.1.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:02feeeda93e1fa3b33414eb57c2b0aefd1db8f558dd33fdfcce664a0f86056e4"},
347
+ {file = "cytoolz-1.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d08154ad45349162b6c37f12d5d1b2e6eef338e657b85e1621e4e6a4a69d64cb"},
348
+ {file = "cytoolz-1.1.0-cp313-cp313t-win32.whl", hash = "sha256:10ae4718a056948d73ca3e1bb9ab1f95f897ec1e362f829b9d37cc29ab566c60"},
349
+ {file = "cytoolz-1.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:1bb77bc6197e5cb19784b6a42bb0f8427e81737a630d9d7dda62ed31733f9e6c"},
350
+ {file = "cytoolz-1.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:563dda652c6ff52d215704fbe6b491879b78d7bbbb3a9524ec8e763483cb459f"},
351
+ {file = "cytoolz-1.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d542cee7c7882d2a914a33dec4d3600416fb336734df979473249d4c53d207a1"},
352
+ {file = "cytoolz-1.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31922849b701b0f24bb62e56eb2488dcd3aa6ae3057694bd6b3b7c4c2bc27c2f"},
353
+ {file = "cytoolz-1.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e68308d32afd31943314735c1335e4ab5696110e96b405f6bdb8f2a8dc771a16"},
354
+ {file = "cytoolz-1.1.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fc4bb48b3b866e1867f7c6411a4229e5b44be3989060663713e10efc24c9bd5f"},
355
+ {file = "cytoolz-1.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:456f77207d1445025d7ef262b8370a05492dcb1490cb428b0f3bf1bd744a89b0"},
356
+ {file = "cytoolz-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:174ebc71ebb20a9baeffce6ee07ee2cd913754325c93f99d767380d8317930f7"},
357
+ {file = "cytoolz-1.1.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8b3604fef602bcd53415055a4f68468339192fd17be39e687ae24f476d23d56e"},
358
+ {file = "cytoolz-1.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3604b959a01f64c366e7d10ec7634d5f5cfe10301e27a8f090f6eb3b2a628a18"},
359
+ {file = "cytoolz-1.1.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6db2127a3c1bc2f59f08010d2ae53a760771a9de2f67423ad8d400e9ba4276e8"},
360
+ {file = "cytoolz-1.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56584745ac647993a016a21bc76399113b7595e312f8d0a1b140c9fcf9b58a27"},
361
+ {file = "cytoolz-1.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db2c4c3a7f7bd7e03bb1a236a125c8feb86c75802f4ecda6ecfaf946610b2930"},
362
+ {file = "cytoolz-1.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48cb8a692111a285d2b9acd16d185428176bfbffa8a7c274308525fccd01dd42"},
363
+ {file = "cytoolz-1.1.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d2f344ba5eb17dcf38ee37fdde726f69053f54927db8f8a1bed6ac61e5b1890d"},
364
+ {file = "cytoolz-1.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:abf76b1c1abd031f098f293b6d90ee08bdaa45f8b5678430e331d991b82684b1"},
365
+ {file = "cytoolz-1.1.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ddf9a38a5b686091265ff45b53d142e44a538cd6c2e70610d3bc6be094219032"},
366
+ {file = "cytoolz-1.1.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:946786755274f07bb2be0400f28adb31d7d85a7c7001873c0a8e24a503428fb3"},
367
+ {file = "cytoolz-1.1.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d5b8f78b9fed79cf185ad4ddec099abeef45951bdcb416c5835ba05f0a1242c7"},
368
+ {file = "cytoolz-1.1.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fccde6efefdbc02e676ccb352a2ccc8a8e929f59a1c6d3d60bb78e923a49ca44"},
369
+ {file = "cytoolz-1.1.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:717b7775313da5f51b0fbf50d865aa9c39cb241bd4cb605df3cf2246d6567397"},
370
+ {file = "cytoolz-1.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5158744a09d0e0e4a4f82225e3a3c4ebf38f9ae74467aaa905467270e52f2794"},
371
+ {file = "cytoolz-1.1.0-cp314-cp314-win32.whl", hash = "sha256:1ed534bdbbf063b2bb28fca7d0f6723a3e5a72b086e7c7fe6d74ae8c3e4d00e2"},
372
+ {file = "cytoolz-1.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:472c1c9a085f5ad973ec0ad7f0b9ba0969faea6f96c9e397f6293d386f3a25ec"},
373
+ {file = "cytoolz-1.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:a7ad7ca3386fa86bd301be3fa36e7f0acb024f412f665937955acfc8eb42deff"},
374
+ {file = "cytoolz-1.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:64b63ed4b71b1ba813300ad0f06b8aff19a12cf51116e0e4f1ed837cea4debcf"},
375
+ {file = "cytoolz-1.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a60ba6f2ed9eb0003a737e1ee1e9fa2258e749da6477946008d4324efa25149f"},
376
+ {file = "cytoolz-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1aa58e2434d732241f7f051e6f17657e969a89971025e24578b5cbc6f1346485"},
377
+ {file = "cytoolz-1.1.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6965af3fc7214645970e312deb9bd35a213a1eaabcfef4f39115e60bf2f76867"},
378
+ {file = "cytoolz-1.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddd2863f321d67527d3b67a93000a378ad6f967056f68c06467fe011278a6d0e"},
379
+ {file = "cytoolz-1.1.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4e6b428e9eb5126053c2ae0efa62512ff4b38ed3951f4d0888ca7005d63e56f5"},
380
+ {file = "cytoolz-1.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d758e5ef311d2671e0ae8c214c52e44617cf1e58bef8f022b547b9802a5a7f30"},
381
+ {file = "cytoolz-1.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a95416eca473e6c1179b48d86adcf528b59c63ce78f4cb9934f2e413afa9b56b"},
382
+ {file = "cytoolz-1.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36c8ede93525cf11e2cc787b7156e5cecd7340193ef800b816a16f1404a8dc6d"},
383
+ {file = "cytoolz-1.1.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c949755b6d8a649c5fbc888bc30915926f1b09fe42fea9f289e297c2f6ddd3"},
384
+ {file = "cytoolz-1.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e1b6d37545816905a76d9ed59fa4e332f929e879f062a39ea0f6f620405cdc27"},
385
+ {file = "cytoolz-1.1.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:05332112d4087904842b36954cd1d3fc0e463a2f4a7ef9477bd241427c593c3b"},
386
+ {file = "cytoolz-1.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:31538ca2fad2d688cbd962ccc3f1da847329e2258a52940f10a2ac0719e526be"},
387
+ {file = "cytoolz-1.1.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:747562aa70abf219ea16f07d50ac0157db856d447f7f498f592e097cbc77df0b"},
388
+ {file = "cytoolz-1.1.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:3dc15c48b20c0f467e15e341e102896c8422dccf8efc6322def5c1b02f074629"},
389
+ {file = "cytoolz-1.1.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3c03137ee6103ba92d5d6ad6a510e86fded69cd67050bd8a1843f15283be17ac"},
390
+ {file = "cytoolz-1.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:be8e298d88f88bd172b59912240558be3b7a04959375646e7fd4996401452941"},
391
+ {file = "cytoolz-1.1.0-cp314-cp314t-win32.whl", hash = "sha256:3d407140f5604a89578285d4aac7b18b8eafa055cf776e781aabb89c48738fad"},
392
+ {file = "cytoolz-1.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:56e5afb69eb6e1b3ffc34716ee5f92ffbdb5cb003b3a5ca4d4b0fe700e217162"},
393
+ {file = "cytoolz-1.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:27b19b4a286b3ff52040efa42dbe403730aebe5fdfd2def704eb285e2125c63e"},
394
+ {file = "cytoolz-1.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f32e93a55681d782fc6af939f6df36509d65122423cbc930be39b141064adff8"},
395
+ {file = "cytoolz-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5d9bc596751cbda8073e65be02ca11706f00029768fbbbc81e11a8c290bb41aa"},
396
+ {file = "cytoolz-1.1.0-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b16660d01c3931951fab49db422c627897c38c1a1f0393a97582004019a4887"},
397
+ {file = "cytoolz-1.1.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b7de5718e2113d4efccea3f06055758cdbc17388ecc3341ba4d1d812837d7c1a"},
398
+ {file = "cytoolz-1.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a12a2a1a6bc44099491c05a12039efa08cc33a3d0f8c7b0566185e085e139283"},
399
+ {file = "cytoolz-1.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:047defa7f5f9a32f82373dbc3957289562e8a3fa58ae02ec8e4dca4f43a33a21"},
400
+ {file = "cytoolz-1.1.0.tar.gz", hash = "sha256:13a7bf254c3c0d28b12e2290b82aed0f0977a4c2a2bf84854fcdc7796a29f3b0"},
401
+ ]
402
+
237
403
  [[package]]
238
404
  name = "dstack-sdk"
239
- version = "0.5.3"
405
+ version = "0.5.4"
240
406
  requires_python = ">=3.10"
241
407
  summary = "dstack SDK for Python"
242
408
  groups = ["default"]
243
409
  dependencies = [
244
410
  "asyncio>=3.4.3",
245
411
  "cryptography>=43.0.0",
412
+ "eth-keys>=0.5.0",
413
+ "eth-utils>=4.0.0",
246
414
  "httpx>=0.27.2",
247
415
  "pydantic>=2.9.2",
248
416
  ]
249
417
  files = [
250
- {file = "dstack_sdk-0.5.3-py3-none-any.whl", hash = "sha256:3f0002efcf54f51cbd00e993492ea80a4870beb13abe1b1165e2f64a9c0f32c3"},
251
- {file = "dstack_sdk-0.5.3.tar.gz", hash = "sha256:d159c577faa05840d5286170639b391fac8bd46a6a9016f582f8f1289ce25c8c"},
418
+ {file = "dstack_sdk-0.5.4-py3-none-any.whl", hash = "sha256:3c64d021408cc95def04332caab4593efb9d91fe87553d1f9d31c7c6e0fee07b"},
419
+ {file = "dstack_sdk-0.5.4.tar.gz", hash = "sha256:0a5426cf37bcd89f98db37aced09a8a95431943ceaf6ed75eb69baca32902c95"},
420
+ ]
421
+
422
+ [[package]]
423
+ name = "eth-hash"
424
+ version = "0.8.0"
425
+ requires_python = "<4,>=3.10"
426
+ summary = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3"
427
+ groups = ["default"]
428
+ files = [
429
+ {file = "eth_hash-0.8.0-py3-none-any.whl", hash = "sha256:523718a51b369ab89866b929a5c93c52978cd866ea309192ad980dd8271f9fac"},
430
+ {file = "eth_hash-0.8.0.tar.gz", hash = "sha256:b009752b620da2e9c7668014849d1f5fadbe4f138603f1871cc5d4ca706896b1"},
431
+ ]
432
+
433
+ [[package]]
434
+ name = "eth-keys"
435
+ version = "0.7.0"
436
+ requires_python = "<4,>=3.8"
437
+ summary = "eth-keys: Common API for Ethereum key operations"
438
+ groups = ["default"]
439
+ dependencies = [
440
+ "eth-typing>=3",
441
+ "eth-utils>=2",
442
+ ]
443
+ files = [
444
+ {file = "eth_keys-0.7.0-py3-none-any.whl", hash = "sha256:b0cdda8ffe8e5ba69c7c5ca33f153828edcace844f67aabd4542d7de38b159cf"},
445
+ {file = "eth_keys-0.7.0.tar.gz", hash = "sha256:79d24fd876201df67741de3e3fefb3f4dbcbb6ace66e47e6fe662851a4547814"},
446
+ ]
447
+
448
+ [[package]]
449
+ name = "eth-typing"
450
+ version = "6.0.0"
451
+ requires_python = "<4,>=3.10"
452
+ summary = "eth-typing: Common type annotations for ethereum python packages"
453
+ groups = ["default"]
454
+ dependencies = [
455
+ "typing-extensions>=4.5.0",
456
+ ]
457
+ files = [
458
+ {file = "eth_typing-6.0.0-py3-none-any.whl", hash = "sha256:ee74fb641eb36dd885e1c42c2a3055314efa532b3e71480816df70a94d35cfb9"},
459
+ {file = "eth_typing-6.0.0.tar.gz", hash = "sha256:315dd460dc0b71c15a6cd51e3c0b70d237eec8771beb844144f3a1fb4adb2392"},
460
+ ]
461
+
462
+ [[package]]
463
+ name = "eth-utils"
464
+ version = "6.0.0"
465
+ requires_python = "<4,>=3.10"
466
+ summary = "eth-utils: Common utility functions for python code that interacts with Ethereum"
467
+ groups = ["default"]
468
+ dependencies = [
469
+ "cytoolz>=0.10.1; implementation_name == \"cpython\"",
470
+ "eth-hash>=0.3.1",
471
+ "eth-typing>=5.0.0",
472
+ "pydantic<3,>=2.0.0",
473
+ "toolz>0.8.2; implementation_name == \"pypy\"",
474
+ ]
475
+ files = [
476
+ {file = "eth_utils-6.0.0-py3-none-any.whl", hash = "sha256:63cf48ee32c45541cb5748751909a8345c470432fb6f0fed4bd7c53fd6400469"},
477
+ {file = "eth_utils-6.0.0.tar.gz", hash = "sha256:eb54b2f82dd300d3142c49a89da195e823f5e5284d43203593f87c67bad92a96"},
252
478
  ]
253
479
 
254
480
  [[package]]
@@ -689,6 +915,15 @@ files = [
689
915
  {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"},
690
916
  ]
691
917
 
918
+ [[package]]
919
+ name = "pysha3"
920
+ version = "1.0.2"
921
+ summary = "SHA-3 (Keccak) for Python 2.7 - 3.5"
922
+ groups = ["default"]
923
+ files = [
924
+ {file = "pysha3-1.0.2.tar.gz", hash = "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"},
925
+ ]
926
+
692
927
  [[package]]
693
928
  name = "pytest"
694
929
  version = "9.0.3"
@@ -820,6 +1055,18 @@ files = [
820
1055
  {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"},
821
1056
  ]
822
1057
 
1058
+ [[package]]
1059
+ name = "toolz"
1060
+ version = "1.1.0"
1061
+ requires_python = ">=3.9"
1062
+ summary = "List processing tools and functional utilities"
1063
+ groups = ["default"]
1064
+ marker = "implementation_name == \"pypy\" or implementation_name == \"cpython\""
1065
+ files = [
1066
+ {file = "toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8"},
1067
+ {file = "toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b"},
1068
+ ]
1069
+
823
1070
  [[package]]
824
1071
  name = "typing-extensions"
825
1072
  version = "4.15.0"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "phala-cloud"
7
- version = "0.1.3"
7
+ version = "0.2.0"
8
8
  description = "Python SDK for Phala Cloud API (sync/async, pydantic, REPL-friendly)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -26,6 +26,7 @@ dependencies = [
26
26
  "httpx[socks]>=0.27.0",
27
27
  "pydantic>=2.7.0",
28
28
  "dstack-sdk>=0.5.4",
29
+ "pysha3>=1.0.2",
29
30
  ]
30
31
 
31
32
  [project.optional-dependencies]
@@ -19,9 +19,13 @@ from .result import SafeResult
19
19
  from .utils import (
20
20
  encrypt_env_vars,
21
21
  get_compose_hash,
22
+ get_mr_config_id,
23
+ get_mr_config_id_hex,
24
+ get_mr_config_id_v1,
22
25
  parse_env,
23
26
  parse_env_vars,
24
27
  verify_env_encrypt_public_key,
28
+ verify_mr_config_id,
25
29
  )
26
30
  from .webhook import WebhookEvent, parse_webhook_event, verify_webhook_signature
27
31
 
@@ -46,9 +50,13 @@ __all__ = [
46
50
  "encrypt_env_vars",
47
51
  "error_codes",
48
52
  "get_compose_hash",
53
+ "get_mr_config_id",
54
+ "get_mr_config_id_hex",
55
+ "get_mr_config_id_v1",
49
56
  "parse_env",
50
57
  "parse_env_vars",
51
58
  "verify_env_encrypt_public_key",
59
+ "verify_mr_config_id",
52
60
  "verify_webhook_signature",
53
61
  "parse_webhook_event",
54
62
  "WebhookEvent",
@@ -7,9 +7,11 @@ from .models.apps import AppRevisionsResponse as AppRevisionsResponse
7
7
  from .models.auth import CurrentUserV20251028, CurrentUserV20260121
8
8
  from .models.base import CloudModel
9
9
  from .models.cvms import (
10
+ Certificate,
10
11
  PaginatedCvmInfosV20251028,
11
12
  PaginatedCvmInfosV20260121,
12
13
  PaginatedCvmInfosV20260522,
14
+ TcbInfo,
13
15
  )
14
16
 
15
17
 
@@ -50,7 +52,10 @@ class ProvisionCvmResponse(CloudModel):
50
52
  os_image_hash: str | None = None
51
53
  instance_type: str | None = None
52
54
  node_id: int | None = None
55
+ # Deprecated: identifies a KMS node, not the on-chain KMS contract.
56
+ # Use kms_contract_id instead.
53
57
  kms_id: str | None = None
58
+ kms_contract_id: str | None = None
54
59
 
55
60
 
56
61
  class ProvisionCvmComposeFileUpdateResult(CloudModel):
@@ -276,8 +281,46 @@ class AppInfoResponse(CloudModel):
276
281
  # AppRevisionsResponse and AppRevisionDetailResponse are imported from models.apps
277
282
 
278
283
 
284
+ class AppAttestationKmsInfo(CloudModel):
285
+ contract_address: str
286
+ chain_id: int | None = None
287
+ version: str
288
+ url: str
289
+ gateway_app_id: str | None = None
290
+ gateway_app_url: str
291
+ kms_type: str
292
+
293
+
294
+ class AppAttestationInstance(CloudModel):
295
+ vm_uuid: str | None = None
296
+ name: str | None = None
297
+ instance_id: str | None = None
298
+ status: str | None = None
299
+ image_version: str | None = None
300
+ quote: str | None = None
301
+ ppid: str | None = None
302
+ ppid_sha256: str | None = None
303
+ device_id: str | None = None
304
+ fmspc: str | None = None
305
+ tee_tcb_svn: str | None = None
306
+ mr_config_id: str | None = None
307
+ cpusvn: str | None = None
308
+ pcesvn: int | None = None
309
+ tcb_info: TcbInfo | None = None
310
+ app_certificates: list[Certificate] | None = None
311
+ compose_file: str | None = None
312
+ eventlog: list[GenericObject] = Field(default_factory=list)
313
+ error: str | None = None
314
+
315
+
279
316
  class AppAttestationResponse(CloudModel):
280
- instances: list[GenericObject] = Field(default_factory=list)
317
+ app_id: str | None = None
318
+ contract_address: str | None = None
319
+ kms_info: AppAttestationKmsInfo | None = None
320
+ instances: list[AppAttestationInstance] = Field(default_factory=list)
321
+ kms_guest_agent_info: GenericObject | None = None
322
+ gateway_guest_agent_info: GenericObject | None = None
323
+ qemu_version: str | None = None
281
324
 
282
325
 
283
326
  CurrentUserResponse = CurrentUserV20260121 | CurrentUserV20251028
@@ -15,6 +15,12 @@ __all__ = [
15
15
  "safe_get_cvm_list",
16
16
  "get_kms_list",
17
17
  "safe_get_kms_list",
18
+ "list_kms_contracts",
19
+ "safe_list_kms_contracts",
20
+ "get_kms_contract",
21
+ "safe_get_kms_contract",
22
+ "list_kms_contract_nodes",
23
+ "safe_list_kms_contract_nodes",
18
24
  "list_all_instance_type_families",
19
25
  "safe_list_all_instance_type_families",
20
26
  "list_family_instance_types",
@@ -177,6 +183,30 @@ def safe_get_kms_list(client: Any, *args: Any, **kwargs: Any) -> Any:
177
183
  return client.safe_get_kms_list(*args, **kwargs)
178
184
 
179
185
 
186
+ def list_kms_contracts(client: Any, *args: Any, **kwargs: Any) -> Any:
187
+ return client.list_kms_contracts(*args, **kwargs)
188
+
189
+
190
+ def safe_list_kms_contracts(client: Any, *args: Any, **kwargs: Any) -> Any:
191
+ return client.safe_list_kms_contracts(*args, **kwargs)
192
+
193
+
194
+ def get_kms_contract(client: Any, *args: Any, **kwargs: Any) -> Any:
195
+ return client.get_kms_contract(*args, **kwargs)
196
+
197
+
198
+ def safe_get_kms_contract(client: Any, *args: Any, **kwargs: Any) -> Any:
199
+ return client.safe_get_kms_contract(*args, **kwargs)
200
+
201
+
202
+ def list_kms_contract_nodes(client: Any, *args: Any, **kwargs: Any) -> Any:
203
+ return client.list_kms_contract_nodes(*args, **kwargs)
204
+
205
+
206
+ def safe_list_kms_contract_nodes(client: Any, *args: Any, **kwargs: Any) -> Any:
207
+ return client.safe_list_kms_contract_nodes(*args, **kwargs)
208
+
209
+
180
210
  def list_all_instance_type_families(client: Any, *args: Any, **kwargs: Any) -> Any:
181
211
  return client.list_all_instance_type_families(*args, **kwargs)
182
212
 
@@ -30,6 +30,9 @@ from .models import (
30
30
  GetCvmListRequest,
31
31
  GetKmsListRequest,
32
32
  GetKmsListResponse,
33
+ KmsContract,
34
+ ListKmsContractNodesResponse,
35
+ ListKmsContractsResponse,
33
36
  PaginatedCvmInfosAny,
34
37
  PaginatedCvmInfosV20251028,
35
38
  PaginatedCvmInfosV20260121,
@@ -37,15 +40,20 @@ from .models import (
37
40
  )
38
41
  from .result import SafeResult
39
42
 
40
- ApiVersion = Literal["2025-10-28", "2026-01-21", "2026-05-22"]
43
+ ApiVersion = Literal["2025-10-28", "2026-01-21", "2026-05-22", "2026-06-23"]
41
44
  SUPPORTED_API_VERSIONS: tuple[ApiVersion, ...] = (
42
45
  "2025-10-28",
43
46
  "2026-01-21",
44
47
  "2026-05-22",
48
+ "2026-06-23",
45
49
  )
46
- DEFAULT_API_VERSION: ApiVersion = "2026-05-22"
50
+ DEFAULT_API_VERSION: ApiVersion = "2026-06-23"
47
51
  DEFAULT_BASE_URL = "https://cloud-api.phala.com/api/v1"
48
52
 
53
+ # The contract-centric KMS API exists from this version onward; the contract
54
+ # methods pin it per request.
55
+ _KMS_CONTRACT_API_VERSION = "2026-06-23"
56
+
49
57
  T = TypeVar("T", bound=BaseModel)
50
58
 
51
59
 
@@ -228,8 +236,20 @@ class AsyncPhalaCloud:
228
236
  self,
229
237
  request: GetKmsListRequest | Mapping[str, Any] | None = None,
230
238
  ) -> GetKmsListResponse:
239
+ """List KMS nodes (legacy, node-centric shape).
240
+
241
+ .. deprecated::
242
+ From API version 2026-06-23 the KMS API is contract-centric. Use
243
+ :meth:`list_kms_contracts` and :meth:`list_kms_contract_nodes`. This
244
+ method stays pinned to the legacy node-list shape.
245
+ """
231
246
  req = self._coerce(GetKmsListRequest, request)
232
- data = await self.get("/kms", params=req.model_dump(exclude_none=True))
247
+ data = await self.request(
248
+ "GET",
249
+ "/kms",
250
+ params=req.model_dump(exclude_none=True),
251
+ headers={"X-Phala-Version": "2026-05-22"},
252
+ )
233
253
  return self._validate(GetKmsListResponse, data)
234
254
 
235
255
  async def safe_get_kms_list(
@@ -238,6 +258,38 @@ class AsyncPhalaCloud:
238
258
  ) -> SafeResult[GetKmsListResponse]:
239
259
  return await self.safe(self.get_kms_list, request)
240
260
 
261
+ async def list_kms_contracts(self) -> ListKmsContractsResponse:
262
+ """List the available KMS contracts."""
263
+ data = await self.request(
264
+ "GET", "/kms", headers={"X-Phala-Version": _KMS_CONTRACT_API_VERSION}
265
+ )
266
+ return self._validate(ListKmsContractsResponse, data)
267
+
268
+ async def safe_list_kms_contracts(self) -> SafeResult[ListKmsContractsResponse]:
269
+ return await self.safe(self.list_kms_contracts)
270
+
271
+ async def get_kms_contract(self, slug: str) -> KmsContract:
272
+ """Get a KMS contract by slug (a kc_ hashed id also resolves)."""
273
+ data = await self.request(
274
+ "GET", f"/kms/{slug}", headers={"X-Phala-Version": _KMS_CONTRACT_API_VERSION}
275
+ )
276
+ return self._validate(KmsContract, data)
277
+
278
+ async def safe_get_kms_contract(self, slug: str) -> SafeResult[KmsContract]:
279
+ return await self.safe(self.get_kms_contract, slug)
280
+
281
+ async def list_kms_contract_nodes(self, slug: str) -> ListKmsContractNodesResponse:
282
+ """List the KMS nodes (with RPC url) under a contract."""
283
+ data = await self.request(
284
+ "GET", f"/kms/{slug}/nodes", headers={"X-Phala-Version": _KMS_CONTRACT_API_VERSION}
285
+ )
286
+ return self._validate(ListKmsContractNodesResponse, data)
287
+
288
+ async def safe_list_kms_contract_nodes(
289
+ self, slug: str
290
+ ) -> SafeResult[ListKmsContractNodesResponse]:
291
+ return await self.safe(self.list_kms_contract_nodes, slug)
292
+
241
293
  def _decode_or_raise(self, response: httpx.Response) -> Any:
242
294
  if response.status_code >= 400:
243
295
  raise self._to_api_error(response)
@@ -465,8 +517,20 @@ class PhalaCloud:
465
517
  self,
466
518
  request: GetKmsListRequest | Mapping[str, Any] | None = None,
467
519
  ) -> GetKmsListResponse:
520
+ """List KMS nodes (legacy, node-centric shape).
521
+
522
+ .. deprecated::
523
+ From API version 2026-06-23 the KMS API is contract-centric. Use
524
+ :meth:`list_kms_contracts` and :meth:`list_kms_contract_nodes`. This
525
+ method stays pinned to the legacy node-list shape.
526
+ """
468
527
  req = self._coerce(GetKmsListRequest, request)
469
- data = self.get("/kms", params=req.model_dump(exclude_none=True))
528
+ data = self.request(
529
+ "GET",
530
+ "/kms",
531
+ params=req.model_dump(exclude_none=True),
532
+ headers={"X-Phala-Version": "2026-05-22"},
533
+ )
470
534
  return self._validate(GetKmsListResponse, data)
471
535
 
472
536
  def safe_get_kms_list(
@@ -475,6 +539,34 @@ class PhalaCloud:
475
539
  ) -> SafeResult[GetKmsListResponse]:
476
540
  return self.safe(self.get_kms_list, request)
477
541
 
542
+ def list_kms_contracts(self) -> ListKmsContractsResponse:
543
+ """List the available KMS contracts."""
544
+ data = self.request("GET", "/kms", headers={"X-Phala-Version": _KMS_CONTRACT_API_VERSION})
545
+ return self._validate(ListKmsContractsResponse, data)
546
+
547
+ def safe_list_kms_contracts(self) -> SafeResult[ListKmsContractsResponse]:
548
+ return self.safe(self.list_kms_contracts)
549
+
550
+ def get_kms_contract(self, slug: str) -> KmsContract:
551
+ """Get a KMS contract by slug (a kc_ hashed id also resolves)."""
552
+ data = self.request(
553
+ "GET", f"/kms/{slug}", headers={"X-Phala-Version": _KMS_CONTRACT_API_VERSION}
554
+ )
555
+ return self._validate(KmsContract, data)
556
+
557
+ def safe_get_kms_contract(self, slug: str) -> SafeResult[KmsContract]:
558
+ return self.safe(self.get_kms_contract, slug)
559
+
560
+ def list_kms_contract_nodes(self, slug: str) -> ListKmsContractNodesResponse:
561
+ """List the KMS nodes (with RPC url) under a contract."""
562
+ data = self.request(
563
+ "GET", f"/kms/{slug}/nodes", headers={"X-Phala-Version": _KMS_CONTRACT_API_VERSION}
564
+ )
565
+ return self._validate(ListKmsContractNodesResponse, data)
566
+
567
+ def safe_list_kms_contract_nodes(self, slug: str) -> SafeResult[ListKmsContractNodesResponse]:
568
+ return self.safe(self.list_kms_contract_nodes, slug)
569
+
478
570
  def _decode_or_raise(self, response: httpx.Response) -> Any:
479
571
  if response.status_code >= 400:
480
572
  raise self._to_api_error(response)
@@ -58,3 +58,4 @@ TOKEN_RATE_LIMIT = "ERR-05-002"
58
58
 
59
59
  # Module 06: Auth
60
60
  OAUTH_EMAIL_INVALID = "ERR-06-001"
61
+ PERMISSION_DENIED = "ERR-06-006"