{"receipt_id":"28392c9aa6c79224","locker_id":"locker_6eb578029e8e","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","provider":"gcs","payment_proof":{"tx_signature":"3M39xRjWKEWVa5D7meHNjWdfSrXwmvCtvJQJ3pB9F6jBHQRjGR115jEe53w3Rr7VWpdrehUYWYrjq99qoBpCCVSh","paid_amount":"1","pay_asset":"BETA","paid_raw":1,"amount_sol":null,"amount_lamports":null,"payer":"2Dbvt7kgBjjuBUChmh4bqfrGtqUTRDZhud6Rom5jFniR","payee":"HqrTLaNk89dHPVR5zyMPtEiRnQfabmqc8B9yR3KVbyVp","confirmed_at":1778634945,"explorer_url":"https://explorer.solana.com/tx/3M39xRjWKEWVa5D7meHNjWdfSrXwmvCtvJQJ3pB9F6jBHQRjGR115jEe53w3Rr7VWpdrehUYWYrjq99qoBpCCVSh"},"content_proof":{"merkle_root":"sha256:e5306c47204e03342c096c323f6bf5b7b5bccbedcf9c6fedf28b076198235d11","att_code":"4255ddbc","file_count":1,"total_bytes":56108,"schema_version":"1.0","attested_at":"2026-06-08T08:55:49Z","files":[{"filename":"declaration-of-cognitive-continuity.pdf","size_bytes":56108,"content_hash":"489c2b88ffd6ed8c8028f51f824522857af4544b248b6f739375fcbedfa3916e","download_url":"https://api.nukez.xyz/v1/r/28392c9aa6c79224/f/declaration-of-cognitive-continuity.pdf"}]},"on_chain_anchor":null,"merkle_algorithm":{"name":"nukez-merkle-v1","schema_version":"1.0","spec":{"ordering":"Sort file entries lexicographically by filename","leaf_formula":"SHA256(\"{filename}:{size_bytes}:{content_hash}\".encode('utf-8')).hexdigest()","combine_formula":"SHA256((left_hex + right_hex).encode('utf-8')).hexdigest()","odd_node_rule":"If odd number of nodes at any level, duplicate the last node","direction":"Bottom-up (leaves to root)"},"pseudocode":["1. entries = sorted(files, key=lambda e: e['filename'])","2. For each entry, strip 'sha256:' prefix from content_hash if present","3. leaves = [SHA256(f'{e.filename}:{e.size_bytes}:{e.content_hash}') for e in entries]","4. while len(level) > 1:","     next_level = []","     for i in range(0, len(level), 2):","       left = level[i]","       right = level[i+1] if i+1 < len(level) else level[i]","       next_level.append(SHA256(left + right))","     level = next_level","5. root = level[0]"],"notes":["All SHA256 outputs are lowercase hex strings (64 chars)","String concatenation in combine step uses raw hex (no separators)","SHA256 input is always UTF-8 encoded","content_hash in leaf formula should have 'sha256:' prefix stripped"],"reference_implementation":"https://github.com/nukez-xyz/gateway/blob/main/gateway/app/core/merkle.py"},"verify_yourself":{"steps":["1. Download each file from its download_url (e.g. https://api.nukez.xyz/v1/r/28392c9aa6c79224/f/{filename})","2. SHA256 the raw bytes — result must match the file's content_hash","3. Build the merkle tree using the algorithm above","4. Your computed root must match content_proof.merkle_root","5. Look up on_chain_anchor.tx_signature on Solana Explorer — the SPL Memo in that transaction contains the merkle root","6. (Optional) Call the recompute endpoint to have the gateway independently rebuild the merkle tree from live storage"],"endpoints":{"recompute_verify":"https://api.nukez.xyz/v1/storage/recompute-verify?receipt_id=28392c9aa6c79224","payment_verify":"https://api.nukez.xyz/v1/receipts/28392c9aa6c79224/verify-payment","merkle_proof":"https://api.nukez.xyz/v1/storage/merkle-proof?receipt_id=28392c9aa6c79224&filename={filename}","unified_verify":"https://api.nukez.xyz/v1/storage/verify?receipt_id=28392c9aa6c79224"}},"verify_page_url":"https://nukez.xyz/verify/28392c9aa6c79224"}