@nervosnetwork/ckb-sdk-utils
Version:
Utils module of @nervosnetwork/ckb-sdk-core
77 lines • 3.73 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.serializeOption = exports.serializeTable = exports.serializeDynVec = exports.serializeFixVec = exports.serializeStruct = exports.serializeArray = exports.getOffsets = exports.fullLengthSize = exports.offsetSize = void 0;
const index_js_1 = require("../convertors/index.js");
exports.offsetSize = 4;
exports.fullLengthSize = 4;
const getOffsets = (elmLengths) => {
const headerLength = exports.fullLengthSize + exports.offsetSize * elmLengths.length;
const offsets = [headerLength];
elmLengths.forEach((_, idx) => {
if (idx) {
offsets.push(offsets[offsets.length - 1] + elmLengths[idx - 1]);
}
});
return offsets;
};
exports.getOffsets = getOffsets;
const serializeArray = (array) => {
if (typeof array !== 'string' && !Array.isArray(array)) {
throw new TypeError('The array to be serialized should by type of string or bytes');
}
const bytes = typeof array === 'string' ? (0, index_js_1.hexToBytes)(array) : array;
return (0, index_js_1.bytesToHex)(bytes);
};
exports.serializeArray = serializeArray;
const serializeStruct = (struct) => {
let res = '';
struct.forEach(value => {
res += (0, exports.serializeArray)(value).slice(2);
});
return `0x${res}`;
};
exports.serializeStruct = serializeStruct;
const serializeFixVec = (fixVec) => {
if (typeof fixVec !== 'string' && !Array.isArray(fixVec)) {
throw new TypeError('The fixed vector to be serialized should be a string or an array of bytes');
}
const vec = typeof fixVec === 'string' ? [...(0, index_js_1.hexToBytes)(fixVec)].map(b => `0x${b.toString(16)}`) : fixVec;
const serializedItemVec = vec.map(item => (0, exports.serializeArray)(item).slice(2));
const header = (0, index_js_1.toUint32Le)(`0x${serializedItemVec.length.toString(16)}`).slice(2);
return `0x${header}${serializedItemVec.join('')}`;
};
exports.serializeFixVec = serializeFixVec;
const serializeDynVec = (dynVec) => {
if (!Array.isArray(dynVec)) {
throw new TypeError('The dynamic vector to be serialized should be an array of bytes');
}
const serializedItemVec = dynVec.map(item => (0, exports.serializeArray)(item).slice(2));
const body = serializedItemVec.join('');
let offsets = '';
if (serializedItemVec.length) {
offsets = (0, exports.getOffsets)(serializedItemVec.map(item => item.length / 2))
.map(offset => (0, index_js_1.toUint32Le)(`0x${offset.toString(16)}`).slice(2))
.join('');
}
const headerLength = exports.fullLengthSize + exports.offsetSize * serializedItemVec.length;
const fullLength = (0, index_js_1.toUint32Le)(`0x${(headerLength + body.length / 2).toString(16)}`).slice(2);
return `0x${fullLength}${offsets}${body}`;
};
exports.serializeDynVec = serializeDynVec;
const serializeTable = (table) => {
const bodyElms = [];
table.forEach(value => {
bodyElms.push((0, exports.serializeArray)(value).slice(2));
});
const body = bodyElms.join('');
const headerLength = exports.fullLengthSize + exports.offsetSize * table.size;
const fullLength = (0, index_js_1.toUint32Le)(`0x${(headerLength + body.length / 2).toString(16)}`).slice(2);
const offsets = (0, exports.getOffsets)(bodyElms.map(arg => arg.length / 2))
.map(offset => (0, index_js_1.toUint32Le)(`0x${offset.toString(16)}`).slice(2))
.join('');
return `0x${fullLength}${offsets}${body}`;
};
exports.serializeTable = serializeTable;
const serializeOption = (innerItem) => (!innerItem ? '0x' : innerItem);
exports.serializeOption = serializeOption;
//# sourceMappingURL=basic.js.map
;