@vultisig/core-chain 2.14.1 → 2.15.1
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 +34 -0
- package/dist/chains/cosmos/gas.d.ts +13 -0
- package/dist/chains/cosmos/gas.d.ts.map +1 -1
- package/dist/chains/cosmos/gas.js +103 -0
- package/dist/chains/cosmos/gas.js.map +1 -1
- package/dist/chains/cosmos/staking/lcdQueries.d.ts +8 -2
- package/dist/chains/cosmos/staking/lcdQueries.d.ts.map +1 -1
- package/dist/chains/cosmos/staking/lcdQueries.js +24 -6
- package/dist/chains/cosmos/staking/lcdQueries.js.map +1 -1
- package/dist/chains/utxo/client/getUtxoAddressInfo.d.ts +4 -3
- package/dist/chains/utxo/client/getUtxoAddressInfo.d.ts.map +1 -1
- package/dist/chains/utxo/client/getUtxoAddressInfo.js +30 -3
- package/dist/chains/utxo/client/getUtxoAddressInfo.js.map +1 -1
- package/dist/chains/utxo/tx/getUtxos.d.ts.map +1 -1
- package/dist/chains/utxo/tx/getUtxos.js +1 -1
- package/dist/chains/utxo/tx/getUtxos.js.map +1 -1
- package/dist/chains/utxo/zcashBranchId.d.ts +6 -0
- package/dist/chains/utxo/zcashBranchId.d.ts.map +1 -0
- package/dist/chains/utxo/zcashBranchId.js +83 -0
- package/dist/chains/utxo/zcashBranchId.js.map +1 -0
- package/package.json +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# @vultisig/core-chain
|
|
2
2
|
|
|
3
|
+
## 2.15.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#709](https://github.com/vultisig/vultisig-sdk/pull/709) [`de621f3`](https://github.com/vultisig/vultisig-sdk/commit/de621f3fd2a8c1ca64e73f6fe64afb7d77fb3e43) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Resolve Cosmos fee amounts from live node min gas prices when available, keeping the existing static amounts as safe floors.
|
|
8
|
+
|
|
9
|
+
- [#712](https://github.com/vultisig/vultisig-sdk/pull/712) [`9439a61`](https://github.com/vultisig/vultisig-sdk/commit/9439a6194abf3533ad06aa84847c81b2af7fe8df) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Filter Blockchair UTXO selection to confirmed spendable outputs and request an explicit address-info UTXO limit.
|
|
10
|
+
|
|
11
|
+
- [#714](https://github.com/vultisig/vultisig-sdk/pull/714) [`625fb42`](https://github.com/vultisig/vultisig-sdk/commit/625fb4205f265587f66f447b4059543756ef1095) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Fetch the live Zcash ZIP-243 consensus branch ID for SDK signing and fail loudly instead of using a stale compiled fallback.
|
|
12
|
+
|
|
13
|
+
## 2.15.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- [#686](https://github.com/vultisig/vultisig-sdk/pull/686) [`b900fcf`](https://github.com/vultisig/vultisig-sdk/commit/b900fcf95709da28ea7add1ea144d126c9fbcd98) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - Add QBTC support to the Cosmos staking signing path and LCD query layer. QBTC
|
|
18
|
+
is a Cosmos-SDK chain (post-quantum testnet, ML-DSA-signed) but lives in
|
|
19
|
+
`OtherChain`, so it sat outside the staking helpers' typing and LCD root
|
|
20
|
+
resolution.
|
|
21
|
+
|
|
22
|
+
- `QBTCHelper.buildTxComponents` now consumes a `signData.signDirect` payload
|
|
23
|
+
verbatim — the `bodyBytes` / `authInfoBytes` already carry the ML-DSA pubkey
|
|
24
|
+
`Any`, gas and fee, so the initiator and every co-signing peer rebuild an
|
|
25
|
+
identical SignDoc hash. Previously it always rebuilt the body from
|
|
26
|
+
`transactionType` (MsgSend / IBC / Vote), which silently turned a staking
|
|
27
|
+
SignDoc into a `MsgSend`. `signAmino` is rejected (ML-DSA is
|
|
28
|
+
SIGN_MODE_DIRECT only). The normal send path (no `signData`) is unchanged.
|
|
29
|
+
- `chains/cosmos/staking/lcdQueries` exports a widened
|
|
30
|
+
`StakingChain = IbcEnabledCosmosChain | Chain.QBTC` and resolves the LCD root
|
|
31
|
+
through a helper that routes QBTC to `qbtcRestUrl` and every other staking
|
|
32
|
+
chain to `cosmosRpcUrl[chain]`.
|
|
33
|
+
|
|
34
|
+
Backward compatible: existing IBC-enabled staking chains route exactly as
|
|
35
|
+
before.
|
|
36
|
+
|
|
3
37
|
## 2.14.1
|
|
4
38
|
|
|
5
39
|
### Patch Changes
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import { IbcEnabledCosmosChain } from '../../Chain.js';
|
|
2
|
+
import type { CoinKey } from '../../coin/Coin.js';
|
|
2
3
|
export declare const cosmosGasRecord: Record<IbcEnabledCosmosChain, bigint>;
|
|
4
|
+
type FetchOpts = {
|
|
5
|
+
fetchImpl?: typeof fetch;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
};
|
|
8
|
+
type ParsedDecimal = {
|
|
9
|
+
numerator: bigint;
|
|
10
|
+
denominator: bigint;
|
|
11
|
+
};
|
|
12
|
+
export declare const getFeeAmountFromGasPrice: (gasLimit: bigint, gasPrice: ParsedDecimal) => bigint;
|
|
13
|
+
export declare const getMinGasPriceForDenom: (minimumGasPrice: string, targetDenom: string) => ParsedDecimal | undefined;
|
|
14
|
+
export declare const getCosmosFeeAmount: (coin: CoinKey<IbcEnabledCosmosChain>, opts?: FetchOpts) => Promise<bigint>;
|
|
15
|
+
export {};
|
|
3
16
|
//# sourceMappingURL=gas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/gas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,qBAAqB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/gas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAO9C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CASjE,CAAA;AAED,KAAK,SAAS,GAAG;IACf,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB,CAAA;AAMD,KAAK,aAAa,GAAG;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AA2BD,eAAO,MAAM,wBAAwB,GAAI,UAAU,MAAM,EAAE,UAAU,aAAa,KAAG,MAIpF,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,iBAAiB,MAAM,EAAE,aAAa,MAAM,KAAG,aAAa,GAAG,SAYrG,CAAA;AAyDD,eAAO,MAAM,kBAAkB,GAC7B,MAAM,OAAO,CAAC,qBAAqB,CAAC,EACpC,OAAM,SAAc,KACnB,OAAO,CAAC,MAAM,CAehB,CAAA"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { Chain } from '../../Chain.js';
|
|
2
|
+
import { cosmosFeeCoinDenom } from './cosmosFeeCoinDenom.js';
|
|
3
|
+
import { getCosmosGasLimit } from './cosmosGasLimitRecord.js';
|
|
4
|
+
import { cosmosRpcUrl } from './cosmosRpcUrl.js';
|
|
2
5
|
const defaultGas = 7500n;
|
|
3
6
|
export const cosmosGasRecord = {
|
|
4
7
|
[Chain.Cosmos]: defaultGas,
|
|
@@ -10,4 +13,104 @@ export const cosmosGasRecord = {
|
|
|
10
13
|
[Chain.Noble]: 30000n,
|
|
11
14
|
[Chain.Akash]: 200000n,
|
|
12
15
|
};
|
|
16
|
+
const minGasPriceConfigPath = '/cosmos/base/node/v1beta1/config';
|
|
17
|
+
const minGasPriceFetchTimeoutMs = 3_000;
|
|
18
|
+
const maxLiveFeeMultiplier = 10n;
|
|
19
|
+
const parseDecimal = (value) => {
|
|
20
|
+
if (!/^\d+(?:\.\d+)?$/.test(value))
|
|
21
|
+
return undefined;
|
|
22
|
+
const [whole, fraction = ''] = value.split('.');
|
|
23
|
+
const denominator = 10n ** BigInt(fraction.length);
|
|
24
|
+
const numerator = BigInt(`${whole}${fraction}`);
|
|
25
|
+
return { numerator, denominator };
|
|
26
|
+
};
|
|
27
|
+
const parseMinGasPriceEntry = (entry) => {
|
|
28
|
+
const match = entry.trim().match(/^(\d+(?:\.\d+)?)([a-zA-Z][a-zA-Z0-9/._:-]*)$/);
|
|
29
|
+
if (!match)
|
|
30
|
+
return undefined;
|
|
31
|
+
const [, amount, denom] = match;
|
|
32
|
+
const decimal = parseDecimal(amount);
|
|
33
|
+
if (!decimal)
|
|
34
|
+
return undefined;
|
|
35
|
+
return { ...decimal, denom };
|
|
36
|
+
};
|
|
37
|
+
export const getFeeAmountFromGasPrice = (gasLimit, gasPrice) => {
|
|
38
|
+
const total = gasLimit * gasPrice.numerator;
|
|
39
|
+
return (total + gasPrice.denominator - 1n) / gasPrice.denominator;
|
|
40
|
+
};
|
|
41
|
+
export const getMinGasPriceForDenom = (minimumGasPrice, targetDenom) => {
|
|
42
|
+
for (const entry of minimumGasPrice.split(',')) {
|
|
43
|
+
const parsed = parseMinGasPriceEntry(entry);
|
|
44
|
+
if (parsed?.denom.toLowerCase() === targetDenom.toLowerCase()) {
|
|
45
|
+
return {
|
|
46
|
+
numerator: parsed.numerator,
|
|
47
|
+
denominator: parsed.denominator,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
};
|
|
53
|
+
const getTimeoutController = (signal) => {
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const abort = () => controller.abort();
|
|
56
|
+
if (signal?.aborted) {
|
|
57
|
+
abort();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
controller,
|
|
64
|
+
cleanup: () => {
|
|
65
|
+
signal?.removeEventListener('abort', abort);
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
const fetchMinGasPrice = async (chain, { fetchImpl = fetch, signal } = {}) => {
|
|
70
|
+
const timeoutController = getTimeoutController(signal);
|
|
71
|
+
const timeout = setTimeout(() => timeoutController.controller.abort(), minGasPriceFetchTimeoutMs);
|
|
72
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
73
|
+
const rejectTimeout = () => reject(new Error(`Cosmos min gas config request timed out after ${minGasPriceFetchTimeoutMs}ms`));
|
|
74
|
+
if (timeoutController.controller.signal.aborted) {
|
|
75
|
+
rejectTimeout();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
timeoutController.controller.signal.addEventListener('abort', rejectTimeout, { once: true });
|
|
79
|
+
});
|
|
80
|
+
try {
|
|
81
|
+
return await Promise.race([
|
|
82
|
+
(async () => {
|
|
83
|
+
const response = await fetchImpl(`${cosmosRpcUrl[chain]}${minGasPriceConfigPath}`, {
|
|
84
|
+
signal: timeoutController.controller.signal,
|
|
85
|
+
});
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
throw new Error(`Cosmos ${chain} min gas config request failed: ${response.status}`);
|
|
88
|
+
}
|
|
89
|
+
const data = (await response.json());
|
|
90
|
+
return data.minimum_gas_price ?? '';
|
|
91
|
+
})(),
|
|
92
|
+
timeoutPromise,
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
clearTimeout(timeout);
|
|
97
|
+
timeoutController.cleanup();
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
export const getCosmosFeeAmount = async (coin, opts = {}) => {
|
|
101
|
+
const floor = cosmosGasRecord[coin.chain];
|
|
102
|
+
try {
|
|
103
|
+
const minimumGasPrice = await fetchMinGasPrice(coin.chain, opts);
|
|
104
|
+
const gasPrice = getMinGasPriceForDenom(minimumGasPrice, cosmosFeeCoinDenom[coin.chain]);
|
|
105
|
+
if (!gasPrice)
|
|
106
|
+
return floor;
|
|
107
|
+
const computedFee = getFeeAmountFromGasPrice(getCosmosGasLimit(coin), gasPrice);
|
|
108
|
+
if (computedFee > floor * maxLiveFeeMultiplier)
|
|
109
|
+
return floor;
|
|
110
|
+
return computedFee > floor ? computedFee : floor;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return floor;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
13
116
|
//# sourceMappingURL=gas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/gas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAyB,MAAM,aAAa,CAAA;AAE1D,MAAM,UAAU,GAAG,KAAK,CAAA;AAExB,MAAM,CAAC,MAAM,eAAe,GAA0C;IACpE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU;IAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK;IACtB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU;IAC1B,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,UAAU;IACzB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,iBAAiB;IAC/B,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,UAAU;IAChC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM;IACrB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO;CACvB,CAAA"}
|
|
1
|
+
{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/gas.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Generic across every cosmos-sdk chain we support — same paths, just
|
|
9
9
|
* different LCD root. No chain-specific branching.
|
|
10
10
|
*/
|
|
11
|
-
import { IbcEnabledCosmosChain } from '@vultisig/core-chain/Chain';
|
|
11
|
+
import { Chain, IbcEnabledCosmosChain } from '@vultisig/core-chain/Chain';
|
|
12
12
|
export type Coin = {
|
|
13
13
|
denom: string;
|
|
14
14
|
amount: string;
|
|
@@ -123,8 +123,14 @@ export type VestingAccount = PeriodicVestingAccount | ContinuousVestingAccount |
|
|
|
123
123
|
* make sense on `IbcEnabledCosmosChain`. Tighten the type at the boundary
|
|
124
124
|
* so callers can't accidentally hit `/cosmos/staking/...` against a
|
|
125
125
|
* THORChain LCD that doesn't serve it.
|
|
126
|
+
*
|
|
127
|
+
* QBTC is a Cosmos-SDK chain too (post-quantum testnet, MLDSA-signed) and
|
|
128
|
+
* serves the same x/staking + x/distribution endpoints, but it lives in
|
|
129
|
+
* `OtherChain` rather than `CosmosChain` (WalletCore can't sign it), so it
|
|
130
|
+
* isn't a key of `cosmosRpcUrl`. Include it explicitly and resolve its LCD
|
|
131
|
+
* root via `qbtcRestUrl`.
|
|
126
132
|
*/
|
|
127
|
-
type StakingChain =
|
|
133
|
+
export type StakingChain = IbcEnabledCosmosChain | typeof Chain.QBTC;
|
|
128
134
|
export declare const getDelegationsUrl: (chain: StakingChain, delegatorAddress: string) => string;
|
|
129
135
|
export declare const getUnbondingDelegationsUrl: (chain: StakingChain, delegatorAddress: string) => string;
|
|
130
136
|
export declare const getDelegatorRewardsUrl: (chain: StakingChain, delegatorAddress: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lcdQueries.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/staking/lcdQueries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"lcdQueries.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/staking/lcdQueries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LCD query helpers for the cosmos-sdk staking + distribution modules.
|
|
3
|
+
*
|
|
4
|
+
* Read-only HTTP fetches against the per-chain `cosmosRpcUrl` (which actually
|
|
5
|
+
* points at the LCD/REST endpoint, despite the dict name). All endpoints are
|
|
6
|
+
* unauthenticated, public, and rate-limited at most by the upstream provider.
|
|
7
|
+
*
|
|
8
|
+
* Generic across every cosmos-sdk chain we support — same paths, just
|
|
9
|
+
* different LCD root. No chain-specific branching.
|
|
10
|
+
*/
|
|
11
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
1
12
|
import { cosmosRpcUrl } from '../cosmosRpcUrl.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
13
|
+
import { qbtcRestUrl } from '../qbtc/tendermintRpcUrl.js';
|
|
14
|
+
/**
|
|
15
|
+
* LCD/REST root for a staking chain. QBTC isn't keyed in `cosmosRpcUrl`, so
|
|
16
|
+
* route it to its dedicated REST endpoint; every other staking chain is a
|
|
17
|
+
* `CosmosChain` and indexes `cosmosRpcUrl` directly.
|
|
18
|
+
*/
|
|
19
|
+
const stakingLcdRoot = (chain) => (chain === Chain.QBTC ? qbtcRestUrl : cosmosRpcUrl[chain]);
|
|
20
|
+
export const getDelegationsUrl = (chain, delegatorAddress) => `${stakingLcdRoot(chain)}/cosmos/staking/v1beta1/delegations/${delegatorAddress}`;
|
|
21
|
+
export const getUnbondingDelegationsUrl = (chain, delegatorAddress) => `${stakingLcdRoot(chain)}/cosmos/staking/v1beta1/delegators/${delegatorAddress}/unbonding_delegations`;
|
|
22
|
+
export const getDelegatorRewardsUrl = (chain, delegatorAddress) => `${stakingLcdRoot(chain)}/cosmos/distribution/v1beta1/delegators/${delegatorAddress}/rewards`;
|
|
23
|
+
export const getAuthAccountUrl = (chain, address) => `${stakingLcdRoot(chain)}/cosmos/auth/v1beta1/accounts/${address}`;
|
|
6
24
|
/**
|
|
7
25
|
* Validator list endpoint. Optional `status` filter is the canonical way to
|
|
8
26
|
* exclude jailed / unbonding validators from the picker — without it, large
|
|
@@ -18,9 +36,9 @@ export const getValidatorsUrl = (chain, opts = {}) => {
|
|
|
18
36
|
if (opts.paginationKey)
|
|
19
37
|
params.set('pagination.key', opts.paginationKey);
|
|
20
38
|
const qs = params.toString();
|
|
21
|
-
return `${
|
|
39
|
+
return `${stakingLcdRoot(chain)}/cosmos/staking/v1beta1/validators${qs ? `?${qs}` : ''}`;
|
|
22
40
|
};
|
|
23
|
-
export const getValidatorUrl = (chain, validatorAddress) => `${
|
|
41
|
+
export const getValidatorUrl = (chain, validatorAddress) => `${stakingLcdRoot(chain)}/cosmos/staking/v1beta1/validators/${validatorAddress}`;
|
|
24
42
|
async function lcdGet(url, opts = {}) {
|
|
25
43
|
const f = opts.fetchImpl ?? fetch;
|
|
26
44
|
const res = await f(url, { signal: opts.signal });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lcdQueries.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/staking/lcdQueries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lcdQueries.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/staking/lcdQueries.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,9 @@ import { ChainAccount } from '@vultisig/core-chain/ChainAccount';
|
|
|
3
3
|
type BlockchairAddressResponse = {
|
|
4
4
|
data: {
|
|
5
5
|
[address: string]: {
|
|
6
|
-
address
|
|
6
|
+
address?: {
|
|
7
7
|
balance: number;
|
|
8
|
+
unspent_output_count?: number;
|
|
8
9
|
};
|
|
9
10
|
utxo: {
|
|
10
11
|
block_id: number;
|
|
@@ -15,11 +16,11 @@ type BlockchairAddressResponse = {
|
|
|
15
16
|
recipient: string;
|
|
16
17
|
script_hex: string;
|
|
17
18
|
is_from_coinbase: boolean;
|
|
18
|
-
is_spendable
|
|
19
|
+
is_spendable?: boolean;
|
|
19
20
|
}[];
|
|
20
21
|
};
|
|
21
22
|
};
|
|
22
23
|
};
|
|
23
|
-
export declare const getUtxoAddressInfo: (
|
|
24
|
+
export declare const getUtxoAddressInfo: (account: ChainAccount<UtxoChain>) => Promise<BlockchairAddressResponse>;
|
|
24
25
|
export {};
|
|
25
26
|
//# sourceMappingURL=getUtxoAddressInfo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUtxoAddressInfo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/client/getUtxoAddressInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAKhE,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE;QACJ,CAAC,OAAO,EAAE,MAAM,GAAG;YACjB,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"getUtxoAddressInfo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/client/getUtxoAddressInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAKhE,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE;QACJ,CAAC,OAAO,EAAE,MAAM,GAAG;YACjB,OAAO,CAAC,EAAE;gBACR,OAAO,EAAE,MAAM,CAAA;gBACf,oBAAoB,CAAC,EAAE,MAAM,CAAA;aAC9B,CAAA;YACD,IAAI,EAAE;gBACJ,QAAQ,EAAE,MAAM,CAAA;gBAChB,gBAAgB,EAAE,MAAM,CAAA;gBACxB,KAAK,EAAE,MAAM,CAAA;gBACb,KAAK,EAAE,MAAM,CAAA;gBACb,SAAS,EAAE,MAAM,CAAA;gBACjB,SAAS,EAAE,MAAM,CAAA;gBACjB,UAAU,EAAE,MAAM,CAAA;gBAClB,gBAAgB,EAAE,OAAO,CAAA;gBACzB,YAAY,CAAC,EAAE,OAAO,CAAA;aACvB,EAAE,CAAA;SACJ,CAAA;KACF,CAAA;CACF,CAAA;AAYD,eAAO,MAAM,kBAAkB,GAAU,SAAS,YAAY,CAAC,SAAS,CAAC,uCAsCxE,CAAA"}
|
|
@@ -1,7 +1,34 @@
|
|
|
1
1
|
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
2
2
|
import { getBlockchairBaseUrl } from './getBlockchairBaseUrl.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
const blockchairUtxoPageSize = 1_000;
|
|
4
|
+
const getAddressInfoUrl = ({ address, chain, offset, }) => `${getBlockchairBaseUrl(chain)}/dashboards/address/${address}?limit=${blockchairUtxoPageSize}&offset=${offset}`;
|
|
5
|
+
export const getUtxoAddressInfo = async (account) => {
|
|
6
|
+
const utxo = [];
|
|
7
|
+
let firstPage;
|
|
8
|
+
let expectedUtxoCount;
|
|
9
|
+
for (let offset = 0;; offset += blockchairUtxoPageSize) {
|
|
10
|
+
const page = await queryUrl(getAddressInfoUrl({ ...account, offset }));
|
|
11
|
+
firstPage ??= page;
|
|
12
|
+
const entry = page.data[account.address];
|
|
13
|
+
const pageUtxos = entry?.utxo ?? [];
|
|
14
|
+
utxo.push(...pageUtxos);
|
|
15
|
+
expectedUtxoCount ??= entry?.address?.unspent_output_count;
|
|
16
|
+
const hasAllReportedUtxos = expectedUtxoCount !== undefined && utxo.length >= expectedUtxoCount;
|
|
17
|
+
const hasNoMorePages = expectedUtxoCount === undefined && pageUtxos.length < blockchairUtxoPageSize;
|
|
18
|
+
if (expectedUtxoCount !== undefined && pageUtxos.length === 0 && utxo.length < expectedUtxoCount) {
|
|
19
|
+
throw new Error(`Blockchair returned ${utxo.length} UTXOs for ${account.chain}:${account.address}, expected ${expectedUtxoCount}`);
|
|
20
|
+
}
|
|
21
|
+
if (hasAllReportedUtxos || pageUtxos.length === 0 || hasNoMorePages) {
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (!firstPage) {
|
|
26
|
+
throw new Error(`Failed to fetch UTXO address info for ${account.chain}:${account.address}`);
|
|
27
|
+
}
|
|
28
|
+
const firstEntry = firstPage.data[account.address];
|
|
29
|
+
if (firstEntry) {
|
|
30
|
+
firstEntry.utxo = utxo;
|
|
31
|
+
}
|
|
32
|
+
return firstPage;
|
|
6
33
|
};
|
|
7
34
|
//# sourceMappingURL=getUtxoAddressInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUtxoAddressInfo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/client/getUtxoAddressInfo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"getUtxoAddressInfo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/client/getUtxoAddressInfo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAwB7D,MAAM,sBAAsB,GAAG,KAAK,CAAA;AAEpC,MAAM,iBAAiB,GAAG,CAAC,EACzB,OAAO,EACP,KAAK,EACL,MAAM,GAGP,EAAE,EAAE,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,uBAAuB,OAAO,UAAU,sBAAsB,WAAW,MAAM,EAAE,CAAA;AAErH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,OAAgC,EAAE,EAAE;IAC3E,MAAM,IAAI,GAAsD,EAAE,CAAA;IAClE,IAAI,SAAgD,CAAA;IACpD,IAAI,iBAAqC,CAAA;IAEzC,KAAK,IAAI,MAAM,GAAG,CAAC,GAAI,MAAM,IAAI,sBAAsB,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAA4B,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QACjG,SAAS,KAAK,IAAI,CAAA;QAElB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAA;QAEvB,iBAAiB,KAAK,KAAK,EAAE,OAAO,EAAE,oBAAoB,CAAA;QAC1D,MAAM,mBAAmB,GAAG,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,iBAAiB,CAAA;QAC/F,MAAM,cAAc,GAAG,iBAAiB,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,sBAAsB,CAAA;QAEnG,IAAI,iBAAiB,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YACjG,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,CAAC,MAAM,cAAc,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,cAAc,iBAAiB,EAAE,CAClH,CAAA;QACH,CAAC;QAED,IAAI,mBAAmB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;YACpE,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,GAAG,IAAI,CAAA;IACxB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUtxos.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/tx/getUtxos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,eAAO,MAAM,QAAQ,GAAU,SAAS,YAAY,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"getUtxos.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/tx/getUtxos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,eAAO,MAAM,QAAQ,GAAU,SAAS,YAAY,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,cAAc,EAAE,CAkBzF,CAAA"}
|
|
@@ -9,7 +9,7 @@ export const getUtxos = async (account) => {
|
|
|
9
9
|
const { data } = await getUtxoAddressInfo(account);
|
|
10
10
|
const { utxo } = data[account.address];
|
|
11
11
|
return utxo
|
|
12
|
-
.filter(({ value }) => value > minUtxo[account.chain])
|
|
12
|
+
.filter(({ block_id, is_spendable, value }) => value > minUtxo[account.chain] && is_spendable !== false && block_id > 0)
|
|
13
13
|
.map(({ transaction_hash, value, index }) => ({
|
|
14
14
|
hash: transaction_hash,
|
|
15
15
|
amount: BigInt(value),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUtxos.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/tx/getUtxos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,gBAAgB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAKpC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAgC,EAA6B,EAAE;IAC5F,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAElD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAEtC,OAAO,IAAI;SACR,MAAM,
|
|
1
|
+
{"version":3,"file":"getUtxos.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/tx/getUtxos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,gBAAgB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAKpC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAgC,EAA6B,EAAE;IAC5F,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAElD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAEtC,OAAO,IAAI;SACR,MAAM,CACL,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,YAAY,KAAK,KAAK,IAAI,QAAQ,GAAG,CAAC,CAChH;SACA,GAAG,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACrB,KAAK;KACN,CAAC,CAAC,CAAA;AACP,CAAC,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const zcashBranchIdToWalletCoreHex: (bigEndianHex: string) => string;
|
|
2
|
+
export declare const zcashBranchIdToNumber: (bigEndianHex: string) => number;
|
|
3
|
+
export declare const getZcashBranchIdHex: () => Promise<string>;
|
|
4
|
+
export declare const getZcashBranchId: () => Promise<number>;
|
|
5
|
+
export declare const resetZcashBranchIdCacheForTests: () => void;
|
|
6
|
+
//# sourceMappingURL=zcashBranchId.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zcashBranchId.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/utxo/zcashBranchId.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,4BAA4B,GAAI,cAAc,MAAM,KAAG,MAGnE,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,cAAc,MAAM,KAAG,MACP,CAAA;AAyCtD,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAAC,MAAM,CAqB1D,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAIvD,CAAA;AAED,eAAO,MAAM,+BAA+B,YAG3C,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { rootApiUrl } from '@vultisig/core-config';
|
|
2
|
+
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
3
|
+
const cacheTtlMs = 60 * 60 * 1000;
|
|
4
|
+
const rpcTimeoutMs = 10_000;
|
|
5
|
+
const zcashRpcUrl = `${rootApiUrl}/zcash`;
|
|
6
|
+
let cache;
|
|
7
|
+
let inFlight;
|
|
8
|
+
const assertFourByteHex = (hex) => {
|
|
9
|
+
if (!/^[0-9a-fA-F]{8}$/.test(hex)) {
|
|
10
|
+
throw new Error(`Invalid Zcash consensus branch id: expected 4-byte hex, received "${hex}"`);
|
|
11
|
+
}
|
|
12
|
+
return hex.toLowerCase();
|
|
13
|
+
};
|
|
14
|
+
export const zcashBranchIdToWalletCoreHex = (bigEndianHex) => {
|
|
15
|
+
const hex = assertFourByteHex(bigEndianHex);
|
|
16
|
+
return hex.match(/../g).reverse().join('');
|
|
17
|
+
};
|
|
18
|
+
export const zcashBranchIdToNumber = (bigEndianHex) => Number.parseInt(assertFourByteHex(bigEndianHex), 16);
|
|
19
|
+
const fetchZcashBranchIdHex = async () => {
|
|
20
|
+
const controller = new AbortController();
|
|
21
|
+
const timeout = setTimeout(() => {
|
|
22
|
+
controller.abort();
|
|
23
|
+
}, rpcTimeoutMs);
|
|
24
|
+
let response;
|
|
25
|
+
try {
|
|
26
|
+
response = await queryUrl(zcashRpcUrl, {
|
|
27
|
+
body: {
|
|
28
|
+
jsonrpc: '1.0',
|
|
29
|
+
id: 'vultisig-sdk',
|
|
30
|
+
method: 'getblockchaininfo',
|
|
31
|
+
params: [],
|
|
32
|
+
},
|
|
33
|
+
signal: controller.signal,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (controller.signal.aborted) {
|
|
38
|
+
throw new Error('Zcash RPC timed out while fetching consensus branch id');
|
|
39
|
+
}
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
}
|
|
45
|
+
if (response.error) {
|
|
46
|
+
throw new Error(`Zcash RPC error: ${response.error.message ?? 'unknown error'}`);
|
|
47
|
+
}
|
|
48
|
+
const nextBlock = response.result?.consensus?.nextblock;
|
|
49
|
+
if (!nextBlock) {
|
|
50
|
+
throw new Error('Zcash RPC response is missing consensus.nextblock');
|
|
51
|
+
}
|
|
52
|
+
return zcashBranchIdToWalletCoreHex(nextBlock);
|
|
53
|
+
};
|
|
54
|
+
export const getZcashBranchIdHex = async () => {
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
if (cache && cache.expiresAt > now) {
|
|
57
|
+
return cache.value;
|
|
58
|
+
}
|
|
59
|
+
if (!inFlight) {
|
|
60
|
+
inFlight = fetchZcashBranchIdHex()
|
|
61
|
+
.then(value => {
|
|
62
|
+
cache = {
|
|
63
|
+
value,
|
|
64
|
+
expiresAt: Date.now() + cacheTtlMs,
|
|
65
|
+
};
|
|
66
|
+
return value;
|
|
67
|
+
})
|
|
68
|
+
.finally(() => {
|
|
69
|
+
inFlight = undefined;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return inFlight;
|
|
73
|
+
};
|
|
74
|
+
export const getZcashBranchId = async () => {
|
|
75
|
+
const walletCoreHex = await getZcashBranchIdHex();
|
|
76
|
+
const bigEndianHex = walletCoreHex.match(/../g).reverse().join('');
|
|
77
|
+
return zcashBranchIdToNumber(bigEndianHex);
|
|
78
|
+
};
|
|
79
|
+
export const resetZcashBranchIdCacheForTests = () => {
|
|
80
|
+
cache = undefined;
|
|
81
|
+
inFlight = undefined;
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=zcashBranchId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zcashBranchId.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/utxo/zcashBranchId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AACjC,MAAM,YAAY,GAAG,MAAM,CAAA;AAC3B,MAAM,WAAW,GAAG,GAAG,UAAU,QAAQ,CAAA;AAkBzC,IAAI,KAAwB,CAAA;AAC5B,IAAI,QAAqC,CAAA;AAEzC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAU,EAAE;IAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,qEAAqE,GAAG,GAAG,CAAC,CAAA;IAC9F,CAAC;IAED,OAAO,GAAG,CAAC,WAAW,EAAE,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,YAAoB,EAAU,EAAE;IAC3E,MAAM,GAAG,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAC3C,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,YAAoB,EAAU,EAAE,CACpE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;AAEtD,MAAM,qBAAqB,GAAG,KAAK,IAAqB,EAAE;IACxD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC,EAAE,YAAY,CAAC,CAAA;IAEhB,IAAI,QAAqC,CAAA;IACzC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAA8B,WAAW,EAAE;YAClE,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,cAAc;gBAClB,MAAM,EAAE,mBAAmB;gBAC3B,MAAM,EAAE,EAAE;aACX;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;QAC3E,CAAC;QAED,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAA;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,4BAA4B,CAAC,SAAS,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,IAAqB,EAAE;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,qBAAqB,EAAE;aAC/B,IAAI,CAAC,KAAK,CAAC,EAAE;YACZ,KAAK,GAAG;gBACN,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU;aACnC,CAAA;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,GAAG,SAAS,CAAA;QACtB,CAAC,CAAC,CAAA;IACN,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAqB,EAAE;IAC1D,MAAM,aAAa,GAAG,MAAM,mBAAmB,EAAE,CAAA;IACjD,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnE,OAAO,qBAAqB,CAAC,YAAY,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,EAAE;IAClD,KAAK,GAAG,SAAS,CAAA;IACjB,QAAQ,GAAG,SAAS,CAAA;AACtB,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vultisig/core-chain",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.15.1",
|
|
4
4
|
"description": "Blockchain chain logic shared across Vultisig clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -785,6 +785,11 @@
|
|
|
785
785
|
"import": "./dist/chains/utxo/tx/UtxoScriptType.js",
|
|
786
786
|
"default": "./dist/chains/utxo/tx/UtxoScriptType.js"
|
|
787
787
|
},
|
|
788
|
+
"./chains/utxo/zcashBranchId": {
|
|
789
|
+
"types": "./dist/chains/utxo/zcashBranchId.d.ts",
|
|
790
|
+
"import": "./dist/chains/utxo/zcashBranchId.js",
|
|
791
|
+
"default": "./dist/chains/utxo/zcashBranchId.js"
|
|
792
|
+
},
|
|
788
793
|
"./coin/AccountCoin": {
|
|
789
794
|
"types": "./dist/coin/AccountCoin.d.ts",
|
|
790
795
|
"import": "./dist/coin/AccountCoin.js",
|