@coral-xyz/borsh
Version:
Anchor Borsh
222 lines • 8.63 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.struct = exports.f64 = exports.f32 = exports.i32 = exports.u32 = exports.i16 = exports.u16 = exports.i8 = exports.u8 = void 0;
exports.u64 = u64;
exports.i64 = i64;
exports.u128 = u128;
exports.i128 = i128;
exports.u256 = u256;
exports.i256 = i256;
exports.publicKey = publicKey;
exports.option = option;
exports.bool = bool;
exports.vec = vec;
exports.tagged = tagged;
exports.vecU8 = vecU8;
exports.str = str;
exports.rustEnum = rustEnum;
exports.array = array;
exports.map = map;
const buffer_layout_1 = require("buffer-layout");
const web3_js_1 = require("@solana/web3.js");
const bn_js_1 = __importDefault(require("bn.js"));
var buffer_layout_2 = require("buffer-layout");
Object.defineProperty(exports, "u8", { enumerable: true, get: function () { return buffer_layout_2.u8; } });
Object.defineProperty(exports, "i8", { enumerable: true, get: function () { return buffer_layout_2.s8; } });
Object.defineProperty(exports, "u16", { enumerable: true, get: function () { return buffer_layout_2.u16; } });
Object.defineProperty(exports, "i16", { enumerable: true, get: function () { return buffer_layout_2.s16; } });
Object.defineProperty(exports, "u32", { enumerable: true, get: function () { return buffer_layout_2.u32; } });
Object.defineProperty(exports, "i32", { enumerable: true, get: function () { return buffer_layout_2.s32; } });
Object.defineProperty(exports, "f32", { enumerable: true, get: function () { return buffer_layout_2.f32; } });
Object.defineProperty(exports, "f64", { enumerable: true, get: function () { return buffer_layout_2.f64; } });
Object.defineProperty(exports, "struct", { enumerable: true, get: function () { return buffer_layout_2.struct; } });
class BNLayout extends buffer_layout_1.Layout {
constructor(span, signed, property) {
super(span, property);
this.blob = (0, buffer_layout_1.blob)(span);
this.signed = signed;
}
decode(b, offset = 0) {
const num = new bn_js_1.default(this.blob.decode(b, offset), 10, "le");
if (this.signed) {
return num.fromTwos(this.span * 8).clone();
}
return num;
}
encode(src, b, offset = 0) {
if (this.signed) {
src = src.toTwos(this.span * 8);
}
return this.blob.encode(src.toArrayLike(Buffer, "le", this.span), b, offset);
}
}
function u64(property) {
return new BNLayout(8, false, property);
}
function i64(property) {
return new BNLayout(8, true, property);
}
function u128(property) {
return new BNLayout(16, false, property);
}
function i128(property) {
return new BNLayout(16, true, property);
}
function u256(property) {
return new BNLayout(32, false, property);
}
function i256(property) {
return new BNLayout(32, true, property);
}
class WrappedLayout extends buffer_layout_1.Layout {
constructor(layout, decoder, encoder, property) {
super(layout.span, property);
this.layout = layout;
this.decoder = decoder;
this.encoder = encoder;
}
decode(b, offset) {
return this.decoder(this.layout.decode(b, offset));
}
encode(src, b, offset) {
return this.layout.encode(this.encoder(src), b, offset);
}
getSpan(b, offset) {
return this.layout.getSpan(b, offset);
}
}
function publicKey(property) {
return new WrappedLayout((0, buffer_layout_1.blob)(32), (b) => new web3_js_1.PublicKey(b), (key) => key.toBuffer(), property);
}
class OptionLayout extends buffer_layout_1.Layout {
constructor(layout, property) {
super(-1, property);
this.layout = layout;
this.discriminator = (0, buffer_layout_1.u8)();
}
encode(src, b, offset = 0) {
if (src === null || src === undefined) {
return this.discriminator.encode(0, b, offset);
}
this.discriminator.encode(1, b, offset);
return this.layout.encode(src, b, offset + 1) + 1;
}
decode(b, offset = 0) {
const discriminator = this.discriminator.decode(b, offset);
if (discriminator === 0) {
return null;
}
else if (discriminator === 1) {
return this.layout.decode(b, offset + 1);
}
throw new Error("Invalid option " + this.property);
}
getSpan(b, offset = 0) {
const discriminator = this.discriminator.decode(b, offset);
if (discriminator === 0) {
return 1;
}
else if (discriminator === 1) {
return this.layout.getSpan(b, offset + 1) + 1;
}
throw new Error("Invalid option " + this.property);
}
}
function option(layout, property) {
return new OptionLayout(layout, property);
}
function bool(property) {
return new WrappedLayout((0, buffer_layout_1.u8)(), decodeBool, encodeBool, property);
}
function decodeBool(value) {
if (value === 0) {
return false;
}
else if (value === 1) {
return true;
}
throw new Error("Invalid bool: " + value);
}
function encodeBool(value) {
return value ? 1 : 0;
}
function vec(elementLayout, property) {
const length = (0, buffer_layout_1.u32)("length");
const layout = (0, buffer_layout_1.struct)([
length,
(0, buffer_layout_1.seq)(elementLayout, (0, buffer_layout_1.offset)(length, -length.span), "values"),
]);
return new WrappedLayout(layout, ({ values }) => values, (values) => ({ values }), property);
}
function tagged(tag, layout, property) {
const wrappedLayout = (0, buffer_layout_1.struct)([
u64("tag"),
layout.replicate("data"),
]);
function decodeTag({ tag: receivedTag, data }) {
if (!receivedTag.eq(tag)) {
throw new Error("Invalid tag, expected: " +
tag.toString("hex") +
", got: " +
receivedTag.toString("hex"));
}
return data;
}
return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);
}
function vecU8(property) {
const length = (0, buffer_layout_1.u32)("length");
const layout = (0, buffer_layout_1.struct)([
length,
(0, buffer_layout_1.blob)((0, buffer_layout_1.offset)(length, -length.span), "data"),
]);
return new WrappedLayout(layout, ({ data }) => data, (data) => ({ data }), property);
}
function str(property) {
return new WrappedLayout(vecU8(), (data) => data.toString("utf-8"), (s) => Buffer.from(s, "utf-8"), property);
}
function rustEnum(variants, property, discriminant) {
const unionLayout = (0, buffer_layout_1.union)(discriminant !== null && discriminant !== void 0 ? discriminant : (0, buffer_layout_1.u8)(), property);
variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));
return unionLayout;
}
function array(elementLayout, length, property) {
const layout = (0, buffer_layout_1.struct)([
(0, buffer_layout_1.seq)(elementLayout, length, "values"),
]);
return new WrappedLayout(layout, ({ values }) => values, (values) => ({ values }), property);
}
class MapEntryLayout extends buffer_layout_1.Layout {
constructor(keyLayout, valueLayout, property) {
super(keyLayout.span + valueLayout.span, property);
this.keyLayout = keyLayout;
this.valueLayout = valueLayout;
}
decode(b, offset) {
offset = offset || 0;
const key = this.keyLayout.decode(b, offset);
const value = this.valueLayout.decode(b, offset + this.keyLayout.getSpan(b, offset));
return [key, value];
}
encode(src, b, offset) {
offset = offset || 0;
const keyBytes = this.keyLayout.encode(src[0], b, offset);
const valueBytes = this.valueLayout.encode(src[1], b, offset + keyBytes);
return keyBytes + valueBytes;
}
getSpan(b, offset) {
return (this.keyLayout.getSpan(b, offset) + this.valueLayout.getSpan(b, offset));
}
}
function map(keyLayout, valueLayout, property) {
const length = (0, buffer_layout_1.u32)("length");
const layout = (0, buffer_layout_1.struct)([
length,
(0, buffer_layout_1.seq)(new MapEntryLayout(keyLayout, valueLayout), (0, buffer_layout_1.offset)(length, -length.span), "values"),
]);
return new WrappedLayout(layout, ({ values }) => new Map(values), (values) => ({ values: Array.from(values.entries()) }), property);
}
//# sourceMappingURL=index.js.map