thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
235 lines • 19 kB
JavaScript
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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