diff --git a/dist/data.js b/dist/data.js index 6764ecd..3913078 100644 --- a/dist/data.js +++ b/dist/data.js @@ -1,11 +1,11 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseScript = exports.loadFileByTxid = exports.loadFileByInpoint = exports.loadFileByOutpoint = exports.getBlockByHash = exports.getBlockByHeight = exports.getBlockchainInfo = exports.loadTx = exports.getRawTx = void 0; -const bitcore_lib_1 = require("bitcore-lib"); -const ioredis_1 = require("ioredis"); const core_1 = require("@ts-bitcoin/core"); -const http_errors_1 = require("http-errors"); +const bitcore_lib_1 = require("bitcore-lib"); const createError = require("http-errors"); +const http_errors_1 = require("http-errors"); +const ioredis_1 = require("ioredis"); const provider_1 = require("./provider"); let bsvProvider = new provider_1.ProxyProvider(); let btcProvider = new provider_1.BtcProvider(); @@ -87,19 +87,19 @@ async function getBlockByHash(network, hash) { } exports.getBlockByHash = getBlockByHash; async function loadFileByOutpoint(outpoint, fuzzy = false) { - const url = `https://v3.ordinals.gorillapool.io/content/${outpoint.toString()}${fuzzy ? '?fuzzy=true' : ''}`; + const url = `https://ordinals.gorillapool.io/content/${outpoint.toString()}${fuzzy ? "?fuzzy=true" : ""}`; const resp = await fetch(url); if (!resp.ok) { throw createError(resp.status, resp.statusText); } return { data: Buffer.from(await resp.arrayBuffer()), - type: resp.headers.get('content-type') || '', + type: resp.headers.get("content-type") || "", }; } exports.loadFileByOutpoint = loadFileByOutpoint; async function loadFileByInpoint(inpoint) { - const [txid, vout] = inpoint.split('i'); + const [txid, vout] = inpoint.split("i"); const rawtx = await getRawTx(txid); const tx = new bitcore_lib_1.Transaction(rawtx); return parseScript(tx.txIns[parseInt(vout, 10)].script); @@ -107,7 +107,7 @@ async function loadFileByInpoint(inpoint) { exports.loadFileByInpoint = loadFileByInpoint; async function loadFileByTxid(txid) { const tx = await loadTx(txid); - for (let txOut of tx.txOuts) { + for (const txOut of tx.txOuts) { try { const data = await parseScript(txOut.script); if (data) @@ -122,7 +122,7 @@ function parseScript(script) { var _a, _b, _c, _d; let opFalse = 0; let opIf = 0; - for (let [i, chunk] of script.chunks.entries()) { + for (const [i, chunk] of script.chunks.entries()) { if (chunk.opCodeNum === core_1.OpCode.OP_FALSE) { opFalse = i; } @@ -130,7 +130,7 @@ function parseScript(script) { opIf = i; } if (((_a = chunk.buf) === null || _a === void 0 ? void 0 : _a.equals(ORD)) && opFalse === i - 2 && opIf === i - 1) { - let file = {}; + const file = {}; for (let j = i + 1; j < script.chunks.length; j += 2) { if (script.chunks[j].buf) break; @@ -139,7 +139,7 @@ function parseScript(script) { file.data = script.chunks[j + 1].buf; return file; case core_1.OpCode.OP_1: - file.type = (_b = script.chunks[j + 1].buf) === null || _b === void 0 ? void 0 : _b.toString('utf8'); + file.type = (_b = script.chunks[j + 1].buf) === null || _b === void 0 ? void 0 : _b.toString("utf8"); break; case core_1.OpCode.OP_ENDIF: break; @@ -149,7 +149,7 @@ function parseScript(script) { if ((_c = chunk.buf) === null || _c === void 0 ? void 0 : _c.equals(B)) { return { data: script.chunks[i + 1].buf, - type: (_d = script.chunks[i + 2].buf) === null || _d === void 0 ? void 0 : _d.toString('utf8'), + type: (_d = script.chunks[i + 2].buf) === null || _d === void 0 ? void 0 : _d.toString("utf8"), }; } } diff --git a/dist/data.js.map b/dist/data.js.map index 4db1712..d6e9e51 100644 --- a/dist/data.js.map +++ b/dist/data.js.map @@ -1 +1 @@ -{"version":3,"file":"data.js","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"data.js","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 2438bd5..2fab036 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/provider.ts","../src/lib.ts","../src/routes.ts"],"sourcesContent":["import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordinals.shruggr.cloud/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n","import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n","import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n"],"names":["redis","process","env","REDIS_HOST","host","port","REDIS_PORT","parseInt","console","log","Redis","JungleBusProvider","network","_proto","prototype","getRawTx","txid","_redis","Promise","resolve","getBuffer","then","rawtx","_temp","jb","JungleBusClient","GetTransaction","txnData","_redis2","Buffer","from","transaction","set","e","reject","getBlockchainInfo","fetch","resp","ok","createError","status","statusText","json","info","height","hash","getBlockByHeight","getBlockByHash","loadInscription","pointer","metadata","file","_temp4","_result","NotFound","_temp3","match","_pointer$split","split","vout","bsvProvider","Error","tx","Tx","fromBuffer","v","script","txOuts","parseScript","_temp2","data","_ref","meta","MAP","_catch","loadPointerFromDNS","hostname","lookupDomain","dns","resolveTxt","TXTs","outer","_step","_iterator","_createForOfIteratorHelperLoose","done","_step2","_iterator2","value","elem","startsWith","slice","prefix","getLatestBlock","B","ORD","_step3","opFalse","opIf","opORD","type","alloc","_iterator3","chunks","entries","_chunk$buf","_chunk$buf2","_step3$value","i","chunk","buf","equals","length","toString","opCodeNum","OpCode","OP_FALSE","OP_IF","_script$chunks","_script$chunks2","OP_PUSHDATA4","concat","OP_TRUE","OP_ENDIF","sendFile","res","immutable","header","JSON","stringify","send","app","getOrdfsFile","req","next","params","filename","dirData","dir","parse","query","err","get","_exit","outpoint","_req$res","redirect","render","_loadPointerFromDNS","_json","_getLatestBlock","call","_json2","_getBlockByHeight","_temp5","_json3","_getBlockByHash","_send","_getRawTx","_exit2","_temp7","_result3","_temp6","_loadInscription","_req$res2","raw","error","message","_loadPointerFromDNS2","_loadInscription2","_req$res3","htmlData","b64HtmlData"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.cjs","sources":["../src/provider.ts","../src/lib.ts","../src/routes.ts"],"sourcesContent":["import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordfs.gorillapool.io/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n","import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n","import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n"],"names":["redis","process","env","REDIS_HOST","host","port","REDIS_PORT","parseInt","console","log","Redis","JungleBusProvider","network","_proto","prototype","getRawTx","txid","_redis","Promise","resolve","getBuffer","then","rawtx","_temp","jb","JungleBusClient","GetTransaction","txnData","_redis2","Buffer","from","transaction","set","e","reject","getBlockchainInfo","fetch","resp","ok","createError","status","statusText","json","info","height","hash","getBlockByHeight","getBlockByHash","loadInscription","pointer","metadata","file","_temp4","_result","NotFound","_temp3","match","_pointer$split","split","vout","bsvProvider","Error","tx","Tx","fromBuffer","v","script","txOuts","parseScript","_temp2","data","_ref","meta","MAP","_catch","loadPointerFromDNS","hostname","lookupDomain","dns","resolveTxt","TXTs","outer","_step","_iterator","_createForOfIteratorHelperLoose","done","_step2","_iterator2","value","elem","startsWith","slice","prefix","getLatestBlock","B","ORD","_step3","opFalse","opIf","opORD","type","alloc","_iterator3","chunks","entries","_chunk$buf","_chunk$buf2","_step3$value","i","chunk","buf","equals","length","toString","opCodeNum","OpCode","OP_FALSE","OP_IF","_script$chunks","_script$chunks2","OP_PUSHDATA4","concat","OP_TRUE","OP_ENDIF","sendFile","res","immutable","header","JSON","stringify","send","app","getOrdfsFile","req","next","params","filename","dirData","dir","parse","query","err","get","_exit","outpoint","_req$res","redirect","render","_loadPointerFromDNS","_json","_getLatestBlock","call","_json2","_getBlockByHeight","_temp5","_json3","_getBlockByHash","_send","_getRawTx","_exit2","_temp7","_result3","_temp6","_loadInscription","_req$res2","raw","error","message","_loadPointerFromDNS2","_loadInscription2","_req$res3","htmlData","b64HtmlData"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.modern.js.map b/dist/index.modern.js.map index cb7611e..2adf2c5 100644 --- a/dist/index.modern.js.map +++ b/dist/index.modern.js.map @@ -1 +1,153 @@ -{"version":3,"file":"index.modern.js","sources":["../src/provider.ts","../src/lib.ts","../src/routes.ts"],"sourcesContent":["import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordinals.shruggr.cloud/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n","import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n","import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n"],"names":["redis","process","env","REDIS_HOST","host","port","REDIS_PORT","parseInt","console","log","Redis","B","Buffer","from","ORD","bsvProvider","constructor","this","network","getRawTx","txid","_redis","rawtx","getBuffer","_redis2","jb","JungleBusClient","txnData","GetTransaction","transaction","set","getBlockchainInfo","resp","fetch","ok","createError","status","statusText","info","json","height","hash","getBlockByHeight","getBlockByHash","async","getLatestBlock","NotFound","loadPointerFromDNS","hostname","lookupDomain","TXTs","dns","resolveTxt","pointer","outer","TXT","elem","startsWith","slice","prefix","loadInscription","metadata","file","match","Error","vout","split","tx","Tx","fromBuffer","v","script","txOuts","parseScript","url","data","meta","MAP","_unused","opFalse","opIf","opORD","type","alloc","i","chunk","chunks","entries","_chunk$buf","_chunk$buf2","buf","equals","length","toString","opCodeNum","OpCode","OP_FALSE","OP_IF","_script$chunks","_script$chunks2","OP_PUSHDATA4","concat","OP_TRUE","OP_ENDIF","sendFile","res","immutable","header","JSON","stringify","send","RegisterRoutes","app","getOrdfsFile","req","next","params","filename","dirData","dir","parse","query","err","get","outpoint","e","render","_req$res","redirect","_req$res2","raw","error","message","_req$res3","htmlData","b64HtmlData"],"mappings":"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"} \ No newline at end of file +{ + "version": 3, + "file": "index.modern.js", + "sources": [ + "../src/provider.ts", + "../src/lib.ts", + "../src/routes.ts" + ], + "sourcesContent": [ + "import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordfs.gorillapool.io/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n", + "import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n", + "import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n" + ], + "names": [ + "redis", + "process", + "env", + "REDIS_HOST", + "host", + "port", + "REDIS_PORT", + "parseInt", + "console", + "log", + "Redis", + "B", + "Buffer", + "from", + "ORD", + "bsvProvider", + "constructor", + "this", + "network", + "getRawTx", + "txid", + "_redis", + "rawtx", + "getBuffer", + "_redis2", + "jb", + "JungleBusClient", + "txnData", + "GetTransaction", + "transaction", + "set", + "getBlockchainInfo", + "resp", + "fetch", + "ok", + "createError", + "status", + "statusText", + "info", + "json", + "height", + "hash", + "getBlockByHeight", + "getBlockByHash", + "async", + "getLatestBlock", + "NotFound", + "loadPointerFromDNS", + "hostname", + "lookupDomain", + "TXTs", + "dns", + "resolveTxt", + "pointer", + "outer", + "TXT", + "elem", + "startsWith", + "slice", + "prefix", + "loadInscription", + "metadata", + "file", + "match", + "Error", + "vout", + "split", + "tx", + "Tx", + "fromBuffer", + "v", + "script", + "txOuts", + "parseScript", + "url", + "data", + "meta", + "MAP", + "_unused", + "opFalse", + "opIf", + "opORD", + "type", + "alloc", + "i", + "chunk", + "chunks", + "entries", + "_chunk$buf", + "_chunk$buf2", + "buf", + "equals", + "length", + "toString", + "opCodeNum", + "OpCode", + "OP_FALSE", + "OP_IF", + "_script$chunks", + "_script$chunks2", + "OP_PUSHDATA4", + "concat", + "OP_TRUE", + "OP_ENDIF", + "sendFile", + "res", + "immutable", + "header", + "JSON", + "stringify", + "send", + "RegisterRoutes", + "app", + "getOrdfsFile", + "req", + "next", + "params", + "filename", + "dirData", + "dir", + "parse", + "query", + "err", + "get", + "outpoint", + "e", + "render", + "_req$res", + "redirect", + "_req$res2", + "raw", + "error", + "message", + "_req$res3", + "htmlData", + "b64HtmlData" + ], + "mappings": "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" +} diff --git a/dist/index.module.js.map b/dist/index.module.js.map index a3f9a86..0d61dba 100644 --- a/dist/index.module.js.map +++ b/dist/index.module.js.map @@ -1 +1,191 @@ -{"version":3,"file":"index.module.js","sources":["../src/provider.ts","../src/lib.ts","../src/routes.ts"],"sourcesContent":["import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordinals.shruggr.cloud/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n","import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n","import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n"],"names":["redis","process","env","REDIS_HOST","host","port","REDIS_PORT","parseInt","console","log","Redis","JungleBusProvider","network","_proto","prototype","getRawTx","txid","_redis","Promise","resolve","getBuffer","then","rawtx","_temp","jb","JungleBusClient","GetTransaction","txnData","_redis2","Buffer","from","transaction","set","e","reject","getBlockchainInfo","fetch","resp","ok","createError","status","statusText","json","info","height","hash","getBlockByHeight","getBlockByHash","loadInscription","pointer","metadata","file","_temp4","_result","NotFound","_temp3","match","_pointer$split","split","vout","bsvProvider","Error","tx","Tx","fromBuffer","v","script","txOuts","parseScript","_temp2","data","_ref","meta","MAP","_catch","loadPointerFromDNS","hostname","lookupDomain","dns","resolveTxt","TXTs","outer","_step","_iterator","_createForOfIteratorHelperLoose","done","_step2","_iterator2","value","elem","startsWith","slice","prefix","getLatestBlock","B","ORD","_step3","opFalse","opIf","opORD","type","alloc","_iterator3","chunks","entries","_chunk$buf","_chunk$buf2","_step3$value","i","chunk","buf","equals","length","toString","opCodeNum","OpCode","OP_FALSE","OP_IF","_script$chunks","_script$chunks2","OP_PUSHDATA4","concat","OP_TRUE","OP_ENDIF","sendFile","res","immutable","header","JSON","stringify","send","RegisterRoutes","app","getOrdfsFile","req","next","params","filename","dirData","dir","parse","query","err","get","_exit","outpoint","_req$res","redirect","render","_loadPointerFromDNS","_json","_getLatestBlock","call","_json2","_getBlockByHeight","_temp5","_json3","_getBlockByHash","_send","_getRawTx","_exit2","_temp7","_result3","_temp6","_loadInscription","_req$res2","raw","error","message","_loadPointerFromDNS2","_loadInscription2","_req$res3","htmlData","b64HtmlData"],"mappings":"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"} \ No newline at end of file +{ + "version": 3, + "file": "index.module.js", + "sources": [ + "../src/provider.ts", + "../src/lib.ts", + "../src/routes.ts" + ], + "sourcesContent": [ + "import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordfs.gorillapool.io/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n", + "import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n", + "import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n" + ], + "names": [ + "redis", + "process", + "env", + "REDIS_HOST", + "host", + "port", + "REDIS_PORT", + "parseInt", + "console", + "log", + "Redis", + "JungleBusProvider", + "network", + "_proto", + "prototype", + "getRawTx", + "txid", + "_redis", + "Promise", + "resolve", + "getBuffer", + "then", + "rawtx", + "_temp", + "jb", + "JungleBusClient", + "GetTransaction", + "txnData", + "_redis2", + "Buffer", + "from", + "transaction", + "set", + "e", + "reject", + "getBlockchainInfo", + "fetch", + "resp", + "ok", + "createError", + "status", + "statusText", + "json", + "info", + "height", + "hash", + "getBlockByHeight", + "getBlockByHash", + "loadInscription", + "pointer", + "metadata", + "file", + "_temp4", + "_result", + "NotFound", + "_temp3", + "match", + "_pointer$split", + "split", + "vout", + "bsvProvider", + "Error", + "tx", + "Tx", + "fromBuffer", + "v", + "script", + "txOuts", + "parseScript", + "_temp2", + "data", + "_ref", + "meta", + "MAP", + "_catch", + "loadPointerFromDNS", + "hostname", + "lookupDomain", + "dns", + "resolveTxt", + "TXTs", + "outer", + "_step", + "_iterator", + "_createForOfIteratorHelperLoose", + "done", + "_step2", + "_iterator2", + "value", + "elem", + "startsWith", + "slice", + "prefix", + "getLatestBlock", + "B", + "ORD", + "_step3", + "opFalse", + "opIf", + "opORD", + "type", + "alloc", + "_iterator3", + "chunks", + "entries", + "_chunk$buf", + "_chunk$buf2", + "_step3$value", + "i", + "chunk", + "buf", + "equals", + "length", + "toString", + "opCodeNum", + "OpCode", + "OP_FALSE", + "OP_IF", + "_script$chunks", + "_script$chunks2", + "OP_PUSHDATA4", + "concat", + "OP_TRUE", + "OP_ENDIF", + "sendFile", + "res", + "immutable", + "header", + "JSON", + "stringify", + "send", + "RegisterRoutes", + "app", + "getOrdfsFile", + "req", + "next", + "params", + "filename", + "dirData", + "dir", + "parse", + "query", + "err", + "get", + "_exit", + "outpoint", + "_req$res", + "redirect", + "render", + "_loadPointerFromDNS", + "_json", + "_getLatestBlock", + "call", + "_json2", + "_getBlockByHeight", + "_temp5", + "_json3", + "_getBlockByHash", + "_send", + "_getRawTx", + "_exit2", + "_temp7", + "_result3", + "_temp6", + "_loadInscription", + "_req$res2", + "raw", + "error", + "message", + "_loadPointerFromDNS2", + "_loadInscription2", + "_req$res3", + "htmlData", + "b64HtmlData" + ], + "mappings": "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" +} diff --git a/dist/index.umd.js.map b/dist/index.umd.js.map index 475770b..a7882a8 100644 --- a/dist/index.umd.js.map +++ b/dist/index.umd.js.map @@ -1 +1,190 @@ -{"version":3,"file":"index.umd.js","sources":["../src/provider.ts","../src/lib.ts","../src/routes.ts"],"sourcesContent":["import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordinals.shruggr.cloud/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordinals.shruggr.cloud/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n","import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n","import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n"],"names":["redis","process","env","REDIS_HOST","host","port","REDIS_PORT","parseInt","console","log","Redis","JungleBusProvider","network","_proto","prototype","getRawTx","txid","_redis","Promise","resolve","getBuffer","then","rawtx","_temp","jb","JungleBusClient","GetTransaction","txnData","_redis2","Buffer","from","transaction","set","e","reject","getBlockchainInfo","fetch","resp","ok","createError","status","statusText","json","info","height","hash","getBlockByHeight","getBlockByHash","loadInscription","pointer","metadata","file","_temp4","_result","NotFound","_temp3","match","_pointer$split","split","vout","bsvProvider","Error","tx","Tx","fromBuffer","v","script","txOuts","parseScript","_temp2","data","_ref","meta","MAP","_catch","loadPointerFromDNS","hostname","lookupDomain","dns","resolveTxt","TXTs","outer","_step","_iterator","_createForOfIteratorHelperLoose","done","_step2","_iterator2","value","elem","startsWith","slice","prefix","getLatestBlock","B","ORD","_step3","opFalse","opIf","opORD","type","alloc","_iterator3","chunks","entries","_chunk$buf","_chunk$buf2","_step3$value","i","chunk","buf","equals","length","toString","opCodeNum","OpCode","OP_FALSE","OP_IF","_script$chunks","_script$chunks2","OP_PUSHDATA4","concat","OP_TRUE","OP_ENDIF","sendFile","res","immutable","header","JSON","stringify","send","app","getOrdfsFile","req","next","params","filename","dirData","dir","parse","query","err","get","_exit","outpoint","_req$res","redirect","render","_loadPointerFromDNS","_json","_getLatestBlock","call","_json2","_getBlockByHeight","_temp5","_json3","_getBlockByHash","_send","_getRawTx","_exit2","_temp7","_result3","_temp6","_loadInscription","_req$res2","raw","error","message","_loadPointerFromDNS2","_loadInscription2","_req$res3","htmlData","b64HtmlData"],"mappings":"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"} \ No newline at end of file +{ + "version": 3, + "file": "index.umd.js", + "sources": [ + "../src/provider.ts", + "../src/lib.ts", + "../src/routes.ts" + ], + "sourcesContent": [ + "import { JungleBusClient } from \"@gorillapool/js-junglebus\";\n// import * as Client from \"bitcoin-core\";\nimport fetch from \"cross-fetch\";\nimport createError from \"http-errors\";\nimport { Redis } from \"ioredis\";\n\nlet redis: Redis;\nif (process.env.REDIS_HOST) {\n const host = process.env.REDIS_HOST;\n const port = process.env.REDIS_PORT\n ? parseInt(process.env.REDIS_PORT, 10)\n : 6379;\n console.log(\"Connecting to redis:\", host, port);\n redis = new Redis(port, host);\n}\n\nexport interface ITxProvider {\n network: string;\n getRawTx: (string) => Promise;\n getBlockchainInfo: () => Promise<{ height: number; hash: string }>;\n getBlockByHeight: (number) => Promise<{ height: number; hash: string }>;\n getBlockByHash: (string) => Promise<{ height: number; hash: string }>;\n}\n\n// export class RpcProvider implements ITxProvider {\n// private client: Client;\n\n// constructor(\n// public network: string,\n// host: string,\n// port: string,\n// username: string,\n// password: string\n// ) {\n// this.client = new Client({\n// host,\n// port,\n// username,\n// password,\n// });\n// }\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// rawtx = await this.client.getTransactionByHash(txid, {\n// extension: \"bin\",\n// });\n// if (!rawtx) {\n// throw new createError.NotFound();\n// }\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockchainInfo();\n// return {\n// height: info.blocks,\n// hash: info.bestblockhash,\n// };\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const hash = await this.client.getBlockHash(height);\n// return { height, hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const info = await this.client.getBlockHeader(hash);\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n\nexport class JungleBusProvider implements ITxProvider {\n public network = \"bsv\";\n\n async getRawTx(txid: string): Promise {\n let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n if (!rawtx) {\n const jb = new JungleBusClient(\"https://junglebus.gorillapool.io\");\n const txnData = await jb.GetTransaction(txid);\n rawtx = Buffer.from(txnData!.transaction, \"base64\");\n redis?.set(`rawtx:${txid}`, rawtx);\n }\n return rawtx;\n }\n\n async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n \"https://api.whatsonchain.com/v1/bsv/main/block/headers\"\n );\n if (!resp.ok) {\n throw createError(resp.status, resp.statusText);\n }\n const info = await resp.json();\n return {\n height: info[0].height,\n hash: info[0].hash,\n };\n }\n\n async getBlockByHeight(\n height: number\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}`\n );\n const info = await resp.json();\n return { height, hash: info.hash };\n }\n\n async getBlockByHash(\n hash: string\n ): Promise<{ height: number; hash: string }> {\n const resp = await fetch(\n `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}`\n );\n const info = await resp.json();\n\n return {\n height: info.height,\n hash,\n };\n }\n}\n\n// export class BtcProvider implements ITxProvider {\n// public network = \"btc\";\n\n// async getRawTx(txid: string): Promise {\n// let rawtx = await redis?.getBuffer(`rawtx:${txid}`);\n// if (!rawtx) {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/tx/${txid}`\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n// rawtx = Buffer.from(await resp.arrayBuffer());\n// redis?.set(`rawtx:${txid}`, rawtx);\n// }\n// return rawtx;\n// }\n\n// async getBlockchainInfo(): Promise<{ height: number; hash: string }> {\n// // TODO: Make this configuration based\n// const resp = await fetch(\n// \"https://ordfs.gorillapool.io/v1/btc/block/latest\"\n// );\n// if (!resp.ok) {\n// throw createError(resp.status, resp.statusText);\n// }\n\n// return resp.json();\n// }\n\n// async getBlockByHeight(\n// height: number\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/height/${height}`\n// );\n// const info = await resp.json();\n// return { height, hash: info.hash };\n// }\n\n// async getBlockByHash(\n// hash: string\n// ): Promise<{ height: number; hash: string }> {\n// const resp = await fetch(\n// `https://ordfs.gorillapool.io/v1/btc/block/hash/${hash}`\n// );\n// const info = await resp.json();\n\n// return {\n// height: info.height,\n// hash,\n// };\n// }\n// }\n", + "import { OpCode, Script, Tx } from \"@ts-bitcoin/core\";\n// import { Transaction } from \"bitcore-lib\";\nimport * as dns from \"dns/promises\";\nimport createError from \"http-errors\";\nimport fetch from \"cross-fetch\";\nimport {\n // BtcProvider,\n ITxProvider,\n JungleBusProvider,\n // RpcProvider,\n} from \"./provider\";\n\nconst B = Buffer.from(\"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\");\nconst ORD = Buffer.from(\"ord\");\n\n// let btcProvider: ITxProvider = new BtcProvider();\nlet bsvProvider: ITxProvider = new JungleBusProvider();\n\n// if (process.env.BITCOIN_HOST) {\n// bsvProvider = new RpcProvider(\n// \"bsv\",\n// process.env.BITCOIN_HOST || \"\",\n// process.env.BITCOIN_PORT || \"8332\",\n// process.env.BITCOIN_USER || \"\",\n// process.env.BITCOIN_PASS || \"\"\n// );\n// }\n\n// if (process.env.BTC_HOST) {\n// btcProvider = new RpcProvider(\n// \"btc\",\n// process.env.BTC_HOST || \"\",\n// process.env.BTC_PORT || \"8332\",\n// process.env.BTC_USER || \"\",\n// process.env.BTC_PASS || \"\"\n// );\n// }\n\nexport async function getLatestBlock(\n network: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockchainInfo();\n case \"bsv\":\n return bsvProvider.getBlockchainInfo();\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHeight(\n network: string,\n height: number\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHeight(height);\n case \"bsv\":\n return bsvProvider.getBlockByHeight(height);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getBlockByHash(\n network: string,\n hash: string\n): Promise<{ height: number; hash: string }> {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getBlockByHash(hash);\n case \"bsv\":\n return bsvProvider.getBlockByHash(hash);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function getRawTx(\n network: string,\n txid: string\n): Promise {\n switch (network) {\n // case \"btc\":\n // return btcProvider.getRawTx(txid);\n case \"bsv\":\n return bsvProvider.getRawTx(txid);\n default:\n throw new createError.NotFound(\"Network Not Found\");\n }\n}\n\nexport async function loadPointerFromDNS(hostname: string): Promise {\n const lookupDomain = `_ordfs.${hostname}`;\n const TXTs = await dns.resolveTxt(lookupDomain);\n const prefix = \"ordfs=\";\n let pointer = \"\";\n console.log(\"Lookup Up:\", lookupDomain);\n outer: for (const TXT of TXTs) {\n for (const elem of TXT) {\n if (!elem.startsWith(prefix)) continue;\n console.log(\"Elem:\", elem);\n pointer = elem.slice(prefix.length);\n console.log(\"Origin:\", pointer);\n break outer;\n }\n\n if (!pointer) {\n throw new createError.NotFound();\n }\n }\n return pointer;\n}\n\nexport async function loadInscription(pointer: string, metadata = false): Promise {\n console.log(\"loadInscription\", pointer);\n let file: File | undefined;\n if (pointer.match(/^[0-9a-fA-F]{64}_\\d*$/)) {\n const [txid, vout] = pointer.split(\"_\");\n console.log(\"BSV:\", txid, vout);\n const rawtx = await bsvProvider.getRawTx(txid);\n if (!rawtx) throw new Error(\"No raw tx found\");\n const tx = Tx.fromBuffer(rawtx);\n const v = parseInt(vout, 10);\n const script = tx.txOuts[v].script;\n if (!script) throw new createError.NotFound();\n file = parseScript(script);\n if (file && metadata) {\n try {\n const url =`https://ordinals.gorillapool.io/api/inscriptions/outpoint/${pointer}`;\n const resp = await fetch(url);\n const data = await resp.json();\n const { hash } = await bsvProvider.getBlockByHeight(data!.height);\n const meta: Meta = {\n height: data.height,\n MAP: data.MAP,\n hash,\n txid,\n v,\n };\n file.meta = meta;\n } catch {};\n }\n // } else if (pointer.match(/^[0-9a-fA-F]{64}i\\d+$/) && btcProvider) {\n // const [txid, vin] = pointer.split(\"i\");\n // console.log(\"BTC\", txid, vin);\n // const rawtx = await btcProvider.getRawTx(txid);\n // if (!rawtx) throw new Error(\"No raw tx found\");\n // const tx = new Transaction(rawtx);\n // const script = Script.fromBuffer(tx.inputs[parseInt(vin, 10)].witnesses[1]);\n // if (!script) throw new createError.NotFound();\n // file = parseScript(script);\n } else throw new Error(\"Invalid Pointer\");\n\n if (!file) throw new createError.NotFound();\n return file;\n}\n\nexport interface Meta {\n height?: number;\n hash?: string;\n txid: string;\n v: number;\n MAP?: {[key:string]:any}\n}\n\nexport interface File {\n type: string;\n data: Buffer;\n meta?: Meta;\n}\n\nexport interface OrdFS {\n [filename: string]: string;\n}\n\nexport function parseScript(script: Script): File | undefined {\n let opFalse = 0;\n let opIf = 0;\n let opORD = 0;\n\n let type = \"application/octet-stream\";\n let data = Buffer.alloc(0);\n for (const [i, chunk] of script.chunks.entries()) {\n if (chunk.buf?.equals(B) && script.chunks.length > i + 2) {\n data = script.chunks[i + 1].buf!;\n type = script.chunks[i + 2].buf!.toString();\n return { data, type };\n }\n if (chunk.opCodeNum === OpCode.OP_FALSE) {\n opFalse = i;\n }\n if (chunk.opCodeNum === OpCode.OP_IF) {\n opIf = i;\n }\n if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) {\n opORD = i;\n break;\n }\n }\n\n for (let i = opORD + 1; i < script.chunks.length; i++) {\n switch (script.chunks[i].opCodeNum) {\n case OpCode.OP_FALSE:\n while (\n script.chunks[i + 1]?.opCodeNum >= 1 &&\n script.chunks[i + 1]?.opCodeNum <= OpCode.OP_PUSHDATA4\n ) {\n data = Buffer.concat([data, script.chunks[i + 1].buf!]);\n i++;\n }\n break;\n case 1:\n // treat 1 like OP_1 (BTC convention)\n // console.log(script.chunks[i].toString('hex'))\n if (script.chunks[i].buf![0] != 1) return;\n case OpCode.OP_TRUE:\n type = script.chunks[i + 1]!.buf!.toString(\"utf8\");\n // console.log(\"Type:\", type)\n i++;\n break;\n case OpCode.OP_ENDIF:\n return { type, data };\n default:\n return;\n }\n }\n\n return { type, data };\n}\n", + "import * as express from \"express\";\nimport { Response } from \"express\";\nimport createError from \"http-errors\";\nimport {\n File,\n OrdFS,\n getBlockByHash,\n getBlockByHeight,\n getLatestBlock,\n getRawTx,\n loadInscription,\n loadPointerFromDNS,\n} from \"./lib\";\n\nfunction sendFile(file: File, res: Response, immutable = true) {\n res.header(\"Content-Type\", file.type || \"\");\n if (file.meta) {\n res.header('ordfs-meta', JSON.stringify(file.meta))\n }\n if (immutable && !file.meta) {\n res.header(\"Cache-Control\", \"public,immutable,max-age=31536000\");\n }\n res.status(200).send(file.data);\n}\n\nexport function RegisterRoutes(app: express.Express) {\n app.get(\"/\", async (req, res) => {\n let outpoint: string;\n try {\n outpoint = await loadPointerFromDNS(req.hostname);\n } catch (e: any) {\n // DNS pointer not found\n res.render(\"pages/index\");\n return;\n }\n try {\n const file = await loadInscription(outpoint);\n if (file.type === \"ord-fs/json\" && !req.query[\"raw\"]) {\n req.res?.redirect(\"index.html\");\n return;\n }\n sendFile(file, res, false);\n } catch (err) {\n // TODO: inscription not found\n res.render(\"pages/404\");\n }\n });\n\n app.get(\"/v1/:network/block/latest\", async (req, res, next) => {\n try {\n res.json(await getLatestBlock(req.params.network));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/height/:height\", async (req, res, next) => {\n try {\n res.json(\n await getBlockByHeight(\n req.params.network,\n parseInt(req.params.height, 10)\n )\n );\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/block/hash/:hash\", async (req, res, next) => {\n try {\n res.json(await getBlockByHash(req.params.network, req.params.hash));\n } catch (e) {\n next(e);\n }\n });\n\n app.get(\"/v1/:network/tx/:txid\", async (req, res) => {\n res.set(\"Content-type\", \"application/octet-stream\");\n res.send(await getRawTx(req.params.network, req.params.txid));\n });\n app.get(\"/:filename\", getInscriptionOrDnsFile);\n app.get(\"/content/:pointer\", getInscription);\n app.get(\"/preview/:b64HtmlData\", previewHtmlFromB64Data);\n app.get(\"/:pointer/:filename\", getOrdfsFile);\n app.get(\"/content/:pointer/:filename\", getOrdfsFile);\n\n async function previewHtmlFromB64Data(req, res, next) {\n try {\n const b64HtmlData = req.params.b64HtmlData;\n const htmlData = Buffer.from(b64HtmlData, \"base64\").toString(\"utf8\");\n res.render(\"pages/preview\", { htmlData });\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscriptionOrDnsFile(req, res, next) {\n const filename = req.params.filename;\n try {\n let pointer: string;\n let file: File;\n let immutable = true;\n try {\n // check if its an ordfs directory\n file = await loadInscription(filename, req.query.meta);\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${filename}/index.html`);\n return;\n }\n } catch (e: any) {\n console.error(\"Outpoint Error\", filename, e.message);\n pointer = await loadPointerFromDNS(req.hostname);\n const dirData = await loadInscription(pointer);\n const dir = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n pointer = dir[filename].slice(6);\n file = await loadInscription(pointer, req.query.meta);\n immutable = false;\n }\n sendFile(file, res, immutable);\n } catch (err) {\n next(err);\n }\n }\n\n async function getInscription(req, res, next) {\n const pointer = req.params.pointer;\n try {\n const file = await loadInscription(pointer, req.query.meta);\n // check if its an ordfs directory\n if (file.type === \"ord-fs/json\" && !req.query.raw) {\n req.res?.redirect(`/${pointer}/index.html`);\n return;\n }\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n\n async function getOrdfsFile(req, res, next) {\n try {\n let pointer = req.params.pointer;\n const filename = req.params.filename;\n const dirData = await loadInscription(pointer);\n const dir: OrdFS = JSON.parse(dirData.data!.toString(\"utf8\"));\n if (!dir[filename]) {\n throw new createError.NotFound();\n }\n if (dir[filename].startsWith(\"ord://\")) {\n pointer = dir[filename].slice(6);\n } else {\n pointer = dir[filename];\n }\n const file = await loadInscription(pointer, req.query.meta);\n sendFile(file, res, true);\n } catch (err) {\n next(err);\n }\n }\n}\n" + ], + "names": [ + "redis", + "process", + "env", + "REDIS_HOST", + "host", + "port", + "REDIS_PORT", + "parseInt", + "console", + "log", + "Redis", + "JungleBusProvider", + "network", + "_proto", + "prototype", + "getRawTx", + "txid", + "_redis", + "Promise", + "resolve", + "getBuffer", + "then", + "rawtx", + "_temp", + "jb", + "JungleBusClient", + "GetTransaction", + "txnData", + "_redis2", + "Buffer", + "from", + "transaction", + "set", + "e", + "reject", + "getBlockchainInfo", + "fetch", + "resp", + "ok", + "createError", + "status", + "statusText", + "json", + "info", + "height", + "hash", + "getBlockByHeight", + "getBlockByHash", + "loadInscription", + "pointer", + "metadata", + "file", + "_temp4", + "_result", + "NotFound", + "_temp3", + "match", + "_pointer$split", + "split", + "vout", + "bsvProvider", + "Error", + "tx", + "Tx", + "fromBuffer", + "v", + "script", + "txOuts", + "parseScript", + "_temp2", + "data", + "_ref", + "meta", + "MAP", + "_catch", + "loadPointerFromDNS", + "hostname", + "lookupDomain", + "dns", + "resolveTxt", + "TXTs", + "outer", + "_step", + "_iterator", + "_createForOfIteratorHelperLoose", + "done", + "_step2", + "_iterator2", + "value", + "elem", + "startsWith", + "slice", + "prefix", + "getLatestBlock", + "B", + "ORD", + "_step3", + "opFalse", + "opIf", + "opORD", + "type", + "alloc", + "_iterator3", + "chunks", + "entries", + "_chunk$buf", + "_chunk$buf2", + "_step3$value", + "i", + "chunk", + "buf", + "equals", + "length", + "toString", + "opCodeNum", + "OpCode", + "OP_FALSE", + "OP_IF", + "_script$chunks", + "_script$chunks2", + "OP_PUSHDATA4", + "concat", + "OP_TRUE", + "OP_ENDIF", + "sendFile", + "res", + "immutable", + "header", + "JSON", + "stringify", + "send", + "app", + "getOrdfsFile", + "req", + "next", + "params", + "filename", + "dirData", + "dir", + "parse", + "query", + "err", + "get", + "_exit", + "outpoint", + "_req$res", + "redirect", + "render", + "_loadPointerFromDNS", + "_json", + "_getLatestBlock", + "call", + "_json2", + "_getBlockByHeight", + "_temp5", + "_json3", + "_getBlockByHash", + "_send", + "_getRawTx", + "_exit2", + "_temp7", + "_result3", + "_temp6", + "_loadInscription", + "_req$res2", + "raw", + "error", + "message", + "_loadPointerFromDNS2", + "_loadInscription2", + "_req$res3", + "htmlData", + "b64HtmlData" + ], + "mappings": "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" +} diff --git a/dist/lib.js b/dist/lib.js index 89a2603..b447836 100644 --- a/dist/lib.js +++ b/dist/lib.js @@ -1,10 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadInscription = exports.loadPointerFromDNS = void 0; -const dns = require("dns/promises"); const cross_fetch_1 = require("cross-fetch"); -const http_errors_1 = require("http-errors"); +const dns = require("dns/promises"); const createError = require("http-errors"); +const http_errors_1 = require("http-errors"); const data_1 = require("./data"); const outpoint_1 = require("./models/outpoint"); async function loadPointerFromDNS(hostname) { @@ -39,17 +39,16 @@ async function loadInscription(pointer, metadata = false, fuzzy = false) { file = await (0, data_1.loadFileByOutpoint)(outpoint_1.Outpoint.fromString(pointer), fuzzy); if (file && metadata) { try { - const url = `https://v3.ordinals.gorillapool.io/api/txos/${pointer}`; + const url = `https://ordinals.gorillapool.io/api/txos/${pointer}`; const resp = await (0, cross_fetch_1.default)(url); if (!resp.ok) { throw createError(resp.status, resp.statusText); } const data = await resp.json(); - const { hash } = await (0, data_1.getBlockByHeight)('bsv', data.height); + const { hash } = await (0, data_1.getBlockByHeight)("bsv", data.height); file.meta = Object.assign(Object.assign({}, data), { hash }); } catch (_a) { } - ; } } else diff --git a/dist/lib.js.map b/dist/lib.js.map index f41a123..d19d709 100644 --- a/dist/lib.js.map +++ b/dist/lib.js.map @@ -1 +1 @@ -{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":";;;AAAA,oCAAoC;AACpC,6CAAgC;AAChC,6CAAmD;AACnD,2CAA2C;AAG3C,iCAAiG;AACjG,gDAA6C;AAEtC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,YAAY,GAAG,UAAU,QAAQ,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC;IACxB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,OAAO,CAAA;SACf;KACF;IACD,MAAM,IAAI,sBAAQ,EAAE,CAAC;AACvB,CAAC;AAhBD,gDAgBC;AAEM,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,QAAQ,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK;IACpF,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,IAAsB,CAAC;IAE3B,IAAI,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE;QACtC,IAAI,GAAG,MAAM,IAAA,qBAAc,EAAC,OAAO,CAAC,CAAC;KACtC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACjD,IAAI,GAAG,MAAM,IAAA,wBAAiB,EAAC,OAAO,CAAC,CAAA;KACxC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACjD,IAAI,GAAG,MAAM,IAAA,yBAAkB,EAAC,mBAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAA;QACpE,IAAI,IAAI,IAAI,QAAQ,EAAE;YACpB,IAAI;gBACF,MAAM,GAAG,GAAE,+CAA+C,OAAO,EAAE,CAAC;gBACpE,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAK,EAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;oBACZ,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;iBACjD;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,uBAAgB,EAAC,KAAK,EAAE,IAAK,CAAC,MAAM,CAAC,CAAC;gBAE7D,IAAI,CAAC,IAAI,mCACJ,IAAI,KACP,IAAI,GACL,CAAC;aACH;YAAC,WAAM,GAAE;YAAA,CAAC;SACZ;KACF;;QAAM,MAAM,IAAI,wBAAU,CAAC,iBAAiB,CAAC,CAAC;IAE/C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,sBAAQ,EAAE,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AA9BD,0CA8BC"} \ No newline at end of file +{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":";;;AAAA,6CAAgC;AAChC,oCAAoC;AACpC,2CAA2C;AAC3C,6CAAmD;AAEnD,iCAKgB;AAEhB,gDAA6C;AAEtC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,YAAY,GAAG,UAAU,QAAQ,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC;IACxB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC;SAChB;KACF;IACD,MAAM,IAAI,sBAAQ,EAAE,CAAC;AACvB,CAAC;AAhBD,gDAgBC;AAEM,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,KAAK;IAEb,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,IAAsB,CAAC;IAE3B,IAAI,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE;QACtC,IAAI,GAAG,MAAM,IAAA,qBAAc,EAAC,OAAO,CAAC,CAAC;KACtC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACjD,IAAI,GAAG,MAAM,IAAA,wBAAiB,EAAC,OAAO,CAAC,CAAC;KACzC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACjD,IAAI,GAAG,MAAM,IAAA,yBAAkB,EAAC,mBAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QACrE,IAAI,IAAI,IAAI,QAAQ,EAAE;YACpB,IAAI;gBACF,MAAM,GAAG,GAAG,4CAA4C,OAAO,EAAE,CAAC;gBAClE,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAK,EAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;oBACZ,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;iBACjD;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,uBAAgB,EAAC,KAAK,EAAE,IAAK,CAAC,MAAM,CAAC,CAAC;gBAE7D,IAAI,CAAC,IAAI,mCACJ,IAAI,KACP,IAAI,GACL,CAAC;aACH;YAAC,WAAM,GAAE;SACX;KACF;;QAAM,MAAM,IAAI,wBAAU,CAAC,iBAAiB,CAAC,CAAC;IAE/C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,sBAAQ,EAAE,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAlCD,0CAkCC"} \ No newline at end of file diff --git a/dist/provider.js b/dist/provider.js index f0c731d..dc9ccab 100644 --- a/dist/provider.js +++ b/dist/provider.js @@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.BtcProvider = exports.ProxyProvider = exports.RpcProvider = void 0; const Client = require("bitcoin-core"); require("cross-fetch/polyfill"); -const http_errors_1 = require("http-errors"); const createError = require("http-errors"); +const http_errors_1 = require("http-errors"); const ioredis_1 = require("ioredis"); let redis; if (process.env.REDIS_HOST) { @@ -108,7 +108,7 @@ class BtcProvider { let rawtx = await (redis === null || redis === void 0 ? void 0 : redis.getBuffer(txid)); if (!rawtx) { // TODO: Make this configuration based - const resp = await fetch(`https://ordinals.shruggr.cloud/v1/btc/tx/${txid}`); + const resp = await fetch(`https://ordfs.gorillapool.io/v1/btc/tx/${txid}`); if (!resp.ok) { throw createError(resp.status, resp.statusText); } @@ -119,19 +119,19 @@ class BtcProvider { } async getBlockchainInfo() { // TODO: Make this configuration based - const resp = await fetch("https://ordinals.shruggr.cloud/v1/btc/block/latest"); + const resp = await fetch("https://ordfs.gorillapool.io/v1/btc/block/latest"); if (!resp.ok) { throw createError(resp.status, resp.statusText); } return resp.json(); } async getBlockByHeight(height) { - const resp = await fetch(`https://ordinals.shruggr.cloud/v1/btc/block/height/${height}`); + const resp = await fetch(`https://ordfs.gorillapool.io/v1/btc/block/height/${height}`); const info = await resp.json(); return { height, hash: info.hash }; } async getBlockByHash(hash) { - const resp = await fetch(`https://ordinals.shruggr.cloud/v1/btc/block/hash/${hash}`); + const resp = await fetch(`https://ordfs.gorillapool.io/v1/btc/block/hash/${hash}`); const info = await resp.json(); return { height: info.height, diff --git a/dist/provider.js.map b/dist/provider.js.map index dc899b4..d7f3f9c 100644 --- a/dist/provider.js.map +++ b/dist/provider.js.map @@ -1 +1 @@ -{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/data.ts b/src/data.ts index 55a7d37..7416106 100644 --- a/src/data.ts +++ b/src/data.ts @@ -1,33 +1,38 @@ -import { Transaction } from "bitcore-lib"; -import { Redis } from "ioredis"; import { OpCode, Script, Tx } from "@ts-bitcoin/core"; -import { NotFound } from "http-errors"; +import { Transaction } from "bitcore-lib"; import * as createError from "http-errors"; -import { Outpoint } from "./models/outpoint"; +import { NotFound } from "http-errors"; +import { Redis } from "ioredis"; import { File } from "./models/models"; -import { BtcProvider, ITxProvider, ProxyProvider, RpcProvider } from "./provider"; +import { Outpoint } from "./models/outpoint"; +import { + BtcProvider, + ITxProvider, + ProxyProvider, + RpcProvider, +} from "./provider"; let bsvProvider: ITxProvider = new ProxyProvider(); let btcProvider: ITxProvider = new BtcProvider(); if (process.env.BITCOIN_HOST) { - bsvProvider = new RpcProvider( - "bsv", - process.env.BITCOIN_HOST || "", - process.env.BITCOIN_PORT || "8332", - process.env.BITCOIN_USER || "", - process.env.BITCOIN_PASS || "" - ); + bsvProvider = new RpcProvider( + "bsv", + process.env.BITCOIN_HOST || "", + process.env.BITCOIN_PORT || "8332", + process.env.BITCOIN_USER || "", + process.env.BITCOIN_PASS || "" + ); } if (process.env.BTC_HOST) { - btcProvider = new RpcProvider( - "btc", - process.env.BTC_HOST || "", - process.env.BTC_PORT || "8332", - process.env.BTC_USER || "", - process.env.BTC_PASS || "" - ); + btcProvider = new RpcProvider( + "btc", + process.env.BTC_HOST || "", + process.env.BTC_PORT || "8332", + process.env.BTC_USER || "", + process.env.BTC_PASS || "" + ); } const B = Buffer.from("19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut"); @@ -35,141 +40,147 @@ const ORD = Buffer.from("ord"); let redis: Redis; if (process.env.REDIS_HOST) { - const host = process.env.REDIS_HOST; - const port = process.env.REDIS_PORT - ? parseInt(process.env.REDIS_PORT, 10) - : 6379; - console.log("Connecting to redis:", host, port); - redis = new Redis(port, host); + const host = process.env.REDIS_HOST; + const port = process.env.REDIS_PORT + ? parseInt(process.env.REDIS_PORT, 10) + : 6379; + console.log("Connecting to redis:", host, port); + redis = new Redis(port, host); } export async function getRawTx(txid: string): Promise { - let rawtx = await redis?.getBuffer(txid); - if (!rawtx) { - try { - rawtx = await bsvProvider.getRawTx(txid); - } catch {} - // const url = `http://${BITCOIN_HOST}:${BITCOIN_PORT}/rest/tx/${txid}.bin` - // const resp = await fetch(url); - // if (!resp.ok) { - // throw createError(resp.status, resp.statusText) - // } - // rawtx = Buffer.from(await resp.arrayBuffer()); - } - if (!rawtx) { - try { - rawtx = await btcProvider.getRawTx(txid); - } catch {} - } - if (!rawtx) { - throw new NotFound(); - } - return rawtx; + let rawtx = await redis?.getBuffer(txid); + if (!rawtx) { + try { + rawtx = await bsvProvider.getRawTx(txid); + } catch {} + // const url = `http://${BITCOIN_HOST}:${BITCOIN_PORT}/rest/tx/${txid}.bin` + // const resp = await fetch(url); + // if (!resp.ok) { + // throw createError(resp.status, resp.statusText) + // } + // rawtx = Buffer.from(await resp.arrayBuffer()); + } + if (!rawtx) { + try { + rawtx = await btcProvider.getRawTx(txid); + } catch {} + } + if (!rawtx) { + throw new NotFound(); + } + return rawtx; } export async function loadTx(txid: string): Promise { - return Tx.fromBuffer(await getRawTx(txid)); + return Tx.fromBuffer(await getRawTx(txid)); } -export async function getBlockchainInfo(network: string): Promise<{ height: number; hash: string }> { - switch (network) { - case "bsv": - return bsvProvider.getBlockchainInfo(); - case "btc": - return btcProvider.getBlockchainInfo(); - } - throw new Error("Invalid Network"); +export async function getBlockchainInfo( + network: string +): Promise<{ height: number; hash: string }> { + switch (network) { + case "bsv": + return bsvProvider.getBlockchainInfo(); + case "btc": + return btcProvider.getBlockchainInfo(); + } + throw new Error("Invalid Network"); } export async function getBlockByHeight( - network: string, - height: number + network: string, + height: number ): Promise<{ height: number; hash: string }> { - switch (network) { - case "bsv": - return bsvProvider.getBlockByHeight(height); - case "btc": - return btcProvider.getBlockByHeight(height); - } - throw new Error("Invalid Network"); + switch (network) { + case "bsv": + return bsvProvider.getBlockByHeight(height); + case "btc": + return btcProvider.getBlockByHeight(height); + } + throw new Error("Invalid Network"); } export async function getBlockByHash( - network: string, - hash: string + network: string, + hash: string ): Promise<{ height: number; hash: string }> { - switch (network) { - case "bsv": - return bsvProvider.getBlockByHash(hash); - case "btc": - return btcProvider.getBlockByHash(hash); - } - throw new Error("Invalid Network"); + switch (network) { + case "bsv": + return bsvProvider.getBlockByHash(hash); + case "btc": + return btcProvider.getBlockByHash(hash); + } + throw new Error("Invalid Network"); } -export async function loadFileByOutpoint(outpoint: Outpoint, fuzzy = false): Promise { - const url = `https://v3.ordinals.gorillapool.io/content/${outpoint.toString()}${fuzzy ? '?fuzzy=true' : ''}` - const resp = await fetch(url); - if (!resp.ok) { - throw createError(resp.status, resp.statusText); - } - return { - data: Buffer.from(await resp.arrayBuffer()), - type: resp.headers.get('content-type') || '', - }; +export async function loadFileByOutpoint( + outpoint: Outpoint, + fuzzy = false +): Promise { + const url = `https://ordinals.gorillapool.io/content/${outpoint.toString()}${ + fuzzy ? "?fuzzy=true" : "" + }`; + const resp = await fetch(url); + if (!resp.ok) { + throw createError(resp.status, resp.statusText); + } + return { + data: Buffer.from(await resp.arrayBuffer()), + type: resp.headers.get("content-type") || "", + }; } export async function loadFileByInpoint(inpoint: string): Promise { - const [txid, vout] = inpoint.split('i'); - const rawtx = await getRawTx(txid); - const tx = new Transaction(rawtx); - return parseScript(tx.txIns[parseInt(vout, 10)].script); + const [txid, vout] = inpoint.split("i"); + const rawtx = await getRawTx(txid); + const tx = new Transaction(rawtx); + return parseScript(tx.txIns[parseInt(vout, 10)].script); } export async function loadFileByTxid(txid: string): Promise { - const tx = await loadTx(txid); - for (let txOut of tx.txOuts) { - try { - const data = await parseScript(txOut.script); - if (data) return data; - } catch { } - } - throw new NotFound(); + const tx = await loadTx(txid); + for (const txOut of tx.txOuts) { + try { + const data = await parseScript(txOut.script); + if (data) return data; + } catch {} + } + throw new NotFound(); } export function parseScript(script: Script): File { - let opFalse = 0; - let opIf = 0; - for (let [i, chunk] of script.chunks.entries()) { - if (chunk.opCodeNum === OpCode.OP_FALSE) { - opFalse = i; - } - if (chunk.opCodeNum === OpCode.OP_IF) { - opIf = i; - } - if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) { - let file = {} as File; - for (let j = i + 1; j < script.chunks.length; j += 2) { - if (script.chunks[j].buf) break; - switch (script.chunks[j].opCodeNum) { - case OpCode.OP_0: - file.data = script.chunks[j + 1].buf; - return file; - case OpCode.OP_1: - file.type = script.chunks[j + 1].buf?.toString('utf8'); - break; - case OpCode.OP_ENDIF: - break; - } - } - } - if (chunk.buf?.equals(B)) { - return { - data: script.chunks[i + 1].buf, - type: script.chunks[i + 2].buf?.toString('utf8'), - }; + let opFalse = 0; + let opIf = 0; + for (const [i, chunk] of script.chunks.entries()) { + if (chunk.opCodeNum === OpCode.OP_FALSE) { + opFalse = i; + } + if (chunk.opCodeNum === OpCode.OP_IF) { + opIf = i; + } + if (chunk.buf?.equals(ORD) && opFalse === i - 2 && opIf === i - 1) { + const file = {} as File; + for (let j = i + 1; j < script.chunks.length; j += 2) { + if (script.chunks[j].buf) break; + switch (script.chunks[j].opCodeNum) { + case OpCode.OP_0: + file.data = script.chunks[j + 1].buf; + return file; + case OpCode.OP_1: + file.type = script.chunks[j + 1].buf?.toString("utf8"); + break; + case OpCode.OP_ENDIF: + break; } + } } - throw new NotFound(); + if (chunk.buf?.equals(B)) { + return { + data: script.chunks[i + 1].buf, + type: script.chunks[i + 2].buf?.toString("utf8"), + }; + } + } + throw new NotFound(); } - diff --git a/src/lib.ts b/src/lib.ts index a8009e3..3b6877b 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,10 +1,15 @@ -import * as dns from "dns/promises"; import fetch from "cross-fetch"; -import { BadRequest, NotFound } from "http-errors"; +import * as dns from "dns/promises"; import * as createError from "http-errors"; +import { BadRequest, NotFound } from "http-errors"; +import { + getBlockByHeight, + loadFileByInpoint, + loadFileByOutpoint, + loadFileByTxid, +} from "./data"; import { File } from "./models/models"; -import { getBlockByHeight, loadFileByInpoint, loadFileByOutpoint, loadFileByTxid } from "./data"; import { Outpoint } from "./models/outpoint"; export async function loadPointerFromDNS(hostname: string): Promise { @@ -19,37 +24,41 @@ export async function loadPointerFromDNS(hostname: string): Promise { console.log("Elem:", elem); pointer = elem.slice(prefix.length); console.log("Origin:", pointer); - return pointer + return pointer; } } throw new NotFound(); } -export async function loadInscription(pointer: string, metadata = false, fuzzy = false): Promise { +export async function loadInscription( + pointer: string, + metadata = false, + fuzzy = false +): Promise { console.log("loadInscription", pointer); let file: File | undefined; if (pointer.match(/^[0-9a-fA-F]{64}$/)) { file = await loadFileByTxid(pointer); } else if (pointer.match(/^[0-9a-fA-F]{64}i\d+$/)) { - file = await loadFileByInpoint(pointer) + file = await loadFileByInpoint(pointer); } else if (pointer.match(/^[0-9a-fA-F]{64}_\d+$/)) { - file = await loadFileByOutpoint(Outpoint.fromString(pointer), fuzzy) + file = await loadFileByOutpoint(Outpoint.fromString(pointer), fuzzy); if (file && metadata) { try { - const url =`https://v3.ordinals.gorillapool.io/api/txos/${pointer}`; + const url = `https://ordinals.gorillapool.io/api/txos/${pointer}`; const resp = await fetch(url); if (!resp.ok) { throw createError(resp.status, resp.statusText); } const data = await resp.json(); - const { hash } = await getBlockByHeight('bsv', data!.height); + const { hash } = await getBlockByHeight("bsv", data!.height); file.meta = { ...data, - hash + hash, }; - } catch {}; + } catch {} } } else throw new BadRequest("Invalid Pointer"); @@ -57,4 +66,3 @@ export async function loadInscription(pointer: string, metadata = false, fuzzy = return file; } export { File }; - diff --git a/src/provider.ts b/src/provider.ts index 3ea0cd2..40a9f19 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -1,192 +1,196 @@ import * as Client from "bitcoin-core"; import "cross-fetch/polyfill"; -import { NotFound } from "http-errors"; import * as createError from "http-errors"; +import { NotFound } from "http-errors"; import { Redis } from "ioredis"; let redis: Redis; if (process.env.REDIS_HOST) { - const host = process.env.REDIS_HOST; - const port = process.env.REDIS_PORT - ? parseInt(process.env.REDIS_PORT, 10) - : 6379; - console.log("Connecting to redis:", host, port); - redis = new Redis(port, host); + const host = process.env.REDIS_HOST; + const port = process.env.REDIS_PORT + ? parseInt(process.env.REDIS_PORT, 10) + : 6379; + console.log("Connecting to redis:", host, port); + redis = new Redis(port, host); } export interface ITxProvider { - network: string; - getRawTx: (string) => Promise; - getBlockchainInfo: () => Promise<{ height: number; hash: string }>; - getBlockByHeight: (number) => Promise<{ height: number; hash: string }>; - getBlockByHash: (string) => Promise<{ height: number; hash: string }>; + network: string; + getRawTx: (rawtx: string) => Promise; + getBlockchainInfo: () => Promise<{ height: number; hash: string }>; + getBlockByHeight: ( + height: number + ) => Promise<{ height: number; hash: string }>; + getBlockByHash: (hash: string) => Promise<{ height: number; hash: string }>; } export class RpcProvider implements ITxProvider { - private client: Client; - - constructor( - public network: string, - host: string, - port: string, - username: string, - password: string - ) { - this.client = new Client({ - host, - port, - username, - password, - }); - } - - async getRawTx(txid: string): Promise { - let rawtx = await redis?.getBuffer(txid); - if (!rawtx) { - rawtx = await this.client.getTransactionByHash(txid, { - extension: "bin", - }); - if (!rawtx) { - throw new NotFound(); - } - redis?.set(txid, rawtx); - } - return rawtx; - } - - async getBlockchainInfo(): Promise<{ height: number; hash: string }> { - const info = await this.client.getBlockchainInfo(); - return { - height: info.blocks, - hash: info.bestblockhash, - }; - } - - async getBlockByHeight( - height: number - ): Promise<{ height: number; hash: string }> { - const hash = await this.client.getBlockHash(height); - return { height, hash }; - } - - async getBlockByHash( - hash: string - ): Promise<{ height: number; hash: string }> { - const info = await this.client.getBlockHeader(hash); - return { - height: info.height, - hash, - }; + private client: Client; + + constructor( + public network: string, + host: string, + port: string, + username: string, + password: string + ) { + this.client = new Client({ + host, + port, + username, + password, + }); + } + + async getRawTx(txid: string): Promise { + let rawtx = await redis?.getBuffer(txid); + if (!rawtx) { + rawtx = await this.client.getTransactionByHash(txid, { + extension: "bin", + }); + if (!rawtx) { + throw new NotFound(); + } + redis?.set(txid, rawtx); } + return rawtx; + } + + async getBlockchainInfo(): Promise<{ height: number; hash: string }> { + const info = await this.client.getBlockchainInfo(); + return { + height: info.blocks, + hash: info.bestblockhash, + }; + } + + async getBlockByHeight( + height: number + ): Promise<{ height: number; hash: string }> { + const hash = await this.client.getBlockHash(height); + return { height, hash }; + } + + async getBlockByHash( + hash: string + ): Promise<{ height: number; hash: string }> { + const info = await this.client.getBlockHeader(hash); + return { + height: info.height, + hash, + }; + } } export class ProxyProvider implements ITxProvider { - public network = "bsv"; - - async getRawTx(txid: string): Promise { - let rawtx = await redis?.getBuffer(txid); - if (!rawtx) { - const resp = await fetch(`https://junglebus.gorillapool.io/v1/transaction/get/${txid}/bin`); - if (!resp.ok) { - throw createError(resp.status, resp.statusText); - } - rawtx = Buffer.from(await resp.arrayBuffer()); - redis?.set(txid, rawtx); - } - return rawtx; + public network = "bsv"; + + async getRawTx(txid: string): Promise { + let rawtx = await redis?.getBuffer(txid); + if (!rawtx) { + const resp = await fetch( + `https://junglebus.gorillapool.io/v1/transaction/get/${txid}/bin` + ); + if (!resp.ok) { + throw createError(resp.status, resp.statusText); + } + rawtx = Buffer.from(await resp.arrayBuffer()); + redis?.set(txid, rawtx); } - - async getBlockchainInfo(): Promise<{ height: number; hash: string }> { - const resp = await fetch( - "https://api.whatsonchain.com/v1/bsv/main/block/headers" - ); - if (!resp.ok) { - throw createError(resp.status, resp.statusText); - } - const info = await resp.json(); - return { - height: info[0].height, - hash: info[0].hash, - }; - } - - async getBlockByHeight( - height: number - ): Promise<{ height: number; hash: string }> { - const resp = await fetch( - `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}` - ); - const info = await resp.json(); - return { height, hash: info.hash }; - } - - async getBlockByHash( - hash: string - ): Promise<{ height: number; hash: string }> { - const resp = await fetch( - `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}` - ); - const info = await resp.json(); - - return { - height: info.height, - hash, - }; + return rawtx; + } + + async getBlockchainInfo(): Promise<{ height: number; hash: string }> { + const resp = await fetch( + "https://api.whatsonchain.com/v1/bsv/main/block/headers" + ); + if (!resp.ok) { + throw createError(resp.status, resp.statusText); } + const info = await resp.json(); + return { + height: info[0].height, + hash: info[0].hash, + }; + } + + async getBlockByHeight( + height: number + ): Promise<{ height: number; hash: string }> { + const resp = await fetch( + `https://api.whatsonchain.com/v1/bsv/main/block/height/${height}` + ); + const info = await resp.json(); + return { height, hash: info.hash }; + } + + async getBlockByHash( + hash: string + ): Promise<{ height: number; hash: string }> { + const resp = await fetch( + `https://api.whatsonchain.com/v1/bsv/main/block/hash/${hash}` + ); + const info = await resp.json(); + + return { + height: info.height, + hash, + }; + } } export class BtcProvider implements ITxProvider { - public network = "btc"; - - async getRawTx(txid: string): Promise { - let rawtx = await redis?.getBuffer(txid); - if (!rawtx) { - // TODO: Make this configuration based - const resp = await fetch( - `https://ordinals.shruggr.cloud/v1/btc/tx/${txid}` - ); - if (!resp.ok) { - throw createError(resp.status, resp.statusText); - } - rawtx = Buffer.from(await resp.arrayBuffer()); - redis?.set(txid, rawtx); - } - return rawtx; + public network = "btc"; + + async getRawTx(txid: string): Promise { + let rawtx = await redis?.getBuffer(txid); + if (!rawtx) { + // TODO: Make this configuration based + const resp = await fetch( + `https://ordfs.gorillapool.io/v1/btc/tx/${txid}` + ); + if (!resp.ok) { + throw createError(resp.status, resp.statusText); + } + rawtx = Buffer.from(await resp.arrayBuffer()); + redis?.set(txid, rawtx); } - - async getBlockchainInfo(): Promise<{ height: number; hash: string }> { - // TODO: Make this configuration based - const resp = await fetch( - "https://ordinals.shruggr.cloud/v1/btc/block/latest" - ); - if (!resp.ok) { - throw createError(resp.status, resp.statusText); - } - - return resp.json(); + return rawtx; + } + + async getBlockchainInfo(): Promise<{ height: number; hash: string }> { + // TODO: Make this configuration based + const resp = await fetch( + "https://ordfs.gorillapool.io/v1/btc/block/latest" + ); + if (!resp.ok) { + throw createError(resp.status, resp.statusText); } - async getBlockByHeight( - height: number - ): Promise<{ height: number; hash: string }> { - const resp = await fetch( - `https://ordinals.shruggr.cloud/v1/btc/block/height/${height}` - ); - const info = await resp.json(); - return { height, hash: info.hash }; - } - - async getBlockByHash( - hash: string - ): Promise<{ height: number; hash: string }> { - const resp = await fetch( - `https://ordinals.shruggr.cloud/v1/btc/block/hash/${hash}` - ); - const info = await resp.json(); - - return { - height: info.height, - hash, - }; - } + return resp.json(); + } + + async getBlockByHeight( + height: number + ): Promise<{ height: number; hash: string }> { + const resp = await fetch( + `https://ordfs.gorillapool.io/v1/btc/block/height/${height}` + ); + const info = await resp.json(); + return { height, hash: info.hash }; + } + + async getBlockByHash( + hash: string + ): Promise<{ height: number; hash: string }> { + const resp = await fetch( + `https://ordfs.gorillapool.io/v1/btc/block/hash/${hash}` + ); + const info = await resp.json(); + + return { + height: info.height, + hash, + }; + } }