@vultisig/core-chain 1.0.0 → 1.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/CHANGELOG.md +52 -0
- package/dist/amount/toChainAmount.d.ts +6 -1
- package/dist/amount/toChainAmount.d.ts.map +1 -1
- package/dist/amount/toChainAmount.js +88 -0
- package/dist/amount/toChainAmount.js.map +1 -1
- package/dist/chains/cardano/asset/cardanoAssetId.d.ts +14 -0
- package/dist/chains/cardano/asset/cardanoAssetId.d.ts.map +1 -0
- package/dist/chains/cardano/asset/cardanoAssetId.js +19 -0
- package/dist/chains/cardano/asset/cardanoAssetId.js.map +1 -0
- package/dist/chains/cardano/client/getCardanoAddressAssets.d.ts +10 -0
- package/dist/chains/cardano/client/getCardanoAddressAssets.d.ts.map +1 -0
- package/dist/chains/cardano/client/getCardanoAddressAssets.js +19 -0
- package/dist/chains/cardano/client/getCardanoAddressAssets.js.map +1 -0
- package/dist/chains/cardano/client/getCardanoAssetInfo.d.ts +23 -0
- package/dist/chains/cardano/client/getCardanoAssetInfo.d.ts.map +1 -0
- package/dist/chains/cardano/client/getCardanoAssetInfo.js +16 -0
- package/dist/chains/cardano/client/getCardanoAssetInfo.js.map +1 -0
- package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.d.ts +20 -0
- package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.d.ts.map +1 -0
- package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.js +22 -0
- package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.js.map +1 -0
- package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.d.ts +14 -0
- package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.d.ts.map +1 -0
- package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.js +28 -0
- package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/BtcAddressType.d.ts +7 -0
- package/dist/chains/cosmos/qbtc/claim/BtcAddressType.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/BtcAddressType.js +9 -0
- package/dist/chains/cosmos/qbtc/claim/BtcAddressType.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.d.ts +8 -0
- package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.js +2 -0
- package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.d.ts +25 -0
- package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.js +43 -0
- package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.d.ts +26 -0
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.js +57 -0
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.d.ts +49 -0
- package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js +85 -0
- package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.d.ts +14 -0
- package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.js +31 -0
- package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.d.ts +3 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.js +13 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.d.ts +14 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.js +22 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.js.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/proofService.d.ts +50 -0
- package/dist/chains/cosmos/qbtc/claim/proofService.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/claim/proofService.js +71 -0
- package/dist/chains/cosmos/qbtc/claim/proofService.js.map +1 -0
- package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.d.ts +1 -2
- package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.d.ts.map +1 -1
- package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.js +13 -9
- package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.js.map +1 -1
- package/dist/chains/cosmos/qbtc/tendermintRpcUrl.d.ts +3 -5
- package/dist/chains/cosmos/qbtc/tendermintRpcUrl.d.ts.map +1 -1
- package/dist/chains/cosmos/qbtc/tendermintRpcUrl.js +3 -5
- package/dist/chains/cosmos/qbtc/tendermintRpcUrl.js.map +1 -1
- package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.d.ts +15 -0
- package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.d.ts.map +1 -0
- package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.js +22 -0
- package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/halts.d.ts +56 -0
- package/dist/chains/cosmos/thor/lp/halts.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/halts.js +95 -0
- package/dist/chains/cosmos/thor/lp/halts.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/index.d.ts +45 -0
- package/dist/chains/cosmos/thor/lp/index.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/index.js +12 -0
- package/dist/chains/cosmos/thor/lp/index.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/lockup.d.ts +47 -0
- package/dist/chains/cosmos/thor/lp/lockup.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/lockup.js +56 -0
- package/dist/chains/cosmos/thor/lp/lockup.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/lpChainMap.d.ts +25 -0
- package/dist/chains/cosmos/thor/lp/lpChainMap.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/lpChainMap.js +30 -0
- package/dist/chains/cosmos/thor/lp/lpChainMap.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/math.d.ts +129 -0
- package/dist/chains/cosmos/thor/lp/math.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/math.js +227 -0
- package/dist/chains/cosmos/thor/lp/math.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/memberPool.d.ts +4 -0
- package/dist/chains/cosmos/thor/lp/memberPool.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/memberPool.js +24 -0
- package/dist/chains/cosmos/thor/lp/memberPool.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/memo.d.ts +62 -0
- package/dist/chains/cosmos/thor/lp/memo.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/memo.js +62 -0
- package/dist/chains/cosmos/thor/lp/memo.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/pairing.d.ts +30 -0
- package/dist/chains/cosmos/thor/lp/pairing.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/pairing.js +44 -0
- package/dist/chains/cosmos/thor/lp/pairing.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/payload.d.ts +66 -0
- package/dist/chains/cosmos/thor/lp/payload.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/payload.js +49 -0
- package/dist/chains/cosmos/thor/lp/payload.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/pools.d.ts +46 -0
- package/dist/chains/cosmos/thor/lp/pools.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/pools.js +85 -0
- package/dist/chains/cosmos/thor/lp/pools.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/position.d.ts +23 -0
- package/dist/chains/cosmos/thor/lp/position.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/position.js +105 -0
- package/dist/chains/cosmos/thor/lp/position.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/positions.d.ts +15 -0
- package/dist/chains/cosmos/thor/lp/positions.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/positions.js +47 -0
- package/dist/chains/cosmos/thor/lp/positions.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/types.d.ts +45 -0
- package/dist/chains/cosmos/thor/lp/types.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/types.js +2 -0
- package/dist/chains/cosmos/thor/lp/types.js.map +1 -0
- package/dist/chains/cosmos/thor/lp/validation.d.ts +38 -0
- package/dist/chains/cosmos/thor/lp/validation.d.ts.map +1 -0
- package/dist/chains/cosmos/thor/lp/validation.js +100 -0
- package/dist/chains/cosmos/thor/lp/validation.js.map +1 -0
- package/dist/chains/polkadot/dapp/PolkadotSignerPayload.d.ts +16 -0
- package/dist/chains/polkadot/dapp/PolkadotSignerPayload.d.ts.map +1 -0
- package/dist/chains/polkadot/dapp/PolkadotSignerPayload.js +2 -0
- package/dist/chains/polkadot/dapp/PolkadotSignerPayload.js.map +1 -0
- package/dist/chains/polkadot/dapp/constructSigningPayload.d.ts +12 -0
- package/dist/chains/polkadot/dapp/constructSigningPayload.d.ts.map +1 -0
- package/dist/chains/polkadot/dapp/constructSigningPayload.js +30 -0
- package/dist/chains/polkadot/dapp/constructSigningPayload.js.map +1 -0
- package/dist/chains/solana/getDynamicPriorityFeePrice.d.ts +3 -0
- package/dist/chains/solana/getDynamicPriorityFeePrice.d.ts.map +1 -0
- package/dist/chains/solana/getDynamicPriorityFeePrice.js +20 -0
- package/dist/chains/solana/getDynamicPriorityFeePrice.js.map +1 -0
- package/dist/chains/solana/jito.d.ts +6 -0
- package/dist/chains/solana/jito.d.ts.map +1 -0
- package/dist/chains/solana/jito.js +40 -0
- package/dist/chains/solana/jito.js.map +1 -0
- package/dist/chains/ton/address.d.ts +6 -0
- package/dist/chains/ton/address.d.ts.map +1 -0
- package/dist/chains/ton/address.js +17 -0
- package/dist/chains/ton/address.js.map +1 -0
- package/dist/chains/ton/api.d.ts +7 -2
- package/dist/chains/ton/api.d.ts.map +1 -1
- package/dist/chains/ton/api.js +16 -3
- package/dist/chains/ton/api.js.map +1 -1
- package/dist/chains/utxo/client/getDashUtxos.d.ts +3 -0
- package/dist/chains/utxo/client/getDashUtxos.d.ts.map +1 -0
- package/dist/chains/utxo/client/getDashUtxos.js +28 -0
- package/dist/chains/utxo/client/getDashUtxos.js.map +1 -0
- package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.d.ts +21 -0
- package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.d.ts.map +1 -0
- package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.js +182 -0
- package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.js.map +1 -0
- package/dist/chains/utxo/tx/getPsbtTransferInfo.js +1 -1
- package/dist/chains/utxo/tx/getPsbtTransferInfo.js.map +1 -1
- package/dist/chains/utxo/tx/getUtxos.d.ts.map +1 -1
- package/dist/chains/utxo/tx/getUtxos.js +5 -0
- package/dist/chains/utxo/tx/getUtxos.js.map +1 -1
- package/dist/coin/balance/resolvers/cardano.d.ts +1 -0
- package/dist/coin/balance/resolvers/cardano.d.ts.map +1 -1
- package/dist/coin/balance/resolvers/cardano.js +12 -0
- package/dist/coin/balance/resolvers/cardano.js.map +1 -1
- package/dist/coin/balance/resolvers/qbtc.d.ts.map +1 -1
- package/dist/coin/balance/resolvers/qbtc.js +6 -5
- package/dist/coin/balance/resolvers/qbtc.js.map +1 -1
- package/dist/coin/balance/resolvers/sui.d.ts.map +1 -1
- package/dist/coin/balance/resolvers/sui.js +1 -0
- package/dist/coin/balance/resolvers/sui.js.map +1 -1
- package/dist/coin/balance/resolvers/ton.d.ts.map +1 -1
- package/dist/coin/balance/resolvers/ton.js +11 -2
- package/dist/coin/balance/resolvers/ton.js.map +1 -1
- package/dist/coin/find/CoinFinderChainKind.d.ts +1 -1
- package/dist/coin/find/CoinFinderChainKind.d.ts.map +1 -1
- package/dist/coin/find/CoinFinderChainKind.js +1 -1
- package/dist/coin/find/CoinFinderChainKind.js.map +1 -1
- package/dist/coin/find/index.d.ts.map +1 -1
- package/dist/coin/find/index.js +2 -0
- package/dist/coin/find/index.js.map +1 -1
- package/dist/coin/find/resolvers/cardano.d.ts +5 -0
- package/dist/coin/find/resolvers/cardano.d.ts.map +1 -0
- package/dist/coin/find/resolvers/cardano.js +17 -0
- package/dist/coin/find/resolvers/cardano.js.map +1 -0
- package/dist/coin/knownTokens/index.d.ts.map +1 -1
- package/dist/coin/knownTokens/index.js +74 -0
- package/dist/coin/knownTokens/index.js.map +1 -1
- package/dist/coin/token/metadata/chains.d.ts +1 -1
- package/dist/coin/token/metadata/chains.d.ts.map +1 -1
- package/dist/coin/token/metadata/chains.js +1 -0
- package/dist/coin/token/metadata/chains.js.map +1 -1
- package/dist/coin/token/metadata/index.d.ts.map +1 -1
- package/dist/coin/token/metadata/index.js +2 -0
- package/dist/coin/token/metadata/index.js.map +1 -1
- package/dist/coin/token/metadata/resolvers/cardano.d.ts +8 -0
- package/dist/coin/token/metadata/resolvers/cardano.d.ts.map +1 -0
- package/dist/coin/token/metadata/resolvers/cardano.js +20 -0
- package/dist/coin/token/metadata/resolvers/cardano.js.map +1 -0
- package/dist/swap/native/utils/getNativeSwapDecimals.d.ts +8 -0
- package/dist/swap/native/utils/getNativeSwapDecimals.d.ts.map +1 -1
- package/dist/swap/native/utils/getNativeSwapDecimals.js +19 -4
- package/dist/swap/native/utils/getNativeSwapDecimals.js.map +1 -1
- package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/qbtc.js +22 -5
- package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
- package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/solana.js +12 -1
- package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
- package/dist/tx/hash/resolvers/cardano.d.ts.map +1 -1
- package/dist/tx/hash/resolvers/cardano.js +9 -5
- package/dist/tx/hash/resolvers/cardano.js.map +1 -1
- package/dist/tx/status/resolvers/cosmos.d.ts.map +1 -1
- package/dist/tx/status/resolvers/cosmos.js +21 -8
- package/dist/tx/status/resolvers/cosmos.js.map +1 -1
- package/dist/tx/status/resolvers/qbtc.d.ts.map +1 -1
- package/dist/tx/status/resolvers/qbtc.js +18 -19
- package/dist/tx/status/resolvers/qbtc.js.map +1 -1
- package/dist/tx/status/resolvers/ton.d.ts.map +1 -1
- package/dist/tx/status/resolvers/ton.js +4 -4
- package/dist/tx/status/resolvers/ton.js.map +1 -1
- package/package.json +192 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { concatBytes, protoBytes, protoString, protoVarint, } from '@vultisig/core-chain/chains/cosmos/qbtc/protoEncoding';
|
|
2
|
+
const msgClaimWithProofTypeURL = '/qbtc.qbtc.v1.MsgClaimWithProof';
|
|
3
|
+
const isHex = (value) => /^[0-9a-f]+$/i.test(value);
|
|
4
|
+
const assertHex = (value, name, expectedLength) => {
|
|
5
|
+
if (value.length !== expectedLength || !isHex(value)) {
|
|
6
|
+
throw new Error(`${name} must be ${expectedLength} hex chars, got ${value.length}`);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
/** Validates the claim input against the chain's constraints (Section 5). */
|
|
10
|
+
export const validateClaimInput = (input) => {
|
|
11
|
+
const { utxos, proof, messageHash, addressHash, qbtcAddressHash } = input;
|
|
12
|
+
if (utxos.length === 0 || utxos.length > 50) {
|
|
13
|
+
throw new Error(`UTXOs count must be 1-50, got ${utxos.length}`);
|
|
14
|
+
}
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
for (const { txid, vout } of utxos) {
|
|
17
|
+
if (txid.length !== 64 || !isHex(txid)) {
|
|
18
|
+
throw new Error(`Invalid txid: expected 64 hex chars, got ${txid.length}`);
|
|
19
|
+
}
|
|
20
|
+
if (!Number.isInteger(vout) || vout < 0) {
|
|
21
|
+
throw new Error(`Invalid vout: expected non-negative integer, got ${vout}`);
|
|
22
|
+
}
|
|
23
|
+
const key = `${txid}:${vout}`;
|
|
24
|
+
if (seen.has(key)) {
|
|
25
|
+
throw new Error(`Duplicate UTXO reference: ${key}`);
|
|
26
|
+
}
|
|
27
|
+
seen.add(key);
|
|
28
|
+
}
|
|
29
|
+
if (!isHex(proof) || proof.length < 200) {
|
|
30
|
+
throw new Error('Proof too small or not valid hex (min 100 bytes / 200 hex chars)');
|
|
31
|
+
}
|
|
32
|
+
if (proof.length > 100_000) {
|
|
33
|
+
throw new Error('Proof too large (max 50 KB / 100000 hex chars)');
|
|
34
|
+
}
|
|
35
|
+
assertHex(messageHash, 'message_hash', 64);
|
|
36
|
+
assertHex(addressHash, 'address_hash', 40);
|
|
37
|
+
assertHex(qbtcAddressHash, 'qbtc_address_hash', 64);
|
|
38
|
+
};
|
|
39
|
+
/** Encodes a single UTXORef as protobuf. */
|
|
40
|
+
const encodeUtxoRef = ({ txid, vout }) => concatBytes(protoString(1, txid), protoVarint(2, BigInt(vout)));
|
|
41
|
+
/** Encodes MsgClaimWithProof as protobuf bytes. */
|
|
42
|
+
const buildMsgClaimWithProof = (input) => {
|
|
43
|
+
const utxoBytes = input.utxos.map(utxo => protoBytes(2, encodeUtxoRef(utxo)));
|
|
44
|
+
return concatBytes(protoString(1, input.claimer), ...utxoBytes, protoString(3, input.proof), protoString(4, input.messageHash), protoString(5, input.addressHash), protoString(6, input.qbtcAddressHash));
|
|
45
|
+
};
|
|
46
|
+
/** Wraps MsgClaimWithProof in a Cosmos Any message. */
|
|
47
|
+
export const buildClaimWithProofAny = (input) => {
|
|
48
|
+
validateClaimInput(input);
|
|
49
|
+
const msg = buildMsgClaimWithProof(input);
|
|
50
|
+
return concatBytes(protoString(1, msgClaimWithProofTypeURL), protoBytes(2, msg));
|
|
51
|
+
};
|
|
52
|
+
/** Builds the TxBody containing a single MsgClaimWithProof. */
|
|
53
|
+
export const buildClaimTxBody = (input) => {
|
|
54
|
+
const anyMsg = buildClaimWithProofAny(input);
|
|
55
|
+
return protoBytes(1, anyMsg);
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=buildClaimTx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildClaimTx.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/buildClaimTx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { QbtcClaimCircuit } from './BtcAddressType.js';
|
|
2
|
+
/**
|
|
3
|
+
* Computes the address hash for QBTC claiming.
|
|
4
|
+
* - ECDSA types: Hash160(compressedPubkey) — 20 bytes
|
|
5
|
+
* - Taproot (Schnorr): x-only pubkey (last 32 bytes of 33-byte compressed key)
|
|
6
|
+
*/
|
|
7
|
+
export declare const computeAddressHash: ({ compressedPubkey, circuit, }: {
|
|
8
|
+
compressedPubkey: Uint8Array;
|
|
9
|
+
circuit: QbtcClaimCircuit;
|
|
10
|
+
}) => Uint8Array;
|
|
11
|
+
/** Computes SHA256 of the QBTC bech32 address string. */
|
|
12
|
+
export declare const computeQbtcAddressHash: (qbtcAddress: string) => Uint8Array;
|
|
13
|
+
/** Computes the first 8 bytes of SHA256 of the chain ID. */
|
|
14
|
+
export declare const computeChainIdHash: (chainId: string) => Uint8Array;
|
|
15
|
+
type ComputeClaimMessageHashInput = {
|
|
16
|
+
addressHash: Uint8Array;
|
|
17
|
+
qbtcAddressHash: Uint8Array;
|
|
18
|
+
chainIdHash: Uint8Array;
|
|
19
|
+
circuit: QbtcClaimCircuit;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Computes the final MessageHash for the QBTC claim.
|
|
23
|
+
*
|
|
24
|
+
* ```
|
|
25
|
+
* MessageHash = SHA256(prefix + addressHash + qbtcAddressHash + chainIdHash + "qbtc-claim-v1")
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Where prefix is `"ecdsa:"` or `"schnorr:"` depending on the BTC address type.
|
|
29
|
+
*/
|
|
30
|
+
export declare const computeClaimMessageHash: ({ addressHash, qbtcAddressHash, chainIdHash, circuit, }: ComputeClaimMessageHashInput) => Uint8Array;
|
|
31
|
+
type ComputeAllClaimHashesInput = {
|
|
32
|
+
btcAddress: string;
|
|
33
|
+
compressedPubkey: Uint8Array;
|
|
34
|
+
qbtcAddress: string;
|
|
35
|
+
chainId: string;
|
|
36
|
+
};
|
|
37
|
+
type ClaimHashes = {
|
|
38
|
+
messageHash: Uint8Array;
|
|
39
|
+
addressHash: Uint8Array;
|
|
40
|
+
qbtcAddressHash: Uint8Array;
|
|
41
|
+
circuit: QbtcClaimCircuit;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Convenience function that computes all hashes needed for a QBTC claim
|
|
45
|
+
* in a single call.
|
|
46
|
+
*/
|
|
47
|
+
export declare const computeAllClaimHashes: ({ btcAddress, compressedPubkey, qbtcAddress, chainId, }: ComputeAllClaimHashesInput) => ClaimHashes;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=computeClaimHashes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeClaimHashes.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/computeClaimHashes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAQ1E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,gCAGhC;IACD,gBAAgB,EAAE,UAAU,CAAA;IAC5B,OAAO,EAAE,gBAAgB,CAAA;CAC1B,KAAG,UAcH,CAAA;AAED,yDAAyD;AACzD,eAAO,MAAM,sBAAsB,GAAI,aAAa,MAAM,KAAG,UACd,CAAA;AAE/C,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,KAAG,UACE,CAAA;AAEvD,KAAK,4BAA4B,GAAG;IAClC,WAAW,EAAE,UAAU,CAAA;IACvB,eAAe,EAAE,UAAU,CAAA;IAC3B,WAAW,EAAE,UAAU,CAAA;IACvB,OAAO,EAAE,gBAAgB,CAAA;CAC1B,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,GAAI,yDAKrC,4BAA4B,KAAG,UAsCjC,CAAA;AAED,KAAK,0BAA0B,GAAG;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,UAAU,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,UAAU,CAAA;IACvB,WAAW,EAAE,UAAU,CAAA;IACvB,eAAe,EAAE,UAAU,CAAA;IAC3B,OAAO,EAAE,gBAAgB,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,yDAKnC,0BAA0B,KAAG,WAgB/B,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ripemd160 } from '@noble/hashes/legacy.js';
|
|
2
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
3
|
+
import { btcAddressTypeCircuit } from './BtcAddressType.js';
|
|
4
|
+
import { detectBtcAddressType } from './detectBtcAddressType.js';
|
|
5
|
+
const claimSuffix = 'qbtc-claim-v1';
|
|
6
|
+
/** Hash160 = RIPEMD160(SHA256(data)), the standard Bitcoin hash. */
|
|
7
|
+
const hash160 = (data) => ripemd160(sha256(data));
|
|
8
|
+
/**
|
|
9
|
+
* Computes the address hash for QBTC claiming.
|
|
10
|
+
* - ECDSA types: Hash160(compressedPubkey) — 20 bytes
|
|
11
|
+
* - Taproot (Schnorr): x-only pubkey (last 32 bytes of 33-byte compressed key)
|
|
12
|
+
*/
|
|
13
|
+
export const computeAddressHash = ({ compressedPubkey, circuit, }) => {
|
|
14
|
+
if (compressedPubkey.length !== 33 ||
|
|
15
|
+
(compressedPubkey[0] !== 0x02 && compressedPubkey[0] !== 0x03)) {
|
|
16
|
+
throw new Error('compressedPubkey must be a 33-byte compressed secp256k1 key');
|
|
17
|
+
}
|
|
18
|
+
if (circuit === 'schnorr') {
|
|
19
|
+
return compressedPubkey.slice(1, 33);
|
|
20
|
+
}
|
|
21
|
+
return hash160(compressedPubkey);
|
|
22
|
+
};
|
|
23
|
+
/** Computes SHA256 of the QBTC bech32 address string. */
|
|
24
|
+
export const computeQbtcAddressHash = (qbtcAddress) => sha256(new TextEncoder().encode(qbtcAddress));
|
|
25
|
+
/** Computes the first 8 bytes of SHA256 of the chain ID. */
|
|
26
|
+
export const computeChainIdHash = (chainId) => sha256(new TextEncoder().encode(chainId)).slice(0, 8);
|
|
27
|
+
/**
|
|
28
|
+
* Computes the final MessageHash for the QBTC claim.
|
|
29
|
+
*
|
|
30
|
+
* ```
|
|
31
|
+
* MessageHash = SHA256(prefix + addressHash + qbtcAddressHash + chainIdHash + "qbtc-claim-v1")
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* Where prefix is `"ecdsa:"` or `"schnorr:"` depending on the BTC address type.
|
|
35
|
+
*/
|
|
36
|
+
export const computeClaimMessageHash = ({ addressHash, qbtcAddressHash, chainIdHash, circuit, }) => {
|
|
37
|
+
const expectedAddressHashLength = circuit === 'schnorr' ? 32 : 20;
|
|
38
|
+
if (addressHash.length !== expectedAddressHashLength) {
|
|
39
|
+
throw new Error(`addressHash must be ${expectedAddressHashLength} bytes for ${circuit}`);
|
|
40
|
+
}
|
|
41
|
+
if (qbtcAddressHash.length !== 32) {
|
|
42
|
+
throw new Error('qbtcAddressHash must be 32 bytes');
|
|
43
|
+
}
|
|
44
|
+
if (chainIdHash.length !== 8) {
|
|
45
|
+
throw new Error('chainIdHash must be 8 bytes');
|
|
46
|
+
}
|
|
47
|
+
const encoder = new TextEncoder();
|
|
48
|
+
const prefix = encoder.encode(`${circuit}:`);
|
|
49
|
+
const suffix = encoder.encode(claimSuffix);
|
|
50
|
+
const message = new Uint8Array(prefix.length +
|
|
51
|
+
addressHash.length +
|
|
52
|
+
qbtcAddressHash.length +
|
|
53
|
+
chainIdHash.length +
|
|
54
|
+
suffix.length);
|
|
55
|
+
let offset = 0;
|
|
56
|
+
message.set(prefix, offset);
|
|
57
|
+
offset += prefix.length;
|
|
58
|
+
message.set(addressHash, offset);
|
|
59
|
+
offset += addressHash.length;
|
|
60
|
+
message.set(qbtcAddressHash, offset);
|
|
61
|
+
offset += qbtcAddressHash.length;
|
|
62
|
+
message.set(chainIdHash, offset);
|
|
63
|
+
offset += chainIdHash.length;
|
|
64
|
+
message.set(suffix, offset);
|
|
65
|
+
return sha256(message);
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Convenience function that computes all hashes needed for a QBTC claim
|
|
69
|
+
* in a single call.
|
|
70
|
+
*/
|
|
71
|
+
export const computeAllClaimHashes = ({ btcAddress, compressedPubkey, qbtcAddress, chainId, }) => {
|
|
72
|
+
const addressType = detectBtcAddressType(btcAddress);
|
|
73
|
+
const circuit = btcAddressTypeCircuit[addressType];
|
|
74
|
+
const addressHash = computeAddressHash({ compressedPubkey, circuit });
|
|
75
|
+
const qbtcAddressHash = computeQbtcAddressHash(qbtcAddress);
|
|
76
|
+
const chainIdHash = computeChainIdHash(chainId);
|
|
77
|
+
const messageHash = computeClaimMessageHash({
|
|
78
|
+
addressHash,
|
|
79
|
+
qbtcAddressHash,
|
|
80
|
+
chainIdHash,
|
|
81
|
+
circuit,
|
|
82
|
+
});
|
|
83
|
+
return { messageHash, addressHash, qbtcAddressHash, circuit };
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=computeClaimHashes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeClaimHashes.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/computeClaimHashes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BtcAddressType } from './BtcAddressType.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detects the Bitcoin address type from the address string format.
|
|
4
|
+
*
|
|
5
|
+
* | Format | Type |
|
|
6
|
+
* |---------------------|-------------|
|
|
7
|
+
* | `1...` | P2PKH |
|
|
8
|
+
* | `3...` | P2SH-P2WPKH |
|
|
9
|
+
* | `bc1q...` (42 chars)| P2WPKH |
|
|
10
|
+
* | `bc1q...` (62 chars)| P2WSH |
|
|
11
|
+
* | `bc1p...` (62 chars)| P2TR |
|
|
12
|
+
*/
|
|
13
|
+
export declare const detectBtcAddressType: (address: string) => BtcAddressType;
|
|
14
|
+
//# sourceMappingURL=detectBtcAddressType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectBtcAddressType.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/detectBtcAddressType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,MAAM,KAAG,cAgBtD,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects the Bitcoin address type from the address string format.
|
|
3
|
+
*
|
|
4
|
+
* | Format | Type |
|
|
5
|
+
* |---------------------|-------------|
|
|
6
|
+
* | `1...` | P2PKH |
|
|
7
|
+
* | `3...` | P2SH-P2WPKH |
|
|
8
|
+
* | `bc1q...` (42 chars)| P2WPKH |
|
|
9
|
+
* | `bc1q...` (62 chars)| P2WSH |
|
|
10
|
+
* | `bc1p...` (62 chars)| P2TR |
|
|
11
|
+
*/
|
|
12
|
+
export const detectBtcAddressType = (address) => {
|
|
13
|
+
if (address.startsWith('1'))
|
|
14
|
+
return 'p2pkh';
|
|
15
|
+
if (address.startsWith('3'))
|
|
16
|
+
return 'p2sh-p2wpkh';
|
|
17
|
+
if (address.startsWith('bc1p')) {
|
|
18
|
+
if (address.length === 62)
|
|
19
|
+
return 'p2tr';
|
|
20
|
+
throw new Error(`Unsupported Bitcoin address format: ${address}`);
|
|
21
|
+
}
|
|
22
|
+
if (address.startsWith('bc1q')) {
|
|
23
|
+
if (address.length === 42)
|
|
24
|
+
return 'p2wpkh';
|
|
25
|
+
if (address.length === 62)
|
|
26
|
+
return 'p2wsh';
|
|
27
|
+
throw new Error(`Unsupported Bitcoin address format: ${address}`);
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Unsupported Bitcoin address format: ${address}`);
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=detectBtcAddressType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectBtcAddressType.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/detectBtcAddressType.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAkB,EAAE;IACtE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAA;IAC3C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,aAAa,CAAA;IAEjD,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE;YAAE,OAAO,MAAM,CAAA;QACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAA;IACnE,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE;YAAE,OAAO,QAAQ,CAAA;QAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE;YAAE,OAAO,OAAO,CAAA;QACzC,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAA;AACnE,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getClaimWithProofDisabled.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.ts"],"names":[],"mappings":"AAUA,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,QAAa,OAAO,CAAC,OAAO,CAajE,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { qbtcRestUrl } from '@vultisig/core-chain/chains/cosmos/qbtc/tendermintRpcUrl';
|
|
2
|
+
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
3
|
+
/** Checks whether the ClaimWithProof feature is disabled on the QBTC chain. */
|
|
4
|
+
export const getClaimWithProofDisabled = async () => {
|
|
5
|
+
const url = `${qbtcRestUrl}/qbtc/v1/params/ClaimWithProofDisabled`;
|
|
6
|
+
const { param } = await queryUrl(url);
|
|
7
|
+
const parsedValue = Number(param.value);
|
|
8
|
+
if (!Number.isFinite(parsedValue)) {
|
|
9
|
+
throw new Error(`Invalid ClaimWithProofDisabled value: ${String(param.value)}`);
|
|
10
|
+
}
|
|
11
|
+
return parsedValue > 0;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=getClaimWithProofDisabled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getClaimWithProofDisabled.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0DAA0D,CAAA;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAS7D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,IAAsB,EAAE;IACpE,MAAM,GAAG,GAAG,GAAG,WAAW,wCAAwC,CAAA;IAElE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAqB,GAAG,CAAC,CAAA;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAEvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,yCAAyC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAC/D,CAAA;IACH,CAAC;IAED,OAAO,WAAW,GAAG,CAAC,CAAA;AACxB,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ClaimableUtxo } from './ClaimableUtxo.js';
|
|
2
|
+
type GetClaimableUtxosInput = {
|
|
3
|
+
btcAddress: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Fetches Bitcoin UTXOs for the given address via Blockchair and returns them
|
|
7
|
+
* as claimable candidates on the QBTC chain.
|
|
8
|
+
*
|
|
9
|
+
* Note: this does not cross-check with the QBTC chain to filter
|
|
10
|
+
* already-claimed UTXOs — see btcq-org/qbtc#134.
|
|
11
|
+
*/
|
|
12
|
+
export declare const getClaimableUtxos: ({ btcAddress, }: GetClaimableUtxosInput) => Promise<ClaimableUtxo[]>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=getClaimableUtxos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getClaimableUtxos.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/getClaimableUtxos.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,KAAK,sBAAsB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,iBAErC,sBAAsB,KAAG,OAAO,CAAC,aAAa,EAAE,CAalD,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
import { getUtxoAddressInfo } from '@vultisig/core-chain/chains/utxo/client/getUtxoAddressInfo';
|
|
3
|
+
/**
|
|
4
|
+
* Fetches Bitcoin UTXOs for the given address via Blockchair and returns them
|
|
5
|
+
* as claimable candidates on the QBTC chain.
|
|
6
|
+
*
|
|
7
|
+
* Note: this does not cross-check with the QBTC chain to filter
|
|
8
|
+
* already-claimed UTXOs — see btcq-org/qbtc#134.
|
|
9
|
+
*/
|
|
10
|
+
export const getClaimableUtxos = async ({ btcAddress, }) => {
|
|
11
|
+
const response = await getUtxoAddressInfo({
|
|
12
|
+
address: btcAddress,
|
|
13
|
+
chain: Chain.Bitcoin,
|
|
14
|
+
});
|
|
15
|
+
const utxos = response.data[btcAddress]?.utxo ?? [];
|
|
16
|
+
return utxos.map(({ transaction_hash, index, value }) => ({
|
|
17
|
+
txid: transaction_hash,
|
|
18
|
+
vout: index,
|
|
19
|
+
amount: value,
|
|
20
|
+
}));
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=getClaimableUtxos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getClaimableUtxos.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/getClaimableUtxos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAA;AAQ/F;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,EACtC,UAAU,GACa,EAA4B,EAAE;IACrD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC;QACxC,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,KAAK,CAAC,OAAO;KACrB,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;IAEnD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;KACd,CAAC,CAAC,CAAA;AACL,CAAC,CAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Base URL for the QBTC proof service. */
|
|
2
|
+
export declare const defaultProofServiceUrl = "https://proof.qbtc.network";
|
|
3
|
+
/** Checks whether the proof service is healthy and ready. */
|
|
4
|
+
export declare const checkProofServiceHealth: ({ baseUrl, }?: {
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
}) => Promise<boolean>;
|
|
7
|
+
type UtxoRef = {
|
|
8
|
+
txid: string;
|
|
9
|
+
vout: number;
|
|
10
|
+
};
|
|
11
|
+
type GenerateClaimProofInput = {
|
|
12
|
+
/** r-component of the ECDSA signature (hex string). */
|
|
13
|
+
signatureR: string;
|
|
14
|
+
/** s-component of the ECDSA signature (hex string). */
|
|
15
|
+
signatureS: string;
|
|
16
|
+
/** Compressed secp256k1 public key (66-char hex string). */
|
|
17
|
+
publicKey: string;
|
|
18
|
+
/** UTXOs to include in the claim. */
|
|
19
|
+
utxos: UtxoRef[];
|
|
20
|
+
/** QBTC bech32 address of the claimer. */
|
|
21
|
+
claimerAddress: string;
|
|
22
|
+
/** QBTC chain ID (e.g., "qbtc-1"). */
|
|
23
|
+
chainId: string;
|
|
24
|
+
/** Proof service base URL. Defaults to {@link defaultProofServiceUrl}. */
|
|
25
|
+
baseUrl?: string;
|
|
26
|
+
};
|
|
27
|
+
type GenerateClaimProofResponse = {
|
|
28
|
+
/** Hex-encoded PLONK ZK proof. */
|
|
29
|
+
proof: string;
|
|
30
|
+
/** 64-char hex MessageHash. */
|
|
31
|
+
message_hash: string;
|
|
32
|
+
/** 40-char hex AddressHash (Hash160). */
|
|
33
|
+
address_hash: string;
|
|
34
|
+
/** 64-char hex QBTCAddressHash. */
|
|
35
|
+
qbtc_address_hash: string;
|
|
36
|
+
/** UTXOs included in the proof. */
|
|
37
|
+
utxos: UtxoRef[];
|
|
38
|
+
/** QBTC claimer address. */
|
|
39
|
+
claimer_address: string;
|
|
40
|
+
};
|
|
41
|
+
export type { GenerateClaimProofResponse as ClaimProofResult };
|
|
42
|
+
/**
|
|
43
|
+
* Calls the proof service to generate a PLONK ZK proof for the QBTC claim.
|
|
44
|
+
* This proves BTC address ownership without revealing the private key,
|
|
45
|
+
* public key, or signature.
|
|
46
|
+
*
|
|
47
|
+
* Timeout: up to 300 seconds — proof generation is computationally expensive.
|
|
48
|
+
*/
|
|
49
|
+
export declare const generateClaimProof: ({ signatureR, signatureS, publicKey, utxos, claimerAddress, chainId, baseUrl, }: GenerateClaimProofInput) => Promise<GenerateClaimProofResponse>;
|
|
50
|
+
//# sourceMappingURL=proofService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofService.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/proofService.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,eAAO,MAAM,sBAAsB,+BAA+B,CAAA;AASlE,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB,GAAU,eAE3C;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,KAAG,OAAO,CAAC,OAAO,CAS7C,CAAA;AAED,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,uBAAuB,GAAG;IAC7B,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,KAAK,0BAA0B,GAAG;IAChC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAA;IACzB,mCAAmC;IACnC,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,4BAA4B;IAC5B,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,YAAY,EAAE,0BAA0B,IAAI,gBAAgB,EAAE,CAAA;AA2B9D;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAU,iFAQtC,uBAAuB,KAAG,OAAO,CAAC,0BAA0B,CAiC9D,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** Base URL for the QBTC proof service. */
|
|
2
|
+
export const defaultProofServiceUrl = 'https://proof.qbtc.network';
|
|
3
|
+
const proofGenerationTimeoutMs = 300_000;
|
|
4
|
+
/** Checks whether the proof service is healthy and ready. */
|
|
5
|
+
export const checkProofServiceHealth = async ({ baseUrl = defaultProofServiceUrl, } = {}) => {
|
|
6
|
+
try {
|
|
7
|
+
const response = await fetch(`${baseUrl}/health`);
|
|
8
|
+
if (!response.ok)
|
|
9
|
+
return false;
|
|
10
|
+
const data = await response.json();
|
|
11
|
+
return data.status === 'healthy' && data.setup_loaded === true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const isHexWithLength = (value, length) => typeof value === 'string' &&
|
|
18
|
+
value.length === length &&
|
|
19
|
+
/^[0-9a-f]+$/i.test(value);
|
|
20
|
+
/** Validates the proof service response matches expected field formats. */
|
|
21
|
+
const assertValidClaimProofResponse = (data) => {
|
|
22
|
+
if (typeof data.proof !== 'string' || data.proof.length === 0) {
|
|
23
|
+
throw new Error('Invalid proof service response: missing proof');
|
|
24
|
+
}
|
|
25
|
+
if (!isHexWithLength(data.message_hash, 64)) {
|
|
26
|
+
throw new Error('Invalid proof service response: invalid message_hash');
|
|
27
|
+
}
|
|
28
|
+
if (!isHexWithLength(data.address_hash, 40)) {
|
|
29
|
+
throw new Error('Invalid proof service response: invalid address_hash');
|
|
30
|
+
}
|
|
31
|
+
if (!isHexWithLength(data.qbtc_address_hash, 64)) {
|
|
32
|
+
throw new Error('Invalid proof service response: invalid qbtc_address_hash');
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Calls the proof service to generate a PLONK ZK proof for the QBTC claim.
|
|
37
|
+
* This proves BTC address ownership without revealing the private key,
|
|
38
|
+
* public key, or signature.
|
|
39
|
+
*
|
|
40
|
+
* Timeout: up to 300 seconds — proof generation is computationally expensive.
|
|
41
|
+
*/
|
|
42
|
+
export const generateClaimProof = async ({ signatureR, signatureS, publicKey, utxos, claimerAddress, chainId, baseUrl = defaultProofServiceUrl, }) => {
|
|
43
|
+
const controller = new AbortController();
|
|
44
|
+
const timeout = setTimeout(() => controller.abort(), proofGenerationTimeoutMs);
|
|
45
|
+
try {
|
|
46
|
+
const response = await fetch(`${baseUrl}/prove`, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: { 'Content-Type': 'application/json' },
|
|
49
|
+
signal: controller.signal,
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
signature_r: signatureR,
|
|
52
|
+
signature_s: signatureS,
|
|
53
|
+
public_key: publicKey,
|
|
54
|
+
utxos: utxos.map(({ txid, vout }) => ({ txid, vout })),
|
|
55
|
+
claimer_address: claimerAddress,
|
|
56
|
+
chain_id: chainId,
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
const text = await response.text();
|
|
61
|
+
throw new Error(`Proof service error (${response.status}): ${text}`);
|
|
62
|
+
}
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
assertValidClaimProofResponse(data);
|
|
65
|
+
return data;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
clearTimeout(timeout);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=proofService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofService.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/proofService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
export declare const getQbtcAccountInfo: ({ address }: {
|
|
2
2
|
address: string;
|
|
3
3
|
}) => Promise<{
|
|
4
|
-
latestBlock: string;
|
|
5
4
|
address: string;
|
|
6
|
-
pubkey: import("@cosmjs/amino").Pubkey | null;
|
|
7
5
|
accountNumber: number;
|
|
8
6
|
sequence: number;
|
|
7
|
+
latestBlock: string;
|
|
9
8
|
}>;
|
|
10
9
|
//# sourceMappingURL=getQbtcAccountInfo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getQbtcAccountInfo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/getQbtcAccountInfo.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getQbtcAccountInfo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/getQbtcAccountInfo.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,kBAAkB,GAAU,aAAa;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;;;EAwBxE,CAAA"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
1
|
+
import { qbtcRestUrl } from '@vultisig/core-chain/chains/cosmos/qbtc/tendermintRpcUrl';
|
|
2
|
+
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
4
3
|
export const getQbtcAccountInfo = async ({ address }) => {
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
const [accountData, blockData] = await Promise.all([
|
|
5
|
+
queryUrl(`${qbtcRestUrl}/cosmos/auth/v1beta1/accounts/${address}`),
|
|
6
|
+
queryUrl(`${qbtcRestUrl}/cosmos/base/tendermint/v1beta1/blocks/latest`),
|
|
7
|
+
]);
|
|
8
|
+
const accountNumber = Number(accountData.account.account_number);
|
|
9
|
+
const sequence = Number(accountData.account.sequence);
|
|
10
|
+
const blockTimestampStr = blockData.block.header.time;
|
|
9
11
|
const blockTimestampNs = BigInt(new Date(blockTimestampStr).getTime()) * 1000000n;
|
|
10
12
|
const timeoutNs = blockTimestampNs + 600000000000n;
|
|
11
|
-
const latestBlock = `${block.header.height}_${timeoutNs}`;
|
|
13
|
+
const latestBlock = `${blockData.block.header.height}_${timeoutNs}`;
|
|
12
14
|
return {
|
|
13
|
-
|
|
15
|
+
address,
|
|
16
|
+
accountNumber,
|
|
17
|
+
sequence,
|
|
14
18
|
latestBlock,
|
|
15
19
|
};
|
|
16
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getQbtcAccountInfo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/getQbtcAccountInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"getQbtcAccountInfo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/getQbtcAccountInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0DAA0D,CAAA;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAmB7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,EAAE,OAAO,EAAuB,EAAE,EAAE;IAC3E,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,QAAQ,CACN,GAAG,WAAW,iCAAiC,OAAO,EAAE,CACzD;QACD,QAAQ,CACN,GAAG,WAAW,+CAA+C,CAC9D;KACF,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrD,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAA;IACrD,MAAM,gBAAgB,GACpB,MAAM,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,QAAU,CAAA;IAC5D,MAAM,SAAS,GAAG,gBAAgB,GAAG,aAAgB,CAAA;IACrD,MAAM,WAAW,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAA;IAEnE,OAAO;QACL,OAAO;QACP,aAAa;QACb,QAAQ;QACR,WAAW;KACZ,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
export declare const qbtcTendermintRpcUrl = "https://qbtc-testnet-rpc.publicnode.com:443";
|
|
1
|
+
export declare const qbtcRestUrl = "https://api.vultisig.com/qbtc-rpc";
|
|
2
|
+
/** @deprecated Use {@link qbtcRestUrl} — Tendermint RPC is no longer used for QBTC. */
|
|
3
|
+
export declare const qbtcTendermintRpcUrl = "https://api.vultisig.com/qbtc-rpc";
|
|
6
4
|
//# sourceMappingURL=tendermintRpcUrl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tendermintRpcUrl.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/tendermintRpcUrl.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tendermintRpcUrl.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/tendermintRpcUrl.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,sCAAsC,CAAA;AAE9D,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,sCAAc,CAAA"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
export const qbtcTendermintRpcUrl = 'https://qbtc-testnet-rpc.publicnode.com:443';
|
|
1
|
+
export const qbtcRestUrl = 'https://api.vultisig.com/qbtc-rpc';
|
|
2
|
+
/** @deprecated Use {@link qbtcRestUrl} — Tendermint RPC is no longer used for QBTC. */
|
|
3
|
+
export const qbtcTendermintRpcUrl = qbtcRestUrl;
|
|
6
4
|
//# sourceMappingURL=tendermintRpcUrl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tendermintRpcUrl.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/tendermintRpcUrl.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tendermintRpcUrl.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/qbtc/tendermintRpcUrl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,mCAAmC,CAAA;AAE9D,uFAAuF;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CosmosChain } from '../../Chain.js';
|
|
2
|
+
export type SumFeeAmountForCosmosChainFeeDenomInput = {
|
|
3
|
+
amounts: readonly {
|
|
4
|
+
denom: string;
|
|
5
|
+
amount: string;
|
|
6
|
+
}[] | undefined;
|
|
7
|
+
chain: CosmosChain;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Sums fee `amount` fields for entries whose `denom` matches the chain's native
|
|
11
|
+
* fee denom ({@link cosmosFeeCoinDenom}), compared case-insensitively.
|
|
12
|
+
* Returns null when there is nothing to sum or no matching denoms.
|
|
13
|
+
*/
|
|
14
|
+
export declare const sumFeeAmountForCosmosChainFeeDenom: ({ amounts, chain, }: SumFeeAmountForCosmosChainFeeDenomInput) => bigint | null;
|
|
15
|
+
//# sourceMappingURL=sumFeeAmountForCosmosChainFeeDenom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sumFeeAmountForCosmosChainFeeDenom.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,MAAM,uCAAuC,GAAG;IACpD,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,SAAS,CAAA;IACjE,KAAK,EAAE,WAAW,CAAA;CACnB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,GAAI,qBAGhD,uCAAuC,KAAG,MAAM,GAAG,IAiBrD,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { cosmosFeeCoinDenom } from './cosmosFeeCoinDenom.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sums fee `amount` fields for entries whose `denom` matches the chain's native
|
|
4
|
+
* fee denom ({@link cosmosFeeCoinDenom}), compared case-insensitively.
|
|
5
|
+
* Returns null when there is nothing to sum or no matching denoms.
|
|
6
|
+
*/
|
|
7
|
+
export const sumFeeAmountForCosmosChainFeeDenom = ({ amounts, chain, }) => {
|
|
8
|
+
if (!amounts?.length) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
const targetDenom = cosmosFeeCoinDenom[chain].toLowerCase();
|
|
12
|
+
let sum = 0n;
|
|
13
|
+
let matched = false;
|
|
14
|
+
for (const { denom, amount } of amounts) {
|
|
15
|
+
if (denom.toLowerCase() === targetDenom) {
|
|
16
|
+
matched = true;
|
|
17
|
+
sum += BigInt(amount);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return matched ? sum : null;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=sumFeeAmountForCosmosChainFeeDenom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sumFeeAmountForCosmosChainFeeDenom.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAOzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,EACjD,OAAO,EACP,KAAK,GACmC,EAAiB,EAAE;IAC3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IAC3D,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE,CAAC;YACxC,OAAO,GAAG,IAAI,CAAA;YACd,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAC7B,CAAC,CAAA"}
|