@getomnichain/omnichain 0.6.1 → 0.6.3

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.
Files changed (89) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/cjs/tron/index.js +1 -0
  3. package/dist/cjs/tron/index.js.map +1 -1
  4. package/dist/cjs/tron/tron_chain.js +88 -45
  5. package/dist/cjs/tron/tron_chain.js.map +1 -1
  6. package/dist/cjs/tron/tron_memo.js +17 -0
  7. package/dist/cjs/tron/tron_memo.js.map +1 -0
  8. package/dist/cjs/tron/tron_raw_data.js +213 -0
  9. package/dist/cjs/tron/tron_raw_data.js.map +1 -0
  10. package/dist/cjs/tron/tron_transaction_builder.js +34 -13
  11. package/dist/cjs/tron/tron_transaction_builder.js.map +1 -1
  12. package/dist/cjs/tron/tron_transaction_status.js +10 -7
  13. package/dist/cjs/tron/tron_transaction_status.js.map +1 -1
  14. package/dist/cjs/tron/tron_transactions.js +1 -1
  15. package/dist/cjs/tron/tron_transactions.js.map +1 -1
  16. package/dist/cjs/utxo/bytes.js +11 -0
  17. package/dist/cjs/utxo/bytes.js.map +1 -0
  18. package/dist/cjs/utxo/index.js +3 -0
  19. package/dist/cjs/utxo/index.js.map +1 -1
  20. package/dist/cjs/utxo/keys.js +56 -0
  21. package/dist/cjs/utxo/keys.js.map +1 -0
  22. package/dist/cjs/utxo/raw_transaction.js +39 -0
  23. package/dist/cjs/utxo/raw_transaction.js.map +1 -0
  24. package/dist/cjs/utxo/script.js.map +1 -1
  25. package/dist/cjs/utxo/unsigned_utxo_transaction.js +135 -0
  26. package/dist/cjs/utxo/unsigned_utxo_transaction.js.map +1 -1
  27. package/dist/cjs/utxo/utxo_chain.js +137 -0
  28. package/dist/cjs/utxo/utxo_chain.js.map +1 -1
  29. package/dist/esm/tron/index.d.ts +1 -0
  30. package/dist/esm/tron/index.d.ts.map +1 -1
  31. package/dist/esm/tron/index.js +1 -0
  32. package/dist/esm/tron/index.js.map +1 -1
  33. package/dist/esm/tron/tron_chain.d.ts +13 -1
  34. package/dist/esm/tron/tron_chain.d.ts.map +1 -1
  35. package/dist/esm/tron/tron_chain.js +89 -46
  36. package/dist/esm/tron/tron_chain.js.map +1 -1
  37. package/dist/esm/tron/tron_memo.d.ts +2 -0
  38. package/dist/esm/tron/tron_memo.d.ts.map +1 -0
  39. package/dist/esm/tron/tron_memo.js +14 -0
  40. package/dist/esm/tron/tron_memo.js.map +1 -0
  41. package/dist/esm/tron/tron_raw_data.d.ts +4 -0
  42. package/dist/esm/tron/tron_raw_data.d.ts.map +1 -0
  43. package/dist/esm/tron/tron_raw_data.js +209 -0
  44. package/dist/esm/tron/tron_raw_data.js.map +1 -0
  45. package/dist/esm/tron/tron_transaction_builder.d.ts +4 -0
  46. package/dist/esm/tron/tron_transaction_builder.d.ts.map +1 -1
  47. package/dist/esm/tron/tron_transaction_builder.js +34 -13
  48. package/dist/esm/tron/tron_transaction_builder.js.map +1 -1
  49. package/dist/esm/tron/tron_transaction_status.d.ts +16 -2
  50. package/dist/esm/tron/tron_transaction_status.d.ts.map +1 -1
  51. package/dist/esm/tron/tron_transaction_status.js +10 -7
  52. package/dist/esm/tron/tron_transaction_status.js.map +1 -1
  53. package/dist/esm/tron/tron_transactions.js +1 -1
  54. package/dist/esm/tron/tron_transactions.js.map +1 -1
  55. package/dist/esm/utxo/bytes.d.ts +3 -0
  56. package/dist/esm/utxo/bytes.d.ts.map +1 -0
  57. package/dist/esm/utxo/bytes.js +7 -0
  58. package/dist/esm/utxo/bytes.js.map +1 -0
  59. package/dist/esm/utxo/index.d.ts +1 -0
  60. package/dist/esm/utxo/index.d.ts.map +1 -1
  61. package/dist/esm/utxo/index.js +1 -0
  62. package/dist/esm/utxo/index.js.map +1 -1
  63. package/dist/esm/utxo/keys.d.ts +8 -0
  64. package/dist/esm/utxo/keys.d.ts.map +1 -0
  65. package/dist/esm/utxo/keys.js +17 -0
  66. package/dist/esm/utxo/keys.js.map +1 -0
  67. package/dist/esm/utxo/raw_transaction.d.ts +5 -0
  68. package/dist/esm/utxo/raw_transaction.d.ts.map +1 -0
  69. package/dist/esm/utxo/raw_transaction.js +35 -0
  70. package/dist/esm/utxo/raw_transaction.js.map +1 -0
  71. package/dist/esm/utxo/script.d.ts +1 -0
  72. package/dist/esm/utxo/script.d.ts.map +1 -1
  73. package/dist/esm/utxo/script.js.map +1 -1
  74. package/dist/esm/utxo/unsigned_utxo_transaction.d.ts +7 -1
  75. package/dist/esm/utxo/unsigned_utxo_transaction.d.ts.map +1 -1
  76. package/dist/esm/utxo/unsigned_utxo_transaction.js +136 -1
  77. package/dist/esm/utxo/unsigned_utxo_transaction.js.map +1 -1
  78. package/dist/esm/utxo/utxo.d.ts +26 -0
  79. package/dist/esm/utxo/utxo.d.ts.map +1 -1
  80. package/dist/esm/utxo/utxo_chain.d.ts +8 -1
  81. package/dist/esm/utxo/utxo_chain.d.ts.map +1 -1
  82. package/dist/esm/utxo/utxo_chain.js +138 -1
  83. package/dist/esm/utxo/utxo_chain.js.map +1 -1
  84. package/dist/esm/utxo/utxo_network_params.d.ts +2 -1
  85. package/dist/esm/utxo/utxo_network_params.d.ts.map +1 -1
  86. package/docs/CONNECTIONS.md +6 -0
  87. package/docs/tron.md +21 -11
  88. package/docs/utxo.md +80 -5
  89. package/package.json +1 -1
