Bytes utility functions for converting, validating, and manipulating binary data in Ethereum applications.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
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