@vultisig/core-chain 1.7.0 → 2.0.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 +22 -0
- package/dist/chains/cosmos/cosmosRpcUrl.d.ts +9 -1
- package/dist/chains/cosmos/cosmosRpcUrl.d.ts.map +1 -1
- package/dist/chains/cosmos/cosmosRpcUrl.js +14 -1
- package/dist/chains/cosmos/cosmosRpcUrl.js.map +1 -1
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.d.ts +11 -1
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.d.ts.map +1 -1
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.js +8 -2
- package/dist/chains/cosmos/qbtc/claim/buildClaimTx.js.map +1 -1
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.d.ts +4 -0
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.d.ts.map +1 -1
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.js +38 -18
- package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.js.map +1 -1
- package/dist/coin/balance/resolvers/cosmos.d.ts.map +1 -1
- package/dist/coin/balance/resolvers/cosmos.js +2 -9
- package/dist/coin/balance/resolvers/cosmos.js.map +1 -1
- package/dist/coin/chainFeeCoin.js +1 -1
- package/dist/coin/find/resolvers/evm/index.d.ts.map +1 -1
- package/dist/coin/find/resolvers/evm/index.js +41 -14
- package/dist/coin/find/resolvers/evm/index.js.map +1 -1
- package/dist/coin/token/metadata/resolvers/cosmos.d.ts.map +1 -1
- package/dist/coin/token/metadata/resolvers/cosmos.js +41 -4
- package/dist/coin/token/metadata/resolvers/cosmos.js.map +1 -1
- package/dist/swap/native/NativeSwapChain.d.ts +22 -1
- package/dist/swap/native/NativeSwapChain.d.ts.map +1 -1
- package/dist/swap/native/NativeSwapChain.js.map +1 -1
- package/dist/swap/native/asset/toNativeSwapAsset.d.ts.map +1 -1
- package/dist/swap/native/asset/toNativeSwapAsset.js +43 -1
- package/dist/swap/native/asset/toNativeSwapAsset.js.map +1 -1
- package/dist/tx/broadcast/resolvers/ripple.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ripple.js +44 -12
- package/dist/tx/broadcast/resolvers/ripple.js.map +1 -1
- package/dist/tx/status/resolvers/ripple.d.ts.map +1 -1
- package/dist/tx/status/resolvers/ripple.js +13 -3
- package/dist/tx/status/resolvers/ripple.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @vultisig/core-chain
|
|
2
2
|
|
|
3
|
+
## 2.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- [#478](https://github.com/vultisig/vultisig-sdk/pull/478) [`2174118`](https://github.com/vultisig/vultisig-sdk/commit/2174118523eacfb97e04ecfa8de96f22059afe99) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - qbtc: add required `broadcaster` field to `BuildMsgClaimWithProofInput` (proto field 9). Mirrors the chain-side signer rework in btcq-org/qbtc#171 - `claimer` is now payload-only (mint destination), while `broadcaster` is the cosmos tx signer. Callers must populate `broadcaster` (typically equal to `claimer` for wallet flows where the user's own MLDSA key signs the tx).
|
|
8
|
+
|
|
9
|
+
BREAKING CHANGE: `BuildMsgClaimWithProofInput` now requires a new `broadcaster: string` field. Existing callers will fail at TypeScript compile-time (or runtime if TS is bypassed) until updated. For wallet flows pass `broadcaster === claimer`.
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#467](https://github.com/vultisig/vultisig-sdk/pull/467) [`2d85653`](https://github.com/vultisig/vultisig-sdk/commit/2d85653c23379bc39bb579acf83d7998070b9ed4) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Discover non-zero EVM tokens even when OneInch metadata lacks a logo or CoinGecko provider, with on-chain metadata fallback when token metadata is missing.
|
|
14
|
+
|
|
15
|
+
- [#474](https://github.com/vultisig/vultisig-sdk/pull/474) [`37c2f82`](https://github.com/vultisig/vultisig-sdk/commit/37c2f82379725ac4ac4d63679afea5c3ac1b7683) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Refresh vulnerable dependency paths for high-severity audit cleanup.
|
|
16
|
+
|
|
17
|
+
## 1.7.1
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- [#455](https://github.com/vultisig/vultisig-sdk/pull/455) [`5102976`](https://github.com/vultisig/vultisig-sdk/commit/5102976d7c13fa9578bbbc6e5122526cefc1ec66) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Normalize THORChain/MayaChain native swap asset ids: single-segment denoms and simple `x/…` paths map to `THOR.<ticker>` / `MAYA.<ticker>`; secured `chain-symbol-0x…` denoms map to `CHAIN.SYMBOL` notation using the canonical `nativeSwapChainIds` mapping. Full `CHAIN.SYMBOL` strings and unrecognized complex denoms remain unchanged.
|
|
22
|
+
|
|
23
|
+
- [#456](https://github.com/vultisig/vultisig-sdk/pull/456) [`b36eb62`](https://github.com/vultisig/vultisig-sdk/commit/b36eb62842051b8b2bae06f1e123a5ebcf6cad88) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Add Terra CW20 metadata resolution and build CW20 token sends as CosmWasm execute transfers.
|
|
24
|
+
|
|
3
25
|
## 1.7.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { CosmosChain } from '@vultisig/core-chain/Chain';
|
|
2
2
|
import { AccountCoinKey } from '@vultisig/core-chain/coin/AccountCoin';
|
|
3
|
+
type CosmosWasmContract = {
|
|
4
|
+
chain: CosmosChain;
|
|
5
|
+
id: string;
|
|
6
|
+
};
|
|
3
7
|
export declare const cosmosRpcUrl: Record<CosmosChain, string>;
|
|
4
|
-
export declare const
|
|
8
|
+
export declare const isCosmosWasmTokenId: (id?: string) => id is string;
|
|
9
|
+
export declare const getCosmosWasmSmartQueryUrl: ({ chain, id }: CosmosWasmContract, query: object) => string;
|
|
10
|
+
export declare const getCosmosWasmTokenBalanceUrl: ({ chain, id, address }: AccountCoinKey<CosmosChain>) => string;
|
|
11
|
+
export declare const getCosmosWasmTokenInfoUrl: (input: CosmosWasmContract) => string;
|
|
12
|
+
export {};
|
|
5
13
|
//# sourceMappingURL=cosmosRpcUrl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmosRpcUrl.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/cosmosRpcUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"cosmosRpcUrl.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/cosmosRpcUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;AAItE,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,WAAW,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAWpD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,KAAG,EAAE,IAAI,MAQvD,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,eAAe,kBAAkB,EAAE,OAAO,MAAM,WACY,CAAA;AAEvG,eAAO,MAAM,4BAA4B,GAAI,wBAAwB,cAAc,CAAC,WAAW,CAAC,WAO7F,CAAA;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,kBAAkB,WACZ,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
1
2
|
import { base64Encode } from '@vultisig/lib-utils/base64Encode';
|
|
2
3
|
export const cosmosRpcUrl = {
|
|
3
4
|
Cosmos: 'https://cosmos-rest.publicnode.com',
|
|
@@ -11,5 +12,17 @@ export const cosmosRpcUrl = {
|
|
|
11
12
|
MayaChain: 'https://mayanode.mayachain.info',
|
|
12
13
|
Akash: 'https://akash-rest.publicnode.com',
|
|
13
14
|
};
|
|
14
|
-
export const
|
|
15
|
+
export const isCosmosWasmTokenId = (id) => {
|
|
16
|
+
if (!id || id.startsWith('ibc/') || id.startsWith('factory/')) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const wasmTokenPattern = /^[a-z]+1[a-z0-9]{20,80}$/;
|
|
20
|
+
return wasmTokenPattern.test(id);
|
|
21
|
+
};
|
|
22
|
+
export const getCosmosWasmSmartQueryUrl = ({ chain, id }, query) => `${cosmosRpcUrl[chain]}/cosmwasm/wasm/v1/contract/${id}/smart/${base64Encode(JSON.stringify(query))}`;
|
|
23
|
+
export const getCosmosWasmTokenBalanceUrl = ({ chain, id, address }) => getCosmosWasmSmartQueryUrl({
|
|
24
|
+
chain,
|
|
25
|
+
id: shouldBePresent(id),
|
|
26
|
+
}, { balance: { address } });
|
|
27
|
+
export const getCosmosWasmTokenInfoUrl = (input) => getCosmosWasmSmartQueryUrl(input, { token_info: {} });
|
|
15
28
|
//# sourceMappingURL=cosmosRpcUrl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmosRpcUrl.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/cosmosRpcUrl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"cosmosRpcUrl.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cosmos/cosmosRpcUrl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAO/D,MAAM,CAAC,MAAM,YAAY,GAAgC;IACvD,MAAM,EAAE,oCAAoC;IAC5C,OAAO,EAAE,qCAAqC;IAC9C,IAAI,EAAE,kCAAkC;IACxC,MAAM,EAAE,oCAAoC;IAC5C,KAAK,EAAE,kCAAkC;IACzC,YAAY,EAAE,0CAA0C;IACxD,KAAK,EAAE,gCAAgC;IACvC,SAAS,EAAE,iDAAiD;IAC5D,SAAS,EAAE,iCAAiC;IAC5C,KAAK,EAAE,mCAAmC;CAC3C,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAW,EAAgB,EAAE;IAC/D,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,0BAA0B,CAAA;IAEnD,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAsB,EAAE,KAAa,EAAE,EAAE,CAC7F,GAAG,YAAY,CAAC,KAAK,CAAC,8BAA8B,EAAE,UAAU,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAA;AAEvG,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAA+B,EAAE,EAAE,CAClG,0BAA0B,CACxB;IACE,KAAK;IACL,EAAE,EAAE,eAAe,CAAC,EAAE,CAAC;CACxB,EACD,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CACzB,CAAA;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAyB,EAAE,EAAE,CACrE,0BAA0B,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAA"}
|
|
@@ -3,7 +3,10 @@ type UtxoRef = {
|
|
|
3
3
|
vout: number;
|
|
4
4
|
};
|
|
5
5
|
type BuildMsgClaimWithProofInput = {
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* QBTC bech32 address of the claimer (mint destination). Payload-only —
|
|
8
|
+
* no longer the cosmos signer since btcq-org/qbtc#171.
|
|
9
|
+
*/
|
|
7
10
|
claimer: string;
|
|
8
11
|
/** UTXOs to include in the claim (1-50, no duplicates). */
|
|
9
12
|
utxos: UtxoRef[];
|
|
@@ -22,6 +25,13 @@ type BuildMsgClaimWithProofInput = {
|
|
|
22
25
|
* Returned by the proof service as `pub_key_hash_sha256`.
|
|
23
26
|
*/
|
|
24
27
|
pubKeyHashSha256: string;
|
|
28
|
+
/**
|
|
29
|
+
* QBTC bech32 address of the cosmos tx signer (broadcaster). Required
|
|
30
|
+
* since btcq-org/qbtc#171 — the address derived from
|
|
31
|
+
* `signer_infos[0].pub_key` must equal this value. For wallet flows where
|
|
32
|
+
* the user signs the cosmos tx themselves, set `broadcaster === claimer`.
|
|
33
|
+
*/
|
|
34
|
+
broadcaster: string;
|
|
25
35
|
};
|
|
26
36
|
/** Validates the claim input against the chain's constraints (Section 5). */
|
|
27
37
|
export declare const validateClaimInput: (input: BuildMsgClaimWithProofInput) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildClaimTx.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/buildClaimTx.ts"],"names":[],"mappings":"AASA,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC
|
|
1
|
+
{"version":3,"file":"buildClaimTx.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/buildClaimTx.ts"],"names":[],"mappings":"AASA,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,eAAe,EAAE,MAAM,CAAA;IACvB;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAYD,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,GAAI,OAAO,2BAA2B,SAgDpE,CAAA;AAwBD,uDAAuD;AACvD,eAAO,MAAM,sBAAsB,GACjC,OAAO,2BAA2B,KACjC,UAOF,CAAA;AAED,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,GAC3B,OAAO,2BAA2B,KACjC,UAGF,CAAA"}
|
|
@@ -8,7 +8,13 @@ const assertHex = (value, name, expectedLength) => {
|
|
|
8
8
|
};
|
|
9
9
|
/** Validates the claim input against the chain's constraints (Section 5). */
|
|
10
10
|
export const validateClaimInput = (input) => {
|
|
11
|
-
const { utxos, proof, messageHash, addressHash, qbtcAddressHash, pubKeyHashSha256, } = input;
|
|
11
|
+
const { claimer, utxos, proof, messageHash, addressHash, qbtcAddressHash, pubKeyHashSha256, broadcaster, } = input;
|
|
12
|
+
if (claimer.length === 0) {
|
|
13
|
+
throw new Error('claimer is required');
|
|
14
|
+
}
|
|
15
|
+
if (broadcaster.length === 0) {
|
|
16
|
+
throw new Error('broadcaster is required');
|
|
17
|
+
}
|
|
12
18
|
if (utxos.length === 0 || utxos.length > 50) {
|
|
13
19
|
throw new Error(`UTXOs count must be 1-50, got ${utxos.length}`);
|
|
14
20
|
}
|
|
@@ -42,7 +48,7 @@ const encodeUtxoRef = ({ txid, vout }) => concatBytes(protoString(1, txid), prot
|
|
|
42
48
|
/** Encodes MsgClaimWithProof as protobuf bytes. */
|
|
43
49
|
const buildMsgClaimWithProof = (input) => {
|
|
44
50
|
const utxoBytes = input.utxos.map(utxo => protoBytes(2, encodeUtxoRef(utxo)));
|
|
45
|
-
return concatBytes(protoString(1, input.claimer), ...utxoBytes, protoString(3, input.proof), protoString(4, input.messageHash), protoString(5, input.addressHash), protoString(6, input.qbtcAddressHash), protoString(7, input.pubKeyHashSha256));
|
|
51
|
+
return concatBytes(protoString(1, input.claimer), ...utxoBytes, protoString(3, input.proof), protoString(4, input.messageHash), protoString(5, input.addressHash), protoString(6, input.qbtcAddressHash), protoString(7, input.pubKeyHashSha256), protoString(9, input.broadcaster));
|
|
46
52
|
};
|
|
47
53
|
/** Wraps MsgClaimWithProof in a Cosmos Any message. */
|
|
48
54
|
export const buildClaimWithProofAny = (input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildClaimTx.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/buildClaimTx.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,kDAAkD,CAAA;AAEzD,MAAM,wBAAwB,GAAG,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"buildClaimTx.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/buildClaimTx.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,10 @@ type GetClaimableUtxosInput = {
|
|
|
10
10
|
* appear "spendable" after the QBTC chain has consumed it. Cross-checking
|
|
11
11
|
* against the chain's UTXO endpoint (btcq-org/qbtc#141) prevents the user
|
|
12
12
|
* from selecting a stale entry and burning ~90s on a no-op claim.
|
|
13
|
+
*
|
|
14
|
+
* The returned `amount` reflects the chain's remaining `entitled_amount`,
|
|
15
|
+
* not the Blockchair-reported BTC value — partial payouts on a UTXO would
|
|
16
|
+
* otherwise mislead the user about what they're about to claim.
|
|
13
17
|
*/
|
|
14
18
|
export declare const getClaimableUtxos: ({ btcAddress, }: GetClaimableUtxosInput) => Promise<ClaimableUtxo[]>;
|
|
15
19
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getClaimableUtxos.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/getClaimableUtxos.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,KAAK,sBAAsB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;
|
|
1
|
+
{"version":3,"file":"getClaimableUtxos.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/qbtc/claim/getClaimableUtxos.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,KAAK,sBAAsB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAiDD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,GAAU,iBAErC,sBAAsB,KAAG,OAAO,CAAC,aAAa,EAAE,CAyBlD,CAAA"}
|
|
@@ -2,21 +2,31 @@ import { Chain } from '@vultisig/core-chain/Chain';
|
|
|
2
2
|
import { qbtcRestUrl } from '@vultisig/core-chain/chains/cosmos/qbtc/tendermintRpcUrl';
|
|
3
3
|
import { getUtxoAddressInfo } from '@vultisig/core-chain/chains/utxo/client/getUtxoAddressInfo';
|
|
4
4
|
/**
|
|
5
|
-
* Asks the QBTC chain
|
|
6
|
-
*
|
|
5
|
+
* Asks the QBTC chain how much of a given UTXO is still claimable via
|
|
6
|
+
* `GET /qbtc/v1/utxo/{txid}/{vout}`.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* The chain returns the UTXO record with its remaining `entitled_amount`
|
|
9
|
+
* even after a full payout — `entitled_amount` is `"0"` once consumed.
|
|
10
|
+
* So a 200 alone is not enough; we have to inspect the body. 404 still
|
|
11
|
+
* happens for UTXOs the chain has never registered.
|
|
12
|
+
*
|
|
13
|
+
* Returns `null` when the UTXO is no longer claimable; otherwise returns
|
|
14
|
+
* the remaining entitled amount in satoshis. Other non-2xx responses
|
|
15
|
+
* propagate so transient network failures don't silently drop UTXOs.
|
|
12
16
|
*/
|
|
13
|
-
const
|
|
17
|
+
const getOnChainEntitledAmount = async ({ txid, vout, }) => {
|
|
14
18
|
const response = await fetch(`${qbtcRestUrl}/qbtc/v1/utxo/${txid}/${vout}`);
|
|
15
|
-
if (response.ok)
|
|
16
|
-
return true;
|
|
17
19
|
if (response.status === 404)
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
+
return null;
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
throw new Error(`Failed to verify UTXO ${txid}:${vout} on QBTC chain (${response.status} ${response.statusText})`);
|
|
23
|
+
}
|
|
24
|
+
const body = await response.json();
|
|
25
|
+
const entitled = body.utxo?.entitled_amount;
|
|
26
|
+
if (entitled === undefined)
|
|
27
|
+
return null;
|
|
28
|
+
const remaining = BigInt(entitled);
|
|
29
|
+
return remaining > 0n ? remaining : null;
|
|
20
30
|
};
|
|
21
31
|
/**
|
|
22
32
|
* Fetches Bitcoin UTXOs for the given address via Blockchair and filters
|
|
@@ -26,6 +36,10 @@ const isUtxoClaimableOnChain = async ({ txid, vout, }) => {
|
|
|
26
36
|
* appear "spendable" after the QBTC chain has consumed it. Cross-checking
|
|
27
37
|
* against the chain's UTXO endpoint (btcq-org/qbtc#141) prevents the user
|
|
28
38
|
* from selecting a stale entry and burning ~90s on a no-op claim.
|
|
39
|
+
*
|
|
40
|
+
* The returned `amount` reflects the chain's remaining `entitled_amount`,
|
|
41
|
+
* not the Blockchair-reported BTC value — partial payouts on a UTXO would
|
|
42
|
+
* otherwise mislead the user about what they're about to claim.
|
|
29
43
|
*/
|
|
30
44
|
export const getClaimableUtxos = async ({ btcAddress, }) => {
|
|
31
45
|
const response = await getUtxoAddressInfo({
|
|
@@ -33,12 +47,18 @@ export const getClaimableUtxos = async ({ btcAddress, }) => {
|
|
|
33
47
|
chain: Chain.Bitcoin,
|
|
34
48
|
});
|
|
35
49
|
const btcUtxos = response.data[btcAddress]?.utxo ?? [];
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
50
|
+
const entitledAmounts = await Promise.all(btcUtxos.map(({ transaction_hash, index }) => getOnChainEntitledAmount({ txid: transaction_hash, vout: index })));
|
|
51
|
+
return btcUtxos.flatMap(({ transaction_hash, index }, i) => {
|
|
52
|
+
const remaining = entitledAmounts[i];
|
|
53
|
+
if (remaining === null)
|
|
54
|
+
return [];
|
|
55
|
+
return [
|
|
56
|
+
{
|
|
57
|
+
txid: transaction_hash,
|
|
58
|
+
vout: index,
|
|
59
|
+
amount: Number(remaining),
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
});
|
|
43
63
|
};
|
|
44
64
|
//# sourceMappingURL=getClaimableUtxos.js.map
|
|
@@ -1 +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,WAAW,EAAE,MAAM,0DAA0D,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAA;
|
|
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,WAAW,EAAE,MAAM,0DAA0D,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAA;AAiB/F;;;;;;;;;;;;GAYG;AACH,MAAM,wBAAwB,GAAG,KAAK,EAAE,EACtC,IAAI,EACJ,IAAI,GAIL,EAA0B,EAAE;IAC3B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,iBAAiB,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;IAE3E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAExC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,IAAI,IAAI,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,CAClG,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAqB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAA;IAC3C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAEvC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClC,OAAO,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1C,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;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,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;IAEtD,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3C,wBAAwB,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAClE,CACF,CAAA;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;QACpC,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,EAAE,CAAA;QACjC,OAAO;YACL;gBACE,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;aAC1B;SACF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmos.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/cosmos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAMxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"cosmos.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/cosmos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAMxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,CAAC,WAAW,CAcjE,CAAA"}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
import { getCosmosClient } from '@vultisig/core-chain/chains/cosmos/client';
|
|
2
|
-
import { getCosmosWasmTokenBalanceUrl } from '@vultisig/core-chain/chains/cosmos/cosmosRpcUrl';
|
|
2
|
+
import { getCosmosWasmTokenBalanceUrl, isCosmosWasmTokenId } from '@vultisig/core-chain/chains/cosmos/cosmosRpcUrl';
|
|
3
3
|
import { getDenom } from '@vultisig/core-chain/coin/utils/getDenom';
|
|
4
4
|
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
5
|
-
const isWasmToken = (id) => {
|
|
6
|
-
if (id.startsWith('ibc/') || id.startsWith('factory/')) {
|
|
7
|
-
return false;
|
|
8
|
-
}
|
|
9
|
-
const wasmTokenPattern = /^[a-z]+1[a-z0-9]{20,80}$/;
|
|
10
|
-
return wasmTokenPattern.test(id);
|
|
11
|
-
};
|
|
12
5
|
export const getCosmosCoinBalance = async (input) => {
|
|
13
|
-
if (
|
|
6
|
+
if (isCosmosWasmTokenId(input.id)) {
|
|
14
7
|
const url = getCosmosWasmTokenBalanceUrl(input);
|
|
15
8
|
const { data } = await queryUrl(url);
|
|
16
9
|
return BigInt(data.balance ?? 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/cosmos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAA;
|
|
1
|
+
{"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/cosmos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AACnH,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAI7D,MAAM,CAAC,MAAM,oBAAoB,GAAqC,KAAK,EAAC,KAAK,EAAC,EAAE;IAClF,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAoB,GAAG,CAAC,CAAA;QACvD,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAA;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAEjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE7B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAE7D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AAC/B,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/evm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAKrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/evm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAKrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAsD3E,eAAO,MAAM,YAAY,EAAE,iBAAiB,CAAC,QAAQ,CAkGpD,CAAA"}
|
|
@@ -4,10 +4,36 @@ import { evmNativeCoinAddress } from '@vultisig/core-chain/chains/evm/config';
|
|
|
4
4
|
import { getErc20Balance } from '@vultisig/core-chain/chains/evm/erc20/getErc20Balance';
|
|
5
5
|
import { queryOneInch } from '@vultisig/core-chain/coin/find/resolvers/evm/queryOneInch';
|
|
6
6
|
import { vult } from '@vultisig/core-chain/coin/knownTokens';
|
|
7
|
+
import { getEvmTokenMetadata } from '@vultisig/core-chain/coin/token/metadata/resolvers/evm';
|
|
7
8
|
import { without } from '@vultisig/lib-utils/array/without';
|
|
8
9
|
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
9
10
|
import { NoDataError } from '@vultisig/lib-utils/error/NoDataError';
|
|
10
11
|
import { hexToNumber } from '@vultisig/lib-utils/hex/hexToNumber';
|
|
12
|
+
const getDiscoveredEvmCoin = async ({ address, chain, tokenAddress, token, }) => {
|
|
13
|
+
if (token) {
|
|
14
|
+
return {
|
|
15
|
+
chain,
|
|
16
|
+
id: token.address,
|
|
17
|
+
decimals: token.decimals,
|
|
18
|
+
logo: token.logoURI,
|
|
19
|
+
ticker: token.symbol,
|
|
20
|
+
address,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const metadataResult = await attempt(() => getEvmTokenMetadata({ chain, id: tokenAddress }));
|
|
24
|
+
if ('error' in metadataResult) {
|
|
25
|
+
if (metadataResult.error instanceof NoDataError) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
throw metadataResult.error;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
chain,
|
|
32
|
+
id: tokenAddress,
|
|
33
|
+
address,
|
|
34
|
+
...metadataResult.data,
|
|
35
|
+
};
|
|
36
|
+
};
|
|
11
37
|
export const findEvmCoins = async ({ address, chain, }) => {
|
|
12
38
|
const oneInchSupportedChains = [
|
|
13
39
|
EvmChain.Ethereum,
|
|
@@ -37,20 +63,21 @@ export const findEvmCoins = async ({ address, chain, }) => {
|
|
|
37
63
|
.filter(tokenAddress => tokenAddress !== evmNativeCoinAddress);
|
|
38
64
|
let discoveredCoins = [];
|
|
39
65
|
if (nonZeroBalanceTokenAddresses.length > 0) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
66
|
+
const tokenInfoResult = await attempt(queryOneInch(`/token/v1.2/${oneInchChainId}/custom?addresses=${nonZeroBalanceTokenAddresses.join(',')}`));
|
|
67
|
+
let tokenInfoData = {};
|
|
68
|
+
if ('data' in tokenInfoResult) {
|
|
69
|
+
tokenInfoData = tokenInfoResult.data ?? {};
|
|
70
|
+
}
|
|
71
|
+
else if (!(tokenInfoResult.error instanceof NoDataError)) {
|
|
72
|
+
throw tokenInfoResult.error;
|
|
73
|
+
}
|
|
74
|
+
discoveredCoins = without(await Promise.all(nonZeroBalanceTokenAddresses.map(tokenAddress => getDiscoveredEvmCoin({
|
|
75
|
+
address,
|
|
76
|
+
chain,
|
|
77
|
+
tokenAddress,
|
|
78
|
+
token: tokenInfoData[tokenAddress] ??
|
|
79
|
+
tokenInfoData[tokenAddress.toLowerCase()],
|
|
80
|
+
}))), undefined);
|
|
54
81
|
}
|
|
55
82
|
if (chain !== EvmChain.Ethereum ||
|
|
56
83
|
discoveredCoins.some(coin => coin.id?.toLowerCase() === vult.id.toLowerCase())) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/evm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAGvF,OAAO,EAAE,YAAY,EAAE,MAAM,2DAA2D,CAAA;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAA;AAE5D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/evm/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmos.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/cosmos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"cosmos.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/cosmos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAQxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAgFzF,eAAO,MAAM,sBAAsB,EAAE,qBAAqB,CAAC,WAAW,CAuCrE,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cosmosRpcUrl } from '@vultisig/core-chain/chains/cosmos/cosmosRpcUrl';
|
|
1
|
+
import { cosmosRpcUrl, getCosmosWasmTokenInfoUrl, isCosmosWasmTokenId, } from '@vultisig/core-chain/chains/cosmos/cosmosRpcUrl';
|
|
2
2
|
import { knownCosmosTokens } from '@vultisig/core-chain/coin/knownTokens/cosmos';
|
|
3
3
|
import { getLastItem } from '@vultisig/lib-utils/array/getLastItem';
|
|
4
4
|
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
@@ -7,8 +7,15 @@ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
|
7
7
|
const decimalsFromMeta = (meta) => {
|
|
8
8
|
if (!meta.denom_units || !meta.display)
|
|
9
9
|
return null;
|
|
10
|
-
const
|
|
11
|
-
|
|
10
|
+
const byDisplay = meta.denom_units.find(u => u.denom === meta.display);
|
|
11
|
+
if (byDisplay)
|
|
12
|
+
return byDisplay.exponent;
|
|
13
|
+
if (meta.symbol) {
|
|
14
|
+
const bySymbol = meta.denom_units.find(u => u.denom === meta.symbol);
|
|
15
|
+
if (bySymbol)
|
|
16
|
+
return bySymbol.exponent;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
12
19
|
};
|
|
13
20
|
const deriveTicker = (denom, meta) => {
|
|
14
21
|
if (meta.symbol)
|
|
@@ -41,6 +48,20 @@ const getDenomMetaFromLCD = async (lcdBase, denom) => {
|
|
|
41
48
|
return listRes.data?.metadatas?.find(data => data.base === denom) ?? null;
|
|
42
49
|
});
|
|
43
50
|
};
|
|
51
|
+
const getCw20MetaFromLCD = async (chain, id) => {
|
|
52
|
+
const { data } = await queryUrl(getCosmosWasmTokenInfoUrl({ chain, id }));
|
|
53
|
+
const ticker = data?.symbol?.trim();
|
|
54
|
+
if (!ticker)
|
|
55
|
+
throw new Error(`Could not fetch CW20 symbol for ${id}`);
|
|
56
|
+
const decimals = data?.decimals;
|
|
57
|
+
if (typeof decimals !== 'number' || !Number.isInteger(decimals) || decimals < 0) {
|
|
58
|
+
throw new Error(`Could not fetch CW20 decimals for ${id}`);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
ticker,
|
|
62
|
+
decimals,
|
|
63
|
+
};
|
|
64
|
+
};
|
|
44
65
|
export const getCosmosTokenMetadata = async ({ chain, id }) => {
|
|
45
66
|
const knownMeta = knownCosmosTokens[chain]?.[id];
|
|
46
67
|
if (knownMeta) {
|
|
@@ -49,12 +70,28 @@ export const getCosmosTokenMetadata = async ({ chain, id }) => {
|
|
|
49
70
|
decimals: knownMeta.decimals,
|
|
50
71
|
};
|
|
51
72
|
}
|
|
73
|
+
if (isCosmosWasmTokenId(id)) {
|
|
74
|
+
return asyncFallbackChain(async () => getCw20MetaFromLCD(chain, id), async () => {
|
|
75
|
+
const lcd = cosmosRpcUrl[chain];
|
|
76
|
+
const meta = await getDenomMetaFromLCD(lcd, id);
|
|
77
|
+
if (!meta)
|
|
78
|
+
throw new Error(`No denom meta information available for ${id}`);
|
|
79
|
+
const decimals = decimalsFromMeta(meta);
|
|
80
|
+
if (decimals === null)
|
|
81
|
+
throw new Error(`Could not fetch decimal for ${id}`);
|
|
82
|
+
const ticker = deriveTicker(id, meta);
|
|
83
|
+
return {
|
|
84
|
+
ticker,
|
|
85
|
+
decimals,
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
}
|
|
52
89
|
const lcd = cosmosRpcUrl[chain];
|
|
53
90
|
const meta = await getDenomMetaFromLCD(lcd, id);
|
|
54
91
|
if (!meta)
|
|
55
92
|
throw new Error(`No denom meta information available for ${id}`);
|
|
56
93
|
const decimals = decimalsFromMeta(meta);
|
|
57
|
-
if (
|
|
94
|
+
if (decimals === null)
|
|
58
95
|
throw new Error(`Could not fetch decimal for ${id}`);
|
|
59
96
|
const ticker = deriveTicker(id, meta);
|
|
60
97
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/cosmos.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/cosmos.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,28 @@ export declare const nativeSwapEnabledChainsRecord: {
|
|
|
14
14
|
};
|
|
15
15
|
type NativeSwapEnabledChain = (typeof nativeSwapEnabledChainsRecord)[NativeSwapChain][number];
|
|
16
16
|
export declare const nativeSwapEnabledChains: NativeSwapEnabledChain[];
|
|
17
|
-
export declare const nativeSwapChainIds:
|
|
17
|
+
export declare const nativeSwapChainIds: {
|
|
18
|
+
Avalanche: string;
|
|
19
|
+
"Bitcoin-Cash": string;
|
|
20
|
+
BSC: string;
|
|
21
|
+
Bitcoin: string;
|
|
22
|
+
Dogecoin: string;
|
|
23
|
+
Ethereum: string;
|
|
24
|
+
Cosmos: string;
|
|
25
|
+
Litecoin: string;
|
|
26
|
+
THORChain: string;
|
|
27
|
+
MayaChain: string;
|
|
28
|
+
Kujira: string;
|
|
29
|
+
Dash: string;
|
|
30
|
+
Arbitrum: string;
|
|
31
|
+
Zcash: string;
|
|
32
|
+
Ripple: string;
|
|
33
|
+
Base: string;
|
|
34
|
+
Solana: string;
|
|
35
|
+
Tron: string;
|
|
36
|
+
Noble: string;
|
|
37
|
+
};
|
|
38
|
+
export type NativeSwapChainId = (typeof nativeSwapChainIds)[NativeSwapEnabledChain];
|
|
18
39
|
type NativeSwapPayloadCase = 'thorchainSwapPayload' | 'mayachainSwapPayload';
|
|
19
40
|
export declare const nativeSwapPayloadCase: Record<NativeSwapChain, NativeSwapPayloadCase>;
|
|
20
41
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeSwapChain.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/native/NativeSwapChain.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,qCAA8C,CAAA;AAC3E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/D,wFAAwF;AACxF,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAGvE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,0CAA0C,MAAM,CAAA;AAE7D,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAGhE,CAAA;AAmBD,eAAO,MAAM,6BAA6B;;;CAYhC,CAAA;AAEV,KAAK,sBAAsB,GACzB,CAAC,OAAO,6BAA6B,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjE,eAAO,MAAM,uBAAuB,EAE/B,sBAAsB,EAAE,CAAA;AAE7B,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"NativeSwapChain.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/native/NativeSwapChain.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,qCAA8C,CAAA;AAC3E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/D,wFAAwF;AACxF,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAGvE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,0CAA0C,MAAM,CAAA;AAE7D,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAGhE,CAAA;AAmBD,eAAO,MAAM,6BAA6B;;;CAYhC,CAAA;AAEV,KAAK,sBAAsB,GACzB,CAAC,OAAO,6BAA6B,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjE,eAAO,MAAM,uBAAuB,EAE/B,sBAAsB,EAAE,CAAA;AAE7B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;CAoBmB,CAAA;AAClD,MAAM,MAAM,iBAAiB,GAC3B,CAAC,OAAO,kBAAkB,CAAC,CAAC,sBAAsB,CAAC,CAAA;AAErD,KAAK,qBAAqB,GACtB,sBAAsB,GACtB,sBAAsB,CAAA;AAE1B,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,eAAe,EACf,qBAAqB,CAItB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeSwapChain.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/native/NativeSwapChain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAE/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAU,CAAA;AAG3E,wFAAwF;AACxF,MAAM,CAAC,MAAM,2BAA2B,GAAoC;IAC1E,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;IACpB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;CACrB,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,0CAA0C,GAAG,GAAG,CAAA;AAE7D,MAAM,CAAC,MAAM,oBAAoB,GAAoC;IACnE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY;IAC/D,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY;CAChE,CAAA;AAED,MAAM,0BAA0B,GAAG;IACjC,KAAK,CAAC,SAAS;IACf,KAAK,CAAC,WAAW;IACjB,KAAK,CAAC,GAAG;IACT,KAAK,CAAC,OAAO;IACb,KAAK,CAAC,QAAQ;IACd,KAAK,CAAC,QAAQ;IACd,KAAK,CAAC,MAAM;IACZ,KAAK,CAAC,QAAQ;IACd,KAAK,CAAC,SAAS;IACf,KAAK,CAAC,MAAM;IACZ,KAAK,CAAC,IAAI;IACV,KAAK,CAAC,MAAM;IACZ,KAAK,CAAC,IAAI;IACV,KAAK,CAAC,KAAK;CACH,CAAA;AAEV,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,0BAA0B;IAC7C,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QACjB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,MAAM;QACZ,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,KAAK;KACZ;CACO,CAAA;AAKV,MAAM,CAAC,MAAM,uBAAuB,GAAG,iBAAiB,CACtD,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CACzC,CAAA;AAE7B,MAAM,CAAC,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"NativeSwapChain.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/native/NativeSwapChain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toNativeSwapAsset.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/asset/toNativeSwapAsset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAA;
|
|
1
|
+
{"version":3,"file":"toNativeSwapAsset.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/asset/toNativeSwapAsset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAA;AA2EhF,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAAI,wBAI/B,OAAO,GAAG,gBAAgB,KAAG,MAoB/B,CAAA"}
|
|
@@ -2,6 +2,44 @@ import { isOneOf } from '@vultisig/lib-utils/array/isOneOf';
|
|
|
2
2
|
import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
3
3
|
import { isFeeCoin } from '../../../coin/utils/isFeeCoin.js';
|
|
4
4
|
import { nativeSwapChainIds, nativeSwapChains, nativeSwapEnabledChains, } from '../NativeSwapChain.js';
|
|
5
|
+
const nativeSwapChainIdValues = Object.values(nativeSwapChainIds);
|
|
6
|
+
const securedAssetDenomChainKeyToSwapId = Object.fromEntries(nativeSwapChainIdValues.map(swapId => [
|
|
7
|
+
swapId.toLowerCase(),
|
|
8
|
+
swapId,
|
|
9
|
+
]));
|
|
10
|
+
const getSecuredAssetSwapId = (chainKey) => securedAssetDenomChainKeyToSwapId[chainKey.toLowerCase()];
|
|
11
|
+
const formatSecuredAssetRest = (rest) => {
|
|
12
|
+
const evmTail = rest.match(/^(.+)-(0x[0-9a-fA-F]+)$/i);
|
|
13
|
+
if (evmTail) {
|
|
14
|
+
return `${evmTail[1].toUpperCase()}-${evmTail[2]}`;
|
|
15
|
+
}
|
|
16
|
+
return rest.toUpperCase();
|
|
17
|
+
};
|
|
18
|
+
const normalizeNativeSwapChainDenom = ({ chain, id, ticker, }) => {
|
|
19
|
+
let denom = id;
|
|
20
|
+
if (id.startsWith('x/')) {
|
|
21
|
+
const tail = id.slice(2);
|
|
22
|
+
if (!tail.includes('/')) {
|
|
23
|
+
denom = shouldBePresent(tail);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (denom.includes('.')) {
|
|
27
|
+
return denom;
|
|
28
|
+
}
|
|
29
|
+
const segments = denom.split('-');
|
|
30
|
+
if (segments.length >= 2) {
|
|
31
|
+
const swapId = getSecuredAssetSwapId(segments[0]);
|
|
32
|
+
if (swapId) {
|
|
33
|
+
const rest = segments.slice(1).join('-');
|
|
34
|
+
return `${swapId}.${formatSecuredAssetRest(rest)}`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!denom.includes('-') && !denom.includes('/')) {
|
|
38
|
+
const swapChainId = nativeSwapChainIds[chain];
|
|
39
|
+
return `${swapChainId}.${ticker}`;
|
|
40
|
+
}
|
|
41
|
+
return id;
|
|
42
|
+
};
|
|
5
43
|
/** Converts a coin to the asset notation used by THORChain/MayaChain swap APIs */
|
|
6
44
|
export const toNativeSwapAsset = ({ chain, id, ticker, }) => {
|
|
7
45
|
if (!isOneOf(chain, nativeSwapEnabledChains)) {
|
|
@@ -12,7 +50,11 @@ export const toNativeSwapAsset = ({ chain, id, ticker, }) => {
|
|
|
12
50
|
return `${swapChainId}.${ticker}`;
|
|
13
51
|
}
|
|
14
52
|
if (isOneOf(chain, nativeSwapChains)) {
|
|
15
|
-
return
|
|
53
|
+
return normalizeNativeSwapChainDenom({
|
|
54
|
+
chain,
|
|
55
|
+
id: shouldBePresent(id),
|
|
56
|
+
ticker,
|
|
57
|
+
});
|
|
16
58
|
}
|
|
17
59
|
const swapChainId = nativeSwapChainIds[chain];
|
|
18
60
|
return `${swapChainId}.${ticker}-${id}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toNativeSwapAsset.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/asset/toNativeSwapAsset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAG5E,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"toNativeSwapAsset.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/asset/toNativeSwapAsset.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AA0BjD,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,CACjD,UAAU,CAAC,MAAM,CAuClB,CAAA"}
|
|
@@ -1,26 +1,58 @@
|
|
|
1
1
|
import { getRippleClient } from '@vultisig/core-chain/chains/ripple/client';
|
|
2
2
|
import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
|
|
3
|
+
/**
|
|
4
|
+
* Engine result codes from XRPL `submit` that indicate the tx may already
|
|
5
|
+
* be on-chain via another MPC peer's broadcast (peer-race recovery path).
|
|
6
|
+
*
|
|
7
|
+
* `tefALREADY` — exact duplicate already seen; the fast peer landed it.
|
|
8
|
+
* `tefPAST_SEQ` — sequence number behind; the fast peer's tx already
|
|
9
|
+
* consumed this sequence.
|
|
10
|
+
*
|
|
11
|
+
* For these we go through `verifyBroadcastByHash` to confirm the tx is
|
|
12
|
+
* actually on-chain before swallowing the duplicate error. Any OTHER
|
|
13
|
+
* non-success engine result (`tem*` malformed, `tec*` claim failures,
|
|
14
|
+
* `tel*` local-policy rejections, `ter*` retry-later, the remaining
|
|
15
|
+
* `tef*` failures) is the chain's authoritative "no" at preflight —
|
|
16
|
+
* propagate directly so the caller sees the real failure.
|
|
17
|
+
*
|
|
18
|
+
* Going through `verifyBroadcastByHash` for non-peer-race rejections
|
|
19
|
+
* would silently swallow the error: `getRippleTxStatus` returns
|
|
20
|
+
* `'pending'` for `txnNotFound`, and the safety net treats `'pending'`
|
|
21
|
+
* as "tx is in flight" (correct for EVM-style chains, wrong for XRPL
|
|
22
|
+
* where rejected txs are never on-chain).
|
|
23
|
+
*/
|
|
24
|
+
const PEER_RACE_ENGINE_RESULTS = new Set(['tefALREADY', 'tefPAST_SEQ']);
|
|
3
25
|
export const broadcastRippleTx = async ({ chain, tx }) => {
|
|
4
26
|
const client = await getRippleClient();
|
|
27
|
+
// RPC-level errors (network blip, connection drop) get the safety-net
|
|
28
|
+
// verify-by-hash path: another peer's broadcast may have landed the tx.
|
|
29
|
+
let response;
|
|
5
30
|
try {
|
|
6
|
-
|
|
7
|
-
// (e.g. `tefPAST_SEQ` / `tefALREADY` for duplicates, `tec*` for fee or
|
|
8
|
-
// balance failures). The rejection is carried in the response payload,
|
|
9
|
-
// not via a thrown error — inspect `engine_result` / `engine_result_code`
|
|
10
|
-
// so non-success outcomes still take the hash-verify path.
|
|
11
|
-
const response = await client.request({
|
|
31
|
+
response = await client.request({
|
|
12
32
|
command: 'submit',
|
|
13
33
|
tx_blob: Buffer.from(tx.encoded).toString('hex'),
|
|
14
34
|
});
|
|
15
|
-
const engineResultCode = response?.result?.engine_result_code;
|
|
16
|
-
if (typeof engineResultCode === 'number' && engineResultCode !== 0) {
|
|
17
|
-
const engineResult = response.result.engine_result ?? 'unknown';
|
|
18
|
-
const engineResultMessage = response.result.engine_result_message ?? '';
|
|
19
|
-
throw new Error(`Ripple broadcast rejected: ${engineResult}${engineResultMessage ? ` — ${engineResultMessage}` : ''}`);
|
|
20
|
-
}
|
|
21
35
|
}
|
|
22
36
|
catch (error) {
|
|
23
37
|
await verifyBroadcastByHash({ chain, tx, error });
|
|
38
|
+
return;
|
|
24
39
|
}
|
|
40
|
+
const engineResultCode = response?.result?.engine_result_code;
|
|
41
|
+
if (typeof engineResultCode !== 'number' || engineResultCode === 0) {
|
|
42
|
+
// tesSUCCESS (applied / queued for next ledger). All good.
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const engineResult = response.result.engine_result ?? 'unknown';
|
|
46
|
+
const engineResultMessage = response.result.engine_result_message ?? '';
|
|
47
|
+
const error = new Error(`Ripple broadcast rejected: ${engineResult}${engineResultMessage ? ` — ${engineResultMessage}` : ''}`);
|
|
48
|
+
if (PEER_RACE_ENGINE_RESULTS.has(engineResult)) {
|
|
49
|
+
// Duplicate / past-sequence: fast MPC peer's broadcast may have
|
|
50
|
+
// already landed the tx. Verify before swallowing.
|
|
51
|
+
await verifyBroadcastByHash({ chain, tx, error });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Authoritative rejection at preflight (tem*/tec*/tel*/ter*/remaining tef*).
|
|
55
|
+
// Propagate so the caller sees the real failure instead of a fake hash.
|
|
56
|
+
throw error;
|
|
25
57
|
};
|
|
26
58
|
//# sourceMappingURL=ripple.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,iBAAiB,GAE1B,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAA;IAEtC,
|
|
1
|
+
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAA;AAEvE,MAAM,CAAC,MAAM,iBAAiB,GAE1B,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAA;IAEtC,sEAAsE;IACtE,wEAAwE;IACxE,IAAI,QAAQ,CAAA;IACZ,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YAC9B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;SACjD,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QACjD,OAAM;IACR,CAAC;IAED,MAAM,gBAAgB,GAAG,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAA;IAC7D,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;QACnE,2DAA2D;QAC3D,OAAM;IACR,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAA;IAC/D,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAA;IACvE,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,8BAA8B,YAAY,GAAG,mBAAmB,CAAC,CAAC,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACtG,CAAA;IAED,IAAI,wBAAwB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,gEAAgE;QAChE,mDAAmD;QACnD,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QACjD,OAAM;IACR,CAAC;IAED,6EAA6E;IAC7E,wEAAwE;IACxE,MAAM,KAAK,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAK9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,CAAC,UAAU,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAK9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAyDjE,CAAA"}
|
|
@@ -8,8 +8,17 @@ export const getRippleTxStatus = async ({ hash, }) => {
|
|
|
8
8
|
command: 'tx',
|
|
9
9
|
transaction: hash,
|
|
10
10
|
}));
|
|
11
|
-
if (error ||
|
|
12
|
-
|
|
11
|
+
if (error ||
|
|
12
|
+
!response ||
|
|
13
|
+
typeof response.result !== 'object' ||
|
|
14
|
+
response.result === null) {
|
|
15
|
+
// The chain says it doesn't know this hash, OR the response is
|
|
16
|
+
// shaped unexpectedly (e.g. malformed payload `{}` without `result`).
|
|
17
|
+
// Either case: mark `isKnown: false` so the verify-by-hash safety
|
|
18
|
+
// net does NOT swallow broadcast errors. Mirrors `solana.ts:19`.
|
|
19
|
+
// Status itself stays `'pending'` so status-polling UI can re-query
|
|
20
|
+
// later.
|
|
21
|
+
return { status: 'pending', isKnown: false };
|
|
13
22
|
}
|
|
14
23
|
const { validated, meta, tx_json } = response.result;
|
|
15
24
|
if (validated) {
|
|
@@ -29,6 +38,7 @@ export const getRippleTxStatus = async ({ hash, }) => {
|
|
|
29
38
|
: undefined;
|
|
30
39
|
return { status, receipt };
|
|
31
40
|
}
|
|
32
|
-
|
|
41
|
+
// Genuinely in the ledger but not yet validated — XRPL knows about it.
|
|
42
|
+
return { status: 'pending', isKnown: true };
|
|
33
43
|
};
|
|
34
44
|
//# sourceMappingURL=ripple.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAIrD,MAAM,CAAC,MAAM,iBAAiB,GAAwC,KAAK,EAAE,EAC3E,IAAI,GACL,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAA;IAEtC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAC7C,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;KAClB,CAAC,CACH,CAAA;IAED,
|
|
1
|
+
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAIrD,MAAM,CAAC,MAAM,iBAAiB,GAAwC,KAAK,EAAE,EAC3E,IAAI,GACL,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAA;IAEtC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAC7C,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;KAClB,CAAC,CACH,CAAA;IAED,IACE,KAAK;QACL,CAAC,QAAQ;QACT,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;QACnC,QAAQ,CAAC,MAAM,KAAK,IAAI,EACxB,CAAC;QACD,+DAA+D;QAC/D,sEAAsE;QACtE,kEAAkE;QAClE,iEAAiE;QACjE,oEAAoE;QACpE,SAAS;QACT,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC9C,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,MAI7C,CAAA;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI,KAAK,IAAI;YACb,mBAAmB,IAAI,IAAI;YAC3B,IAAI,CAAC,iBAAiB,KAAK,YAAY,CAAA;QAEzC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;QAC5C,MAAM,MAAM,GAAG,OAAO,EAAE,GAAG,CAAA;QAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC1C,MAAM,OAAO,GACX,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE;YAC7B,CAAC,CAAC;gBACE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;gBACzB,WAAW,EAAE,OAAO,CAAC,QAAQ;gBAC7B,SAAS,EAAE,OAAO,CAAC,MAAM;aAC1B;YACH,CAAC,CAAC,SAAS,CAAA;QAEf,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAC5B,CAAC;IAED,uEAAuE;IACvE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC7C,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vultisig/core-chain",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Blockchain chain logic shared across Vultisig clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -1695,7 +1695,7 @@
|
|
|
1695
1695
|
"@solana/web3.js": "^1.98.4",
|
|
1696
1696
|
"@ton/core": "^0.63.1",
|
|
1697
1697
|
"@ton/crypto": "^3.3.0",
|
|
1698
|
-
"@trustwallet/wallet-core": "^4.6.
|
|
1698
|
+
"@trustwallet/wallet-core": "^4.6.9",
|
|
1699
1699
|
"@vultisig/core-config": "0.9.1",
|
|
1700
1700
|
"@vultisig/lib-utils": "0.10.1",
|
|
1701
1701
|
"bip32": "^5.0.1",
|