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.
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);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 calculatedtype 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;
}65-byte format (standard): r (32 bytes) + s (32 bytes) + v (1 byte)
64-byte format (EIP-2098): r (32 bytes) + vs (32 bytes)
Object format: Flexible object with signature components