Home

Awesome

Borsher

Support for Borsh (de)serialization

Borsher wraps the Borsh JS and simplifies the creation of schema

Install

pnpm add borsher

Usage

import { BorshSchema, borshSerialize, borshDeserialize, Unit } from 'borsher';

u8

const n: number = 100;
const buffer = borshSerialize(BorshSchema.u8, n);

u16

const n: number = 100;
const buffer = borshSerialize(BorshSchema.u16, n);

u32

const n: number = 100;
const buffer = borshSerialize(BorshSchema.u32, n);

u64

const n: bigint = 100n;
const buffer = borshSerialize(BorshSchema.u64, n);

u128

const n: bigint = 100n;
const buffer = borshSerialize(BorshSchema.u128, n);

i8

const n: number = 100;
const buffer = borshSerialize(BorshSchema.i8, n);

i16

const n: number = 100;
const buffer = borshSerialize(BorshSchema.i16, n);

i32

const n: number = 100;
const buffer = borshSerialize(BorshSchema.i32, n);

i64

const n: bigint = 100n;
const buffer = borshSerialize(BorshSchema.i64, n);

i128

const n: bigint = 100n;
const buffer = borshSerialize(BorshSchema.i128, n);

f32

const n: number = 1.0;
const buffer = borshSerialize(BorshSchema.f32, n);

f64

const n: number = 1.0;
const buffer = borshSerialize(BorshSchema.f64, n);

bool

const b: boolean = true;
const buffer = borshSerialize(BorshSchema.bool, b);

String

const message: string = 'hello world';
const buffer = borshSerialize(BorshSchema.String, message);

Option

const schema = BorshSchema.Option(BorshSchema.String);

const some: string | null = 'hello world';
const someBuffer = borshSerialize(schema, some);

const none: string | null = null;
const noneBuffer = borshSerialize(schema, none);

Array

const schema = BorshSchema.Array(BorshSchema.String, 2);
const messages: string[] = ['hello', 'world'];
const buffer = borshSerialize(schema, messages);

Vec

const schema = BorshSchema.Vec(BorshSchema.String);
const messages: string[] = ['hello', 'world'];
const buffer = borshSerialize(schema, messages);

HashSet

const schema = BorshSchema.HashSet(BorshSchema.String);
const messages: Set<string> = new Set(['hello', 'world']);
const buffer = borshSerialize(schema, messages);

HashMap

const schema = BorshSchema.HashMap(BorshSchema.String, BorshSchema.u128);
const balances: Map<string, bigint> = new Map([
  ['alice', 1_000_000_000_000_000_000_000_000n],
  ['bob', 2_000_000_000_000_000_000_000_000n],
]);
const buffer = borshSerialize(schema, balances);

Unit

const unit: Unit = {};
const buffer = borshSerialize(BorshSchema.Unit, unit);

Struct

type Person = {
  name: string;
  age: number;
};

const schema = BorshSchema.Struct({
  name: BorshSchema.String,
  age: BorshSchema.u8,
});

const person: Person = {
  name: 'alice',
  age: 18,
};

const buffer = borshSerialize(schema, person);

Enum Without Associated Type

type Status = 
  | {
      Pending: Unit;
    }
  | {
      Fulfilled: Unit;
    }
  | {
      Rejected: Unit;
    };

const schema = BorshSchema.Enum({
  Pending: BorshSchema.Unit,
  Fulfilled: BorshSchema.Unit,
  Rejected: BorshSchema.Unit,
});

const status: Status = {
  Pending: {},
};

const buffer = borshSerialize(schema, status);

Enum With Associated Type

type Shape =
  | {
      Square: number;
    }
  | {
      Rectangle: {
        length: number;
        width: number;
      };
    }
  | {
      Circle: {
        radius: number;
      };
    };

const schema = BorshSchema.Enum({
  Square: BorshSchema.u32,
  Rectangle: BorshSchema.Struct({
    length: BorshSchema.u32,
    width: BorshSchema.u32,
  }),
  Circle: BorshSchema.Struct({
    radius: BorshSchema.u32,
  }),
});

const shape: Shape = {
  Square: 5,
};

const buffer = borshSerialize(schema, shape);