UNPKG

thor-devkit

Version:

Typescript library to aid DApp development on VeChain Thor

235 lines 19 kB
import BigNumber from 'bignumber.js'; import * as rlp from 'rlp'; import { Buffer } from 'buffer'; export class RLP { constructor(profile) { this.profile = profile; } /** * encode data according to profile * @param data the structured data to be encoded */ encode(data) { const packed = pack(data, this.profile, ''); return rlp.encode(packed); } /** * decode buffer according to profile * @param buf rlp encoded data */ decode(buf) { const packed = rlp.decode(buf); return unpack(packed, this.profile, ''); } } (function (RLP) { /** base class of scalar kind */ class ScalarKind { } RLP.ScalarKind = ScalarKind; /** a buffer kind to keep buffer type */ class BufferKind extends ScalarKind { data(data, ctx) { assert(Buffer.isBuffer(data), ctx, 'expected buffer'); return { encode() { return data; } }; } buffer(buf, ctx) { return { decode() { return buf; } }; } } RLP.BufferKind = BufferKind; /** a scalar kind to presents number */ class NumericKind extends ScalarKind { /** * create a numeric kind * @param maxBytes up limit of data in bytes */ constructor(maxBytes) { super(); this.maxBytes = maxBytes; } data(data, ctx) { assert(typeof data === 'string' || typeof data === 'number', ctx, 'expected string or number'); if (typeof data === 'string') { const isHex = isHexString(data); const isDec = isDecString(data); assert(isHex || isDec, ctx, 'expected non-negative integer in hex or dec string'); if (isHex) { assert(data.length > 2, ctx, 'expected valid hex string'); } } else { assert(Number.isSafeInteger(data) && data >= 0, ctx, 'expected non-negative safe integer'); } const bn = new BigNumber(data); if (bn.isZero()) { return { encode() { return Buffer.alloc(0); } }; } let hex = bn.toString(16); if (hex.length % 2 !== 0) { hex = '0' + hex; } assert(this.maxBytes ? hex.length <= this.maxBytes * 2 : true, ctx, `expected number in ${this.maxBytes} bytes`); return { encode() { return Buffer.from(hex, 'hex'); } }; } buffer(buf, ctx) { assert(this.maxBytes ? buf.length <= this.maxBytes : true, ctx, `expected less than ${this.maxBytes} bytes`); assert(buf.length === 0 || buf[0] !== 0, ctx, 'expected canonical integer (no leading zero bytes)'); return { decode() { if (buf.length === 0) { return 0; } const bn = new BigNumber(buf.toString('hex'), 16); const num = bn.toNumber(); return Number.isSafeInteger(num) ? num : '0x' + bn.toString(16); } }; } } RLP.NumericKind = NumericKind; /** a scalar kind to present blob */ class BlobKind extends ScalarKind { data(data, ctx) { assert(isHexString(data), ctx, 'expected hex string'); assert(data.length % 2 === 0, ctx, 'expected even length hex'); return { encode() { return Buffer.from(data.slice(2), 'hex'); } }; } buffer(buf, ctx) { return { decode() { return '0x' + buf.toString('hex'); } }; } } RLP.BlobKind = BlobKind; /** fixed length blob */ class FixedBlobKind extends BlobKind { constructor(bytes) { super(); this.bytes = bytes; } data(data, ctx) { const encoder = super.data(data, ctx); assert(data.length === this.bytes * 2 + 2, ctx, `expected hex string presents ${this.bytes} bytes`); return encoder; } buffer(buf, ctx) { const decoder = super.buffer(buf, ctx); assert(buf.length === this.bytes, ctx, `expected ${this.bytes} bytes`); return decoder; } } RLP.FixedBlobKind = FixedBlobKind; /** fixed length blob allowing null */ class NullableFixedBlobKind extends FixedBlobKind { data(data, ctx) { if (!data) { return { encode() { return Buffer.alloc(0); } }; } return super.data(data, ctx); } buffer(buf, ctx) { if (buf.length === 0) { return { decode() { return null; } }; } return super.buffer(buf, ctx); } } RLP.NullableFixedBlobKind = NullableFixedBlobKind; /** fixed length blob kind that will remove leading zero on encoding and pad zero on decoding */ class CompactFixedBlobKind extends FixedBlobKind { data(data, ctx) { const buf = super.data(data, ctx).encode(); return { encode() { const nzIndex = buf.findIndex(v => v !== 0); if (nzIndex >= 0) { return buf.slice(nzIndex); } return Buffer.alloc(0); } }; } buffer(buf, ctx) { assert(buf.length <= this.bytes, ctx, `expected less than ${this.bytes} bytes`); assert(buf.length === 0 || buf[0] !== 0, ctx, 'expected no leading zero bytes'); const bytes = this.bytes; return { decode() { const zeros = '0'.repeat((bytes - buf.length) * 2); return '0x' + zeros + buf.toString('hex'); } }; } } RLP.CompactFixedBlobKind = CompactFixedBlobKind; })(RLP || (RLP = {})); function pack(obj, profile, ctx) { ctx = ctx ? ctx + '.' + profile.name : profile.name; const kind = profile.kind; if (kind instanceof RLP.ScalarKind) { return kind.data(obj, ctx).encode(); } if (Array.isArray(kind)) { return kind.map(k => pack(obj[k.name], k, ctx)); } assert(Array.isArray(obj), ctx, 'expected array'); const item = kind.item; return obj.map((part, i) => pack(part, { name: '#' + i, kind: item }, ctx)); } function unpack(packed, profile, ctx) { ctx = ctx ? ctx + '.' + profile.name : profile.name; const kind = profile.kind; if (kind instanceof RLP.ScalarKind) { assert(Buffer.isBuffer(packed), ctx, 'expected Buffer'); return kind.buffer(packed, ctx).decode(); } if (Array.isArray(kind)) { assert(Array.isArray(packed), ctx, 'expected array'); const parts = packed; assert(parts.length === kind.length, ctx, `expected ${kind.length} items, but got ${parts.length}`); return kind.reduce((o, p, i) => { o[p.name] = unpack(parts[i], p, ctx); return o; }, {}); } assert(Array.isArray(packed), ctx, 'expected array'); const item = kind.item; return packed.map((part, i) => unpack(part, { name: '#' + i, kind: item }, ctx)); } function assert(cond, ctx, msg) { if (!cond) { throw new RLPError(`${ctx}: ${msg}`); } } function isHexString(str) { return /^0x[0-9a-f]*$/i.test(str); } function isDecString(str) { return /^\d+$/.test(str); } class RLPError extends Error { constructor(msg) { super(msg); this.name = RLPError.name; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmxwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JscC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUE7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUE7QUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUUvQixNQUFNLE9BQU8sR0FBRztJQUNaLFlBQXFCLE9BQW9CO1FBQXBCLFlBQU8sR0FBUCxPQUFPLENBQWE7SUFBSSxDQUFDO0lBRTlDOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxJQUFTO1FBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUMzQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFrQixDQUFBO0lBQzlDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsR0FBVztRQUNyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQVUsQ0FBQyxDQUFBO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzNDLENBQUM7Q0FDSjtBQUVELFdBQWlCLEdBQUc7SUFDaEIsZ0NBQWdDO0lBQ2hDLE1BQXNCLFVBQVU7S0FHL0I7SUFIcUIsY0FBVSxhQUcvQixDQUFBO0lBRUQsd0NBQXdDO0lBQ3hDLE1BQWEsVUFBVyxTQUFRLFVBQVU7UUFDL0IsSUFBSSxDQUFDLElBQVksRUFBRSxHQUFXO1lBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO1lBQ3JELE9BQU8sRUFBRSxNQUFNLEtBQUssT0FBTyxJQUFJLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUN2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