"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTransaction = exports.getHeaderInfo = exports.genContractAddress = exports.resultManagerTriggerSmartContract = exports.resultManager = exports.deepCopyJson = exports.fromUtf8 = void 0;
const tronweb_js_1 = require("../../tronweb.js");
const transaction_js_1 = require("../../utils/transaction.js");
const ethersUtils_js_1 = require("../../utils/ethersUtils.js");
function fromUtf8(value) {
    return tronweb_js_1.TronWeb.fromUtf8(value).replace(/^0x/, '');
}
exports.fromUtf8 = fromUtf8;
function deepCopyJson(json) {
    return JSON.parse(JSON.stringify(json));
}
exports.deepCopyJson = deepCopyJson;
function resultManager(transaction, data, options) {
    if (transaction.Error)
        throw new Error(transaction.Error);
    if (transaction.result && transaction.result.message) {
        throw new Error(tronweb_js_1.TronWeb.toUtf8(transaction.result.message));
    }
    const authResult = (0, transaction_js_1.txCheckWithArgs)(transaction, data, options);
    if (authResult) {
        return transaction;
    }
    throw new Error('Invalid transaction');
}
exports.resultManager = resultManager;
function resultManagerTriggerSmartContract(transaction, data, options) {
    if (transaction.Error)
        throw new Error(transaction.Error);
    if (transaction.result && transaction.result.message) {
        throw new Error(tronweb_js_1.TronWeb.toUtf8(transaction.result.message));
    }
    if (!(options._isConstant || options.estimateEnergy)) {
        const authResult = (0, transaction_js_1.txCheckWithArgs)(transaction.transaction, data, options);
        if (authResult) {
            return transaction;
        }
        throw new Error('Invalid transaction');
    }
    return transaction;
}
exports.resultManagerTriggerSmartContract = resultManagerTriggerSmartContract;
function genContractAddress(ownerAddress, txID) {
    return ('41' +
        (0, ethersUtils_js_1.keccak256)(Buffer.from(txID + ownerAddress, 'hex'))
            .toString()
            .substring(2)
            .slice(24));
}
exports.genContractAddress = genContractAddress;
function getHeaderInfo(node) {
    return node.request('wallet/getblock', { detail: false }, 'post').then((data) => {
        return {
            ref_block_bytes: data.block_header.raw_data.number.toString(16).slice(-4).padStart(4, '0'),
            ref_block_hash: data.blockID.slice(16, 32),
            expiration: data.block_header.raw_data.timestamp + 60 * 1000,
            timestamp: data.block_header.raw_data.timestamp,
        };
    });
}
exports.getHeaderInfo = getHeaderInfo;
async function createTransaction(tronWeb, type, value, Permission_id, options = {}) {
    const metaData = await getHeaderInfo(tronWeb.fullNode);
    const tx = {
        visible: false,
        txID: '',
        raw_data_hex: '',
        raw_data: {
            contract: [
                {
                    parameter: {
                        value,
                        type_url: `type.googleapis.com/protocol.${type}`,
                    },
                    type,
                },
            ],
            ...metaData,
            ...options,
        },
    };
    if (Permission_id) {
        tx.raw_data.contract[0].Permission_id = Permission_id;
    }
    const pb = (0, transaction_js_1.txJsonToPb)(tx);
    tx.txID = (0, transaction_js_1.txPbToTxID)(pb).replace(/^0x/, '');
    tx.raw_data_hex = (0, transaction_js_1.txPbToRawDataHex)(pb).toLowerCase();
    return tx;
}
exports.createTransaction = createTransaction;
//# sourceMappingURL=helper.js.map