Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Solana development skill covering @solana/kit v5, Anchor programs, LiteSVM testing, and security patterns.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/kit/codecs.md
1---2title: Codecs Reference3description: Data encoding and decoding patterns for numbers, strings, structs, arrays, enums, discriminated unions, and common account/instruction codecs.4---56# Solana Kit Codecs Reference78## Direction910- **`encode()`**: values → `Uint8Array`11- **`decode()`**: `Uint8Array` → values1213## Codec Types1415```ts16// Full codec17const codec: Codec<number> = getU32Codec();18codec.encode(42); // Uint8Array19codec.decode(bytes); // number2021// Encoder only (tree-shaking)22const encoder: Encoder<number> = getU32Encoder();2324// Decoder only25const decoder: Decoder<number> = getU32Decoder();26```2728## Number Codecs2930```ts31// Unsigned32getU8Codec(); // 1 byte33getU16Codec(); // 2 bytes (little-endian default)34getU32Codec(); // 4 bytes35getU64Codec(); // 8 bytes (bigint)36getU128Codec(); // 16 bytes (bigint)3738// Signed39getI8Codec(); getI16Codec(); getI32Codec(); getI64Codec();4041// Float42getF32Codec(); getF64Codec();4344// Big-endian45getU16Codec({ endian: Endian.Big });46```4748## String Codecs4950```ts51// UTF-8 (variable)52const utf8 = getUtf8Codec();5354// With size prefix (common)55const prefixed = addCodecSizePrefix(getUtf8Codec(), getU32Codec());5657// Fixed size58const fixed = fixCodecSize(getUtf8Codec(), 32);5960// Base58 (addresses)61const base58 = getBase58Codec();62```6364## Struct Codec6566```ts67type MyStruct = { id: number; name: string; balance: bigint };6869const codec = getStructCodec([70['id', getU32Codec()],71['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],72['balance', getU64Codec()],73]);7475const bytes = codec.encode({ id: 1, name: 'Alice', balance: 1000n });76const data = codec.decode(bytes);77```7879## Array & Tuple8081```ts82// Array with size prefix83const arr = addCodecSizePrefix(getArrayCodec(getU32Codec()), getU32Codec());8485// Fixed array86const fixed = fixCodecSize(getArrayCodec(getU32Codec()), 10);8788// Tuple89const point = getTupleCodec([getI32Codec(), getI32Codec()]);90```9192## Enum9394```ts95enum Direction { Up, Down, Left, Right }96const codec = getEnumCodec(Direction);97codec.encode(Direction.Up); // [0]98```99100## Discriminated Union101102```ts103type Shape =104| { __kind: 'circle'; radius: number }105| { __kind: 'rectangle'; width: number; height: number };106107const codec = getDiscriminatedUnionCodec([108['circle', getStructCodec([['radius', getU32Codec()]])],109['rectangle', getStructCodec([110['width', getU32Codec()],111['height', getU32Codec()],112])],113]);114```115116## Boolean & Nullable117118```ts119const bool = getBooleanCodec(); // 1 byte120const u32Bool = getBooleanCodec({ size: 4 });121122const nullable = getNullableCodec(getU32Codec());123nullable.encode(null); // [0]124nullable.encode(42); // [1, 42, 0, 0, 0]125```126127## Options (Rust Option)128129```ts130import { some, none, isSome, getOptionCodec } from '@solana/options';131132const opt = getOptionCodec(getU32Codec());133opt.encode(some(42)); // [1, 42, 0, 0, 0]134opt.encode(none()); // [0]135```136137## Bytes138139```ts140const bytes = getBytesCodec();141const fixed32 = fixCodecSize(getBytesCodec(), 32); // pubkeys142```143144## Composition Helpers145146```ts147// Size prefix148const prefixed = addCodecSizePrefix(getUtf8Codec(), getU32Codec());149150// Fixed size151const fixed = fixCodecSize(getUtf8Codec(), 32);152153// Transform154const upper = transformCodec(155getUtf8Codec(),156(v) => v.toUpperCase(), // before encode157(v) => v.toLowerCase(), // after decode158);159160// Offset161const offset = offsetCodec(getU32Codec(), { preOffset: 4 });162```163164## Common Patterns165166### Account Decoder167168```ts169const tokenDecoder: Decoder<TokenAccount> = getStructDecoder([170['mint', fixDecoderSize(getBytesDecoder(), 32)],171['owner', fixDecoderSize(getBytesDecoder(), 32)],172['amount', getU64Decoder()],173['delegate', getOptionDecoder(fixDecoderSize(getBytesDecoder(), 32))],174['state', getU8Decoder()],175]);176```177178### Instruction Encoder179180```ts181const transferEncoder: Encoder<{ discriminator: number; amount: bigint }> =182getStructEncoder([183['discriminator', getU8Encoder()],184['amount', getU64Encoder()],185]);186187const data = transferEncoder.encode({ discriminator: 3, amount: 1000000n });188```