or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

array-operations.mddata-conversion.mdhex-operations.mdindex.mdsignature-operations.mdtype-checking.md
tile.json

signature-operations.mddocs/

Signature Operations

Functions for parsing and reconstructing cryptographic signatures used in Ethereum transactions and message signing. These utilities handle the complex task of working with ECDSA signatures in various formats.

Capabilities

Split Signature

Parses a signature from various input formats into a complete Signature object with all components.

/**
 * Parse signature into complete Signature object with all components
 * @param signature - SignatureLike input (bytes, hex string, or object)
 * @returns Complete Signature object with r, s, v, recoveryParam, _vs, yParityAndS, compact
 * @throws Error if signature format is invalid
 */
function splitSignature(signature: SignatureLike): Signature;

Usage Examples:

import { splitSignature } from "@ethersproject/bytes";

// Parse 65-byte signature (standard format)
const sig65 = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b";
const parsed1 = splitSignature(sig65);
// Result: {
//   r: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
//   s: "0x34567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
//   v: 27,
//   recoveryParam: 0,
//   _vs: "0x34567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
//   yParityAndS: "0x34567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
//   compact: "0x1234...full compact representation"
// }

// Parse 64-byte signature (EIP-2098 compact format)
const sig64 = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef92";
const parsed2 = splitSignature(sig64);
// Automatically extracts v from high bit of s component

// Parse object format
const sigObj = {
  r: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
  s: "0x34567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
  v: 27
};
const parsed3 = splitSignature(sigObj);

// Parse with recoveryParam instead of v
const sigRecovery = {
  r: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
  s: "0x34567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
  recoveryParam: 0
};
const parsed4 = splitSignature(sigRecovery);

Join Signature

Combines signature components into a single 65-byte signature format.

/**
 * Combine signature components into 65-byte signature format
 * @param signature - SignatureLike input with signature components
 * @returns Hex string containing 65-byte signature (r + s + v)
 */
function joinSignature(signature: SignatureLike): string;

Usage Examples:

import { joinSignature, splitSignature } from "@ethersproject/bytes";

// Join from object format
const sigComponents = {
  r: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
  s: "0x34567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
  v: 27
};
const joined1 = joinSignature(sigComponents);
// Result: "0x1234567890abcdef...1234567890abcdef121b" (65 bytes total)

// Join from already parsed signature
const signature = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b";
const parsed = splitSignature(signature);
const rejoined = joinSignature(parsed);
// Result: Same as original signature

// Round-trip conversion
const original = {
  r: "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab",
  s: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12",
  recoveryParam: 1
};
const bytes = joinSignature(original);
const reparsed = splitSignature(bytes);
// reparsed will have all signature components properly calculated

Types

type SignatureLike = {
  r: string;
  s?: string;
  _vs?: string;
  recoveryParam?: number;
  v?: number;
} | BytesLike;

interface Signature {
  /** R component of the signature (32 bytes) */
  r: string;
  /** S component of the signature (32 bytes) */
  s: string;
  /** Combined v and s value (EIP-2098 format) */
  _vs: string;
  /** Recovery parameter (0 or 1) */
  recoveryParam: number;
  /** V value (typically 27 or 28) */
  v: number;
  /** Alias for _vs (y parity and s combined) */
  yParityAndS: string;
  /** Compact signature format (r + _vs) */
  compact: string;
}

Signature Format Details

65-byte format (standard): r (32 bytes) + s (32 bytes) + v (1 byte)

  • Used in most Ethereum signature contexts
  • V value is typically 27 or 28 for Ethereum mainnet

64-byte format (EIP-2098): r (32 bytes) + vs (32 bytes)

  • Compact format where v bit is encoded in high bit of s
  • More efficient storage while maintaining all information

Object format: Flexible object with signature components

  • Can specify v, recoveryParam, or both
  • Can use _vs for EIP-2098 compatibility
  • Allows partial signatures that get completed by functions