From b06c9d2bf4363e40d4407aa58016b8553e2b86f9 Mon Sep 17 00:00:00 2001 From: Olivier Desenfans Date: Tue, 25 Aug 2026 15:20:36 +0200 Subject: [PATCH 1/2] chore: require aleph-message 1.3.0 for V-PROGRAM support aleph-message 1.3.0 adds MessageType.v_program and VerifiableProgramMessage. Bump the floor so listing and fetching V-PROGRAM messages is guaranteed to parse, and cover it with unit tests. --- pyproject.toml | 2 +- tests/unit/test_v_program_get.py | 93 ++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 tests/unit/test_v_program_get.py diff --git a/pyproject.toml b/pyproject.toml index cdd5c9fe..01161beb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ "aiohttp>=3.8.3", "aioresponses>=0.7.6", "aleph-cid>=0.1", - "aleph-message>=1.1.1", + "aleph-message>=1.3.0", "aleph-superfluid>=0.3", "base58==2.1.1", # Needed now as default with _load_account changement "coincurve; python_version>='3.9'", diff --git a/tests/unit/test_v_program_get.py b/tests/unit/test_v_program_get.py new file mode 100644 index 00000000..3eea77d1 --- /dev/null +++ b/tests/unit/test_v_program_get.py @@ -0,0 +1,93 @@ +import hashlib +import json + +import pytest +from aleph_message.models import MessageType, VerifiableProgramMessage + +from aleph.sdk.query.filters import MessageFilter + +from .conftest import make_mock_get_session + +ADDRESS = "0x4145f182EF2F06b45E50468519C1B92C60FBd4A0" +LAUNCH_DIGEST = "e" * 96 + + +def make_v_program_message() -> dict: + content = { + "address": ADDRESS, + "time": 1755000000.0, + "allow_amend": False, + "payment": {"chain": "ETH", "type": "credit"}, + "resources": {"vcpus": 1, "memory": 512, "seconds": 30}, + "runtime": {"ref": "a" * 64, "comment": "runtime manifest"}, + "workload": {"ref": "b" * 64, "hash_tree": "c" * 64, "roothash": "d" * 64}, + "verification": { + "backend": "sev_snp", + "policy": 0x30000, + "measurements": [ + {"platform": "sev_snp", "registers": {"launch": LAUNCH_DIGEST}} + ], + }, + "volumes": [], + "environment": {"internet": True}, + } + item_content = json.dumps(content, separators=(",", ":")) + return { + "chain": "ETH", + "sender": ADDRESS, + "type": "V-PROGRAM", + "channel": "TEST", + "time": 1755000000.0, + "item_type": "inline", + "item_content": item_content, + "item_hash": hashlib.sha256(item_content.encode()).hexdigest(), + "content": content, + "signature": "0x" + "ab" * 65, + "confirmed": False, + } + + +@pytest.mark.asyncio +async def test_get_v_program_messages(): + raw = make_v_program_message() + mock_session = make_mock_get_session( + { + "messages": [raw], + "pagination_page": 1, + "pagination_total": 1, + "pagination_per_page": 20, + "pagination_item": "messages", + } + ) + async with mock_session as session: + response = await session.get_messages( + message_filter=MessageFilter(message_types=[MessageType.v_program]), + ignore_invalid_messages=False, + ) + + assert len(response.messages) == 1 + message = response.messages[0] + assert isinstance(message, VerifiableProgramMessage) + assert message.type == MessageType.v_program + assert message.content.verification.measurements[0].registers.launch == ( + LAUNCH_DIGEST + ) + + +@pytest.mark.asyncio +async def test_get_v_program_message(): + raw = make_v_program_message() + mock_session = make_mock_get_session({"status": "processed", "message": raw}) + async with mock_session as session: + message = await session.get_message( + raw["item_hash"], message_type=VerifiableProgramMessage + ) + + assert isinstance(message, VerifiableProgramMessage) + assert message.content.workload.roothash == "d" * 64 + assert message.content.is_confidential + + +def test_message_filter_v_program_http_params(): + params = MessageFilter(message_types=[MessageType.v_program]).as_http_params() + assert params["msgTypes"] == "V-PROGRAM" From 56d5d33b3c5c5ddf4e26f0c48a357eaf054d981f Mon Sep 17 00:00:00 2001 From: Olivier Desenfans Date: Tue, 25 Aug 2026 15:33:31 +0200 Subject: [PATCH 2/2] style: normalize aleph-message pin for pyproject-fmt --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 01161beb..8ca98b44 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ "aiohttp>=3.8.3", "aioresponses>=0.7.6", "aleph-cid>=0.1", - "aleph-message>=1.3.0", + "aleph-message>=1.3", "aleph-superfluid>=0.3", "base58==2.1.1", # Needed now as default with _load_account changement "coincurve; python_version>='3.9'",