package/docs/tron.md CHANGED
@@ -36,7 +36,8 @@ const { transaction } = await TronMainnet.createTransferTransaction({
36
36
  - Native TRX builds a `TransferContract`. With `isFullBalance: true` the amount is reduced by 0.3 TRX (`DEFAULT_TRX_FEE_LIMIT_SUN`).
37
37
  - TRC-20 builds a `TriggerSmartContract` calling `transfer(address,uint256)` with a 15 TRX `fee_limit` (`DEFAULT_TRC20_TRANSFER_FEE_LIMIT_SUN`), or the `feeLimitSun` of an explicit `TronGasPricing`. `FeePriority` has no effect on Tron.
38
38
  - `memo` is stored hex-encoded in `raw_data.data`.
39
- - `raw_data` is built exactly like tronpy: current timestamp, 60 s expiration, TAPoS reference from the latest solid block (`wallet/getnodeinfo`). The txID and the account permission come from `wallet/getsignweight`.
39
+ - `raw_data` is built like tronpy: current timestamp, 60 s expiration, TAPoS reference from the latest solid block (`wallet/getnodeinfo`). The txID is computed locally: `sha256` of the protobuf-encoded `raw_data` (`transaction.rawDataHex`). `wallet/getsignweight` is called only when `permissionId(...)` is set, and its txID must equal the local one. Building therefore costs one node call.
40
+ - `TronTrx.buildTransaction(type, value)` builds `TransferContract`, `TriggerSmartContract` (any calldata and `call_value`), `FreezeBalanceV2Contract` and `DelegateResourceContract`, with `.memo()`, `.feeLimit()`, `.expiration()` and `.withOwner()`. These four are the contract types the local encoder supports; TRC-10 fields (`call_token_value`, `token_id`) must be 0.
40
41
  - `transaction.canonicalTransaction` parses the wire JSON into the 12-contract discriminated union from `helpers/transaction.py` (`parseTronCanonicalTransaction`).
41
42
 
42
43
  ## Signing and broadcasting
@@ -48,12 +49,14 @@ const response = await TronMainnet.broadcastSignedTransaction(signed);
48
49
  ```
49
50
 
50
51
  - Signatures are tronpy's: RFC 6979 recoverable `r || s || recid` over the txID, appended to the transaction's signature list (like tronpy, signing mutates the transaction). Messages use the TIP-191 `"\x19TRON Signed Message:\n"` keccak hash.
52
+ - Signing recomputes the txID from `raw_data` and signs only that. A carried `txID` or `raw_data_hex` that does not match `raw_data`, or an unsupported contract type, is refused with `InvalidArgument` before the key is used.
53
+ - Broadcasting re-checks the txID the same way before anything is sent, then requires the node's reply to name that txID (`RpcError` otherwise). A signed transaction can be stored with `signed.toJsonStr()` and re-broadcast later with `chain.broadcast(stored)` or `broadcastSignedTransaction(TronSignedTransaction.fromJson(stored))`: it is sent exactly as stored, with the same txID. A stored copy that was altered is refused with `InvalidArgument` and never reaches the node.
51
54
  - `broadcastSignedTransaction` never throws: node rejections such as `DUP_TRANSACTION_ERROR`, `SERVER_BUSY` or `BLOCK_UNSOLIDIFIED` come back as `broadcastError` with the txID kept. A reply without `txid` is Python's `KeyError('txid')`. The TS `Chain.broadcast` adapter accepts the signed JSON and throws. It throws `BroadcastRejected` only for the codes java-tron returns before accepting the transaction (`SIGERROR`, `CONTRACT_VALIDATE_ERROR`, `CONTRACT_EXE_ERROR`, `BANDWITH_ERROR`) and `TransactionTooLarge` for `TOO_BIG_TRANSACTION_ERROR`. Everything else, including `DUP_TRANSACTION_ERROR`, `SERVER_BUSY`, `OTHER_ERROR`, unknown codes and a reply without `txid`, is `RpcError`: the transaction may be on-chain, so check its status and re-broadcast the same signed bytes rather than re-signing, as Python's warning says. `TRANSACTION_EXPIRATION_ERROR` and `TAPOS_ERROR` are `RpcError` too: java-tron checks expiry before its duplicate check, so re-broadcasting a transaction that already landed returns them after the 60 s expiry.
52
55
  - `TronChain` constructs for any chain id (Nile, private networks) and never touches the network-type registry, as Python's constructor registers nothing.
53
- - `broadcastSignedTransaction` takes the node's `txid` like Python (`result.get("txid") or signed.tx_hash`). The `broadcast` adapter returns the signed txID (lowercase) and throws `RpcError` if the node answers a different one, compared case-insensitively.
56
+ - `broadcastSignedTransaction` and the `broadcast` adapter return the signed txID (lowercase). A node reply naming a different txID, compared case-insensitively, is an `RpcError`.
54
57
  - Loading a TRC-20 contract checks the `getcontract` reply like tronpy's `AsyncContract`: a `bytecode` that is not hex and an `abi` that is not an object raise tronpy's texts before any other call.
55
58
  - A TronGrid reply that is valid JSON but not an object fails like Python's `payload.get` (`'str' object has no attribute 'get'`) as `RpcError`, without echoing the reply.
56
- - External signers sign `transaction.txId` and attach the signature with `transaction.transaction.setSignature([...])`.
59
+ - External signers sign `transaction.txId` and attach the signature with `transaction.transaction.setSignature([...])`. `txId` is computed from `raw_data` and checked against any txID or `raw_data_hex` the payload carries, so a payload loaded from JSON cannot hand a signer someone else's txID: a mismatch throws `InvalidArgument`.
57
60
  - `TronWallet.handleTransactionPrerequisite` handles `TronApproveTransactionPrerequisite`. It reads the current allowance, skips if it is enough, and otherwise approves (25 TRX fee limit). For USDT-style tokens it first resets the allowance to 0 and waits three blocks; these are tokens in `ZERO_RESET_APPROVAL_TRC20_ADDRESSES` or prerequisites with `requiresZeroResetFirst`.
58
61
 
59
62
  ## Reading state
@@ -66,6 +69,17 @@ const response = await TronMainnet.broadcastSignedTransaction(signed);
66
69
  - plus the fee debited from the first contract's owner.
67
70
 
68
71
  Unknown TRC-20 tokens are resolved through `symbol()`/`decimals()`. `fees` is a `TronTransactionFees`, whose constructor enforces Python's rule `energyUsageTotal = energyUsage + originEnergyUsage + energyFee / getEnergyFee`.
72
+ - Balance changes count only money that moved:
73
+ - an internal transaction counts as TRX only if it is not `rejected`, its `note` is `call` or `suicide` (staking and resource-delegation entries are skipped), and only its `callValueInfo` entries without a `tokenId` (TRC-10) are added up;
74
+ - the TRX a `TriggerSmartContract` sends as `call_value` is debited from the owner and credited to the contract;
75
+ - a `Transfer` log counts as TRC-20 only with exactly three topics and one 32-byte data word, so TRC-721 transfers are skipped.
76
+ These are the rules Clydner applies.
77
+ - Successful and failed statuses also carry, from the same two node calls:
78
+ - `blockNumber`: the block that included the transaction;
79
+ - `signers`: the owner account of the transaction's contract (the authorizing account, not the keys that signed under a multi-signature permission); `[]` when the raw transaction cannot be fetched;
80
+ - `memoHex`: `raw_data.data` in lowercase hex, and `memo`: that hex decoded by `decodeTronMemo` (strict UTF-8, a leading byte-order mark dropped, `null` for no memo, invalid UTF-8 or bad hex). Clydner decodes memos the same way.
81
+ Pending and not-found statuses carry `null`, `[]`, `null`, `null`.
82
+ - Confirmations are not on the status (`wait` and `confirmations` options stay refused). Compute them as `getChainTipHeight() − blockNumber + 1`. A poll loop should read the tip once per tick and reuse it for every transaction it checks in that tick, so confirmations cost one call per tick, not one per transaction.
69
83
  - `simulateTransaction` dry-runs `TriggerSmartContract` through `wallet/triggerconstantcontract` and reports `energyUsed`; other contract types throw `FeatureNotSupported` (Python's `NotImplementedError`). `supportsFullTransactionSimulation` is `false`.
70
84
 
71
85
  ## Differences from omnichain-py
@@ -79,8 +93,11 @@ const response = await TronMainnet.broadcastSignedTransaction(signed);
79
93
  | `private_key_hex` / `_private_key` are plain attributes | `#private` fields; `wallet.privateKeyHex` still returns the key | `JSON.stringify` and the default `util.inspect` never print the key or the TronGrid API key, and a non-JSON TronGrid reply never reaches an error text |
80
94
  | `is_base58check_address` raises `ValueError` on a bad checksum | Returns `false`; callers raise their own error | TS predicates do not throw |
81
95
  | `logger.warning` for non-NORMAL `FeePriority` | No logging | The TS SDK has no logger |
96
+ | The txID comes from `wallet/getsignweight` and is signed as given | The txID is computed locally from the protobuf-encoded `raw_data`; a mismatching carried txID or `raw_data_hex` is refused before signing or broadcasting | A node or payload must not be able to get a signature over a different transaction. Python's fix is on RIN-328 |
97
+ | Status counts rejected internal transactions, staking/delegation entries and TRC-10 `callValue` as TRX, and does not debit `call_value` | Only real TRX and TRC-20 moves are counted (see Reading state) | Deposits must not look larger than what arrived. Python's fix is on RIN-328 |
98
+ | Status has no block number, signers or memo | `blockNumber`, `signers`, `memo`, `memoHex` | Read from data the status already fetches; no extra node calls |
82
99
 
83
- `TronClient` behaves like tronpy's httpx provider: it never follows redirects, it raises httpx's `raise_for_status` text on non-2xx responses, and its timeout restarts on every received chunk. Contract calls go through `tronAbiEncodeSingle` / `tronAbiDecodeSingle`, a port of tronpy's `trx_abi` (strict eth_abi decoding, Tron addresses inside arrays and tuples). `TronTransaction.sign` refuses the payloads tronpy's `AsyncTransaction.sign` refuses, with the same texts.
100
+ `TronClient` behaves like tronpy's httpx provider: it never follows redirects, it raises httpx's `raise_for_status` text on non-2xx responses, and its timeout restarts on every received chunk. Contract calls go through `tronAbiEncodeSingle` / `tronAbiDecodeSingle`, a port of tronpy's `trx_abi` (strict eth_abi decoding, Tron addresses inside arrays and tuples). `TronTransaction.sign` keeps tronpy's texts for the refusals it shares with `AsyncTransaction.sign` (expired, permission list, signature list), and adds the local txID checks above.
84
101
 
85
102
  Hex input (keys, signatures, txIDs, node messages) is parsed exactly like Python's `bytes.fromhex`: ASCII whitespace is skipped, `0x` is not hex, and errors report only a position. The TS `verifyMessageSignature` adapter additionally accepts TronWeb's `0x`-prefixed signatures.
86
103
 
@@ -94,10 +111,3 @@ Hex input (keys, signatures, txIDs, node messages) is parsed exactly like Python
94
111
  ## Known limitation
95
112
 
96
113
  - TronGrid JSON integers above 2^53 lose precision in `JSON.parse` before they reach `BigInt`. Python's ints do not. Balances and amounts below 9,007,199,254 TRX (or 2^53 base units of a token) are exact.
97
-
98
- ## Known issues shared with omnichain-py
99
-
100
- These are bugs in omnichain-py itself. They are kept for parity and tracked to be fixed in both SDKs:
101
-
102
- - RIN-317 — status counts rejected internal transactions and TRC-10 `callValue` as TRX, and does not debit TRX sent as `call_value`.
103
- - RIN-318 — the wallet signs the txID returned by the node (or found in a JSON payload) without recomputing it from `raw_data`.
package/docs/utxo.md CHANGED
@@ -14,8 +14,9 @@ rune / rare-sat filtering).
14
14
 
15
15
  - [utxo_chain.ts](../utxo/utxo_chain.ts) — `UtxoChain extends Chain`
16
16
  - [utxo_network_params.ts](../utxo/utxo_network_params.ts) — `UtxoNetworkParams`, SLIP-44 coin ids, derivation purposes, dust default, RBF sequence
17
- - [unsigned_utxo_transaction.ts](../utxo/unsigned_utxo_transaction.ts) — `UnsignedUtxoTransaction { psbtBase64, selectedInputs, feeSats, inputsToSign, … }`
18
- - [utxo.ts](../utxo/utxo.ts) — `UnspentTransactionOutput`, `RawTransactionView`, `FeeEstimate`, `AddressBalance`
17
+ - [unsigned_utxo_transaction.ts](../utxo/unsigned_utxo_transaction.ts) — `UnsignedUtxoTransaction { psbtBase64, selectedInputs, feeSats, inputsToSign, … }`, `signWith`, `finalize`
18
+ - [utxo.ts](../utxo/utxo.ts) — `UnspentTransactionOutput`, `RawTransactionView`, `FeeEstimate`, `AddressBalance`, `UtxoPsbtInput`, `UtxoPsbtOutput`, `UtxoSigner`, `FinalizedUtxoTransaction`
19
+ - [raw_transaction.ts](../utxo/raw_transaction.ts) — `utxoFromRawTransaction` (reads one output of a raw transaction, no network call)
19
20
  - [script.ts](../utxo/script.ts) — `detectScriptType`, `buildOpReturnScript`, `scriptTypeForAddress`
20
21
  - [fee.ts](../utxo/fee.ts) — per-script-type vByte tables, fee math
21
22
  - [coin_selection.ts](../utxo/coin_selection.ts) — branch-and-bound + accumulator fallback over effective-value
@@ -184,11 +185,74 @@ this is intentional. Legacy inputs need `nonWitnessUtxo` for correctness;
184
185
  SegWit/Taproot inputs technically don't, but hardware wallets like Trezor
185
186
  and Phantom demand it. Populating both is the safe default.
186
187
 
188
+ ## Building from explicit inputs
189
+
190
+ `assembleTransaction` builds a transaction from inputs you have already
191
+ chosen, owned by any number of keys, with no coin selection and no
192
+ automatic change. Each input carries its parent transaction:
193
+
194
+ ```ts
195
+ const unsigned = btc.assembleTransaction({
196
+ inputs: [
197
+ { utxo: vaultUtxo, parentTxHex: vaultParentHex },
198
+ { utxo: operatorUtxo, parentTxHex: operatorParentHex },
199
+ ],
200
+ outputs: [
201
+ { kind: 'address', address: recipient, valueSats: 50_000 },
202
+ { kind: 'address', address: operatorAddress, valueSats: operatorChange },
203
+ { kind: 'opReturn', data: memoBytes },
204
+ ],
205
+ rbfEnabled: true, // optional, defaults to the chain's setting
206
+ });
207
+ ```
208
+
209
+ - Inputs and outputs keep the order given. If you want change, add it
210
+ as an `address` output.
211
+ - `feeSats` is inputs minus outputs; `feeRateSatsPerVByte` is
212
+ `feeSats / estimatedVBytes`; `changeAddress` is `null`.
213
+ - Every input is checked against its parent transaction: the txid,
214
+ the output's value and script, and that `ownerAddress` owns that
215
+ script. A mismatch throws, so the reported fee is the fee the chain
216
+ will charge.
217
+ - Address outputs must be at or above the chain's dust value; at most
218
+ one OP_RETURN output of up to 80 bytes; outputs may not exceed inputs.
219
+
220
+ `utxoFromRawTransaction(parentTxHex, vout, ownerAddress)` turns an output
221
+ of a raw transaction you already hold into an `UnspentTransactionOutput`,
222
+ without a network call.
223
+
187
224
  ## Signing
188
225
 
189
- The chain module never holds keys. You hand the PSBT to whatever signs
190
- it — a user's wallet, a hardware device, an external service. For
191
- testing or for protocol-controlled wallets that talk to Bitcoin Core:
226
+ The chain module never holds keys. `signWith` takes a signer object — a
227
+ 33-byte compressed public key and a function that signs a 32-byte hash
228
+ with a 64-byte compact ECDSA signature (what `ecpair` and
229
+ `tiny-secp256k1` produce):
230
+
231
+ ```ts
232
+ const { hex, txid, vsize } = unsigned
233
+ .signWith(vaultSigner)
234
+ .signWith(operatorSigner)
235
+ .finalize();
236
+ await btc.broadcast(hex);
237
+ ```
238
+
239
+ - `signWith` signs the P2WPKH and P2PKH inputs whose script belongs to
240
+ the signer's key and returns a new `UnsignedUtxoTransaction`; the
241
+ original is unchanged. Signing again with the same key is a no-op. It
242
+ throws if the key owns none of the inputs. Taproot, P2WSH and P2SH
243
+ inputs are never signed by it.
244
+ - Before signing, and again in `finalize`, every input is checked against
245
+ its parent transaction: the parent must be present and be the one the
246
+ input spends, a declared amount and script must match the parent output,
247
+ and the real fee must equal `feeSats`. Otherwise nothing is signed.
248
+ - `finalize` throws if any input is unsigned (naming the index),
249
+ verifies every signature (rejecting high-S ones), refuses a fee rate
250
+ of 5000 sat/vB or more, and returns the raw hex, txid and vsize.
251
+ - Both work on transactions from `createTransferUnsignedTransaction` too.
252
+
253
+ Alternatively, hand the PSBT to whatever signs it — a user's wallet, a
254
+ hardware device, an external service. For testing or for
255
+ protocol-controlled wallets that talk to Bitcoin Core:
192
256
 
193
257
  ```ts
194
258
  // Sign via Bitcoin Core's wallet (it has the keys for sender's address):
@@ -220,6 +284,17 @@ All five address types are supported per chain: P2PKH (`1…`), P2SH
220
284
  (`3…`), P2WPKH (`bc1q…` 42-char bech32), P2WSH (`bc1q…` 62-char bech32),
221
285
  P2TR (`bc1p…` bech32m).
222
286
 
287
+ To derive the address of a public key on the chain's network:
288
+
289
+ ```ts
290
+ btc.addressForPublicKey(publicKey); // P2WPKH (default)
291
+ btc.addressForPublicKey(publicKey, UtxoScriptTypes.P2PKH); // P2PKH
292
+ ```
293
+
294
+ Dogecoin has no segwit, so P2WPKH there throws `FeatureNotSupported`.
295
+ `UtxoNetworkInfo` is the type of `chain.params.networkInfo`, for code that
296
+ needs to name the network type without importing `bitcoinjs-lib`.
297
+
223
298
  ## Asset filtering (Bitcoin only)
224
299
 
225
300
  To avoid accidentally spending UTXOs that carry inscriptions, runes, or
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getomnichain/omnichain",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "Multi-chain SDK for EVM, Solana, UTXO (BTC/LTC/DOGE/DASH/ZEC/BCH), Stellar, Tron, and TON. TypeScript parity port of omnichain-py.",
5
5
  "keywords": [
6
6
  "omnichain",