import { blob, Layout } from '@solana/buffer-layout'; import { toBigIntBE, toBigIntLE, toBufferBE, toBufferLE } from 'bigint-buffer'; import { encodeDecode } from './base'; export const bigInt = (length: number) => (property?: string): Layout => { const layout = blob(length, property); const { encode, decode } = encodeDecode(layout); const bigIntLayout = layout as Layout as Layout; bigIntLayout.decode = (buffer: Buffer, offset: number) => { const src = decode(buffer, offset); return toBigIntLE(Buffer.from(src)); }; bigIntLayout.encode = (bigInt: bigint, buffer: Buffer, offset: number) => { const src = toBufferLE(bigInt, length); return encode(src, buffer, offset); }; return bigIntLayout; }; export const bigIntBE = (length: number) => (property?: string): Layout => { const layout = blob(length, property); const { encode, decode } = encodeDecode(layout); const bigIntLayout = layout as Layout as Layout; bigIntLayout.decode = (buffer: Buffer, offset: number) => { const src = decode(buffer, offset); return toBigIntBE(Buffer.from(src)); }; bigIntLayout.encode = (bigInt: bigint, buffer: Buffer, offset: number) => { const src = toBufferBE(bigInt, length); return encode(src, buffer, offset); }; return bigIntLayout; }; export const u64 = bigInt(8); export const u64be = bigIntBE(8); export const u128 = bigInt(16); export const u128be = bigIntBE(16); export const u192 = bigInt(24); export const u192be = bigIntBE(24); export const u256 = bigInt(32); export const u256be = bigIntBE(32);