@native-to-anchor/buffer-layout
Version:
Buffer layout utilities for Solana programs.
224 lines • 9.12 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.utf8Str = exports.bytes = exports.vec = exports.coption = exports.option = exports.i128 = exports.u128 = exports.i64 = exports.u64 = exports.publicKey = exports.decimal = exports.bool = exports.union = exports.u8 = exports.u32 = exports.u16 = exports.struct = exports.seq = exports.i8 = exports.i32 = exports.i16 = exports.Layout = exports.f64 = exports.f32 = exports.blob = void 0;
const bn_js_1 = __importDefault(require("bn.js"));
const buffer_layout_1 = require("@solana/buffer-layout");
var buffer_layout_2 = require("@solana/buffer-layout");
Object.defineProperty(exports, "blob", { enumerable: true, get: function () { return buffer_layout_2.blob; } });
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, "Layout", { enumerable: true, get: function () { return buffer_layout_2.Layout; } });
Object.defineProperty(exports, "i16", { enumerable: true, get: function () { return buffer_layout_2.s16; } });
Object.defineProperty(exports, "i32", { enumerable: true, get: function () { return buffer_layout_2.s32; } });
Object.defineProperty(exports, "i8", { enumerable: true, get: function () { return buffer_layout_2.s8; } });
Object.defineProperty(exports, "seq", { enumerable: true, get: function () { return buffer_layout_2.seq; } });
Object.defineProperty(exports, "struct", { enumerable: true, get: function () { return buffer_layout_2.struct; } });
Object.defineProperty(exports, "u16", { enumerable: true, get: function () { return buffer_layout_2.u16; } });
Object.defineProperty(exports, "u32", { enumerable: true, get: function () { return buffer_layout_2.u32; } });
Object.defineProperty(exports, "u8", { enumerable: true, get: function () { return buffer_layout_2.u8; } });
Object.defineProperty(exports, "union", { enumerable: true, get: function () { return buffer_layout_2.union; } });
var buffer_layout_utils_1 = require("@solana/buffer-layout-utils");
Object.defineProperty(exports, "bool", { enumerable: true, get: function () { return buffer_layout_utils_1.bool; } });
Object.defineProperty(exports, "decimal", { enumerable: true, get: function () { return buffer_layout_utils_1.decimal; } });
Object.defineProperty(exports, "publicKey", { enumerable: true, get: function () { return buffer_layout_utils_1.publicKey; } });
function u64(property) {
return new BNLayout(8, false, property);
}
exports.u64 = u64;
function i64(property) {
return new BNLayout(8, true, property);
}
exports.i64 = i64;
function u128(property) {
return new BNLayout(16, false, property);
}
exports.u128 = u128;
function i128(property) {
return new BNLayout(16, true, property);
}
exports.i128 = i128;
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;
}
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);
}
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;
}
}
function option(layout, property) {
return new OptionLayout(layout, property);
}
exports.option = option;
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.discriminator.span +
this.layout.encode(src, b, offset + this.discriminator.span));
}
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 + this.discriminator.span);
}
throw new Error("Invalid option " + this.layout.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 coption(layout, property) {
return new COptionLayout(layout, property);
}
exports.coption = coption;
class COptionLayout extends buffer_layout_1.Layout {
constructor(layout, property) {
super(-1, property);
this.layout = layout;
this.discriminator = (0, buffer_layout_1.u32)();
}
encode(src, b, offset = 0) {
if (src === null || src === undefined) {
return this.layout.span + this.discriminator.encode(0, b, offset);
}
this.discriminator.encode(1, b, offset);
return (this.discriminator.span +
this.layout.encode(src, b, offset + this.discriminator.span));
}
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 + this.discriminator.span);
}
throw new Error("Invalid coption " + this.layout.property);
}
getSpan(b, offset = 0) {
return (this.discriminator.span +
this.layout.getSpan(b, offset + this.discriminator.span));
}
}
function vec(layout, property) {
return new VecLayout(layout, property);
}
exports.vec = vec;
class VecLayout extends buffer_layout_1.Layout {
constructor(layout, property) {
super(-1, property);
this.layout = (0, buffer_layout_1.struct)([
(0, buffer_layout_1.u32)("length"),
// @ts-ignore
(0, buffer_layout_1.seq)(layout, (0, buffer_layout_1.offset)((0, buffer_layout_1.u32)(), -4), "src"),
], property);
}
encode(src, b, offset = 0) {
const data = {
src,
};
return this.layout.encode(data, b, offset);
}
decode(b, offset = 0) {
const data = this.layout.decode(b, offset);
return data.src;
}
getSpan(b, offset = 0) {
return this.layout.getSpan(b, offset);
}
}
function bytes(property) {
return new BytesLayout(property);
}
exports.bytes = bytes;
class BytesLayout extends buffer_layout_1.Layout {
constructor(property) {
super(-1, property);
this.layout = (0, buffer_layout_1.struct)([
(0, buffer_layout_1.u32)("length"),
// @ts-ignore
(0, buffer_layout_1.blob)((0, buffer_layout_1.offset)((0, buffer_layout_1.u32)(), -4), "src"),
], this.property);
}
encode(src, b, offset = 0) {
if (src === null || src === undefined) {
return this.layout.span;
}
const data = {
src,
};
return this.layout.encode(data, b, offset);
}
decode(b, offset = 0) {
const data = this.layout.decode(b, offset);
return data.src;
}
getSpan(b, offset = 0) {
return ((0, buffer_layout_1.u32)().span +
new bn_js_1.default(new Uint8Array(b).slice(offset, offset + 4), 10, "le").toNumber());
}
}
function utf8Str(property) {
return new Utf8StringLayout(property);
}
exports.utf8Str = utf8Str;
class Utf8StringLayout extends buffer_layout_1.Layout {
constructor(property) {
super(-1, property);
this.layout = (0, buffer_layout_1.struct)([
(0, buffer_layout_1.u32)("length"),
// @ts-ignore
(0, buffer_layout_1.blob)((0, buffer_layout_1.offset)((0, buffer_layout_1.u32)(), -4), "src"),
], this.property);
}
encode(src, b, offset = 0) {
if (src === null || src === undefined) {
return this.layout.span;
}
const data = {
src: Buffer.from(src, "utf8"),
};
return this.layout.encode(data, b, offset);
}
decode(b, offset = 0) {
const data = this.layout.decode(b, offset);
return data.src.toString();
}
getSpan(b, offset = 0) {
return ((0, buffer_layout_1.u32)().span +
new bn_js_1.default(new Uint8Array(b).slice(offset, offset + 4), 10, "le").toNumber());
}
}
//# sourceMappingURL=index.js.map