"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PAYMENT_LEAF_V2 = exports.PAYMENT_LEAF_V1 = void 0;
exports.paymentLeafV1Hash = paymentLeafV1Hash;
exports.paymentLeafV2Hash = paymentLeafV2Hash;
exports.merkleVerifyValueWei = merkleVerifyValueWei;
exports.effectiveTokenOrNativeWei = effectiveTokenOrNativeWei;
const ethers_1 = require("ethers");
exports.PAYMENT_LEAF_V1 = 0x01;
exports.PAYMENT_LEAF_V2 = 0x02;
/** Matches CheckpointLeaf.paymentLeafV1 */
function paymentLeafV1Hash(chainId, leaf) {
    const version = ethers_1.ethers.hexlify(new Uint8Array([exports.PAYMENT_LEAF_V1]));
    return ethers_1.ethers.keccak256(ethers_1.ethers.AbiCoder.defaultAbiCoder().encode(['bytes1', 'uint64', 'bytes32', 'address', 'address', 'uint256', 'uint256', 'uint64', 'uint256', 'bool'], [
        version,
        BigInt(chainId),
        leaf.txHash,
        leaf.from,
        leaf.to,
        BigInt(leaf.value ?? 0),
        BigInt(leaf.blockNumber),
        BigInt(leaf.blockTimestamp),
        BigInt(leaf.gasUsed ?? 0),
        leaf.success,
    ]));
}
/** Matches CheckpointLeaf.paymentLeafV2 */
function paymentLeafV2Hash(chainId, leaf) {
    const version = ethers_1.ethers.hexlify(new Uint8Array([exports.PAYMENT_LEAF_V2]));
    return ethers_1.ethers.keccak256(ethers_1.ethers.AbiCoder.defaultAbiCoder().encode([
        'bytes1',
        'uint64',
        'bytes32',
        'address',
        'address',
        'address',
        'uint256',
        'uint256',
        'uint64',
        'uint256',
        'bool',
        'uint32',
    ], [
        version,
        BigInt(chainId),
        leaf.txHash,
        leaf.from,
        leaf.to,
        leaf.token,
        BigInt(leaf.value ?? 0),
        BigInt(leaf.blockNumber),
        BigInt(leaf.blockTimestamp),
        BigInt(leaf.gasUsed ?? 0),
        leaf.success,
        Number(leaf.logIndex ?? 0),
    ]));
}
/** Historical batches 1–50: verify with native/on-chain wei only. */
function merkleVerifyValueWei(record) {
    if (record.onChainValueWei != null && String(record.onChainValueWei) !== '') {
        return BigInt(String(record.onChainValueWei));
    }
    return BigInt(String(record.nativeValueWei ?? record.value ?? '0'));
}
function effectiveTokenOrNativeWei(record) {
    const native = BigInt(String(record.value ?? '0'));
    const tokenVal = record.token != null && record.tokenValue != null ? BigInt(String(record.tokenValue)) : 0n;
    if (tokenVal > 0n)
        return tokenVal;
    return native;
}
