@getomnichain/omnichain 0.2.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/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/abstract_gas_pricing.d.ts +31 -0
- package/dist/abstract_gas_pricing.d.ts.map +1 -0
- package/dist/abstract_gas_pricing.js +22 -0
- package/dist/abstract_gas_pricing.js.map +1 -0
- package/dist/address.d.ts +10 -0
- package/dist/address.d.ts.map +1 -0
- package/dist/address.factory.d.ts +26 -0
- package/dist/address.factory.d.ts.map +1 -0
- package/dist/address.factory.js +75 -0
- package/dist/address.factory.js.map +1 -0
- package/dist/address.js +13 -0
- package/dist/address.js.map +1 -0
- package/dist/address_field.decorator.d.ts +17 -0
- package/dist/address_field.decorator.d.ts.map +1 -0
- package/dist/address_field.decorator.js +34 -0
- package/dist/address_field.decorator.js.map +1 -0
- package/dist/chain.base.d.ts +79 -0
- package/dist/chain.base.d.ts.map +1 -0
- package/dist/chain.base.js +113 -0
- package/dist/chain.base.js.map +1 -0
- package/dist/chain_ids.d.ts +122 -0
- package/dist/chain_ids.d.ts.map +1 -0
- package/dist/chain_ids.js +193 -0
- package/dist/chain_ids.js.map +1 -0
- package/dist/errors.d.ts +42 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +62 -0
- package/dist/errors.js.map +1 -0
- package/dist/evm/evm_address.d.ts +11 -0
- package/dist/evm/evm_address.d.ts.map +1 -0
- package/dist/evm/evm_address.js +56 -0
- package/dist/evm/evm_address.js.map +1 -0
- package/dist/evm/evm_chain.d.ts +123 -0
- package/dist/evm/evm_chain.d.ts.map +1 -0
- package/dist/evm/evm_chain.js +685 -0
- package/dist/evm/evm_chain.js.map +1 -0
- package/dist/evm/evm_chains.d.ts +83 -0
- package/dist/evm/evm_chains.d.ts.map +1 -0
- package/dist/evm/evm_chains.js +493 -0
- package/dist/evm/evm_chains.js.map +1 -0
- package/dist/evm/evm_gas_estimate.d.ts +45 -0
- package/dist/evm/evm_gas_estimate.d.ts.map +1 -0
- package/dist/evm/evm_gas_estimate.js +70 -0
- package/dist/evm/evm_gas_estimate.js.map +1 -0
- package/dist/evm/evm_gas_pricing.d.ts +40 -0
- package/dist/evm/evm_gas_pricing.d.ts.map +1 -0
- package/dist/evm/evm_gas_pricing.js +56 -0
- package/dist/evm/evm_gas_pricing.js.map +1 -0
- package/dist/evm/evm_token.d.ts +7 -0
- package/dist/evm/evm_token.d.ts.map +1 -0
- package/dist/evm/evm_token.js +22 -0
- package/dist/evm/evm_token.js.map +1 -0
- package/dist/evm/evm_tokens.d.ts +81 -0
- package/dist/evm/evm_tokens.d.ts.map +1 -0
- package/dist/evm/evm_tokens.js +104 -0
- package/dist/evm/evm_tokens.js.map +1 -0
- package/dist/evm/evm_transaction_status.d.ts +108 -0
- package/dist/evm/evm_transaction_status.d.ts.map +1 -0
- package/dist/evm/evm_transaction_status.js +177 -0
- package/dist/evm/evm_transaction_status.js.map +1 -0
- package/dist/evm/index.d.ts +10 -0
- package/dist/evm/index.d.ts.map +1 -0
- package/dist/evm/index.js +10 -0
- package/dist/evm/index.js.map +1 -0
- package/dist/evm/unsigned_evm_transaction.d.ts +19 -0
- package/dist/evm/unsigned_evm_transaction.d.ts.map +1 -0
- package/dist/evm/unsigned_evm_transaction.js +18 -0
- package/dist/evm/unsigned_evm_transaction.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/is_address.decorator.d.ts +3 -0
- package/dist/is_address.decorator.d.ts.map +1 -0
- package/dist/is_address.decorator.js +51 -0
- package/dist/is_address.decorator.js.map +1 -0
- package/dist/network_type.d.ts +73 -0
- package/dist/network_type.d.ts.map +1 -0
- package/dist/network_type.js +144 -0
- package/dist/network_type.js.map +1 -0
- package/dist/priority.d.ts +23 -0
- package/dist/priority.d.ts.map +1 -0
- package/dist/priority.js +23 -0
- package/dist/priority.js.map +1 -0
- package/dist/solana/index.d.ts +9 -0
- package/dist/solana/index.d.ts.map +1 -0
- package/dist/solana/index.js +9 -0
- package/dist/solana/index.js.map +1 -0
- package/dist/solana/solana_address.d.ts +20 -0
- package/dist/solana/solana_address.d.ts.map +1 -0
- package/dist/solana/solana_address.js +45 -0
- package/dist/solana/solana_address.js.map +1 -0
- package/dist/solana/solana_chain.d.ts +213 -0
- package/dist/solana/solana_chain.d.ts.map +1 -0
- package/dist/solana/solana_chain.js +704 -0
- package/dist/solana/solana_chain.js.map +1 -0
- package/dist/solana/solana_chains.d.ts +24 -0
- package/dist/solana/solana_chains.d.ts.map +1 -0
- package/dist/solana/solana_chains.js +84 -0
- package/dist/solana/solana_chains.js.map +1 -0
- package/dist/solana/solana_gas_pricing.d.ts +30 -0
- package/dist/solana/solana_gas_pricing.d.ts.map +1 -0
- package/dist/solana/solana_gas_pricing.js +26 -0
- package/dist/solana/solana_gas_pricing.js.map +1 -0
- package/dist/solana/solana_token.d.ts +19 -0
- package/dist/solana/solana_token.d.ts.map +1 -0
- package/dist/solana/solana_token.js +34 -0
- package/dist/solana/solana_token.js.map +1 -0
- package/dist/solana/solana_tokens.d.ts +22 -0
- package/dist/solana/solana_tokens.d.ts.map +1 -0
- package/dist/solana/solana_tokens.js +26 -0
- package/dist/solana/solana_tokens.js.map +1 -0
- package/dist/solana/solana_transaction_status.d.ts +59 -0
- package/dist/solana/solana_transaction_status.d.ts.map +1 -0
- package/dist/solana/solana_transaction_status.js +144 -0
- package/dist/solana/solana_transaction_status.js.map +1 -0
- package/dist/solana/unsigned_solana_transaction.d.ts +31 -0
- package/dist/solana/unsigned_solana_transaction.d.ts.map +1 -0
- package/dist/solana/unsigned_solana_transaction.js +26 -0
- package/dist/solana/unsigned_solana_transaction.js.map +1 -0
- package/dist/token.d.ts +35 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +62 -0
- package/dist/token.js.map +1 -0
- package/dist/ton/index.d.ts +2 -0
- package/dist/ton/index.d.ts.map +1 -0
- package/dist/ton/index.js +2 -0
- package/dist/ton/index.js.map +1 -0
- package/dist/ton/ton_address.d.ts +10 -0
- package/dist/ton/ton_address.d.ts.map +1 -0
- package/dist/ton/ton_address.js +53 -0
- package/dist/ton/ton_address.js.map +1 -0
- package/dist/transaction_status.d.ts +140 -0
- package/dist/transaction_status.d.ts.map +1 -0
- package/dist/transaction_status.js +271 -0
- package/dist/transaction_status.js.map +1 -0
- package/dist/unsigned_transaction.d.ts +7 -0
- package/dist/unsigned_transaction.d.ts.map +1 -0
- package/dist/unsigned_transaction.js +9 -0
- package/dist/unsigned_transaction.js.map +1 -0
- package/dist/utxo/btc/btc_address.d.ts +15 -0
- package/dist/utxo/btc/btc_address.d.ts.map +1 -0
- package/dist/utxo/btc/btc_address.js +39 -0
- package/dist/utxo/btc/btc_address.js.map +1 -0
- package/dist/utxo/btc/btc_chain.d.ts +34 -0
- package/dist/utxo/btc/btc_chain.d.ts.map +1 -0
- package/dist/utxo/btc/btc_chain.js +62 -0
- package/dist/utxo/btc/btc_chain.js.map +1 -0
- package/dist/utxo/btc/btc_chains.d.ts +25 -0
- package/dist/utxo/btc/btc_chains.d.ts.map +1 -0
- package/dist/utxo/btc/btc_chains.js +43 -0
- package/dist/utxo/btc/btc_chains.js.map +1 -0
- package/dist/utxo/btc/btc_token.d.ts +6 -0
- package/dist/utxo/btc/btc_token.d.ts.map +1 -0
- package/dist/utxo/btc/btc_token.js +11 -0
- package/dist/utxo/btc/btc_token.js.map +1 -0
- package/dist/utxo/btc/index.d.ts +14 -0
- package/dist/utxo/btc/index.d.ts.map +1 -0
- package/dist/utxo/btc/index.js +14 -0
- package/dist/utxo/btc/index.js.map +1 -0
- package/dist/utxo/btc/network_params.d.ts +50 -0
- package/dist/utxo/btc/network_params.d.ts.map +1 -0
- package/dist/utxo/btc/network_params.js +188 -0
- package/dist/utxo/btc/network_params.js.map +1 -0
- package/dist/utxo/btc/tools/asset_outpoint.d.ts +7 -0
- package/dist/utxo/btc/tools/asset_outpoint.d.ts.map +1 -0
- package/dist/utxo/btc/tools/asset_outpoint.js +12 -0
- package/dist/utxo/btc/tools/asset_outpoint.js.map +1 -0
- package/dist/utxo/btc/tools/bitcoin_core.tool.d.ts +41 -0
- package/dist/utxo/btc/tools/bitcoin_core.tool.d.ts.map +1 -0
- package/dist/utxo/btc/tools/bitcoin_core.tool.js +172 -0
- package/dist/utxo/btc/tools/bitcoin_core.tool.js.map +1 -0
- package/dist/utxo/btc/tools/esplora.tool.d.ts +27 -0
- package/dist/utxo/btc/tools/esplora.tool.d.ts.map +1 -0
- package/dist/utxo/btc/tools/esplora.tool.js +113 -0
- package/dist/utxo/btc/tools/esplora.tool.js.map +1 -0
- package/dist/utxo/btc/tools/inscription_index.d.ts +6 -0
- package/dist/utxo/btc/tools/inscription_index.d.ts.map +1 -0
- package/dist/utxo/btc/tools/inscription_index.js +2 -0
- package/dist/utxo/btc/tools/inscription_index.js.map +1 -0
- package/dist/utxo/btc/tools/ordiscan.tool.d.ts +19 -0
- package/dist/utxo/btc/tools/ordiscan.tool.d.ts.map +1 -0
- package/dist/utxo/btc/tools/ordiscan.tool.js +53 -0
- package/dist/utxo/btc/tools/ordiscan.tool.js.map +1 -0
- package/dist/utxo/btc/tools/rare_sat_index.d.ts +6 -0
- package/dist/utxo/btc/tools/rare_sat_index.d.ts.map +1 -0
- package/dist/utxo/btc/tools/rare_sat_index.js +2 -0
- package/dist/utxo/btc/tools/rare_sat_index.js.map +1 -0
- package/dist/utxo/btc/tools/rune_index.d.ts +6 -0
- package/dist/utxo/btc/tools/rune_index.d.ts.map +1 -0
- package/dist/utxo/btc/tools/rune_index.js +2 -0
- package/dist/utxo/btc/tools/rune_index.js.map +1 -0
- package/dist/utxo/btc/tools/unisat.tool.d.ts +18 -0
- package/dist/utxo/btc/tools/unisat.tool.d.ts.map +1 -0
- package/dist/utxo/btc/tools/unisat.tool.js +49 -0
- package/dist/utxo/btc/tools/unisat.tool.js.map +1 -0
- package/dist/utxo/coin_selection.d.ts +29 -0
- package/dist/utxo/coin_selection.d.ts.map +1 -0
- package/dist/utxo/coin_selection.js +156 -0
- package/dist/utxo/coin_selection.js.map +1 -0
- package/dist/utxo/doge/doge_chains.d.ts +17 -0
- package/dist/utxo/doge/doge_chains.d.ts.map +1 -0
- package/dist/utxo/doge/doge_chains.js +28 -0
- package/dist/utxo/doge/doge_chains.js.map +1 -0
- package/dist/utxo/doge/index.d.ts +3 -0
- package/dist/utxo/doge/index.d.ts.map +1 -0
- package/dist/utxo/doge/index.js +3 -0
- package/dist/utxo/doge/index.js.map +1 -0
- package/dist/utxo/doge/network_params.d.ts +4 -0
- package/dist/utxo/doge/network_params.d.ts.map +1 -0
- package/dist/utxo/doge/network_params.js +24 -0
- package/dist/utxo/doge/network_params.js.map +1 -0
- package/dist/utxo/ecc.d.ts +2 -0
- package/dist/utxo/ecc.d.ts.map +1 -0
- package/dist/utxo/ecc.js +11 -0
- package/dist/utxo/ecc.js.map +1 -0
- package/dist/utxo/fee.d.ts +12 -0
- package/dist/utxo/fee.d.ts.map +1 -0
- package/dist/utxo/fee.js +51 -0
- package/dist/utxo/fee.js.map +1 -0
- package/dist/utxo/index.d.ts +20 -0
- package/dist/utxo/index.d.ts.map +1 -0
- package/dist/utxo/index.js +20 -0
- package/dist/utxo/index.js.map +1 -0
- package/dist/utxo/ltc/index.d.ts +3 -0
- package/dist/utxo/ltc/index.d.ts.map +1 -0
- package/dist/utxo/ltc/index.js +3 -0
- package/dist/utxo/ltc/index.js.map +1 -0
- package/dist/utxo/ltc/ltc_chains.d.ts +17 -0
- package/dist/utxo/ltc/ltc_chains.d.ts.map +1 -0
- package/dist/utxo/ltc/ltc_chains.js +28 -0
- package/dist/utxo/ltc/ltc_chains.js.map +1 -0
- package/dist/utxo/ltc/network_params.d.ts +4 -0
- package/dist/utxo/ltc/network_params.d.ts.map +1 -0
- package/dist/utxo/ltc/network_params.js +27 -0
- package/dist/utxo/ltc/network_params.js.map +1 -0
- package/dist/utxo/script.d.ts +16 -0
- package/dist/utxo/script.d.ts.map +1 -0
- package/dist/utxo/script.js +52 -0
- package/dist/utxo/script.js.map +1 -0
- package/dist/utxo/tools/broadcaster.d.ts +6 -0
- package/dist/utxo/tools/broadcaster.d.ts.map +1 -0
- package/dist/utxo/tools/broadcaster.js +2 -0
- package/dist/utxo/tools/broadcaster.js.map +1 -0
- package/dist/utxo/tools/chain_tip_provider.d.ts +5 -0
- package/dist/utxo/tools/chain_tip_provider.d.ts.map +1 -0
- package/dist/utxo/tools/chain_tip_provider.js +2 -0
- package/dist/utxo/tools/chain_tip_provider.js.map +1 -0
- package/dist/utxo/tools/fee_estimator.d.ts +6 -0
- package/dist/utxo/tools/fee_estimator.d.ts.map +1 -0
- package/dist/utxo/tools/fee_estimator.js +2 -0
- package/dist/utxo/tools/fee_estimator.js.map +1 -0
- package/dist/utxo/tools/raw_transaction_provider.d.ts +8 -0
- package/dist/utxo/tools/raw_transaction_provider.d.ts.map +1 -0
- package/dist/utxo/tools/raw_transaction_provider.js +2 -0
- package/dist/utxo/tools/raw_transaction_provider.js.map +1 -0
- package/dist/utxo/tools/utxo_provider.d.ts +7 -0
- package/dist/utxo/tools/utxo_provider.d.ts.map +1 -0
- package/dist/utxo/tools/utxo_provider.js +2 -0
- package/dist/utxo/tools/utxo_provider.js.map +1 -0
- package/dist/utxo/unsigned_utxo_transaction.d.ts +32 -0
- package/dist/utxo/unsigned_utxo_transaction.d.ts.map +1 -0
- package/dist/utxo/unsigned_utxo_transaction.js +32 -0
- package/dist/utxo/unsigned_utxo_transaction.js.map +1 -0
- package/dist/utxo/utxo.d.ts +43 -0
- package/dist/utxo/utxo.d.ts.map +1 -0
- package/dist/utxo/utxo.js +2 -0
- package/dist/utxo/utxo.js.map +1 -0
- package/dist/utxo/utxo_chain.d.ts +102 -0
- package/dist/utxo/utxo_chain.d.ts.map +1 -0
- package/dist/utxo/utxo_chain.js +524 -0
- package/dist/utxo/utxo_chain.js.map +1 -0
- package/dist/utxo/utxo_chains.d.ts +29 -0
- package/dist/utxo/utxo_chains.d.ts.map +1 -0
- package/dist/utxo/utxo_chains.js +63 -0
- package/dist/utxo/utxo_chains.js.map +1 -0
- package/dist/utxo/utxo_gas_pricing.d.ts +22 -0
- package/dist/utxo/utxo_gas_pricing.d.ts.map +1 -0
- package/dist/utxo/utxo_gas_pricing.js +20 -0
- package/dist/utxo/utxo_gas_pricing.js.map +1 -0
- package/dist/utxo/utxo_network_params.d.ts +25 -0
- package/dist/utxo/utxo_network_params.d.ts.map +1 -0
- package/dist/utxo/utxo_network_params.js +15 -0
- package/dist/utxo/utxo_network_params.js.map +1 -0
- package/dist/utxo/utxo_transaction_status.d.ts +73 -0
- package/dist/utxo/utxo_transaction_status.d.ts.map +1 -0
- package/dist/utxo/utxo_transaction_status.js +89 -0
- package/dist/utxo/utxo_transaction_status.js.map +1 -0
- package/docs/PUBLISHING.md +119 -0
- package/docs/README.md +273 -0
- package/docs/evm.md +205 -0
- package/docs/solana.md +220 -0
- package/docs/utxo.md +364 -0
- package/package.json +94 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
import { Psbt, Transaction } from 'bitcoinjs-lib';
|
|
2
|
+
import { CHAIN_ID_BITCOIN_MAINNET, CHAIN_ID_BITCOIN_SIGNET, CHAIN_ID_BITCOIN_TESTNET, } from "../chain_ids.js";
|
|
3
|
+
import { btcParamsForChainId, btcParamsShapeMatches, } from "./btc/network_params.js";
|
|
4
|
+
import { Chain } from "../chain.base.js";
|
|
5
|
+
import { ChainError, ChainErrorKinds } from "../errors.js";
|
|
6
|
+
import { NetworkType, registerNonEvmChain } from "../network_type.js";
|
|
7
|
+
import { Priority } from "../priority.js";
|
|
8
|
+
import { Token } from "../token.js";
|
|
9
|
+
import { AssetBalanceChange, TransactionStatusTypes, } from "../transaction_status.js";
|
|
10
|
+
import { UtxoTransactionFees, UtxoTransactionOutput, UtxoTransactionStatus, } from "./utxo_transaction_status.js";
|
|
11
|
+
import "./ecc.js";
|
|
12
|
+
import { CoinSelectionOutcomes, selectCoins, } from "./coin_selection.js";
|
|
13
|
+
import { costOfChangeSats, estimateTxVBytes, outputVBytes } from "./fee.js";
|
|
14
|
+
import { UtxoScriptTypes, buildOpReturnScript, detectScriptType, scriptTypeForAddress, } from "./script.js";
|
|
15
|
+
import { FINAL_SEQUENCE, OP_RETURN_MAX_BYTES, RBF_SEQUENCE, } from "./utxo_network_params.js";
|
|
16
|
+
import { UnsignedUtxoTransaction } from "./unsigned_utxo_transaction.js";
|
|
17
|
+
const RESERVED_BTC_CHAIN_IDS = [
|
|
18
|
+
CHAIN_ID_BITCOIN_MAINNET,
|
|
19
|
+
CHAIN_ID_BITCOIN_TESTNET,
|
|
20
|
+
CHAIN_ID_BITCOIN_SIGNET,
|
|
21
|
+
];
|
|
22
|
+
const DEFAULT_BLOCK_TIME_SECONDS = 600;
|
|
23
|
+
const DEFAULT_FEE_TARGET_BLOCKS = 3;
|
|
24
|
+
const DEFAULT_LONG_TERM_FEE_RATE = 5;
|
|
25
|
+
const DEFAULT_NATIVE_DECIMALS = 8;
|
|
26
|
+
class UtxoNativeToken extends Token {
|
|
27
|
+
constructor(chainId, symbol, decimals) {
|
|
28
|
+
super(chainId, symbol, undefined, decimals);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class UtxoChain extends Chain {
|
|
32
|
+
params;
|
|
33
|
+
utxoProvider;
|
|
34
|
+
rawTxProvider;
|
|
35
|
+
feeEstimator;
|
|
36
|
+
broadcaster;
|
|
37
|
+
chainTipProvider;
|
|
38
|
+
walletExplorerTemplate;
|
|
39
|
+
tokenExplorerTemplate;
|
|
40
|
+
transactionExplorerTemplate;
|
|
41
|
+
_nativeToken;
|
|
42
|
+
defaultFeeTargetBlocks;
|
|
43
|
+
longTermFeeRateSatsPerVByte;
|
|
44
|
+
rbfEnabled;
|
|
45
|
+
constructor(init) {
|
|
46
|
+
// Reject a non-BTC UTXO chain (LTC/DOGE/DASH/ZEC/BCH — mainnet AND
|
|
47
|
+
// testnet) constructed with a reserved BTC chainId. The prior slip44
|
|
48
|
+
// heuristic let `litecoinTestnetChain({chainId: -2})` through because
|
|
49
|
+
// LTC testnet's slip44 is `Slip44.Testnet` (same as BTC testnet). Gate
|
|
50
|
+
// on the seeded BTC params directly: at reserved ids the constructor
|
|
51
|
+
// must present params shape-identical to what's already seeded, else
|
|
52
|
+
// it's a chain claiming a BTC id with foreign address rules.
|
|
53
|
+
if (RESERVED_BTC_CHAIN_IDS.includes(init.chainId)) {
|
|
54
|
+
const seeded = btcParamsForChainId(BigInt(init.chainId));
|
|
55
|
+
const paramsAsBtc = init.params;
|
|
56
|
+
// Use the strict comparator exported from btc/network_params.ts so
|
|
57
|
+
// both this guard and registerBtcChainParams share ONE invariant.
|
|
58
|
+
// A non-BtcNetworkParams (missing `name`, `hrp`, etc.) fails the
|
|
59
|
+
// comparator on the first field mismatch.
|
|
60
|
+
if (init.params !== seeded && !btcParamsShapeMatches(seeded, paramsAsBtc)) {
|
|
61
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `chainId ${init.chainId} is reserved for BTC; UtxoChain construction with foreign params (slip44=${init.params.slip44CoinId}) is not permitted. Choose a distinct chainId for this network.`, { chainId: init.chainId });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
super(init.chainId, init.name, NetworkType.BTC, init.blockTimeSeconds ?? DEFAULT_BLOCK_TIME_SECONDS, init.nativeSymbol, init.walletExplorerUrlTemplate);
|
|
65
|
+
this.params = init.params;
|
|
66
|
+
this.utxoProvider = init.utxoProvider;
|
|
67
|
+
this.rawTxProvider = init.rawTxProvider;
|
|
68
|
+
this.feeEstimator = init.feeEstimator;
|
|
69
|
+
this.broadcaster = init.broadcaster;
|
|
70
|
+
this.chainTipProvider = init.chainTipProvider;
|
|
71
|
+
this.walletExplorerTemplate = init.walletExplorerUrlTemplate;
|
|
72
|
+
this.tokenExplorerTemplate = init.tokenExplorerUrlTemplate ?? init.walletExplorerUrlTemplate;
|
|
73
|
+
this.transactionExplorerTemplate = init.transactionExplorerUrlTemplate;
|
|
74
|
+
this._nativeToken = new UtxoNativeToken(init.chainId, init.nativeSymbol, init.nativeDecimals ?? DEFAULT_NATIVE_DECIMALS);
|
|
75
|
+
this.defaultFeeTargetBlocks = init.defaultFeeTargetBlocks ?? DEFAULT_FEE_TARGET_BLOCKS;
|
|
76
|
+
this.longTermFeeRateSatsPerVByte = init.longTermFeeRateSatsPerVByte ?? DEFAULT_LONG_TERM_FEE_RATE;
|
|
77
|
+
this.rbfEnabled = init.rbfEnabled ?? true;
|
|
78
|
+
registerNonEvmChain(init.chainId, NetworkType.BTC);
|
|
79
|
+
}
|
|
80
|
+
get nativeToken() {
|
|
81
|
+
return this._nativeToken;
|
|
82
|
+
}
|
|
83
|
+
get slip44CoinId() {
|
|
84
|
+
return this.params.slip44CoinId;
|
|
85
|
+
}
|
|
86
|
+
get supportedDerivationPurposes() {
|
|
87
|
+
return this.params.supportedDerivationPurposes;
|
|
88
|
+
}
|
|
89
|
+
get dustValueSats() {
|
|
90
|
+
return this.params.dustValueSats;
|
|
91
|
+
}
|
|
92
|
+
getWalletExplorerUrl(address) {
|
|
93
|
+
return this.walletExplorerTemplate.replace('{wallet_address}', address);
|
|
94
|
+
}
|
|
95
|
+
getTokenExplorerUrl(_tokenIdentifier) {
|
|
96
|
+
return this.tokenExplorerTemplate.replace('{wallet_address}', '');
|
|
97
|
+
}
|
|
98
|
+
getTransactionExplorerUrl(txHash) {
|
|
99
|
+
return this.transactionExplorerTemplate.replace('{tx_hash}', txHash);
|
|
100
|
+
}
|
|
101
|
+
validateAddress(raw) {
|
|
102
|
+
if (typeof raw !== 'string' || raw.length === 0)
|
|
103
|
+
return false;
|
|
104
|
+
return this.params.walletAddressRegex.test(raw);
|
|
105
|
+
}
|
|
106
|
+
validateTokenIdentifier(raw) {
|
|
107
|
+
return raw === undefined;
|
|
108
|
+
}
|
|
109
|
+
async getUtxos(addresses, _options) {
|
|
110
|
+
if (addresses.length === 0)
|
|
111
|
+
return [];
|
|
112
|
+
const lists = await Promise.all(addresses.map((address) => this.utxoProvider.getUtxos(address)));
|
|
113
|
+
return lists.flat();
|
|
114
|
+
}
|
|
115
|
+
async getBalance(owner, tokenIdentifier) {
|
|
116
|
+
if (!this.validateTokenIdentifier(tokenIdentifier)) {
|
|
117
|
+
throw new ChainError(ChainErrorKinds.InvalidTokenIdentifier, `${this.name}: only the native token is supported (got ${tokenIdentifier})`, { chainId: this.chainId, identifier: tokenIdentifier });
|
|
118
|
+
}
|
|
119
|
+
if (!this.validateAddress(owner)) {
|
|
120
|
+
throw new ChainError(ChainErrorKinds.InvalidAddress, `${this.name}: invalid wallet address ${owner}`, { chainId: this.chainId, address: owner });
|
|
121
|
+
}
|
|
122
|
+
const balance = await this.utxoProvider.getAddressBalance(owner);
|
|
123
|
+
return BigInt(balance.confirmedSats);
|
|
124
|
+
}
|
|
125
|
+
async getChainTipHeight() {
|
|
126
|
+
return this.chainTipProvider.getChainTipHeight();
|
|
127
|
+
}
|
|
128
|
+
async getTransactionStatus(txHash) {
|
|
129
|
+
// Narrow the try to the provider call only. Constructor asserts and
|
|
130
|
+
// upsert failures must NOT be silently coerced into NotFound.
|
|
131
|
+
// Classify: (a) provider signalled "no such tx" (Esplora HTTP 404,
|
|
132
|
+
// Bitcoin Core RPC code -5) → NotFound; (b) any other throw →
|
|
133
|
+
// RpcError so consumers can retry rather than treating a 429/timeout
|
|
134
|
+
// as a definitive miss.
|
|
135
|
+
let tx;
|
|
136
|
+
try {
|
|
137
|
+
tx = await this.rawTxProvider.getTransaction(txHash);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (err instanceof ChainError)
|
|
141
|
+
throw err;
|
|
142
|
+
if (isProviderNotFoundError(err)) {
|
|
143
|
+
return new UtxoTransactionStatus({
|
|
144
|
+
chainId: this.chainId,
|
|
145
|
+
status: TransactionStatusTypes.NotFound,
|
|
146
|
+
confirmationAt: null,
|
|
147
|
+
balanceChanges: null,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const rawMsg = err instanceof Error ? err.message : String(err);
|
|
151
|
+
const sanitizedMsg = sanitizeUtxoErrMessage(rawMsg);
|
|
152
|
+
// Build a scrubbed cause: sanitizeCause strips axios `.config`/
|
|
153
|
+
// `.request`/`.response` object trees (which carry Authorization
|
|
154
|
+
// headers + query-string keys) by rebuilding a plain Error with
|
|
155
|
+
// only sanitized message+stack. Consumers walking `.cause` in a
|
|
156
|
+
// structured logger no longer leak API keys.
|
|
157
|
+
const safeCause = err instanceof Error
|
|
158
|
+
? sanitizedCauseForUtxo(err, sanitizedMsg)
|
|
159
|
+
: undefined;
|
|
160
|
+
throw new ChainError(ChainErrorKinds.RpcError, `Failed to read UTXO tx ${txHash}: ${sanitizedMsg}`, { chainId: this.chainId, txHash }, safeCause);
|
|
161
|
+
}
|
|
162
|
+
// Bitcoin Core reports `confirmations: -1` for a conflicted/RBF-
|
|
163
|
+
// replaced tx (a reorged-out deposit). Do not run the shape asserts
|
|
164
|
+
// that would throw InvalidArgument on the way out — surface as
|
|
165
|
+
// NotFound so the status poll doesn't crash.
|
|
166
|
+
if (tx.confirmations < 0) {
|
|
167
|
+
return new UtxoTransactionStatus({
|
|
168
|
+
chainId: this.chainId,
|
|
169
|
+
status: TransactionStatusTypes.NotFound,
|
|
170
|
+
confirmationAt: null,
|
|
171
|
+
balanceChanges: null,
|
|
172
|
+
error: {
|
|
173
|
+
code: 'CONFLICTED',
|
|
174
|
+
reason: `Provider reports confirmations=${tx.confirmations} (RBF-replaced / reorged)`,
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// Wrap the decode block so a non-integer valueSats/absoluteSats from a
|
|
179
|
+
// consumer's provider tool (BTC-float→sats overflow) or a
|
|
180
|
+
// Transaction.fromHex failure surfaces as a typed
|
|
181
|
+
// ChainError(TransactionDecodeFailed) rather than a raw RangeError.
|
|
182
|
+
// Mirrors evm_chain.ts:decodeBalanceChanges catch.
|
|
183
|
+
try {
|
|
184
|
+
// Populate outputs on both pending AND confirmed paths — a 0-conf
|
|
185
|
+
// mempool tx still has visible outputs, and BTC/LTC/DOGE deposit
|
|
186
|
+
// detectors need them. balanceChanges stays null on Pending per the
|
|
187
|
+
// TransactionStatus base invariant.
|
|
188
|
+
const outputs = tx.vout.map((o) => new UtxoTransactionOutput({
|
|
189
|
+
scriptPubkeyHex: o.scriptPubKeyHex,
|
|
190
|
+
address: o.address,
|
|
191
|
+
valueSats: BigInt(o.valueSats),
|
|
192
|
+
}));
|
|
193
|
+
// Derive vsize from the raw hex — bitcoinjs-lib is already a dep
|
|
194
|
+
// and both Esplora + Bitcoin Core populate tx.hex. Falls back to
|
|
195
|
+
// null on malformed hex so the status still returns.
|
|
196
|
+
let vsize = null;
|
|
197
|
+
try {
|
|
198
|
+
if (tx.hex && tx.hex.length > 0) {
|
|
199
|
+
vsize = Transaction.fromHex(tx.hex).virtualSize();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
vsize = null;
|
|
204
|
+
}
|
|
205
|
+
const fees = tx.fees !== null
|
|
206
|
+
? new UtxoTransactionFees({ absoluteSats: BigInt(tx.fees.absoluteSats), vsize })
|
|
207
|
+
: null;
|
|
208
|
+
const isPending = tx.confirmations === 0;
|
|
209
|
+
if (isPending) {
|
|
210
|
+
return new UtxoTransactionStatus({
|
|
211
|
+
chainId: this.chainId,
|
|
212
|
+
status: TransactionStatusTypes.Pending,
|
|
213
|
+
confirmationAt: null,
|
|
214
|
+
balanceChanges: null,
|
|
215
|
+
confirmations: 0,
|
|
216
|
+
outputs,
|
|
217
|
+
vsize,
|
|
218
|
+
fees,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
// Outputs-only per-address native deltas. Full input-side accounting
|
|
222
|
+
// to compute net native change (Python's `_native_balance_changes`
|
|
223
|
+
// parity) is deferred — the raw-tx provider currently returns only
|
|
224
|
+
// vin.txid+vout, no address/value/scriptPubKeyHex. Noted in
|
|
225
|
+
// SINAN_OPEN_QUESTIONS.md.
|
|
226
|
+
const balanceChanges = new Map();
|
|
227
|
+
const perAddressSats = new Map();
|
|
228
|
+
for (const out of tx.vout) {
|
|
229
|
+
if (!out.address)
|
|
230
|
+
continue;
|
|
231
|
+
perAddressSats.set(out.address, (perAddressSats.get(out.address) ?? 0n) + BigInt(out.valueSats));
|
|
232
|
+
}
|
|
233
|
+
for (const [address, sats] of perAddressSats) {
|
|
234
|
+
AssetBalanceChange.upsert(balanceChanges, address, this._nativeToken, AssetBalanceChange.fromMr(sats, this._nativeToken.decimals));
|
|
235
|
+
}
|
|
236
|
+
return new UtxoTransactionStatus({
|
|
237
|
+
chainId: this.chainId,
|
|
238
|
+
status: TransactionStatusTypes.Success,
|
|
239
|
+
confirmationAt: tx.blockTime,
|
|
240
|
+
balanceChanges,
|
|
241
|
+
confirmations: tx.confirmations,
|
|
242
|
+
outputs,
|
|
243
|
+
vsize,
|
|
244
|
+
fees,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
if (err instanceof ChainError)
|
|
249
|
+
throw err;
|
|
250
|
+
throw new ChainError(ChainErrorKinds.TransactionDecodeFailed, `Failed to decode UTXO tx ${txHash}: ${err instanceof Error ? err.message : String(err)}`, { chainId: this.chainId, txHash }, err instanceof Error ? err : undefined);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async createTransferUnsignedTransaction(req) {
|
|
254
|
+
return this.buildTransfer(req, undefined);
|
|
255
|
+
}
|
|
256
|
+
async buildTransfer(req, getUtxosOptions) {
|
|
257
|
+
// UTXO builder does not yet consume the CreateTransferRequest fields
|
|
258
|
+
// introduced in Wave 2B (Python-parity amountHr / isFullBalance /
|
|
259
|
+
// gasPricing). Rejecting them at entry — silently letting an
|
|
260
|
+
// amountHr-only request through would produce `amount === undefined`
|
|
261
|
+
// downstream and end in a NaN cointoss after several RPC round-trips.
|
|
262
|
+
if (req.amountHr !== undefined) {
|
|
263
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: CreateTransferRequest.amountHr is not yet supported — pass \`amount\` (bigint sats) or \`outputs\` (multi-recipient) instead.`, { chainId: this.chainId });
|
|
264
|
+
}
|
|
265
|
+
if (req.isFullBalance === true) {
|
|
266
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: CreateTransferRequest.isFullBalance is not yet supported — pass \`amount\` explicitly and reserve fees yourself.`, { chainId: this.chainId });
|
|
267
|
+
}
|
|
268
|
+
if (req.gasPricing !== undefined) {
|
|
269
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: CreateTransferRequest.gasPricing is not yet consumed by UtxoChain (Phase 2 follow-up). Use \`feeRateSatsPerVByte\` / \`feeTargetBlocks\` on CreateUtxoTransferOptions for now.`, { chainId: this.chainId });
|
|
270
|
+
}
|
|
271
|
+
if (!this.validateTokenIdentifier(req.tokenIdentifier)) {
|
|
272
|
+
throw new ChainError(ChainErrorKinds.InvalidTokenIdentifier, `${this.name}: only the native token is supported`, { chainId: this.chainId, identifier: req.tokenIdentifier });
|
|
273
|
+
}
|
|
274
|
+
if (req.from === undefined || !this.validateAddress(req.from)) {
|
|
275
|
+
throw new ChainError(ChainErrorKinds.InvalidAddress, `${this.name}: invalid sender address ${req.from ?? '<missing>'}`, { chainId: this.chainId, address: req.from });
|
|
276
|
+
}
|
|
277
|
+
const fromAddress = req.from;
|
|
278
|
+
const opts = req;
|
|
279
|
+
// Normalize: single-output form (to/amount) OR multi-output form (outputs[]).
|
|
280
|
+
// Exactly one must be provided; the multi-output form is preferred going forward.
|
|
281
|
+
const hasSingle = req.to !== undefined || req.amount !== undefined;
|
|
282
|
+
const hasMulti = Array.isArray(opts.outputs) && opts.outputs.length > 0;
|
|
283
|
+
if (hasSingle && hasMulti) {
|
|
284
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: cannot specify both single-output (to/amount) and multi-output (outputs[]) forms`, { chainId: this.chainId });
|
|
285
|
+
}
|
|
286
|
+
if (!hasSingle && !hasMulti) {
|
|
287
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: must specify either (to, amount) or a non-empty outputs[] array`, { chainId: this.chainId });
|
|
288
|
+
}
|
|
289
|
+
// Wave 2B made `amount` optional on the base CreateTransferRequest so
|
|
290
|
+
// `amountHr` could coexist. UTXO's single-output form still needs
|
|
291
|
+
// `amount: bigint` — reject `{to, memo}`-without-amount up front
|
|
292
|
+
// rather than let it propagate through as NaN downstream.
|
|
293
|
+
if (hasSingle && !hasMulti && req.amount === undefined) {
|
|
294
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: single-output form requires \`amount: bigint\` (bitcoin satoshis) — omitting amount would produce NaN downstream`, { chainId: this.chainId });
|
|
295
|
+
}
|
|
296
|
+
const normalizedOutputs = hasMulti
|
|
297
|
+
? opts.outputs.slice()
|
|
298
|
+
: [{ to: req.to, amount: req.amount }];
|
|
299
|
+
for (let i = 0; i < normalizedOutputs.length; i++) {
|
|
300
|
+
const o = normalizedOutputs[i];
|
|
301
|
+
if (!this.validateAddress(o.to)) {
|
|
302
|
+
throw new ChainError(ChainErrorKinds.InvalidAddress, `${this.name}: invalid recipient address at outputs[${i}]: ${o.to}`, { chainId: this.chainId, address: o.to });
|
|
303
|
+
}
|
|
304
|
+
if (typeof o.amount !== 'bigint') {
|
|
305
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: outputs[${i}].amount must be a bigint (got ${typeof o.amount})`, { chainId: this.chainId });
|
|
306
|
+
}
|
|
307
|
+
if (o.amount <= 0n) {
|
|
308
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: outputs[${i}] amount must be > 0`, { chainId: this.chainId });
|
|
309
|
+
}
|
|
310
|
+
const sats = bigintToNumber(o.amount);
|
|
311
|
+
if (sats < this.params.dustValueSats) {
|
|
312
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: outputs[${i}] amount ${sats} below dust ${this.params.dustValueSats}`, { chainId: this.chainId });
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const totalTargetSats = normalizedOutputs.reduce((acc, o) => acc + bigintToNumber(o.amount), 0);
|
|
316
|
+
const recipientTypes = normalizedOutputs.map((o) => scriptTypeForAddress(o.to, this.params.networkInfo));
|
|
317
|
+
const memoBytes = encodeMemo(req.memo);
|
|
318
|
+
const feeRateSatsPerVByte = await this.resolveFeeRate(opts.feeRateSatsPerVByte, opts.feeTargetBlocks);
|
|
319
|
+
const utxos = await this.getUtxos([fromAddress], getUtxosOptions);
|
|
320
|
+
if (utxos.length === 0) {
|
|
321
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: no spendable UTXOs available for ${fromAddress}`, { chainId: this.chainId, address: fromAddress });
|
|
322
|
+
}
|
|
323
|
+
const changeAddress = opts.changeAddress ?? fromAddress;
|
|
324
|
+
const changeType = scriptTypeForAddress(changeAddress, this.params.networkInfo);
|
|
325
|
+
const outputsFixedVBytes = recipientTypes.reduce((acc, t) => acc + outputVBytes(t), 0) +
|
|
326
|
+
(memoBytes ? memoBytes.length + 11 : 0);
|
|
327
|
+
const selection = this.runCoinSelection({
|
|
328
|
+
utxos,
|
|
329
|
+
targetSats: totalTargetSats,
|
|
330
|
+
feeRateSatsPerVByte,
|
|
331
|
+
changeOutputType: changeType,
|
|
332
|
+
outputsFixedVBytes,
|
|
333
|
+
costOfChangeSats: costOfChangeSats(changeType, feeRateSatsPerVByte, this.longTermFeeRateSatsPerVByte),
|
|
334
|
+
});
|
|
335
|
+
if (selection.outcome !== CoinSelectionOutcomes.Success) {
|
|
336
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: coin selection failed (${selection.outcome}) for target ${totalTargetSats} sats`, { chainId: this.chainId });
|
|
337
|
+
}
|
|
338
|
+
const rbfEnabled = opts.rbfEnabled ?? this.rbfEnabled;
|
|
339
|
+
const sequence = rbfEnabled ? RBF_SEQUENCE : FINAL_SEQUENCE;
|
|
340
|
+
const psbt = new Psbt({ network: this.params.networkInfo });
|
|
341
|
+
const rawTxByTxid = await this.fetchParentTransactions(selection.selected);
|
|
342
|
+
const inputsToSign = {};
|
|
343
|
+
selection.selected.forEach((utxo, index) => {
|
|
344
|
+
this.addInputToPsbt({
|
|
345
|
+
psbt,
|
|
346
|
+
utxo,
|
|
347
|
+
sequence,
|
|
348
|
+
parentTxHex: rawTxByTxid.get(utxo.txid),
|
|
349
|
+
});
|
|
350
|
+
const list = inputsToSign[utxo.ownerAddress] ?? [];
|
|
351
|
+
list.push(index);
|
|
352
|
+
inputsToSign[utxo.ownerAddress] = list;
|
|
353
|
+
});
|
|
354
|
+
for (const o of normalizedOutputs) {
|
|
355
|
+
psbt.addOutput({ address: o.to, value: BigInt(bigintToNumber(o.amount)) });
|
|
356
|
+
}
|
|
357
|
+
if (selection.hasChange) {
|
|
358
|
+
psbt.addOutput({ address: changeAddress, value: BigInt(selection.changeSats) });
|
|
359
|
+
}
|
|
360
|
+
if (memoBytes) {
|
|
361
|
+
psbt.addOutput({ script: buildOpReturnScript(memoBytes), value: 0n });
|
|
362
|
+
}
|
|
363
|
+
const estimatedVBytes = estimateTxVBytes(selection.selected.map((u) => u.scriptType), selection.hasChange ? [...recipientTypes, changeType] : recipientTypes, memoBytes ? [memoBytes.length] : []);
|
|
364
|
+
return new UnsignedUtxoTransaction({
|
|
365
|
+
chainId: this.chainId,
|
|
366
|
+
params: this.params,
|
|
367
|
+
psbtBase64: psbt.toBase64(),
|
|
368
|
+
selectedInputs: selection.selected,
|
|
369
|
+
feeSats: selection.feeSats,
|
|
370
|
+
feeRateSatsPerVByte,
|
|
371
|
+
estimatedVBytes,
|
|
372
|
+
totalInputSats: selection.totalValueSats,
|
|
373
|
+
totalOutputSats: totalTargetSats + (selection.hasChange ? selection.changeSats : 0),
|
|
374
|
+
changeAddress: selection.hasChange ? changeAddress : null,
|
|
375
|
+
inputsToSign,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
addInputToPsbt(args) {
|
|
379
|
+
const { psbt, utxo, sequence, parentTxHex } = args;
|
|
380
|
+
const scriptPubKey = Buffer.from(utxo.scriptPubKeyHex, 'hex');
|
|
381
|
+
const scriptType = detectScriptType(scriptPubKey);
|
|
382
|
+
const parentTxBytes = Buffer.from(parentTxHex, 'hex');
|
|
383
|
+
const input = {
|
|
384
|
+
hash: utxo.txid,
|
|
385
|
+
index: utxo.vout,
|
|
386
|
+
sequence,
|
|
387
|
+
nonWitnessUtxo: parentTxBytes,
|
|
388
|
+
};
|
|
389
|
+
if (scriptType === UtxoScriptTypes.P2WPKH ||
|
|
390
|
+
scriptType === UtxoScriptTypes.P2WSH ||
|
|
391
|
+
scriptType === UtxoScriptTypes.P2TR ||
|
|
392
|
+
scriptType === UtxoScriptTypes.P2SH) {
|
|
393
|
+
input.witnessUtxo = { script: scriptPubKey, value: BigInt(utxo.valueSats) };
|
|
394
|
+
}
|
|
395
|
+
psbt.addInput(input);
|
|
396
|
+
}
|
|
397
|
+
async resolveFeeRate(overrideRate, targetBlocks) {
|
|
398
|
+
if (overrideRate !== undefined) {
|
|
399
|
+
if (overrideRate < 1) {
|
|
400
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${this.name}: feeRateSatsPerVByte must be >= 1 (got ${overrideRate})`, { chainId: this.chainId });
|
|
401
|
+
}
|
|
402
|
+
return Math.ceil(overrideRate);
|
|
403
|
+
}
|
|
404
|
+
const estimate = await this.feeEstimator.getFeeEstimate(targetBlocks ?? this.defaultFeeTargetBlocks);
|
|
405
|
+
return estimate.satsPerVByte;
|
|
406
|
+
}
|
|
407
|
+
static targetBlocksForPriority(priority) {
|
|
408
|
+
switch (priority) {
|
|
409
|
+
case Priority.FAST: return 1;
|
|
410
|
+
case Priority.NORMAL: return 3;
|
|
411
|
+
case Priority.SLOW: return 6;
|
|
412
|
+
default: {
|
|
413
|
+
const unreachable = priority;
|
|
414
|
+
throw new Error(`Unhandled Priority value: ${unreachable}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
async suggestFeeRate(priority) {
|
|
419
|
+
return this.resolveFeeRate(undefined, UtxoChain.targetBlocksForPriority(priority));
|
|
420
|
+
}
|
|
421
|
+
async fetchParentTransactions(utxos) {
|
|
422
|
+
const uniqueTxids = Array.from(new Set(utxos.map((u) => u.txid)));
|
|
423
|
+
const hexes = await this.rawTxProvider.getRawTransactionHexBatch(uniqueTxids);
|
|
424
|
+
if (hexes.length !== uniqueTxids.length) {
|
|
425
|
+
throw new ChainError(ChainErrorKinds.RpcError, `${this.name}: provider returned ${hexes.length} parent txs for ${uniqueTxids.length} requested`, { chainId: this.chainId });
|
|
426
|
+
}
|
|
427
|
+
return new Map(uniqueTxids.map((txid, i) => [txid, hexes[i]]));
|
|
428
|
+
}
|
|
429
|
+
runCoinSelection(params) {
|
|
430
|
+
return selectCoins(params);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
function bigintToNumber(value) {
|
|
434
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
435
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `UTXO amount ${value} exceeds Number.MAX_SAFE_INTEGER`);
|
|
436
|
+
}
|
|
437
|
+
return Number(value);
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Detect whether the underlying provider signalled "no such tx" (as opposed
|
|
441
|
+
* to a transport failure). Two canonical shapes are recognised:
|
|
442
|
+
*
|
|
443
|
+
* - Esplora / any axios-based HTTP provider → `response.status === 404`
|
|
444
|
+
* - Bitcoin Core `getrawtransaction` on an unknown txid → RPC error code
|
|
445
|
+
* `-5` (surfaces via `bitcoin-core.tool.ts` as
|
|
446
|
+
* `Error("bitcoin-core getrawtransaction: -5 <msg>")`).
|
|
447
|
+
*
|
|
448
|
+
* Everything else is treated as a transport failure and wrapped in
|
|
449
|
+
* `ChainError(RpcError)` so consumers can retry.
|
|
450
|
+
*/
|
|
451
|
+
function isProviderNotFoundError(err) {
|
|
452
|
+
if (!err || typeof err !== 'object')
|
|
453
|
+
return false;
|
|
454
|
+
const anyErr = err;
|
|
455
|
+
const status = anyErr.response?.status;
|
|
456
|
+
if (typeof status === 'number' && status === 404)
|
|
457
|
+
return true;
|
|
458
|
+
const message = typeof anyErr.message === 'string' ? anyErr.message : '';
|
|
459
|
+
if (/getrawtransaction:\s*-5\b/.test(message)) {
|
|
460
|
+
// Bitcoin Core RPC code -5 has TWO meanings:
|
|
461
|
+
// - "No such mempool or blockchain transaction" → genuinely unknown
|
|
462
|
+
// (node has -txindex enabled, or the tx is unknown even in mempool)
|
|
463
|
+
// - "No such mempool transaction. Use -txindex or provide a block hash…"
|
|
464
|
+
// → the tx MIGHT exist on-chain but the node can't look it up
|
|
465
|
+
// without a block hash. Reporting NotFound here would silently
|
|
466
|
+
// misreport every confirmed deposit as missing on a non-txindex
|
|
467
|
+
// node — a real-money fail-open. Route it as RpcError so the
|
|
468
|
+
// consumer sees a node-misconfiguration signal.
|
|
469
|
+
if (/mempool or blockchain/i.test(message))
|
|
470
|
+
return true;
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Best-effort scrub for provider error messages so API keys and auth
|
|
477
|
+
* tokens don't leak into `TransactionErrorInfo.reason`. The UTXO
|
|
478
|
+
* providers (Esplora, Unisat, Ordiscan) carry keys in URL query strings,
|
|
479
|
+
* Authorization headers, AND URL paths (`/v1/<key>/tx/…`); a raw axios
|
|
480
|
+
* error stringifies the full request URL. Matches EVM's
|
|
481
|
+
* `sanitizeMessage` intent (errors.ts).
|
|
482
|
+
*/
|
|
483
|
+
function sanitizeUtxoErrMessage(msg) {
|
|
484
|
+
return msg
|
|
485
|
+
// Basic-auth credentials in a URL: http://user:pass@host — the
|
|
486
|
+
// canonical Bitcoin Core RPC form, which the -5 branch above
|
|
487
|
+
// specifically expects and could otherwise expose.
|
|
488
|
+
.replace(/(:\/\/)[^:@\s/]+:[^@\s/]+@/g, '$1***:***@')
|
|
489
|
+
// Query-string API key params.
|
|
490
|
+
.replace(/([?&][A-Za-z_-]*(?:key|token|apikey|api_key|auth)=)[^&\s]+/gi, '$1***')
|
|
491
|
+
// Bearer / Authorization headers.
|
|
492
|
+
.replace(/(Authorization|Bearer)\s+[A-Za-z0-9._~+/=-]+/gi, '$1 ***')
|
|
493
|
+
// Hex/base58-ish 32+-char tokens embedded in URL paths (hosted
|
|
494
|
+
// Esplora often uses `/v1/<key>/…`).
|
|
495
|
+
.replace(/\/[A-Fa-f0-9]{32,}\b/g, '/***')
|
|
496
|
+
// Provider-prefixed key markers (Blockstream/Unisat/Ordiscan style).
|
|
497
|
+
.replace(/\b(?:pk|sk|ghp|gho)_[A-Za-z0-9]{20,}\b/g, '***');
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Rebuild a fresh Error from `cause` with the sanitized message + a
|
|
501
|
+
* sanitized stack. Drops axios `.config` / `.response` / `.request`
|
|
502
|
+
* object trees that carry Authorization headers and full request URLs.
|
|
503
|
+
* Symmetric with `sanitizeCause` (errors.ts) but with the UTXO-specific
|
|
504
|
+
* regex sweeps applied instead of a per-chain rpcUrl scrub.
|
|
505
|
+
*/
|
|
506
|
+
function sanitizedCauseForUtxo(cause, sanitizedMsg) {
|
|
507
|
+
const safe = new Error(sanitizedMsg);
|
|
508
|
+
safe.name = cause.name;
|
|
509
|
+
if (cause.stack)
|
|
510
|
+
safe.stack = sanitizeUtxoErrMessage(cause.stack);
|
|
511
|
+
return safe;
|
|
512
|
+
}
|
|
513
|
+
function encodeMemo(memo) {
|
|
514
|
+
if (memo === undefined || memo === null)
|
|
515
|
+
return null;
|
|
516
|
+
const buf = Buffer.from(memo, 'utf8');
|
|
517
|
+
if (buf.length === 0)
|
|
518
|
+
return null;
|
|
519
|
+
if (buf.length > OP_RETURN_MAX_BYTES) {
|
|
520
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `memo length ${buf.length} bytes exceeds OP_RETURN max ${OP_RETURN_MAX_BYTES}`);
|
|
521
|
+
}
|
|
522
|
+
return buf;
|
|
523
|
+
}
|
|
524
|
+
//# sourceMappingURL=utxo_chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxo_chain.js","sourceRoot":"","sources":["../../utxo/utxo_chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAyB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,kBAAkB,EAElB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,UAAU,CAAC;AAClB,OAAO,EACL,qBAAqB,EAGrB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAEL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,YAAY,GAEb,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,MAAM,sBAAsB,GAAsB;IAChD,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;CACxB,CAAC;AAiDF,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AACrC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC,MAAM,eAAgB,SAAQ,KAAK;IACjC,YAAY,OAAe,EAAE,MAAc,EAAE,QAAgB;QAC3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAoB;IAC1B,YAAY,CAAe;IAC3B,aAAa,CAA6B;IAC1C,YAAY,CAAmB;IAC/B,WAAW,CAAkB;IAC7B,gBAAgB,CAAuB;IAC7B,sBAAsB,CAAS;IAC/B,qBAAqB,CAAS;IAC9B,2BAA2B,CAAS;IACpC,YAAY,CAAQ;IACpB,sBAAsB,CAAS;IAC/B,2BAA2B,CAAS;IACpC,UAAU,CAAU;IAEvC,YAAY,IAAmB;QAC7B,mEAAmE;QACnE,qEAAqE;QACrE,sEAAsE;QACtE,uEAAuE;QACvE,qEAAqE;QACrE,qEAAqE;QACrE,6DAA6D;QAC7D,IAAI,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,IAAI,CAAC,MAA0B,CAAC;YACpD,mEAAmE;YACnE,kEAAkE;YAClE,iEAAiE;YACjE,0CAA0C;YAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;gBAC1E,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,WAAW,IAAI,CAAC,OAAO,4EAA4E,IAAI,CAAC,MAAM,CAAC,YAAY,iEAAiE,EAC5L,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,CACH,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,IAAI,EACT,WAAW,CAAC,GAAG,EACf,IAAI,CAAC,gBAAgB,IAAI,0BAA0B,EACnD,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,yBAAyB,CAC/B,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,yBAAyB,CAAC;QAC7D,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,yBAAyB,CAAC;QAC7F,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,8BAA8B,CAAC;QACvE,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CACrC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,cAAc,IAAI,uBAAuB,CAC/C,CAAC;QACF,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,IAAI,yBAAyB,CAAC;QACvF,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,2BAA2B,IAAI,0BAA0B,CAAC;QAClG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;QAC1C,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IAClC,CAAC;IAED,IAAI,2BAA2B;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC;IACjD,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IACnC,CAAC;IAED,oBAAoB,CAAC,OAAe;QAClC,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,mBAAmB,CAAC,gBAAyB;QAC3C,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,yBAAyB,CAAC,MAAc;QACtC,OAAO,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,eAAe,CAAC,GAAW;QACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9D,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,uBAAuB,CAAC,GAAuB;QAC7C,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,SAA4B,EAC5B,QAA0B;QAE1B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAChE,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,eAAwB;QACtD,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,sBAAsB,EACtC,GAAG,IAAI,CAAC,IAAI,6CAA6C,eAAe,GAAG,EAC3E,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,CACvD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,cAAc,EAC9B,GAAG,IAAI,CAAC,IAAI,4BAA4B,KAAK,EAAE,EAC/C,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAC1C,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACvC,oEAAoE;QACpE,8DAA8D;QAC9D,mEAAmE;QACnE,8DAA8D;QAC9D,qEAAqE;QACrE,wBAAwB;QACxB,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,UAAU;gBAAE,MAAM,GAAG,CAAC;YACzC,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,qBAAqB,CAAC;oBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,sBAAsB,CAAC,QAAQ;oBACvC,cAAc,EAAE,IAAI;oBACpB,cAAc,EAAE,IAAI;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACpD,gEAAgE;YAChE,iEAAiE;YACjE,gEAAgE;YAChE,gEAAgE;YAChE,6CAA6C;YAC7C,MAAM,SAAS,GAAG,GAAG,YAAY,KAAK;gBACpC,CAAC,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC;gBAC1C,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,QAAQ,EACxB,0BAA0B,MAAM,KAAK,YAAY,EAAE,EACnD,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EACjC,SAAS,CACV,CAAC;QACJ,CAAC;QAED,iEAAiE;QACjE,oEAAoE;QACpE,+DAA+D;QAC/D,6CAA6C;QAC7C,IAAI,EAAE,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,qBAAqB,CAAC;gBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,sBAAsB,CAAC,QAAQ;gBACvC,cAAc,EAAE,IAAI;gBACpB,cAAc,EAAE,IAAI;gBACpB,KAAK,EAAE;oBACL,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,kCAAkC,EAAE,CAAC,aAAa,2BAA2B;iBACtF;aACF,CAAC,CAAC;QACL,CAAC;QAED,uEAAuE;QACvE,0DAA0D;QAC1D,kDAAkD;QAClD,oEAAoE;QACpE,mDAAmD;QACnD,IAAI,CAAC;YACH,kEAAkE;YAClE,iEAAiE;YACjE,oEAAoE;YACpE,oCAAoC;YACpC,MAAM,OAAO,GAA4B,EAAE,CAAC,IAAI,CAAC,GAAG,CAClD,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,qBAAqB,CAAC;gBACxB,eAAe,EAAE,CAAC,CAAC,eAAe;gBAClC,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;aAC/B,CAAC,CACL,CAAC;YACF,iEAAiE;YACjE,iEAAiE;YACjE,qDAAqD;YACrD,IAAI,KAAK,GAAkB,IAAI,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBACpD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,MAAM,IAAI,GACR,EAAE,CAAC,IAAI,KAAK,IAAI;gBACd,CAAC,CAAC,IAAI,mBAAmB,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC;gBAChF,CAAC,CAAC,IAAI,CAAC;YAEX,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,KAAK,CAAC,CAAC;YACzC,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,IAAI,qBAAqB,CAAC;oBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,sBAAsB,CAAC,OAAO;oBACtC,cAAc,EAAE,IAAI;oBACpB,cAAc,EAAE,IAAI;oBACpB,aAAa,EAAE,CAAC;oBAChB,OAAO;oBACP,KAAK;oBACL,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YAED,qEAAqE;YACrE,mEAAmE;YACnE,mEAAmE;YACnE,4DAA4D;YAC5D,2BAA2B;YAC3B,MAAM,cAAc,GAAyB,IAAI,GAAG,EAAE,CAAC;YACvD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;YACjD,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,OAAO;oBAAE,SAAS;gBAC3B,cAAc,CAAC,GAAG,CAChB,GAAG,CAAC,OAAO,EACX,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAChE,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC7C,kBAAkB,CAAC,MAAM,CACvB,cAAc,EACd,OAAO,EACP,IAAI,CAAC,YAAY,EACjB,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAC5D,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,qBAAqB,CAAC;gBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,sBAAsB,CAAC,OAAO;gBACtC,cAAc,EAAE,EAAE,CAAC,SAAS;gBAC5B,cAAc;gBACd,aAAa,EAAE,EAAE,CAAC,aAAa;gBAC/B,OAAO;gBACP,KAAK;gBACL,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,UAAU;gBAAE,MAAM,GAAG,CAAC;YACzC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,uBAAuB,EACvC,4BAA4B,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzF,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EACjC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iCAAiC,CACrC,GAAsD;QAEtD,OAAO,IAAI,CAAC,aAAa,CAAC,GAAgC,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,GAA8B,EAC9B,eAA4C;QAE5C,qEAAqE;QACrE,kEAAkE;QAClE,6DAA6D;QAC7D,qEAAqE;QACrE,sEAAsE;QACtE,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,iIAAiI,EAC7I,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,oHAAoH,EAChI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,kLAAkL,EAC9L,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,sBAAsB,EACtC,GAAG,IAAI,CAAC,IAAI,sCAAsC,EAClD,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,eAAe,EAAE,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,cAAc,EAC9B,GAAG,IAAI,CAAC,IAAI,4BAA4B,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,EACjE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAC7C,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAW,GAAG,CAAC,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,GAAgC,CAAC;QAE9C,8EAA8E;QAC9E,kFAAkF;QAClF,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;QACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxE,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,oFAAoF,EAChG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,mEAAmE,EAC/E,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QACD,sEAAsE;QACtE,kEAAkE;QAClE,iEAAiE;QACjE,0DAA0D;QAC1D,IAAI,SAAS,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,oHAAoH,EAChI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAyB,QAAQ;YACtD,CAAC,CAAC,IAAI,CAAC,OAAQ,CAAC,KAAK,EAAE;YACvB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAgB,EAAE,CAAC,CAAC;QAE7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,cAAc,EAC9B,GAAG,IAAI,CAAC,IAAI,0CAA0C,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EACnE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CACzC,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,aAAa,CAAC,kCAAkC,OAAO,CAAC,CAAC,MAAM,GAAG,EAC9E,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACnB,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,aAAa,CAAC,sBAAsB,EAChD,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACrC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,aAAa,CAAC,YAAY,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EACpF,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,EAC1C,CAAC,CACF,CAAC;QACF,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjD,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CACpD,CAAC;QAEF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,cAAc,CACnD,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,CACrB,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,sCAAsC,WAAW,EAAE,EAC/D,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAChD,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAW,IAAI,CAAC,aAAa,IAAI,WAAW,CAAC;QAChE,MAAM,UAAU,GAAG,oBAAoB,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAChF,MAAM,kBAAkB,GACtB,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACtC,KAAK;YACL,UAAU,EAAE,eAAe;YAC3B,mBAAmB;YACnB,gBAAgB,EAAE,UAAU;YAC5B,kBAAkB;YAClB,gBAAgB,EAAE,gBAAgB,CAChC,UAAU,EACV,mBAAmB,EACnB,IAAI,CAAC,2BAA2B,CACjC;SACF,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACxD,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,4BAA4B,SAAS,CAAC,OAAO,gBAAgB,eAAe,OAAO,EAC/F,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;QACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE3E,MAAM,YAAY,GAA6B,EAAE,CAAC;QAClD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC,cAAc,CAAC;gBAClB,IAAI;gBACJ,IAAI;gBACJ,QAAQ;gBACR,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE;aACzC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,eAAe,GAAG,gBAAgB,CACtC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAC3C,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,EACtE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CACpC,CAAC;QAEF,OAAO,IAAI,uBAAuB,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;YAC3B,cAAc,EAAE,SAAS,CAAC,QAAQ;YAClC,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,mBAAmB;YACnB,eAAe;YACf,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,eAAe,EAAE,eAAe,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;YACzD,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAES,cAAc,CAAC,IAKxB;QACC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QACnD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEtD,MAAM,KAAK,GAAoC;YAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ;YACR,cAAc,EAAE,aAAa;SAC9B,CAAC;QACF,IACE,UAAU,KAAK,eAAe,CAAC,MAAM;YACrC,UAAU,KAAK,eAAe,CAAC,KAAK;YACpC,UAAU,KAAK,eAAe,CAAC,IAAI;YACnC,UAAU,KAAK,eAAe,CAAC,IAAI,EACnC,CAAC;YACD,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAES,KAAK,CAAC,cAAc,CAC5B,YAAgC,EAChC,YAAgC;QAEhC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,GAAG,IAAI,CAAC,IAAI,2CAA2C,YAAY,GAAG,EACtE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CACrD,YAAY,IAAI,IAAI,CAAC,sBAAsB,CAC5C,CAAC;QACF,OAAO,QAAQ,CAAC,YAAY,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAC,QAAkB;QAC/C,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7B,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;YAC/B,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,WAAW,GAAU,QAAQ,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAqB,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAkB;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,CAAC;IAES,KAAK,CAAC,uBAAuB,CACrC,KAA0C;QAE1C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,QAAQ,EACxB,GAAG,IAAI,CAAC,IAAI,uBAAuB,KAAK,CAAC,MAAM,mBAAmB,WAAW,CAAC,MAAM,YAAY,EAChG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAES,gBAAgB,CAAC,MAA2B;QACpD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,eAAe,KAAK,kCAAkC,CACvD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,MAAM,GAAG,GAA6D,CAAC;IAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;IACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,IAAI,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,6CAA6C;QAC7C,sEAAsE;QACtE,wEAAwE;QACxE,2EAA2E;QAC3E,kEAAkE;QAClE,mEAAmE;QACnE,oEAAoE;QACpE,iEAAiE;QACjE,oDAAoD;QACpD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,GAAW;IACzC,OAAO,GAAG;QACR,+DAA+D;QAC/D,6DAA6D;QAC7D,mDAAmD;SAClD,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC;QACrD,+BAA+B;SAC9B,OAAO,CAAC,8DAA8D,EAAE,OAAO,CAAC;QACjF,kCAAkC;SACjC,OAAO,CAAC,gDAAgD,EAAE,QAAQ,CAAC;QACpE,+DAA+D;QAC/D,qCAAqC;SACpC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC;QACzC,qEAAqE;SACpE,OAAO,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,KAAY,EAAE,YAAoB;IAC/D,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACvB,IAAI,KAAK,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAwB;IAC1C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,GAAG,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,IAAI,UAAU,CAClB,eAAe,CAAC,eAAe,EAC/B,eAAe,GAAG,CAAC,MAAM,gCAAgC,mBAAmB,EAAE,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BtcChain } from './btc/btc_chain.ts';
|
|
2
|
+
import { BitcoinChainFactoryOptions } from './btc/btc_chains.ts';
|
|
3
|
+
import { DogecoinChainFactoryOptions } from './doge/doge_chains.ts';
|
|
4
|
+
import { LitecoinChainFactoryOptions } from './ltc/ltc_chains.ts';
|
|
5
|
+
import { UtxoChain } from './utxo_chain.ts';
|
|
6
|
+
export declare const UtxoCoin: {
|
|
7
|
+
readonly Bitcoin: "bitcoin";
|
|
8
|
+
readonly BitcoinTestnet: "bitcoin-testnet";
|
|
9
|
+
readonly BitcoinSignet: "bitcoin-signet";
|
|
10
|
+
readonly BitcoinRegtest: "bitcoin-regtest";
|
|
11
|
+
readonly Litecoin: "litecoin";
|
|
12
|
+
readonly LitecoinTestnet: "litecoin-testnet";
|
|
13
|
+
readonly Dogecoin: "dogecoin";
|
|
14
|
+
readonly DogecoinTestnet: "dogecoin-testnet";
|
|
15
|
+
};
|
|
16
|
+
export type UtxoCoinName = (typeof UtxoCoin)[keyof typeof UtxoCoin];
|
|
17
|
+
export type UtxoChainFactoryOptions = (BitcoinChainFactoryOptions & {
|
|
18
|
+
coin: 'bitcoin' | 'bitcoin-testnet' | 'bitcoin-signet' | 'bitcoin-regtest';
|
|
19
|
+
}) | (LitecoinChainFactoryOptions & {
|
|
20
|
+
coin: 'litecoin' | 'litecoin-testnet';
|
|
21
|
+
}) | (DogecoinChainFactoryOptions & {
|
|
22
|
+
coin: 'dogecoin' | 'dogecoin-testnet';
|
|
23
|
+
});
|
|
24
|
+
export declare function utxoChainFromCoin(options: UtxoChainFactoryOptions): UtxoChain;
|
|
25
|
+
export declare function utxoChainFromSlip44(slip44CoinId: number, isMainnet: boolean, options: (BitcoinChainFactoryOptions & {
|
|
26
|
+
variant?: 'mainnet' | 'testnet' | 'signet' | 'regtest';
|
|
27
|
+
}) | LitecoinChainFactoryOptions | DogecoinChainFactoryOptions): UtxoChain;
|
|
28
|
+
export type { BtcChain };
|
|
29
|
+
//# sourceMappingURL=utxo_chains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxo_chains.d.ts","sourceRoot":"","sources":["../../utxo/utxo_chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,0BAA0B,EAK3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,2BAA2B,EAG5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAG5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEpE,MAAM,MAAM,uBAAuB,GAC/B,CAAC,0BAA0B,GAAG;IAAE,IAAI,EAAE,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,iBAAiB,CAAA;CAAE,CAAC,GAC7G,CAAC,2BAA2B,GAAG;IAAE,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAAA;CAAE,CAAC,GACzE,CAAC,2BAA2B,GAAG;IAAE,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAE9E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,CAuB7E;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,OAAO,EAClB,OAAO,EACH,CAAC,0BAA0B,GAAG;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC,GACzF,2BAA2B,GAC3B,2BAA2B,GAC9B,SAAS,CAgBX;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|