🧱Serialization with Borsh
@race-foundation/borsh
Introduction
Why is this important?
Defining Schemas
import { field } from '@race-foundation/borsh'; class Player { @field('u8') level!: number; @field('u64') experience!: bigint; @field('string') name!: string; }import { field } from '@race-foundation/borsh'; class CryptoKeys { @field(32) // A 32-byte public key publicKey!: Uint8Array; }import { field, array, struct } from '@race-foundation/borsh'; class Item { @field('u32') id!: number; } class Inventory { // An array of primitive numbers @field(array('u8')) itemQuantities!: number[]; // An array of other serializable objects (structs) @field(array(struct(Item))) items!: Item[]; }import { field, struct } from '@race-foundation/borsh'; class Position { @field('u32') x!: number; @field('u32') y!: number; } class GameObject { @field(struct(Position)) position!: Position; }import { field, variant, enums } from '@race-foundation/borsh'; // 1. Define the abstract base class abstract class GameEvent {} // 2. Create and decorate each variant @variant(0) class PlayerMove extends GameEvent { @field('u32') x!: number; @field('u32') y!: number; } @variant(1) class PlayerAttack extends GameEvent { @field('u64') targetId!: bigint; } // In another class, use the `enums()` helper with the base class class Action { @field(enums(GameEvent)) event!: GameEvent; }import { field, option } from '@race-foundation/borsh'; class PlayerProfile { @field(option('string')) nickname?: string; } const player1 = new PlayerProfile(); // nickname is undefined const player2 = new PlayerProfile(); player2.nickname = 'Racer';import { field, map } from '@race-foundation/borsh'; class Scoreboard { @field(map('string', 'u32')) scores!: Map<string, number>; }
Using serialize and deserialize
serialize and deserializeComplete Example:
Command-Line Tool
Last updated