import network from "@ledgerhq/live-network"; import { Address } from "@ton/ton"; import { getCoinConfig } from "../../config"; import { TonAccountInfo, TonFee, TonJettonTransfer, TonJettonWallet, TonResponseAccountInfo, TonResponseEstimateFee, TonResponseJettonTransfer, TonResponseJettonWallets, TonResponseMasterchainInfo, TonResponseMessage, TonResponseWalletInfo, TonTransactionsList, } from "./api.types"; const getTonUrl = (path?: string): string => { const currencyConfig = getCoinConfig(); return `${currencyConfig.infra.API_TON_ENDPOINT}${path ?? ""}`; }; const fetch = async (path: string): Promise => { const url = getTonUrl(path); const { data } = await network({ method: "GET", url, }); return data; }; const send = async (path: string, data: Record) => { const url = getTonUrl(path); const { data: dataResponse } = await network({ method: "POST", url, data: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }); return dataResponse; }; export async function fetchLastBlockNumber(): Promise { const data = await fetch("/masterchainInfo"); return data.last.seqno; } export async function fetchTransactions( addr: string, opts?: { startLt?: string; endLt?: string }, ): Promise { const address = Address.parse(addr); const urlAddr = address.toString({ bounceable: false, urlSafe: true }); let url = `/transactions?account=${urlAddr}&limit=256`; if (opts?.startLt) url += `&start_lt=${opts.startLt}`; if (opts?.endLt) url += `&end_lt=${opts.endLt}`; return await fetch(url); } export async function fetchAccountInfo(addr: string): Promise { const address = Address.parse(addr); const urlAddr = address.toString({ bounceable: false, urlSafe: true }); const data = await fetch(`/account?address=${urlAddr}`); if (data.status === "uninit" || data.status === "nonexist") { return { balance: data.balance, last_transaction_lt: data.last_transaction_lt, last_transaction_hash: data.last_transaction_hash, status: data.status, seqno: 0, }; } const { seqno } = await fetch(`/wallet?address=${urlAddr}`); return { balance: data.balance, last_transaction_lt: data.last_transaction_lt, last_transaction_hash: data.last_transaction_hash, status: data.status, seqno: seqno || 0, }; } export async function fetchJettonTransactions( addr: string, opts?: { jettonMaster?: string; startLt?: string; endLt?: string; }, ): Promise { const address = Address.parse(addr); const urlAddr = address.toString({ bounceable: false, urlSafe: true }); let url = `/jetton/transfers?address=${urlAddr}&limit=256`; if (opts?.jettonMaster) url += `&jetton_master=${opts.jettonMaster}`; if (opts?.startLt) url += `&start_lt=${opts.startLt}`; if (opts?.endLt) url += `&end_lt=${opts.endLt}`; return (await fetch(url)).jetton_transfers; } export async function fetchJettonWallets(opts?: { address?: string; jettonMaster?: string; }): Promise { let url = `/jetton/wallets?limit=256`; if (opts?.jettonMaster) url += `&jetton_address=${opts.jettonMaster}`; if (opts?.address) { const address = Address.parse(opts.address); const urlAddr = address.toString({ bounceable: false, urlSafe: true }); url += `&owner_address=${urlAddr}`; } return (await fetch(url)).jetton_wallets; } export async function estimateFee( address: string, body: string, initCode?: string, initData?: string, ): Promise { return ( await send("/estimateFee", { address, body, init_code: initCode, init_data: initData, ignore_chksig: true, }) ).source_fees; } export async function broadcastTx(bocBase64: string): Promise { return (await send("/message", { boc: bocBase64 })).message_hash; } export async function fetchAdjacentTransactions( txHash: string, dir: "in" | "out" = "in", ): Promise { const url = `/adjacentTransactions?hash=${encodeURIComponent(txHash)}&direction=${dir}`; return await fetch(url); }