{"id":32414275,"url":"https://github.com/eliezhao/icp-py-core","last_synced_at":"2026-05-13T12:00:54.119Z","repository":{"id":319019462,"uuid":"1058532541","full_name":"eliezhao/icp-py-core","owner":"eliezhao","description":"Python Agent Library for the DFINITY Internet Computer","archived":false,"fork":false,"pushed_at":"2026-05-13T09:54:50.000Z","size":6298,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-13T10:37:50.145Z","etag":null,"topics":["dfinity","ic-py","ic-py-core","icp","internetcomputer","internetcomputerprotocol","python"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/icp-py-core","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eliezhao.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-17T08:05:45.000Z","updated_at":"2026-05-13T09:45:52.000Z","dependencies_parsed_at":"2025-11-28T18:06:14.560Z","dependency_job_id":null,"html_url":"https://github.com/eliezhao/icp-py-core","commit_stats":null,"previous_names":["eliezhao/icp-py-core"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/eliezhao/icp-py-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliezhao%2Ficp-py-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliezhao%2Ficp-py-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliezhao%2Ficp-py-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliezhao%2Ficp-py-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eliezhao","download_url":"https://codeload.github.com/eliezhao/icp-py-core/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliezhao%2Ficp-py-core/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32981543,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T11:31:52.688Z","status":"ssl_error","status_checked_at":"2026-05-13T11:31:52.072Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dfinity","ic-py","ic-py-core","icp","internetcomputer","internetcomputerprotocol","python"],"created_at":"2025-10-25T15:01:16.299Z","updated_at":"2026-05-13T12:00:54.111Z","avatar_url":"https://github.com/eliezhao.png","language":"Python","funding_links":[],"categories":["Client Libraries (Agents)"],"sub_categories":["Python"],"readme":"# 🐍 ICP-PY-CORE\n\n\u003cp style=\"center\" style=\"margin:0; padding:0;\"\u003e\n  \u003cimg src=\"pics/icp-py-core-logo.png\" alt=\"ICP-PY-CORE Logo\" style=\"width:100%; max-width:1200px; height:auto; border-radius:8px;\" /\u003e\n\u003c/p\u003e\n\n\u003cp style=\"center\"\u003e\n  \u003ca href=\"https://pypi.org/project/icp-py-core/\"\u003e\u003cimg src=\"https://badge.fury.io/py/icp-py-core.svg\" alt=\"PyPI version\"\u003e\u003c/a\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://internetcomputer.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/Powered%20by-Internet%20Computer-blue.svg\" alt=\"Internet Computer\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## 📖 About This Project\n\n**ICP-PY-CORE** is a maintained and extended fork of [ic-py](https://github.com/rocklabs-io/ic-py).  \nThis version introduces a modular architecture, protocol upgrades, and new APIs while preserving compatibility with the IC ecosystem.\n\n**Highlights:**\n- ✅ Modular structure under `src/` (`icp_agent`, `icp_identity`, `icp_candid`, etc.)\n- ✅ Updated boundary node endpoints (v3/v4: `/api/v3/canister/.../query`, `/api/v4/canister/.../call`)\n- ✅ **Certificate verification** enabled by default via `blst` (BLS12-381 signatures)\n- ✅ Type-safe Candid encoding/decoding with Rust-based parser (multiple times faster)\n- ✅ Pythonic high-level `Agent.update()` and `Agent.query()` methods\n- ✅ HTTP/2 support in async methods for improved performance\n- ✅ Comprehensive structured error handling hierarchy (11 error classes)\n- ✅ High-level wrappers for Ledger, Governance, Cycles Wallet, and Management canisters\n\n🙏 Special thanks to the original `ic-py` author for their foundational work.\n\n### 🤝 Community \u0026 Contribution\n\n- **[Contributing Guidelines](./CONTRIBUTING.md)** - How to contribute to the project\n- **[Code of Conduct](./CODE_OF_CONDUCT.md)** - Community standards and expectations\n- **[Security Policy](./SECURITY.md)** - How to report security vulnerabilities\n\n---\n\n## 🔧 Installation\n\n```bash\npip install icp-py-core\n```\n\n\u003e The Candid parser uses a Rust extension with pre-built binary wheels for all platforms.  \n\u003e No Rust compiler is required for installation.  \n\u003e For optional certificate verification, see the **blst** section below.\n\n---\n\n## 🚀 Key Improvements\n\n### ✳️ Modular Codebase\nEach component is isolated for clarity and extensibility:\n\n```\nsrc/\n├── icp_agent/         # Agent \u0026 HTTP Client\n├── icp_identity/      # ed25519 / secp256k1 identities\n├── icp_candid/        # Candid encoder/decoder\n├── icp_principal/     # Principal utilities\n├── icp_certificate/   # Certificate validation\n├── icp_core/          # Unified facade (one-line import)\n```\n\n### 🔗 Unified Facade (`icp_core`)\nImport everything from a single entrypoint:\n\n```python\nfrom icp_core import (\n    Agent, Client,\n    Identity, DelegateIdentity,\n    Principal, Certificate,\n    Canister, Ledger, Governance, Management, CyclesWallet,\n    encode, decode, Types,\n)\n```\n\n### ⚡ Endpoint Upgrade\nAll endpoints now target the latest **Boundary Node** versions:  \n- Query: `/api/v3/canister/\u003ccanister_id\u003e/query`\n- Call: `/api/v4/canister/\u003ccanister_id\u003e/call`\n- Read State: `/api/v3/canister/\u003ccanister_id\u003e/read_state`\n- Read Subnet State: `/api/v3/subnet/\u003csubnet_id\u003e/read_state`\n\n### 🔒 Certificate Verification\nCertificate verification is **enabled by default** for security. Verifies responses via **BLS12-381** signatures with `blst`:\n\n**With Agent directly:**\n```python\n# Default: verification enabled\nagent.update(\"canister-id\", \"method_name\", [{'type': Types.Nat, 'value': 2}])\n\n# To disable (for compatibility/testing):\nagent.update(\"canister-id\", \"method_name\", [{'type': Types.Nat, 'value': 2}], verify_certificate=False)\n```\n\n**With Canister wrapper:**\n```python\n# Default: verification enabled (matches Agent.update() behavior)\ncanister.set_value(42)\n\n# Explicitly enable (same as default)\ncanister.set_value(42, verify_certificate=True)\n\n# Disable verification (when blst is not installed)\ncanister.set_value(42, verify_certificate=False)\n```\n\n\u003e **Note:** Both `Agent.update()` and `Canister` methods default to `verify_certificate=True` for security. If `blst` is not installed, you must explicitly pass `verify_certificate=False` to avoid errors.\n\n---\n\n## 🧩 Example Usage\n\n### Identity\n```python\nfrom icp_core import Identity\n# Example: well-known Ed25519 test vector (RFC 8032); use Identity() or from_seed() for real keys\niden = Identity(privkey=\"833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42\")\nprint(iden.sender().to_str())\n```\n\n### Client \u0026 Agent\n```python\nfrom icp_core import Agent, Client, Identity\n\niden = Identity()\nclient = Client(\"https://ic0.app\")\nagent = Agent(iden, client)\n```\n\n### Update (auto-encode)\n```python\nfrom icp_core import Types\nresult = agent.update(\n    \"wcrzb-2qaaa-aaaap-qhpgq-cai\",\n    \"set\",\n    [{'type': Types.Nat, 'value': 2}],\n    return_type=[Types.Nat],\n)\n```\n\n### Query (auto-encode empty args)\n```python\nreply = agent.query(\"wcrzb-2qaaa-aaaap-qhpgq-cai\", \"get\", [])\nprint(reply)\n```\n\n### Canister Wrapper (Type-Safe Method Calls)\nThe `Canister` class provides a high-level, type-safe interface for interacting with canisters. It automatically parses Candid DID files and creates Python methods that match your canister's interface.\n\n**Creating a Canister instance:**\n```python\nfrom icp_core import Agent, Client, Identity, Canister\n\n# Setup agent\nclient = Client(\"https://ic0.app\")\nidentity = Identity()\nagent = Agent(identity, client)\n\n# Define Candid interface\nCOUNTER_DID = \"\"\"\nservice : {\n  get : () -\u003e (nat) query;\n  set : (nat) -\u003e (nat)\n}\n\"\"\"\n\n# Create Canister wrapper\ncounter = Canister(agent, \"wcrzb-2qaaa-aaaap-qhpgq-cai\", COUNTER_DID)\n```\n\n**Calling canister methods:**\n```python\n# Query call (no arguments)\nvalue = counter.get()\nprint(f\"Current value: {value[0]['value']}\")\n\n# Update call (with positional argument)\nresult = counter.set(42)\nprint(f\"Set to: {result[0]['value']}\")\n\n# Update call with keyword arguments (for record types)\n# If your method takes a single record parameter, you can use kwargs:\n# result = counter.update_profile(name=\"Alice\", age=30)\n```\n\n**Certificate Verification with Canister:**\nBy default, `Canister` methods enable certificate verification (`verify_certificate=True`) to match `Agent.update()` behavior for security. You can control this per method call:\n\n```python\n# Default: certificate verification enabled (requires blst)\nresult = counter.set(42)  # Uses verify_certificate=True by default\n\n# Explicitly enable verification (same as default)\nresult = counter.set(42, verify_certificate=True)\n\n# Disable verification (useful when blst is not installed)\nresult = counter.set(42, verify_certificate=False)\n```\n\n**Important Notes:**\n- `verify_certificate` is a **control parameter**, not a method argument. It's extracted from kwargs before processing method arguments.\n- Default value is `True` to match `Agent.update()` default behavior for security.\n- If `blst` is not installed and you don't pass `verify_certificate=False`, update calls will fail.\n- For query calls, certificate verification is not applicable (queries don't return certificates).\n\n**Example: Complete Canister Usage**\n```python\nfrom icp_core import Agent, Client, Identity, Canister\n\n# Setup\nclient = Client(\"https://ic0.app\")\nidentity = Identity(anonymous=True)\nagent = Agent(identity, client)\n\n# Define interface\nDID = \"\"\"\nservice : {\n  get : () -\u003e (nat) query;\n  set : (nat) -\u003e (nat);\n  increment : () -\u003e (nat)\n}\n\"\"\"\n\n# Create canister wrapper\ncounter = Canister(agent, \"wcrzb-2qaaa-aaaap-qhpgq-cai\", DID)\n\n# Query (no verification needed)\ncurrent = counter.get()\nprint(f\"Current: {current[0]['value']}\")\n\n# Update with verification enabled (default, requires blst)\ntry:\n    result = counter.set(100)\n    print(f\"Set to: {result[0]['value']}\")\nexcept Exception as e:\n    if \"blst\" in str(e).lower():\n        # Fallback: disable verification if blst not available\n        result = counter.set(100, verify_certificate=False)\n        print(f\"Set to: {result[0]['value']} (verification disabled)\")\n    else:\n        raise\n\n# Update with verification explicitly disabled\nresult = counter.increment(verify_certificate=False)\nprint(f\"Incremented: {result[0]['value']}\")\n```\n\n---\n\n## ⚠️ Error Handling\n\nICP-PY-CORE provides a structured error hierarchy for better error handling and debugging. All errors inherit from `ICError` and are categorized by type.\n\n### Error Classes\n\n```python\nfrom icp_core import (\n    ICError,                    # Base class for all errors\n    TransportError,             # HTTP/network errors\n    SecurityError,              # Base class for security errors\n    SignatureVerificationFailed,\n    CertificateVerificationError,\n    ReplicaReject,              # Canister rejection\n    PayloadEncodingError,\n    IngressExpiryError,\n)\n```\n\n### Common Error Scenarios\n\n**Transport Errors (Network Issues):**\n```python\nfrom icp_core import Client, TransportError\n\nclient = Client()\ntry:\n    data = client.query(\"canister-id\", b\"data\")\nexcept TransportError as e:\n    print(f\"Failed to connect to {e.url}\")\n    print(f\"Error: {e.original_error}\")\n```\n\n**Replica Rejections (Canister Errors):**\n```python\nfrom icp_core import Agent, Client, Identity, ReplicaReject\n\nagent = Agent(identity, client)\ntry:\n    result = agent.update(\"canister-id\", \"method\", args)\nexcept ReplicaReject as e:\n    print(f\"Rejected with code {e.reject_code}\")\n    print(f\"Message: {e.reject_message}\")\n    if e.error_code:\n        print(f\"Error code: {e.error_code}\")\n```\n\n**Security Errors (Certificate Verification):**\n```python\nfrom icp_core import (\n    CertificateVerificationError,\n    SignatureVerificationFailed,\n)\n\ntry:\n    certificate.assert_certificate_valid(canister_id)\nexcept CertificateVerificationError as e:\n    print(f\"Certificate verification failed: {e.reason}\")\nexcept SignatureVerificationFailed:\n    print(\"BLS signature verification failed\")\n```\n\n### Error Hierarchy\n\n```\nICError (base class)\n├── TransportError (HTTP/network errors)\n├── SecurityError (security errors)\n│   ├── SignatureVerificationFailed\n│   ├── CertificateVerificationError\n│   ├── LookupPathMissing\n│   ├── NodeKeyNotFoundError\n│   └── ReplicaSignatureVerificationFailed\n├── ReplicaReject (canister rejections)\n├── PayloadEncodingError (CBOR encoding errors)\n└── IngressExpiryError (expiry validation errors)\n```\n\n### Best Practices\n\n1. **Catch specific errors** for better error handling:\n   ```python\n   try:\n       result = agent.update(\"canister-id\", \"method\", args)\n   except ReplicaReject as e:\n       # Handle canister rejection\n       handle_rejection(e)\n   except TransportError as e:\n       # Handle network issues\n       handle_network_error(e)\n   except SecurityError as e:\n       # Handle security issues\n       handle_security_error(e)\n   ```\n\n2. **Check error attributes** for detailed information:\n   ```python\n   except ReplicaReject as e:\n       if e.reject_code == 3:\n           # Canister trapped\n           retry_with_different_args()\n       elif e.reject_code == 4:\n           # Canister did not reply\n           check_canister_status()\n   ```\n\n3. **Preserve error context** when re-raising:\n   ```python\n   try:\n       result = agent.update(\"canister-id\", \"method\", args)\n   except TransportError as e:\n       logger.error(f\"Network error: {e.url}\", exc_info=True)\n       raise  # Re-raise to preserve stack trace\n   ```\n\n---\n\n## 🔑 Installing `blst` (optional)\n\n`blst` is required for certificate verification (enabled by default). If `blst` is not installed, you can disable verification with `verify_certificate=False`.\n\n### Prerequisites\n\n**macOS:**\n```bash\n# Install Xcode Command Line Tools\nxcode-select --install\n\n# Install SWIG (required for Python bindings)\nbrew install swig\n```\n\n**Linux (Ubuntu/Debian):**\n```bash\nsudo apt-get update\nsudo apt-get install build-essential swig python3-dev\n```\n\n**Linux (Fedora/RHEL):**\n```bash\nsudo dnf install gcc gcc-c++ make swig python3-devel\n```\n\n### macOS / Linux Installation\n\n**Method 1: Build and add to PYTHONPATH (recommended for development)**\n\n```bash\ngit clone https://github.com/supranational/blst\ncd blst/bindings/python\n\n# For Apple Silicon (M1/M2/M3) if you encounter ABI issues:\n# export BLST_PORTABLE=1\n\npython3 run.me\n\n# Temporary (current session only):\nexport PYTHONPATH=\"$PWD:$PYTHONPATH\"\n\n# Permanent (add to ~/.bashrc or ~/.zshrc):\necho 'export PYTHONPATH=\"/path/to/blst/bindings/python:$PYTHONPATH\"' \u003e\u003e ~/.bashrc\nsource ~/.bashrc\n```\n\n**Method 2: Install to site-packages (recommended for production)**\n\n```bash\ngit clone https://github.com/supranational/blst\ncd blst/bindings/python\n\n# For Apple Silicon (M1/M2/M3) if needed:\n# export BLST_PORTABLE=1\n\npython3 run.me\n\n# Copy to site-packages\nBLST_SRC=\"$PWD\"\nPYBIN=\"python3\"\n\nSITE_PURE=\"$($PYBIN -c 'import sysconfig; print(sysconfig.get_paths()[\"purelib\"])')\"\nSITE_PLAT=\"$($PYBIN -c 'import sysconfig; print(sysconfig.get_paths()[\"platlib\"])')\"\n\ncp \"$BLST_SRC/blst.py\" \"$SITE_PURE\"/\ncp \"$BLST_SRC\"/_blst*.so \"$SITE_PLAT\"/\n```\n\n**Method 3: Install in virtual environment**\n\n```bash\n# Activate your virtual environment first\nsource venv/bin/activate  # or: source .venv/bin/activate\n\ngit clone https://github.com/supranational/blst\ncd blst/bindings/python\n\n# For Apple Silicon if needed:\n# export BLST_PORTABLE=1\n\npython3 run.me\n\n# Copy to virtual environment's site-packages\nBLST_SRC=\"$PWD\"\nSITE_PURE=\"$(python3 -c 'import sysconfig; print(sysconfig.get_paths()[\"purelib\"])')\"\nSITE_PLAT=\"$(python3 -c 'import sysconfig; print(sysconfig.get_paths()[\"platlib\"])')\"\n\ncp \"$BLST_SRC/blst.py\" \"$SITE_PURE\"/\ncp \"$BLST_SRC\"/_blst*.so \"$SITE_PLAT\"/\n```\n\n### Windows Installation\n\n**Option 1: WSL2 (Ubuntu) - Recommended**\n\n1. Install WSL2 and Ubuntu from Microsoft Store\n2. Follow the Linux installation instructions above in WSL2\n\n**Option 2: Native Windows (Advanced)**\n\n1. Install Visual Studio Build Tools with C++ support\n2. Install SWIG for Windows from [swig.org](http://www.swig.org/download.html)\n3. Install Python 3.8+ with development headers\n4. Follow the Linux build steps in PowerShell or Command Prompt\n5. Note: Windows support is experimental; WSL2 is recommended\n\n### Verify Installation\n\nTest if `blst` is correctly installed:\n\n```python\ntry:\n    import blst\n    assert all(hasattr(blst, n) for n in (\"P1_Affine\", \"P2_Affine\", \"Pairing\", \"BLST_SUCCESS\"))\n    print(\"✓ blst is installed and working correctly\")\nexcept (ModuleNotFoundError, AssertionError):\n    print(\"✗ blst is not available or incomplete\")\n```\n\nOr test with `icp-py-core`:\n\n```python\nfrom icp_certificate.certificate import ensure_blst_available\ntry:\n    ensure_blst_available()\n    print(\"✓ blst is available for certificate verification\")\nexcept RuntimeError as e:\n    print(f\"✗ {e}\")\n```\n\n### Troubleshooting\n\n**Issue: \"No module named 'blst'\"**\n- Ensure `blst.py` and `_blst*.so` are in your Python path\n- Check `python3 -c \"import sys; print(sys.path)\"` to see search paths\n- If using virtual environment, ensure it's activated\n\n**Issue: \"ABI mismatch\" on Apple Silicon**\n- Set `export BLST_PORTABLE=1` before running `python3 run.me`\n- This builds a portable version compatible with all architectures\n\n**Issue: \"SWIG not found\"**\n- Install SWIG: `brew install swig` (macOS) or `sudo apt-get install swig` (Linux)\n- Ensure SWIG is in your PATH: `which swig`\n\n**Issue: Import succeeds but API is incomplete**\n- Ensure you're using the official `supranational/blst` repository\n- Rebuild: `cd blst/bindings/python \u0026\u0026 python3 run.me`\n- Check that all required symbols exist: `P1_Affine`, `P2_Affine`, `Pairing`, `BLST_SUCCESS`\n\n---\n\n## 🧠 Features\n\n1. 🧩 Candid encode \u0026 decode (Rust-based parser for high performance)  \n2. 🔐 ed25519 \u0026 secp256k1 identities  \n3. 🧾 Principal utilities (strict DER mode)  \n4. ⚙️ High-level canister calls via Agent (`update()`, `query()`)  \n5. 🪙 Support for Ledger / Governance / Management / Cycles Wallet  \n6. 🔁 Sync \u0026 async APIs (low-level methods)  \n7. 🔒 Certificate verification enabled by default (BLS12-381)  \n8. ⚡ HTTP/2 support in async methods  \n9. 🛡️ Structured error handling (11 error classes)  \n10. 📦 Comprehensive example code library  \n\n---\n\n## 🧰 Example — End-to-End\n\n```python\nfrom icp_core import Agent, Client, Identity, Types\n\nclient = Client(\"https://ic0.app\")\niden = Identity()\nagent = Agent(iden, client)\n\n# Update (auto-encode [42], certificate verification enabled by default)\nagent.update(\"wcrzb-2qaaa-aaaap-qhpgq-cai\", \"set_value\", [42])\n\n# Query (auto-encode empty args)\nres = agent.query(\"wcrzb-2qaaa-aaaap-qhpgq-cai\", \"get_value\", None, return_type=[Types.Nat])\nprint(res)\n```\n\n---\n\n## 🔄 Migration\n\nMigrating from **ic-py**? See **[MIGRATION.md](./MIGRATION.md)** for:\n- New package layout (`icp_*` subpackages and the `icp_core` facade)\n- Endpoint changes (v3 call)\n- Argument auto-encoding in `Agent.update()` / `Agent.query()`\n- Certificate verification flag\n\n---\n\n## 📝 Changelog\n\nWe maintain release notes on GitHub Releases:  \n**https://github.com/eliezhao/icp-py-core/releases**\n\n---\n\n## 🗺 Roadmap\n\nSee [ROADMAP.md](./ROADMAP.md)\n\n✅ **Milestone 1**: v3/v4 endpoint migration, timeouts \u0026 error classification  \n✅ **Milestone 2**: Certificate verification with `blst` (enabled by default)  \n✅ **Milestone 3**: Candid type-system enhancements (Rust parser, DIDLoader, VarT support)  \n✅ **Milestone 4**: Expanded API surface (Ledger, Governance, Cycles Wallet, Management), code optimization, HTTP/2 support, structured error handling  \n✅ **Milestone 5**: Auto-fetch DID files, high-level async API methods (`update_async`, `query_async`), Canister async method support, replica-signed queries  \n\n---\n\n## 🔖 Version\n\n- Current release: **v2.3.0**\n\n---\n\n## 🙌 Acknowledgments\n\nSpecial thanks to the IC community and contributors to the original **ic-py**.  \n**icp-py-core** continues this legacy with modern Python standards and long-term maintenance.\n\n---\n\n## 📚 Additional Resources\n\n- **[CONTRIBUTING.md](./CONTRIBUTING.md)** - Guidelines for contributing to the project\n- **[CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)** - Community code of conduct\n- **[SECURITY.md](./SECURITY.md)** - Security policy and vulnerability reporting\n- **[MIGRATION.md](./MIGRATION.md)** - Migration guide from ic-py\n- **[CHANGELOG.md](./CHANGELOG.md)** - Release notes and changelog\n- **[ROADMAP.md](./ROADMAP.md)** - Project roadmap and future plans\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feliezhao%2Ficp-py-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feliezhao%2Ficp-py-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feliezhao%2Ficp-py-core/lists"}