@ton/core
Version:
Core TypeScript library that implements low level primitives for TON blockchain.
117 lines (93 loc) • 3.14 kB
text/typescript
/**
* Copyright (c) Whales Corp.
* All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import { BitReader } from "../BitReader";
import { BitString } from "../BitString";
import { Cell } from "../Cell";
import { CellType } from "../CellType";
import { exoticLibrary } from "./exoticLibrary";
import { exoticMerkleProof } from "./exoticMerkleProof";
import { exoticMerkleUpdate } from "./exoticMerkleUpdate";
import { exoticPruned } from "./exoticPruned";
import { LevelMask } from "./LevelMask";
function resolvePruned(bits: BitString, refs: Cell[]): { type: CellType, depths: number[], hashes: Buffer[], mask: LevelMask } {
// Parse pruned cell
let pruned = exoticPruned(bits, refs);
// Calculate parameters
let depths: number[] = [];
let hashes: Buffer[] = [];
let mask = new LevelMask(pruned.mask);
for (let i = 0; i < pruned.pruned.length; i++) {
depths.push(pruned.pruned[i].depth);
hashes.push(pruned.pruned[i].hash);
}
return {
type: CellType.PrunedBranch,
depths,
hashes,
mask
};
}
function resolveLibrary(bits: BitString, refs: Cell[]): { type: CellType, depths: number[], hashes: Buffer[], mask: LevelMask } {
// Parse library cell
let pruned = exoticLibrary(bits, refs);
// Calculate parameters
let depths: number[] = [];
let hashes: Buffer[] = [];
let mask = new LevelMask();
return {
type: CellType.Library,
depths,
hashes,
mask
};
}
function resolveMerkleProof(bits: BitString, refs: Cell[]): { type: CellType, depths: number[], hashes: Buffer[], mask: LevelMask } {
// Parse merkle proof cell
let merkleProof = exoticMerkleProof(bits, refs);
// Calculate parameters
let depths: number[] = [];
let hashes: Buffer[] = [];
let mask = new LevelMask(refs[0].level() >> 1);
return {
type: CellType.MerkleProof,
depths,
hashes,
mask
};
}
function resolveMerkleUpdate(bits: BitString, refs: Cell[]): { type: CellType, depths: number[], hashes: Buffer[], mask: LevelMask } {
// Parse merkle proof cell
let merkleUpdate = exoticMerkleUpdate(bits, refs);
// Calculate parameters
let depths: number[] = [];
let hashes: Buffer[] = [];
let mask = new LevelMask((refs[0].level() | refs[1].level()) >> 1);
return {
type: CellType.MerkleUpdate,
depths,
hashes,
mask
};
}
export function resolveExotic(bits: BitString, refs: Cell[]): { type: CellType, depths: number[], hashes: Buffer[], mask: LevelMask } {
let reader = new BitReader(bits);
let type = reader.preloadUint(8);
if (type === 1) {
return resolvePruned(bits, refs);
}
if (type === 2) {
return resolveLibrary(bits, refs);
}
if (type === 3) {
return resolveMerkleProof(bits, refs);
}
if (type === 4) {
return resolveMerkleUpdate(bits, refs);
}
throw Error('Invalid exotic cell type: ' + type);
}