import axios from 'axios'; import { Application, Request, Response } from 'express'; import config from '../../config'; import elementsParser from './elements-parser'; import icons from './icons'; class LiquidRoutes { public initRoutes(app: Application) { app .get(config.MEMPOOL.API_URL_PREFIX + 'assets/icons', this.getAllLiquidIcon) .get(config.MEMPOOL.API_URL_PREFIX + 'assets/featured', this.$getAllFeaturedLiquidAssets) .get(config.MEMPOOL.API_URL_PREFIX + 'asset/:assetId/icon', this.getLiquidIcon) .get(config.MEMPOOL.API_URL_PREFIX + 'assets/group/:id', this.$getAssetGroup) ; if (config.DATABASE.ENABLED) { app .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/pegs', this.$getElementsPegs) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/pegs/month', this.$getElementsPegsByMonth) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/pegs/volume', this.$getPegsVolumeDaily) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves', this.$getFederationReserves) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/month', this.$getFederationReservesByMonth) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/pegouts', this.$getPegOuts) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/addresses', this.$getFederationAddresses) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/addresses/previous-month', this.$getFederationAddressesOneMonthAgo) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/utxos', this.$getFederationUtxos) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/utxos/previous-month', this.$getFederationUtxosOneMonthAgo) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/status', this.$getFederationAuditStatus) ; } } private getLiquidIcon(req: Request, res: Response) { const result = icons.getIconByAssetId(req.params.assetId); if (result) { res.setHeader('content-type', 'image/png'); res.setHeader('content-length', result.length); res.send(result); } else { res.status(404).send('Asset icon not found'); } } private getAllLiquidIcon(req: Request, res: Response) { const result = icons.getAllIconIds(); if (result) { res.json(result); } else { res.status(404).send('Asset icons not found'); } } private async $getAllFeaturedLiquidAssets(req: Request, res: Response) { try { const response = await axios.get(`${config.EXTERNAL_DATA_SERVER.LIQUID_API}/assets/featured`, { responseType: 'stream', timeout: 10000 }); response.data.pipe(res); } catch (e) { res.status(500).end(); } } private async $getAssetGroup(req: Request, res: Response) { try { const response = await axios.get(`${config.EXTERNAL_DATA_SERVER.LIQUID_API}/assets/group/${parseInt(req.params.id, 10)}`, { responseType: 'stream', timeout: 10000 }); response.data.pipe(res); } catch (e) { res.status(500).end(); } } private async $getElementsPegsByMonth(req: Request, res: Response) { try { const pegs = await elementsParser.$getPegDataByMonth(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 60 * 60).toUTCString()); res.json(pegs); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getFederationReservesByMonth(req: Request, res: Response) { try { const reserves = await elementsParser.$getFederationReservesByMonth(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 60 * 60).toUTCString()); res.json(reserves); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getElementsPegs(req: Request, res: Response) { try { const currentSupply = await elementsParser.$getCurrentLbtcSupply(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(currentSupply); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getFederationReserves(req: Request, res: Response) { try { const currentReserves = await elementsParser.$getCurrentFederationReserves(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(currentReserves); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getFederationAuditStatus(req: Request, res: Response) { try { const auditStatus = await elementsParser.$getAuditStatus(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(auditStatus); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getFederationAddresses(req: Request, res: Response) { try { const federationAddresses = await elementsParser.$getFederationAddresses(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(federationAddresses); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getFederationAddressesOneMonthAgo(req: Request, res: Response) { try { const federationAddresses = await elementsParser.$getFederationAddressesOneMonthAgo(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 60 * 60 * 24).toUTCString()); res.json(federationAddresses); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getFederationUtxos(req: Request, res: Response) { try { const federationUtxos = await elementsParser.$getFederationUtxos(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(federationUtxos); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getFederationUtxosOneMonthAgo(req: Request, res: Response) { try { const federationUtxos = await elementsParser.$getFederationUtxosOneMonthAgo(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 60 * 60 * 24).toUTCString()); res.json(federationUtxos); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getPegOuts(req: Request, res: Response) { try { const recentPegOuts = await elementsParser.$getRecentPegouts(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(recentPegOuts); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } private async $getPegsVolumeDaily(req: Request, res: Response) { try { const pegsVolume = await elementsParser.$getPegsVolumeDaily(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(pegsVolume); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } } } export default new LiquidRoutes();