ordinals-parser 0.1.0

A lightweight parser for Bitcoin Ordinals inscriptions
Documentation
#!/usr/bin/env python3
"""
Example Python script for using ordinals-parser via PyO3 bindings.

This assumes we would build Python bindings for the Rust library.
"""

import sys
from typing import List, Optional
import binascii

# This would be the actual import once the package is installed
try:
    import ordinals_parser
except ImportError:
    print("This is an example file that assumes 'ordinals_parser' Python package is installed.")
    print("The actual implementation would require building PyO3 bindings for the Rust library.")
    sys.exit(1)


def parse_inscriptions_from_hex(tx_hex: str) -> None:
    """Parse and display all inscriptions from a transaction hex string."""
    try:
        # Create a Transaction object from hex
        tx_bytes = binascii.unhexlify(tx_hex)
        tx = ordinals_parser.Transaction.from_bytes(tx_bytes)
        print(f"Transaction ID: {tx.get_txid()}")
        
        # Parse inscriptions from the transaction
        inscriptions = ordinals_parser.parse_inscriptions_from_transaction(tx)
        
        if not inscriptions:
            print("No inscriptions found in this transaction.")
            return
        
        print(f"Found {len(inscriptions)} inscription(s):")
        
        # Print details for each inscription
        for i, inscription in enumerate(inscriptions):
            print(f"\nInscription #{i + 1}")
            print_inscription_details(inscription)
    
    except Exception as e:
        print(f"Error parsing inscriptions: {e}")


def print_inscription_details(inscription) -> None:
    """Print detailed information about an inscription."""
    print(f"  Content Type: {inscription.content_type() or 'None'}")
    
    if inscription.content_encoding():
        print(f"  Content Encoding: {inscription.content_encoding()}")
    
    print(f"  Content Length: {inscription.content_length() or 0} bytes")
    
    if inscription.metaprotocol():
        print(f"  Metaprotocol: {inscription.metaprotocol()}")
    
    parents = inscription.parents()
    if parents:
        print("  Parents:")
        for parent in parents:
            print(f"    {parent}")
    
    if inscription.delegate():
        print(f"  Delegate: {inscription.delegate()}")
    
    pointer = inscription.pointer()
    if pointer is not None:
        print(f"  Pointer: {pointer}")
    
    # For text content, print a preview
    content_type = inscription.content_type()
    if content_type and content_type.startswith('text/'):
        body = inscription.body()
        if body:
            text = body.decode('utf-8', errors='replace')
            preview = f"{text[:100]}..." if len(text) > 100 else text
            print(f'  Content Preview: "{preview}"')
    elif content_type and content_type.startswith('image/'):
        print("  Content: [IMAGE DATA]")
    elif content_type:
        print("  Content: [BINARY DATA]")
    
    # Print flags
    print("  Flags:")
    print(f"    Duplicate Fields: {inscription.duplicate_field}")
    print(f"    Incomplete Fields: {inscription.incomplete_field}")
    print(f"    Unrecognized Even Fields: {inscription.unrecognized_even_field}")
    print(f"    Hidden: {inscription.hidden()}")


def create_inscription() -> None:
    """Create and convert an inscription."""
    # Create a new inscription
    inscription = ordinals_parser.Inscription()
    inscription.set_content_type("text/plain;charset=utf-8")
    inscription.set_body("Hello, Ordinals!".encode('utf-8'))
    
    # Convert to a witness script
    witness_script = inscription.to_script()
    print("\nCreated inscription witness script:")
    print(binascii.hexlify(witness_script.to_bytes()).decode())
    
    return inscription


if __name__ == "__main__":
    # Example inscription transaction (same as in the Rust example)
    sample_tx_hex = (
        "0200000000010137c361dc8bdf2c902a73c76f3059db944fc62e635ae7381aa06c79e9a1d1640b0100000000fdffffff020000000000000000296a0e6f7264010100000000000000110011018fe3bfeff84353cd5863c7c9ba48575a0cb2fb606d075f336701000000000017a914121f75e89e9b240a83b303b6e22e074d1c65dfa9870247304402205d793a28c26e568cf0601aae58a976a880f98fae56d905ab9e9e7f7342d4b3d402201b53b8f5507ac93eb7afad7e34af11c78c9b325947ad8c3f25be67700c0c0a90012103af0b2c5c872b732ac9474c576f84950e0a89ec57500507944c87f1fa4af76b9d00000000"
    )
    
    # Parse the sample transaction
    print("Parsing sample transaction...")
    parse_inscriptions_from_hex(sample_tx_hex)
    
    # Create an example inscription
    print("\nCreating a new inscription...")
    create_inscription()