@ton/core
Version:
Core TypeScript library that implements low level primitives for TON blockchain.
61 lines (50 loc) • 1.75 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 { beginCell } from '../Builder';
export function exoticMerkleProof(bits: BitString, refs: Cell[]) {
const reader = new BitReader(bits);
// type + hash + depth
const size = 8 + 256 + 16;
if (bits.length !== size) {
throw new Error(`Merkle Proof cell must have exactly (8 + 256 + 16) bits, got "${bits.length}"`);
}
if (refs.length !== 1) {
throw new Error(`Merkle Proof cell must have exactly 1 ref, got "${refs.length}"`);
}
// Check type
let type = reader.loadUint(8);
if (type !== 3) {
throw new Error(`Merkle Proof cell must have type 3, got "${type}"`);
}
// Check data
const proofHash = reader.loadBuffer(32);
const proofDepth = reader.loadUint(16);
const refHash = refs[0].hash(0)
const refDepth = refs[0].depth(0);
if (proofDepth !== refDepth) {
throw new Error(`Merkle Proof cell ref depth must be exactly "${proofDepth}", got "${refDepth}"`);
}
if (!proofHash.equals(refHash)) {
throw new Error(`Merkle Proof cell ref hash must be exactly "${proofHash.toString('hex')}", got "${refHash.toString('hex')}"`);
}
return {
proofDepth,
proofHash
};
}
export function convertToMerkleProof(c: Cell): Cell {
return beginCell()
.storeUint(3, 8)
.storeBuffer(c.hash(0))
.storeUint(c.depth(0), 16)
.storeRef(c)
.endCell({ exotic: true });
}