Skip to main content

Documentation Index

Fetch the complete documentation index at: https://voltaire.tevm.sh/llms.txt

Use this file to discover all available pages before exploring further.

Try it Live

Run Blob examples in the interactive playground

    Calculation

    Each blob stores up to 131,064 bytes of data:
    import { Blob } from 'tevm';
    
    const maxPerBlob = Blob.SIZE - 8; // 131,064 bytes
    console.log(`Max per blob: ${maxPerBlob}`);
    
    // Formula: ceil(dataLength / maxPerBlob)
    function estimate(dataLength: number): number {
      return Math.ceil(dataLength / maxPerBlob);
    }
    
    // Examples
    console.log(estimate(1));         // 1 blob
    console.log(estimate(131_064));   // 1 blob (exactly fits)
    console.log(estimate(131_065));   // 2 blobs (1 byte over)
    console.log(estimate(262_128));   // 2 blobs
    console.log(estimate(300_000));   // 3 blobs
    console.log(estimate(786_384));   // 6 blobs (max)
    

    Size Limits

    import { Blob } from 'tevm';
    
    const maxPerBlob = Blob.SIZE - 8;
    const maxData = maxPerBlob * Blob.MAX_PER_TRANSACTION;
    
    console.log(`Max per blob: ${maxPerBlob} bytes`);       // 131,064
    console.log(`Max per transaction: ${maxData} bytes`);    // 786,384
    console.log(`Max blobs per transaction: ${Blob.MAX_PER_TRANSACTION}`); // 6
    
    // At limit
    console.log(Blob.estimateBlobCount(maxData));     // 6
    
    // Over limit (would fail in splitData)
    console.log(Blob.estimateBlobCount(maxData + 1)); // 7
    

    Use Cases

    Pre-Flight Validation

    import { Blob } from 'tevm';
    
    function canFitInTransaction(data: Uint8Array): boolean {
      const blobCount = Blob.estimateBlobCount(data);
      return blobCount <= Blob.MAX_PER_TRANSACTION;
    }
    
    if (!canFitInTransaction(largeData)) {
      console.error('Data too large for single transaction');
      // Split into multiple transactions or compress
    }
    

    Cost Estimation

    import { Blob } from 'tevm';
    
    async function estimateBlobCost(
      data: Uint8Array,
      provider: any
    ): Promise<bigint> {
      const blobCount = Blob.estimateBlobCount(data);
      const blobBaseFee = await provider.getBlobBaseFee();
    
      return Blob.calculateGas(blobCount, blobBaseFee);
    }
    
    const cost = await estimateBlobCost(data, provider);
    console.log(`Estimated cost: ${cost / 10n**9n} gwei`);
    

    Batch Planning

    import { Blob } from 'tevm';
    
    function planBatches(items: Uint8Array[]): Uint8Array[][] {
      const batches: Uint8Array[][] = [];
      let currentBatch: Uint8Array[] = [];
      let currentBlobCount = 0;
    
      for (const item of items) {
        const itemBlobCount = Blob.estimateBlobCount(item);
    
        if (currentBlobCount + itemBlobCount > Blob.MAX_PER_TRANSACTION) {
          // Start new batch
          batches.push(currentBatch);
          currentBatch = [item];
          currentBlobCount = itemBlobCount;
        } else {
          // Add to current batch
          currentBatch.push(item);
          currentBlobCount += itemBlobCount;
        }
      }
    
      if (currentBatch.length > 0) {
        batches.push(currentBatch);
      }
    
      return batches;
    }
    

    Edge Cases

    import { Blob } from 'tevm';
    
    // Empty data
    console.log(Blob.estimateBlobCount(0)); // 1 blob (minimum)
    
    // Exactly 1 blob
    const exactlyOne = new Uint8Array(131_064);
    console.log(Blob.estimateBlobCount(exactlyOne)); // 1
    
    // 1 byte over
    const oneOver = new Uint8Array(131_065);
    console.log(Blob.estimateBlobCount(oneOver)); // 2
    
    // Maximum
    const maxData = new Uint8Array(786_384);
    console.log(Blob.estimateBlobCount(maxData)); // 6
    

    See Also