"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getApi = getApi;
exports.getBalance = getBalance;
exports.getChainConstants = getChainConstants;
exports.getFinalizedHead = getFinalizedHead;
exports.disconnect = disconnect;
/**
 * Truth Network (Substrate) chain adapter.
 * Connects via WSS, exposes balance (native TRUU), chain constants, and bridge-related helpers.
 * See: docs/07-ccip/TRUTH_NETWORK_BRIDGE_SPEC.md
 */
const api_1 = require("@polkadot/api");
const TRUTH_WSS = process.env.TRUTH_WSS_URL || 'wss://chain-external.truth-network.io';
const SS58_FORMAT = parseInt(process.env.TRUTH_SS58_FORMAT || '42', 10);
let api = null;
async function getApi(wssUrl = TRUTH_WSS) {
    if (api)
        return api;
    const provider = new api_1.WsProvider(wssUrl);
    api = await api_1.ApiPromise.create({ provider });
    return api;
}
async function getBalance(ss58Address, wssUrl) {
    const a = await getApi(wssUrl || TRUTH_WSS);
    const account = await a.query.system.account(ss58Address);
    const data = account.toJSON();
    return data?.data?.free ?? '0';
}
async function getChainConstants(wssUrl) {
    const a = await getApi(wssUrl || TRUTH_WSS);
    const [genesisHash, props, runtime] = await Promise.all([
        a.rpc.chain.getBlockHash(0),
        a.rpc.system.properties(),
        a.rpc.state.getRuntimeVersion(),
    ]);
    const tokenDecimals = props.tokenDecimals ?? 10;
    const tokenSymbol = props.tokenSymbol ?? 'TRUU';
    return {
        genesisHash: genesisHash.toHex(),
        ss58Format: props.ss58Format ?? SS58_FORMAT,
        tokenSymbol,
        tokenDecimals,
        specName: runtime.specName.toString(),
        specVersion: runtime.specVersion.toNumber(),
        minFinalityBlocks: 1,
    };
}
async function getFinalizedHead(wssUrl) {
    const a = await getApi(wssUrl || TRUTH_WSS);
    const hash = await a.rpc.chain.getFinalizedHead();
    return hash.toHex();
}
/** Disconnect and free the API. */
async function disconnect() {
    if (api) {
        await api.disconnect();
        api = null;
    }
}
// CLI: node dist/index.js balance <ss58Address> | constants
async function main() {
    const cmd = process.argv[2];
    const arg = process.argv[3];
    if (cmd === 'balance' && arg) {
        const bal = await getBalance(arg);
        console.log(bal);
    }
    else if (cmd === 'constants') {
        const c = await getChainConstants();
        console.log(JSON.stringify(c, null, 2));
    }
    else {
        console.log('Usage: balance <ss58Address> | constants');
        process.exit(1);
    }
    await disconnect();
}
if (require.main === module) {
    main().catch((e) => {
        console.error(e);
        process.exit(1);
    });
}
