@getomnichain/omnichain 0.3.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/rango_chain_names.js +209 -0
- package/dist/cjs/rango_chain_names.js.map +1 -0
- package/dist/cjs/utxo/btc/tools/bitcoin_core.tool.js +129 -0
- package/dist/cjs/utxo/btc/tools/bitcoin_core.tool.js.map +1 -1
- package/dist/cjs/utxo/btc/tools/esplora.tool.js +84 -0
- package/dist/cjs/utxo/btc/tools/esplora.tool.js.map +1 -1
- package/dist/cjs/utxo/utxo_chain.js +18 -49
- package/dist/cjs/utxo/utxo_chain.js.map +1 -1
- package/dist/cjs/utxo/utxo_transaction_status.js +20 -16
- package/dist/cjs/utxo/utxo_transaction_status.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/rango_chain_names.d.ts +76 -0
- package/dist/esm/rango_chain_names.d.ts.map +1 -0
- package/dist/esm/rango_chain_names.js +171 -0
- package/dist/esm/rango_chain_names.js.map +1 -0
- package/dist/esm/utxo/btc/tools/bitcoin_core.tool.d.ts +4 -1
- package/dist/esm/utxo/btc/tools/bitcoin_core.tool.d.ts.map +1 -1
- package/dist/esm/utxo/btc/tools/bitcoin_core.tool.js +129 -0
- package/dist/esm/utxo/btc/tools/bitcoin_core.tool.js.map +1 -1
- package/dist/esm/utxo/btc/tools/esplora.tool.d.ts +2 -1
- package/dist/esm/utxo/btc/tools/esplora.tool.d.ts.map +1 -1
- package/dist/esm/utxo/btc/tools/esplora.tool.js +84 -0
- package/dist/esm/utxo/btc/tools/esplora.tool.js.map +1 -1
- package/dist/esm/utxo/tools/raw_transaction_provider.d.ts +2 -1
- package/dist/esm/utxo/tools/raw_transaction_provider.d.ts.map +1 -1
- package/dist/esm/utxo/utxo.d.ts +27 -0
- package/dist/esm/utxo/utxo.d.ts.map +1 -1
- package/dist/esm/utxo/utxo_chain.d.ts.map +1 -1
- package/dist/esm/utxo/utxo_chain.js +18 -49
- package/dist/esm/utxo/utxo_chain.js.map +1 -1
- package/dist/esm/utxo/utxo_transaction_status.d.ts +21 -16
- package/dist/esm/utxo/utxo_transaction_status.d.ts.map +1 -1
- package/dist/esm/utxo/utxo_transaction_status.js +20 -16
- package/dist/esm/utxo/utxo_transaction_status.js.map +1 -1
- package/docs/README.md +1 -0
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -8,7 +8,52 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## [0.5.0] — 2026-09-21
|
|
12
|
+
|
|
13
|
+
Adds a single canonical bidirectional map between omnichain chain ids and Rango's uppercase `blockchains[].name` identifiers. Removes the need for downstream consumers that talk to Rango to maintain their own partial copies of the mapping.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **`CHAIN_ID_TO_RANGO_NAME: ReadonlyMap<number, string>`** on `rango_chain_names.ts` — primary map for every omnichain chain that appears in Rango's `/meta`. Sourced from `GET https://public-api.rango.exchange/basic/meta`, snapshot dated 2026-09-21.
|
|
18
|
+
- **`RANGO_NAME_TO_CHAIN_ID: ReadonlyMap<string, number>`** — the inverse map, keyed by uppercase name.
|
|
19
|
+
- **`NOT_ON_RANGO: ReadonlySet<number>`** — explicit "not on Rango" decisions for testnets + mainnet chains omnichain declares but Rango's `/meta` does not carry (e.g. `MANTLE`, `OPBNB`, `SEI_EVM`, `WORLD_CHAIN`, `WANCHAIN`, `ABSTRACT`, `INK`, `BOB`, `ZKLINK_NOVA`, `TEMPO`). Each id must appear in the map or here; the coverage test fails otherwise, and `prepublishOnly` now runs the suite so an undecided chain id cannot ship.
|
|
20
|
+
- **`rangoNameForChainId(chainId)`** and **`chainIdForRangoName(name)`** — accessors. The name-side normalises `trim() + toUpperCase()` and returns `undefined` for any non-string input, so callers looping over untrusted Rango feed rows can skip bad entries instead of aborting.
|
|
21
|
+
- **Fixture** `test/fixtures/rango_meta_blockchains.json` — compact wrapper `{fetchedAt, source, blockchains: [{name, chainId, type}, …]}` of Rango's `/meta`, ~8 KB. The map's substance is verified against it: every mapped name exists, every positive-id row's parsed `chainId` (hex `0x…` or decimal) equals the omnichain id, every non-positive mapped id lives on the family predicate the fixture type implies (`SOLANA→isSolana`, `SUI→isSui`, `XRPL→isXrpl`, `STELLAR→isStellar`, `TON→isTon`, `TRANSFER→isUtxo`; TRON is positive and covered by the hex check), and no `NOT_ON_RANGO` id is actually present in the fixture. Refreshing the map becomes "replace fixture, rerun tests."
|
|
22
|
+
- **Tests** in `test/rango_chain_names.spec.ts`: bijection, no-duplicate names, name-format invariant (`/^[A-Z0-9_]+$/`), critical anchors (BTC=-1, SOLANA=-2000, ETH, BSC, ARBITRUM, BASE, LINEA, AVAX_CCHAIN, LTC, DOGE, BCH, TRON), case/whitespace normalisation, unknown-and-non-string handling, disjoint map/`NOT_ON_RANGO`, exhaustive `chain_ids.ts` coverage, and the three fixture-backed feed checks.
|
|
23
|
+
|
|
24
|
+
### Note
|
|
25
|
+
|
|
26
|
+
- Aliases (alternate Rango spellings for the same chain) are out of scope. If a consumer hits one in the wild, opening a follow-up to add it is a separate decision.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## [0.4.0] — 2026-09-16
|
|
31
|
+
|
|
32
|
+
Brings TS `UtxoTransactionStatus` in line with the Python SDK's already-shipped UTXO shape: per-input `{address, value}` surfaced, and `balanceChanges` becomes net per-address (matching EVM/Solana). Every hydration detail lives in the per-tool provider, mirroring Python's `AbstractUtxoTool.get_tx`.
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- **`UtxoTransaction` interface** on `utxo/utxo.ts` — the intermediate type returned by the tool layer, mirroring Python's `class UtxoTransaction`: `{ inputs, outputs, netChangesHr: Record<string, Decimal>, size, vsize, confirmations, confirmationDatetime }`.
|
|
37
|
+
- **`UtxoTransactionInput` type** — `{ txid, vout, scriptPubkeyHex, address, valueSats, valueBtcHr, coinbase? }`. Both `valueSats` (bigint, `@deprecated`) and `valueBtcHr` (Decimal) are populated this release; the deprecated `valueSats` is scheduled for removal in a future major, with `valueBtcHr` renamed → `value` at that point to align with Python. Mirrors the `AssetBalanceChange.balanceChangeMr`/`Hr` idiom.
|
|
38
|
+
- **`UtxoRawTransactionProvider.getTransactionWithInputs(txid)`** — new provider method returning a fully-hydrated `UtxoTransaction`. Every adapter is responsible for hydration per its API, matching Python's per-tool approach.
|
|
39
|
+
- **`EsploraTool.getTransactionWithInputs`** — parses inline `vin[*].prevout` from Esplora's `/tx/{txid}` response; zero extra RPCs.
|
|
40
|
+
- **`BitcoinCoreTool.getTransactionWithInputs`** — hydrates via a hybrid path that works on every Core version: whichever verbosity the caller requests (`bitcoinCoreVerbose?: 1 | 2`, default `1`), the adapter uses any `vin[*].prevout` the response inlines and runs a batched `getrawtransaction verbose=1` walk for the vins that do not carry a prevout (older Core, mempool txs, pruned-block txs, Core < 25). Zero extra RPCs when block undo data is available; N extra otherwise. Matches Python's `impl/utxo/tools/bitcoin_core.py:453` cost profile on the fallback path. Setting `bitcoinCoreVerbose: 2` on Core ≥ 25 is the recommended production configuration for confirmed-heavy status polling.
|
|
41
|
+
- **`UtxoTransactionStatus.inputs`** — `readonly UtxoTransactionInput[] | null`. Populated when the provider tool hydrated every non-coinbase input; `null` (with `inputsUnresolvedReason: 'pending'`) on `Pending` statuses whose provider skips hydration.
|
|
42
|
+
- **`UtxoTransactionStatus.inputsUnresolvedReason`** — `'provider_error' | 'parent_missing' | 'pending' | null`.
|
|
43
|
+
- **`UtxoInputsUnresolvedReason`** type on `utxo/utxo.ts`.
|
|
44
|
+
- **8 new RIN-226 unit tests** covering: inputs order + dual units, net semantics on a mixed-owner tx, self-send fee-only debit, no legacy accessor, hydration failure → thrown `RpcError`, coinbase input shape, `Pending` + hydration unavailable, `valueSats`/`valueBtcHr` agreement.
|
|
45
|
+
|
|
46
|
+
### Changed (breaking on the UTXO surface)
|
|
47
|
+
|
|
48
|
+
- **`UtxoTransactionStatus.balanceChanges`** is now **net per-address** (from `UtxoTransaction.netChangesHr`) on `Success` statuses — inputs debited, outputs credited. Previously gross output credits per receiving address. Matches `EvmTransactionStatus`, `SolanaTransactionStatus`, Python's UTXO status, and Clydner's BlockCypher parser.
|
|
49
|
+
- On confirmed + hydration failure, `UtxoChain.getTransactionStatus` **throws `ChainError(RpcError)`** rather than returning a `Success` with `null` balance changes (preserves the base `TransactionStatus(Success)` invariant that requires `balanceChanges` present).
|
|
50
|
+
- Rewrote the `UtxoTransactionStatus` class docstring — the "gross output credits" caveat and the "`inputs` … comes back in the 2C UTXO port" TODO are removed.
|
|
51
|
+
- No `outputCreditsByAddress()` accessor and no `grossOutputCreditsLegacy` field: deposit detectors that only need who-got-credited iterate `status.outputs[]` directly (Python has neither).
|
|
52
|
+
|
|
53
|
+
### Note
|
|
54
|
+
|
|
55
|
+
- Migration: consumers that summed positive UTXO credits from `balanceChanges` need to switch to iterating `status.outputs[]` per address. A hot-wallet withdrawal that previously read as a large positive credit (from the change output) now reads as a net debit for the fee — the correct sign.
|
|
56
|
+
- Companion cards to file: rango-intents BTC-8 workaround deletion (drop `enrichInputTxFromChain` and the parent-tx resolver; consume `status.inputs` + iterate `status.outputs[]` for deposit detection) and Clydner BlockCypher-parser netting (drop the parser's own netting or document why it stays because it ingests BlockCypher payloads directly, not SDK statuses).
|
|
12
57
|
|
|
13
58
|
---
|
|
14
59
|
|
|
@@ -324,6 +369,14 @@ Initial npm release of `@getomnichain/omnichain`. Replaces prior vendored-submod
|
|
|
324
369
|
|
|
325
370
|
---
|
|
326
371
|
|
|
372
|
+
[0.5.0]: https://github.com/getomnichain/omnichain/releases/tag/v0.5.0
|
|
373
|
+
[0.4.0]: https://github.com/getomnichain/omnichain/releases/tag/v0.4.0
|
|
374
|
+
[0.3.6]: https://github.com/getomnichain/omnichain/releases/tag/v0.3.6
|
|
375
|
+
[0.3.5]: https://github.com/getomnichain/omnichain/releases/tag/v0.3.5
|
|
376
|
+
[0.3.4]: https://github.com/getomnichain/omnichain/releases/tag/v0.3.4
|
|
377
|
+
[0.3.3]: https://github.com/getomnichain/omnichain/releases/tag/v0.3.3
|
|
378
|
+
[0.3.2]: https://github.com/getomnichain/omnichain/releases/tag/v0.3.2
|
|
379
|
+
[0.3.1]: https://github.com/getomnichain/omnichain/releases/tag/v0.3.1
|
|
327
380
|
[0.3.0]: https://github.com/getomnichain/omnichain/releases/tag/v0.3.0
|
|
328
381
|
[0.2.1]: https://github.com/getomnichain/omnichain/releases/tag/v0.2.1
|
|
329
382
|
[0.2.0]: https://github.com/getomnichain/omnichain/releases/tag/v0.2.0
|
package/dist/cjs/index.js
CHANGED
|
@@ -24,6 +24,7 @@ __exportStar(require("./errors.js"), exports);
|
|
|
24
24
|
__exportStar(require("./is_address.decorator.js"), exports);
|
|
25
25
|
__exportStar(require("./network_type.js"), exports);
|
|
26
26
|
__exportStar(require("./priority.js"), exports);
|
|
27
|
+
__exportStar(require("./rango_chain_names.js"), exports);
|
|
27
28
|
__exportStar(require("./token.js"), exports);
|
|
28
29
|
__exportStar(require("./transaction_status.js"), exports);
|
|
29
30
|
__exportStar(require("./unsigned_transaction.js"), exports);
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,+CAA6B;AAC7B,uDAAqC;AACrC,+DAA6C;AAC7C,kDAAgC;AAChC,iDAA+B;AAC/B,8CAA4B;AAC5B,4DAA0C;AAC1C,oDAAkC;AAClC,gDAA8B;AAC9B,6CAA2B;AAC3B,0DAAwC;AACxC,4DAA0C;AAC1C,iDAA+B;AAC/B,oDAAkC;AAClC,iDAA+B;AAC/B,kDAAgC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,+CAA6B;AAC7B,uDAAqC;AACrC,+DAA6C;AAC7C,kDAAgC;AAChC,iDAA+B;AAC/B,8CAA4B;AAC5B,4DAA0C;AAC1C,oDAAkC;AAClC,gDAA8B;AAC9B,yDAAuC;AACvC,6CAA2B;AAC3B,0DAAwC;AACxC,4DAA0C;AAC1C,iDAA+B;AAC/B,oDAAkC;AAClC,iDAA+B;AAC/B,kDAAgC"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NOT_ON_RANGO = exports.RANGO_NAME_TO_CHAIN_ID = exports.CHAIN_ID_TO_RANGO_NAME = void 0;
|
|
37
|
+
exports.rangoNameForChainId = rangoNameForChainId;
|
|
38
|
+
exports.chainIdForRangoName = chainIdForRangoName;
|
|
39
|
+
const C = __importStar(require("./chain_ids.js"));
|
|
40
|
+
const MAX_RANGO_NAME_LENGTH = 64;
|
|
41
|
+
/**
|
|
42
|
+
* Bidirectional lookup between omnichain chain ids and Rango's canonical
|
|
43
|
+
* uppercase blockchain names (the `blockchains[].name` field of Rango's
|
|
44
|
+
* `/meta` response).
|
|
45
|
+
*
|
|
46
|
+
* TypeScript-only module — no `omnichain-py` counterpart. `chain_ids.ts`
|
|
47
|
+
* mirrors the Python catalogue, but the Rango-name mapping is a
|
|
48
|
+
* TS-consumer concern and does not exist on the Python side.
|
|
49
|
+
*
|
|
50
|
+
* Source of truth: `GET https://public-api.rango.exchange/basic/meta`.
|
|
51
|
+
* The snapshot backing this module lives at
|
|
52
|
+
* `test/fixtures/rango_meta_blockchains.json`; its `fetchedAt` field is
|
|
53
|
+
* the single source-of-date. Refresh via `npm run rango:refresh`.
|
|
54
|
+
*
|
|
55
|
+
* Downstream consumers that talk to Rango should import from here
|
|
56
|
+
* instead of maintaining a local copy. `test/rango_chain_names.spec.ts`
|
|
57
|
+
* fails the suite whenever `chain_ids.ts` gains a new id that is
|
|
58
|
+
* neither mapped here nor listed in `NOT_ON_RANGO`, so a new chain
|
|
59
|
+
* forces an explicit decision. That suite runs on every PR/push via
|
|
60
|
+
* `.github/workflows/test.yml` and on `npm publish` via
|
|
61
|
+
* `prepublishOnly`. When the `test` check is required on `main` via
|
|
62
|
+
* branch protection, consumers vendoring omnichain from `main` inherit
|
|
63
|
+
* that check as their guarantee; until then, the workflow signals but
|
|
64
|
+
* does not block.
|
|
65
|
+
*
|
|
66
|
+
* Aliases (alternate spellings Rango may use in other endpoints) are
|
|
67
|
+
* deliberately out of scope; if a consumer hits one, add it as a
|
|
68
|
+
* separate decision.
|
|
69
|
+
*/
|
|
70
|
+
exports.CHAIN_ID_TO_RANGO_NAME = new Map([
|
|
71
|
+
[C.CHAIN_ID_BITCOIN_MAINNET, 'BTC'],
|
|
72
|
+
[C.CHAIN_ID_LITECOIN_MAINNET, 'LTC'],
|
|
73
|
+
[C.CHAIN_ID_DOGECOIN_MAINNET, 'DOGE'],
|
|
74
|
+
[C.CHAIN_ID_DASH_MAINNET, 'DASH'],
|
|
75
|
+
[C.CHAIN_ID_ZCASH_MAINNET, 'ZCASH'],
|
|
76
|
+
[C.CHAIN_ID_BITCOIN_CASH_MAINNET, 'BCH'],
|
|
77
|
+
[C.CHAIN_ID_SOLANA_MAINNET, 'SOLANA'],
|
|
78
|
+
[C.CHAIN_ID_SUI_MAINNET, 'SUI'],
|
|
79
|
+
[C.CHAIN_ID_XRPL_MAINNET, 'XRPL'],
|
|
80
|
+
[C.CHAIN_ID_STELLAR_MAINNET, 'STELLAR'],
|
|
81
|
+
[C.CHAIN_ID_TON_MAINNET, 'TON'],
|
|
82
|
+
[C.CHAIN_ID_TRON_MAINNET, 'TRON'],
|
|
83
|
+
[C.CHAIN_ID_ETHEREUM, 'ETH'],
|
|
84
|
+
[C.CHAIN_ID_OPTIMISM, 'OPTIMISM'],
|
|
85
|
+
[C.CHAIN_ID_CRONOS, 'CRONOS'],
|
|
86
|
+
[C.CHAIN_ID_BNB_CHAIN, 'BSC'],
|
|
87
|
+
[C.CHAIN_ID_OKX_CHAIN, 'OKC'],
|
|
88
|
+
[C.CHAIN_ID_GNOSIS, 'GNOSIS'],
|
|
89
|
+
[C.CHAIN_ID_UNICHAIN, 'UNICHAIN'],
|
|
90
|
+
[C.CHAIN_ID_POLYGON, 'POLYGON'],
|
|
91
|
+
[C.CHAIN_ID_MONAD, 'MONAD'],
|
|
92
|
+
[C.CHAIN_ID_SONIC, 'SONIC'],
|
|
93
|
+
[C.CHAIN_ID_SHIMMER, 'SHIMMER'],
|
|
94
|
+
[C.CHAIN_ID_XLAYER, 'XLAYER'],
|
|
95
|
+
[C.CHAIN_ID_FANTOM, 'FANTOM'],
|
|
96
|
+
[C.CHAIN_ID_BOBA, 'BOBA'],
|
|
97
|
+
[C.CHAIN_ID_ZKSYNC, 'ZKSYNC'],
|
|
98
|
+
[C.CHAIN_ID_STABLE, 'STABLE'],
|
|
99
|
+
[C.CHAIN_ID_HYPER_EVM, 'HYPEREVM'],
|
|
100
|
+
[C.CHAIN_ID_METIS, 'METIS'],
|
|
101
|
+
[C.CHAIN_ID_POLYGON_ZKEVM, 'POLYGONZK'],
|
|
102
|
+
[C.CHAIN_ID_MOONBEAM, 'MOONBEAM'],
|
|
103
|
+
[C.CHAIN_ID_MOONRIVER, 'MOONRIVER'],
|
|
104
|
+
[C.CHAIN_ID_SONEIUM, 'SONEIUM'],
|
|
105
|
+
[C.CHAIN_ID_CITREA, 'CITREA'],
|
|
106
|
+
[C.CHAIN_ID_MEGA_ETH, 'MEGAETH'],
|
|
107
|
+
[C.CHAIN_ID_ZETACHAIN, 'ZETA_CHAIN'],
|
|
108
|
+
[C.CHAIN_ID_BASE, 'BASE'],
|
|
109
|
+
[C.CHAIN_ID_IOTA_EVM, 'IOTA'],
|
|
110
|
+
[C.CHAIN_ID_PLASMA, 'PLASMA'],
|
|
111
|
+
[C.CHAIN_ID_MODE, 'MODE'],
|
|
112
|
+
[C.CHAIN_ID_ARBITRUM, 'ARBITRUM'],
|
|
113
|
+
[C.CHAIN_ID_CELO, 'CELO'],
|
|
114
|
+
[C.CHAIN_ID_AVALANCHE_C_CHAIN, 'AVAX_CCHAIN'],
|
|
115
|
+
[C.CHAIN_ID_LINEA, 'LINEA'],
|
|
116
|
+
[C.CHAIN_ID_BERA_CHAIN, 'BERACHAIN'],
|
|
117
|
+
[C.CHAIN_ID_BLAST, 'BLAST'],
|
|
118
|
+
[C.CHAIN_ID_TAIKO, 'TAIKO'],
|
|
119
|
+
[C.CHAIN_ID_SCROLL, 'SCROLL'],
|
|
120
|
+
[C.CHAIN_ID_KATANA, 'KATANA'],
|
|
121
|
+
[C.CHAIN_ID_ZORA, 'ZORA'],
|
|
122
|
+
[C.CHAIN_ID_AURORA, 'AURORA'],
|
|
123
|
+
]);
|
|
124
|
+
/**
|
|
125
|
+
* Inverse of `CHAIN_ID_TO_RANGO_NAME`, keyed by uppercase name.
|
|
126
|
+
* Prefer `chainIdForRangoName` for case- and whitespace-tolerant lookup.
|
|
127
|
+
*/
|
|
128
|
+
exports.RANGO_NAME_TO_CHAIN_ID = new Map(Array.from(exports.CHAIN_ID_TO_RANGO_NAME, ([id, name]) => [name, id]));
|
|
129
|
+
/**
|
|
130
|
+
* Explicit decisions for chain ids omnichain declares but Rango's `/meta`
|
|
131
|
+
* does not carry, verified against the same snapshot as
|
|
132
|
+
* `CHAIN_ID_TO_RANGO_NAME`.
|
|
133
|
+
*
|
|
134
|
+
* Every id in `chain_ids.ts` must appear in either `CHAIN_ID_TO_RANGO_NAME`
|
|
135
|
+
* or here; the coverage test fails the PR check and `npm publish` (via
|
|
136
|
+
* `prepublishOnly`) otherwise. Adding an id to `chain_ids.ts` without a
|
|
137
|
+
* decision is a bug.
|
|
138
|
+
*
|
|
139
|
+
* Grouped by reason:
|
|
140
|
+
* - Testnets/devnets Rango's `/meta` intentionally omits.
|
|
141
|
+
* - Mainnet EVM chains not on Rango's `/meta` as of the snapshot; add to
|
|
142
|
+
* `CHAIN_ID_TO_RANGO_NAME` once Rango starts publishing them.
|
|
143
|
+
*/
|
|
144
|
+
exports.NOT_ON_RANGO = new Set([
|
|
145
|
+
// testnets/devnets — Rango's /meta never carries these.
|
|
146
|
+
C.CHAIN_ID_BITCOIN_TESTNET,
|
|
147
|
+
C.CHAIN_ID_BITCOIN_SIGNET,
|
|
148
|
+
C.CHAIN_ID_SOLANA_TESTNET,
|
|
149
|
+
C.CHAIN_ID_SOLANA_DEVNET,
|
|
150
|
+
C.CHAIN_ID_SUI_TESTNET,
|
|
151
|
+
C.CHAIN_ID_SUI_DEVNET,
|
|
152
|
+
C.CHAIN_ID_XRPL_TESTNET,
|
|
153
|
+
C.CHAIN_ID_STELLAR_TESTNET,
|
|
154
|
+
C.CHAIN_ID_TON_TESTNET,
|
|
155
|
+
C.CHAIN_ID_TRON_SHASTA,
|
|
156
|
+
C.CHAIN_ID_GOERLI,
|
|
157
|
+
C.CHAIN_ID_SEPOLIA,
|
|
158
|
+
C.CHAIN_ID_CELO_SEPOLIA,
|
|
159
|
+
// Mainnet, absent from /meta as of the fixture snapshot — move to the map when Rango publishes them.
|
|
160
|
+
C.CHAIN_ID_OPBNB,
|
|
161
|
+
C.CHAIN_ID_WORLD_CHAIN,
|
|
162
|
+
C.CHAIN_ID_WANCHAIN,
|
|
163
|
+
C.CHAIN_ID_SEI_EVM,
|
|
164
|
+
C.CHAIN_ID_ABSTRACT,
|
|
165
|
+
C.CHAIN_ID_TEMPO,
|
|
166
|
+
C.CHAIN_ID_MANTLE,
|
|
167
|
+
C.CHAIN_ID_INK,
|
|
168
|
+
C.CHAIN_ID_BOB,
|
|
169
|
+
C.CHAIN_ID_ZKLINK_NOVA,
|
|
170
|
+
]);
|
|
171
|
+
/**
|
|
172
|
+
* Rango's canonical uppercase blockchain name for a given omnichain chain
|
|
173
|
+
* id, or `undefined` when the chain is not on Rango, when the input is not
|
|
174
|
+
* a real number (`NaN`), or when it is `null` / `undefined`.
|
|
175
|
+
*
|
|
176
|
+
* `bigint` input is rejected at runtime and returns `undefined`. Callers
|
|
177
|
+
* bridging from `ethers` v6's `Network.chainId: bigint` should narrow with
|
|
178
|
+
* `Number(x)` and check `Number.isSafeInteger` first.
|
|
179
|
+
*/
|
|
180
|
+
function rangoNameForChainId(chainId) {
|
|
181
|
+
if (typeof chainId !== 'number' || Number.isNaN(chainId))
|
|
182
|
+
return undefined;
|
|
183
|
+
return exports.CHAIN_ID_TO_RANGO_NAME.get(chainId);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Omnichain chain id for a Rango blockchain name. Input is normalised
|
|
187
|
+
* (`trim()` + `toUpperCase()`) so `' bsc '`, `'BSC'`, `'Bsc'` all resolve
|
|
188
|
+
* to `56`. Returns `undefined` for an unknown name, for any non-string
|
|
189
|
+
* input, for raw input longer than 64 characters (rejected before any
|
|
190
|
+
* per-character work — the bound is several times the longest name in
|
|
191
|
+
* the snapshot, so it is a DoS guard, not a contract), or for input
|
|
192
|
+
* carrying non-ASCII characters (Unicode-aware `toUpperCase` folds
|
|
193
|
+
* `'ſ' → 'S'`
|
|
194
|
+
* and `'ı' → 'I'`, which would resolve homoglyph inputs to real chain
|
|
195
|
+
* ids — the accessor fails closed instead). Callers looping over
|
|
196
|
+
* untrusted Rango feed rows can skip bad entries without a `TypeError`.
|
|
197
|
+
*/
|
|
198
|
+
function chainIdForRangoName(name) {
|
|
199
|
+
if (typeof name !== 'string')
|
|
200
|
+
return undefined;
|
|
201
|
+
if (name.length > MAX_RANGO_NAME_LENGTH)
|
|
202
|
+
return undefined;
|
|
203
|
+
for (let i = 0; i < name.length; i++) {
|
|
204
|
+
if (name.charCodeAt(i) > 0x7f)
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
return exports.RANGO_NAME_TO_CHAIN_ID.get(name.trim().toUpperCase());
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=rango_chain_names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rango_chain_names.js","sourceRoot":"","sources":["../../rango_chain_names.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.BitcoinCoreTool = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
8
9
|
const script_ts_1 = require("../../script.js");
|
|
10
|
+
const decimal_js_1 = require("decimal.js");
|
|
9
11
|
const SATS_PER_BTC = 100_000_000;
|
|
10
12
|
class BitcoinCoreTool {
|
|
11
13
|
client;
|
|
@@ -15,6 +17,7 @@ class BitcoinCoreTool {
|
|
|
15
17
|
importTimestamp;
|
|
16
18
|
watchOnlyLabel;
|
|
17
19
|
watchedAddresses = new Set();
|
|
20
|
+
bitcoinCoreVerbose;
|
|
18
21
|
constructor(options) {
|
|
19
22
|
if (!options.baseUrl || options.baseUrl.trim().length === 0) {
|
|
20
23
|
throw new Error('BitcoinCoreTool: baseUrl is required');
|
|
@@ -24,6 +27,7 @@ class BitcoinCoreTool {
|
|
|
24
27
|
this.feeEstimateMode = options.feeEstimateMode ?? 'CONSERVATIVE';
|
|
25
28
|
this.importTimestamp = options.importTimestamp ?? 'now';
|
|
26
29
|
this.watchOnlyLabel = options.watchOnlyLabel ?? 'utxo-watch';
|
|
30
|
+
this.bitcoinCoreVerbose = options.bitcoinCoreVerbose ?? 1;
|
|
27
31
|
const auth = Buffer.from(`${options.user}:${options.password}`).toString('base64');
|
|
28
32
|
this.client = axios_1.default.create({
|
|
29
33
|
baseURL: options.baseUrl.replace(/\/$/, ''),
|
|
@@ -127,6 +131,131 @@ class BitcoinCoreTool {
|
|
|
127
131
|
fees: verbose.fee !== undefined ? { absoluteSats: Math.round(verbose.fee * SATS_PER_BTC) } : null,
|
|
128
132
|
};
|
|
129
133
|
}
|
|
134
|
+
async getTransactionWithInputs(txid) {
|
|
135
|
+
const main = await this.rpc('getrawtransaction', [txid, this.bitcoinCoreVerbose]);
|
|
136
|
+
const hydratedPrevouts = new Map();
|
|
137
|
+
const needsWalk = [];
|
|
138
|
+
for (const v of main.vin) {
|
|
139
|
+
if (v.coinbase !== undefined)
|
|
140
|
+
continue;
|
|
141
|
+
if (v.txid === undefined || v.vout === undefined)
|
|
142
|
+
continue;
|
|
143
|
+
if (v.prevout) {
|
|
144
|
+
hydratedPrevouts.set(`${v.txid}:${v.vout}`, {
|
|
145
|
+
valueSats: Math.round(v.prevout.value * SATS_PER_BTC),
|
|
146
|
+
scriptPubkeyHex: v.prevout.scriptPubKey.hex,
|
|
147
|
+
address: v.prevout.scriptPubKey.address ?? null,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
needsWalk.push({ txid: v.txid, vout: v.vout });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (needsWalk.length > 0) {
|
|
155
|
+
const parentTxids = Array.from(new Set(needsWalk.map((v) => v.txid)));
|
|
156
|
+
let parents;
|
|
157
|
+
try {
|
|
158
|
+
parents = await this.batchRpc(parentTxids.map((pTxid) => ({ method: 'getrawtransaction', params: [pTxid, 1] })));
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
const rawMsg = err instanceof Error ? err.message : String(err);
|
|
162
|
+
const scrubbed = rawMsg.replace(/getrawtransaction:/g, 'parent-prevout-fetch:');
|
|
163
|
+
throw new Error(`BitcoinCoreTool.getTransactionWithInputs: prevout hydration failed for one of parents [${parentTxids.join(', ')}] on ${txid}: ${scrubbed}`);
|
|
164
|
+
}
|
|
165
|
+
const parentByTxid = new Map();
|
|
166
|
+
for (let i = 0; i < parentTxids.length; i++)
|
|
167
|
+
parentByTxid.set(parentTxids[i], parents[i]);
|
|
168
|
+
for (const v of needsWalk) {
|
|
169
|
+
const parent = parentByTxid.get(v.txid);
|
|
170
|
+
if (!parent) {
|
|
171
|
+
throw new Error(`BitcoinCoreTool.getTransactionWithInputs: parent tx ${v.txid} not returned`);
|
|
172
|
+
}
|
|
173
|
+
const out = parent.vout[v.vout];
|
|
174
|
+
if (!out) {
|
|
175
|
+
throw new Error(`BitcoinCoreTool.getTransactionWithInputs: parent tx ${v.txid} has no vout[${v.vout}]`);
|
|
176
|
+
}
|
|
177
|
+
hydratedPrevouts.set(`${v.txid}:${v.vout}`, {
|
|
178
|
+
valueSats: Math.round(out.value * SATS_PER_BTC),
|
|
179
|
+
scriptPubkeyHex: out.scriptPubKey.hex,
|
|
180
|
+
address: out.scriptPubKey.address ?? null,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const inputs = main.vin.map((v) => {
|
|
185
|
+
if (v.coinbase !== undefined) {
|
|
186
|
+
return {
|
|
187
|
+
txid: '0'.repeat(64),
|
|
188
|
+
vout: 0xffffffff,
|
|
189
|
+
scriptPubkeyHex: '',
|
|
190
|
+
address: null,
|
|
191
|
+
valueSats: 0n,
|
|
192
|
+
valueBtcHr: new decimal_js_1.Decimal(0),
|
|
193
|
+
coinbase: true,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const hydrated = hydratedPrevouts.get(`${v.txid}:${v.vout}`);
|
|
197
|
+
if (!hydrated) {
|
|
198
|
+
throw new Error(`BitcoinCoreTool.getTransactionWithInputs: missing hydrated prevout for ${v.txid}:${v.vout}`);
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
txid: v.txid,
|
|
202
|
+
vout: v.vout,
|
|
203
|
+
scriptPubkeyHex: hydrated.scriptPubkeyHex,
|
|
204
|
+
address: hydrated.address,
|
|
205
|
+
valueSats: BigInt(hydrated.valueSats),
|
|
206
|
+
valueBtcHr: new decimal_js_1.Decimal(hydrated.valueSats).div(SATS_PER_BTC),
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
const outputs = main.vout.map((o) => {
|
|
210
|
+
const hex = o.scriptPubKey.hex;
|
|
211
|
+
const buf = Buffer.from(hex, 'hex');
|
|
212
|
+
return {
|
|
213
|
+
valueSats: Math.round(o.value * SATS_PER_BTC),
|
|
214
|
+
scriptPubKeyHex: hex,
|
|
215
|
+
scriptType: (0, script_ts_1.detectScriptType)(buf),
|
|
216
|
+
address: o.scriptPubKey.address ?? null,
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
const netChangesHr = {};
|
|
220
|
+
for (const i of inputs) {
|
|
221
|
+
if (i.address === null)
|
|
222
|
+
continue;
|
|
223
|
+
const prev = netChangesHr[i.address] ?? new decimal_js_1.Decimal(0);
|
|
224
|
+
netChangesHr[i.address] = prev.minus(i.valueBtcHr);
|
|
225
|
+
}
|
|
226
|
+
for (const o of outputs) {
|
|
227
|
+
if (o.address === null)
|
|
228
|
+
continue;
|
|
229
|
+
const prev = netChangesHr[o.address] ?? new decimal_js_1.Decimal(0);
|
|
230
|
+
netChangesHr[o.address] = prev.plus(new decimal_js_1.Decimal(o.valueSats).div(SATS_PER_BTC));
|
|
231
|
+
}
|
|
232
|
+
for (const addr of Object.keys(netChangesHr)) {
|
|
233
|
+
if (netChangesHr[addr].isZero())
|
|
234
|
+
delete netChangesHr[addr];
|
|
235
|
+
}
|
|
236
|
+
const rawBuf = Buffer.from(main.hex, 'hex');
|
|
237
|
+
const size = rawBuf.byteLength;
|
|
238
|
+
let vsize = size;
|
|
239
|
+
try {
|
|
240
|
+
vsize = bitcoinjs_lib_1.Transaction.fromBuffer(rawBuf).virtualSize();
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
vsize = size;
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
txid: main.txid,
|
|
247
|
+
hex: main.hex,
|
|
248
|
+
inputs,
|
|
249
|
+
outputs,
|
|
250
|
+
netChangesHr,
|
|
251
|
+
size,
|
|
252
|
+
vsize,
|
|
253
|
+
confirmations: main.confirmations ?? 0,
|
|
254
|
+
confirmationDatetime: typeof main.blocktime === 'number' ? new Date(main.blocktime * 1000) : null,
|
|
255
|
+
blockHeight: main.blockheight ?? null,
|
|
256
|
+
fees: main.fee !== undefined ? { absoluteSats: Math.round(main.fee * SATS_PER_BTC) } : null,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
130
259
|
async getFeeEstimate(targetBlocks) {
|
|
131
260
|
const result = await this.rpc('estimatesmartfee', [
|
|
132
261
|
targetBlocks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitcoin_core.tool.js","sourceRoot":"","sources":["../../../../../utxo/btc/tools/bitcoin_core.tool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bitcoin_core.tool.js","sourceRoot":"","sources":["../../../../../utxo/btc/tools/bitcoin_core.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.EsploraTool = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
8
9
|
const script_ts_1 = require("../../script.js");
|
|
10
|
+
const decimal_js_1 = require("decimal.js");
|
|
9
11
|
class EsploraTool {
|
|
10
12
|
client;
|
|
11
13
|
params;
|
|
@@ -84,6 +86,88 @@ class EsploraTool {
|
|
|
84
86
|
fees: meta.fee !== undefined ? { absoluteSats: meta.fee } : null,
|
|
85
87
|
};
|
|
86
88
|
}
|
|
89
|
+
async getTransactionWithInputs(txid) {
|
|
90
|
+
const tipHeight = await this.getChainTipHeight();
|
|
91
|
+
const { data: meta } = await this.client.get(`/tx/${txid}`);
|
|
92
|
+
const inputs = meta.vin.map((v) => {
|
|
93
|
+
if (v.is_coinbase) {
|
|
94
|
+
return {
|
|
95
|
+
txid: v.txid,
|
|
96
|
+
vout: v.vout,
|
|
97
|
+
scriptPubkeyHex: '',
|
|
98
|
+
address: null,
|
|
99
|
+
valueSats: 0n,
|
|
100
|
+
valueBtcHr: new decimal_js_1.Decimal(0),
|
|
101
|
+
coinbase: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (!v.prevout) {
|
|
105
|
+
throw new Error(`EsploraTool.getTransactionWithInputs: non-coinbase vin missing prevout in Esplora response for ${txid}`);
|
|
106
|
+
}
|
|
107
|
+
const value = v.prevout.value;
|
|
108
|
+
return {
|
|
109
|
+
txid: v.txid,
|
|
110
|
+
vout: v.vout,
|
|
111
|
+
scriptPubkeyHex: v.prevout.scriptpubkey,
|
|
112
|
+
address: v.prevout.scriptpubkey_address ?? null,
|
|
113
|
+
valueSats: BigInt(value),
|
|
114
|
+
valueBtcHr: new decimal_js_1.Decimal(value).div(1e8),
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
const outputs = meta.vout.map((o) => {
|
|
118
|
+
const script = Buffer.from(o.scriptpubkey, 'hex');
|
|
119
|
+
return {
|
|
120
|
+
valueSats: o.value,
|
|
121
|
+
scriptPubKeyHex: o.scriptpubkey,
|
|
122
|
+
scriptType: (0, script_ts_1.detectScriptType)(script),
|
|
123
|
+
address: o.scriptpubkey_address ?? null,
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
const netChangesHr = {};
|
|
127
|
+
for (const i of inputs) {
|
|
128
|
+
if (i.address === null)
|
|
129
|
+
continue;
|
|
130
|
+
const prev = netChangesHr[i.address] ?? new decimal_js_1.Decimal(0);
|
|
131
|
+
netChangesHr[i.address] = prev.minus(i.valueBtcHr);
|
|
132
|
+
}
|
|
133
|
+
for (const o of outputs) {
|
|
134
|
+
if (o.address === null)
|
|
135
|
+
continue;
|
|
136
|
+
const prev = netChangesHr[o.address] ?? new decimal_js_1.Decimal(0);
|
|
137
|
+
netChangesHr[o.address] = prev.plus(new decimal_js_1.Decimal(o.valueSats).div(1e8));
|
|
138
|
+
}
|
|
139
|
+
for (const addr of Object.keys(netChangesHr)) {
|
|
140
|
+
if (netChangesHr[addr].isZero())
|
|
141
|
+
delete netChangesHr[addr];
|
|
142
|
+
}
|
|
143
|
+
const blockHeight = meta.status.confirmed && meta.status.block_height ? meta.status.block_height : null;
|
|
144
|
+
const blockTime = meta.status.confirmed && typeof meta.status.block_time === 'number'
|
|
145
|
+
? new Date(meta.status.block_time * 1000)
|
|
146
|
+
: null;
|
|
147
|
+
const hex = await this.getRawTransactionHex(txid);
|
|
148
|
+
const rawBuf = Buffer.from(hex, 'hex');
|
|
149
|
+
const size = rawBuf.byteLength;
|
|
150
|
+
let vsize = size;
|
|
151
|
+
try {
|
|
152
|
+
vsize = bitcoinjs_lib_1.Transaction.fromBuffer(rawBuf).virtualSize();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
vsize = size;
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
txid: meta.txid,
|
|
159
|
+
hex,
|
|
160
|
+
inputs,
|
|
161
|
+
outputs,
|
|
162
|
+
netChangesHr,
|
|
163
|
+
size,
|
|
164
|
+
vsize,
|
|
165
|
+
confirmations: blockHeight ? Math.max(0, tipHeight - blockHeight + 1) : 0,
|
|
166
|
+
confirmationDatetime: blockTime,
|
|
167
|
+
blockHeight,
|
|
168
|
+
fees: meta.fee !== undefined ? { absoluteSats: meta.fee } : null,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
87
171
|
async getFeeEstimate(targetBlocks) {
|
|
88
172
|
const { data } = await this.client.get(`/fee-estimates`);
|
|
89
173
|
const keys = Object.keys(data)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esplora.tool.js","sourceRoot":"","sources":["../../../../../utxo/btc/tools/esplora.tool.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;
|
|
1
|
+
{"version":3,"file":"esplora.tool.js","sourceRoot":"","sources":["../../../../../utxo/btc/tools/esplora.tool.ts"],"names":[],"mappings":"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"}
|