@openproduct/web-sdk
Version:
OpenMask Web - TypeScript Browser SDK for TON blockchain
70 lines (69 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseDictRefs = exports.parseDictBitString = exports.parseDict = void 0;
const bn_js_1 = require("bn.js");
function doParse(prefix, slice, n, res, extractor) {
// Reading label
let lb0 = slice.loadBit() ? 1 : 0;
let prefixLength = 0;
let pp = prefix;
if (lb0 === 0) {
// Short label detected
// Read
prefixLength = slice.readUnaryLength();
// Read prefix
for (let i = 0; i < prefixLength; i++) {
pp += slice.loadBit() ? "1" : "0";
}
}
else {
let lb1 = slice.loadBit() ? 1 : 0;
if (lb1 === 0) {
// Long label detected
prefixLength = slice.loadUint(Math.ceil(Math.log2(n + 1))).toNumber();
for (let i = 0; i < prefixLength; i++) {
pp += slice.loadBit() ? "1" : "0";
}
}
else {
// Same label detected
let bit = slice.loadBit() ? "1" : "0";
prefixLength = slice.loadUint(Math.ceil(Math.log2(n + 1))).toNumber();
for (let i = 0; i < prefixLength; i++) {
pp += bit;
}
}
}
if (n - prefixLength === 0) {
res.set(new bn_js_1.BN(pp, 2).toString(10), extractor(slice));
}
else {
let left = slice.readCell();
let right = slice.readCell();
// NOTE: Left and right branches are implicitly contain prefixes '0' and '1'
if (!left.isExotic) {
doParse(pp + "0", left.beginParse(), n - prefixLength - 1, res, extractor);
}
if (!right.isExotic) {
doParse(pp + "1", right.beginParse(), n - prefixLength - 1, res, extractor);
}
}
}
function parseDict(slice, keySize, extractor) {
let res = new Map();
doParse("", slice, keySize, res, extractor);
return res;
}
exports.parseDict = parseDict;
function parseDictBitString(slice, keySize) {
let res = new Map();
doParse("", slice, keySize, res, (slice) => slice.readRemaining());
return res;
}
exports.parseDictBitString = parseDictBitString;
function parseDictRefs(slice, keySize) {
let res = new Map();
doParse("", slice, keySize, res, (slice) => slice.loadRef());
return res;
}
exports.parseDictRefs = parseDictRefs;