The blob is split into 585-byte chunks, base64-encoded, and written to Solana memo transactions.
FD:{hash8}:{index}:{base64data}
First 8 hex chars of manifest SHA-256 (no sha256: prefix)
Zero-padded chunk index ("00", "01", ...)
Base64-encoded 585-byte raw chunk
Total per memo TX: ~795 bytes (within Solana's 1,232 byte limit)
MEMO_CHUNK_SIZE = 600 (header + payload)
MEMO_PAYLOAD_SIZE = 585 (raw bytes per chunk)
V3_HEADER_SIZE = 15 (FD:{hash8}:{idx}:)
MEMO_PROGRAM_ID = MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr
chunk_count = ceil(blob_bytes / 585)
Example: a 5 MB file produces a ~5 MB blob (49B header + file), requiring ceil(5,242,929 / 585) = 8,963 memo transactions.
After all chunks are confirmed, a single pointer memo is sent. This is the index — anyone can find all chunks from the pointer alone.
Full manifest hash (sha256:abcdef...)
Number of chunks inscribed
585 (constant, for verification)
Content type + encryption mode flags
First 8 chars of inscriber's wallet address
TX signature of the last chunk (for ordering/discovery)
Reconstruction (Hydration)
Three ways to reconstruct a file from chain:
1. From Signatures
Provide the JSON array of all chunk TX signatures. Fetch each TX, extract memo data, decode base64, reassemble in order.
2. From Pointer
Provide one pointer TX signature:
Fetch the pointer TX → parse FREEZEDRY:3: memo
Extract hash, chunk count, and inscriber wallet
Scan inscriber's TX history via getSignaturesForAddress
Match memos containing FD:{hash8}: prefix
Sort by chunk index → decode → reassemble
Provide a Metaplex Core NFT mint address:
Call DAS getAsset → read inscriptionHash attribute
Find pointer memo in the inscription authority's TX history
Chain into pointer resolve (method 2 above)
Last updated