UNPKG

@bbachain/web3.js

Version:

BBAChain Javascript API

59 lines (51 loc) 1.52 kB
import {Buffer} from 'buffer'; import * as BufferLayout from '@bbachain/buffer-layout'; import * as Layout from './layout'; export interface IInstructionInputData { readonly instruction: number; } /** * @internal */ export type InstructionType<TInputData extends IInstructionInputData> = { /** The Instruction index (from bbachain upstream program) */ index: number; /** The BufferLayout to use to build data */ layout: BufferLayout.Layout<TInputData>; }; /** * Populate a buffer of instruction data using an InstructionType * @internal */ export function encodeData<TInputData extends IInstructionInputData>( type: InstructionType<TInputData>, fields?: any, ): Buffer { const allocLength = type.layout.span >= 0 ? type.layout.span : Layout.getAlloc(type, fields); const data = Buffer.alloc(allocLength); const layoutFields = Object.assign({instruction: type.index}, fields); type.layout.encode(layoutFields, data); return data; } /** * Decode instruction data buffer using an InstructionType * @internal */ export function decodeData<TInputData extends IInstructionInputData>( type: InstructionType<TInputData>, buffer: Buffer, ): TInputData { let data: TInputData; try { data = type.layout.decode(buffer); } catch (err) { throw new Error('invalid instruction; ' + err); } if (data.instruction !== type.index) { throw new Error( `invalid instruction; instruction index mismatch ${data.instruction} != ${type.index}`, ); } return data; }