Skip to content

nameskyteam/borsher

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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);