@vultisig/core-chain 2.39.0 → 3.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/tx/broadcast/index.d.ts +2 -0
  3. package/dist/tx/broadcast/index.d.ts.map +1 -1
  4. package/dist/tx/broadcast/index.js +34 -3
  5. package/dist/tx/broadcast/index.js.map +1 -1
  6. package/dist/tx/broadcast/resolver.d.ts +35 -1
  7. package/dist/tx/broadcast/resolver.d.ts.map +1 -1
  8. package/dist/tx/broadcast/resolver.js +42 -1
  9. package/dist/tx/broadcast/resolver.js.map +1 -1
  10. package/dist/tx/broadcast/resolvers/bittensor.d.ts.map +1 -1
  11. package/dist/tx/broadcast/resolvers/bittensor.js +17 -6
  12. package/dist/tx/broadcast/resolvers/bittensor.js.map +1 -1
  13. package/dist/tx/broadcast/resolvers/cardano.d.ts.map +1 -1
  14. package/dist/tx/broadcast/resolvers/cardano.js +26 -16
  15. package/dist/tx/broadcast/resolvers/cardano.js.map +1 -1
  16. package/dist/tx/broadcast/resolvers/cosmos.d.ts.map +1 -1
  17. package/dist/tx/broadcast/resolvers/cosmos.js +33 -31
  18. package/dist/tx/broadcast/resolvers/cosmos.js.map +1 -1
  19. package/dist/tx/broadcast/resolvers/evm.d.ts.map +1 -1
  20. package/dist/tx/broadcast/resolvers/evm.js +21 -9
  21. package/dist/tx/broadcast/resolvers/evm.js.map +1 -1
  22. package/dist/tx/broadcast/resolvers/polkadot.d.ts.map +1 -1
  23. package/dist/tx/broadcast/resolvers/polkadot.js +23 -4
  24. package/dist/tx/broadcast/resolvers/polkadot.js.map +1 -1
  25. package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
  26. package/dist/tx/broadcast/resolvers/qbtc.js +69 -52
  27. package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
  28. package/dist/tx/broadcast/resolvers/ripple.d.ts.map +1 -1
  29. package/dist/tx/broadcast/resolvers/ripple.js +24 -9
  30. package/dist/tx/broadcast/resolvers/ripple.js.map +1 -1
  31. package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
  32. package/dist/tx/broadcast/resolvers/solana.js +19 -10
  33. package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
  34. package/dist/tx/broadcast/resolvers/sui.d.ts.map +1 -1
  35. package/dist/tx/broadcast/resolvers/sui.js +20 -14
  36. package/dist/tx/broadcast/resolvers/sui.js.map +1 -1
  37. package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
  38. package/dist/tx/broadcast/resolvers/ton.js +16 -5
  39. package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
  40. package/dist/tx/broadcast/resolvers/tron.d.ts.map +1 -1
  41. package/dist/tx/broadcast/resolvers/tron.js +15 -6
  42. package/dist/tx/broadcast/resolvers/tron.js.map +1 -1
  43. package/dist/tx/broadcast/resolvers/utxo.d.ts.map +1 -1
  44. package/dist/tx/broadcast/resolvers/utxo.js +27 -17
  45. package/dist/tx/broadcast/resolvers/utxo.js.map +1 -1
  46. package/dist/tx/broadcast/transientRetry.d.ts.map +1 -1
  47. package/dist/tx/broadcast/transientRetry.js +4 -2
  48. package/dist/tx/broadcast/transientRetry.js.map +1 -1
  49. package/dist/tx/broadcast/verifyBroadcastByHash.d.ts +1 -1
  50. package/dist/tx/broadcast/verifyBroadcastByHash.d.ts.map +1 -1
  51. package/dist/tx/broadcast/verifyBroadcastByHash.js +1 -1
  52. package/dist/tx/broadcast/verifyBroadcastByHash.js.map +1 -1
  53. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @vultisig/core-chain
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [#1891](https://github.com/vultisig/vultisig-sdk/pull/1891) [`7d6a014`](https://github.com/vultisig/vultisig-sdk/commit/7d6a01440fd0b855356cce81469b5b5a91665862) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Standardize signed-transaction broadcast adapters on one typed accepted-or-failed result contract.
8
+
3
9
  ## 2.39.0
4
10
 
5
11
  ### Minor Changes
@@ -1,3 +1,5 @@
1
1
  import { BroadcastTxResolver } from './resolver.js';
2
+ export type { BroadcastAcceptedResult, BroadcastFailedResult, BroadcastProviderDetails, BroadcastTxResolver, BroadcastTxResult, } from './resolver.js';
3
+ export { BroadcastErrorCode } from './resolver.js';
2
4
  export declare const broadcastTx: BroadcastTxResolver;
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAgChD,eAAO,MAAM,WAAW,EAAE,mBASzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,mBAAmB,EAAkD,MAAM,YAAY,CAAA;AAgCjH,YAAY,EACV,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,WAAW,EAAE,mBAoCzB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { getChainKind } from '@vultisig/core-chain/ChainKind';
2
+ import { broadcastFailed, isBroadcastTxResult, isRetryableBroadcastCause } from './resolver.js';
2
3
  import { broadcastBittensorTx } from './resolvers/bittensor.js';
3
4
  import { broadcastCardanoTx } from './resolvers/cardano.js';
4
5
  import { broadcastCosmosTx } from './resolvers/cosmos.js';
@@ -27,12 +28,42 @@ const resolvers = {
27
28
  tron: broadcastTronTx,
28
29
  };
29
30
  const hasResolverOwnedRetry = (chainKind) => chainKind === 'evm' || chainKind === 'solana';
30
- export const broadcastTx = input => {
31
+ export { BroadcastErrorCode } from './resolver.js';
32
+ export const broadcastTx = async (input) => {
31
33
  const chainKind = getChainKind(input.chain);
32
34
  const resolver = resolvers[chainKind];
35
+ const resolveOnce = async () => {
36
+ try {
37
+ const result = await resolver(input);
38
+ if (isBroadcastTxResult(result))
39
+ return result;
40
+ return broadcastFailed(new Error('Broadcast resolver returned an invalid result'), false, {
41
+ provider: result,
42
+ });
43
+ }
44
+ catch (cause) {
45
+ return broadcastFailed(cause, isRetryableBroadcastCause(cause));
46
+ }
47
+ };
33
48
  if (hasResolverOwnedRetry(chainKind)) {
34
- return resolver(input);
49
+ return resolveOnce();
50
+ }
51
+ try {
52
+ return await withTransientBroadcastRetry(async () => {
53
+ const result = await resolveOnce();
54
+ if (result.status === 'failed' && result.retryable)
55
+ throw result;
56
+ return result;
57
+ });
58
+ }
59
+ catch (cause) {
60
+ if (isBroadcastTxResult(cause))
61
+ return cause;
62
+ // The public boundary is total even if a future resolver forgets to
63
+ // normalize an exception. Default to non-retryable unless the cause is a
64
+ // recognizable transport failure; blindly retrying an ambiguous signed
65
+ // transaction can double-submit it.
66
+ return broadcastFailed(cause, isRetryableBroadcastCause(cause));
35
67
  }
36
- return withTransientBroadcastRetry(() => resolver(input));
37
68
  };
38
69
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAGxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AAE9D,MAAM,SAAS,GAAgD;IAC7D,SAAS,EAAE,oBAAoB;IAC/B,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,iBAAiB;IACzB,GAAG,EAAE,cAAc;IACnB,QAAQ,EAAE,mBAAmB;IAC7B,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,iBAAiB;IACzB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,cAAc;IACnB,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,eAAe;CACtB,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,SAAoB,EAAW,EAAE,CAAC,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,QAAQ,CAAA;AAE9G,MAAM,CAAC,MAAM,WAAW,GAAwB,KAAK,CAAC,EAAE;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;IAErC,IAAI,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,2BAA2B,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AAC3D,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,42 @@
1
1
  import { Resolver } from '@vultisig/lib-utils/types/Resolver';
2
2
  import { Chain } from '../../Chain.js';
3
3
  import { SigningOutput } from '../../tw/signingOutput.js';
4
+ export declare const BroadcastErrorCode: {
5
+ readonly Rejected: "BROADCAST_REJECTED";
6
+ readonly Transport: "BROADCAST_TRANSPORT_ERROR";
7
+ };
8
+ export type BroadcastErrorCode = (typeof BroadcastErrorCode)[keyof typeof BroadcastErrorCode];
9
+ export type BroadcastProviderDetails = {
10
+ /** Chain/provider-native data, isolated so it cannot become the common contract by accident. */
11
+ provider: unknown;
12
+ };
13
+ /**
14
+ * The provider accepted (or already knew) the signed transaction.
15
+ *
16
+ * `finality: 'pending'` is intentional: a broadcast acknowledgement does not
17
+ * prove that the transaction executed successfully or reached finality.
18
+ */
19
+ export type BroadcastAcceptedResult = {
20
+ status: 'accepted';
21
+ finality: 'pending';
22
+ txHash?: string;
23
+ details?: BroadcastProviderDetails;
24
+ };
25
+ export type BroadcastFailedResult = {
26
+ status: 'failed';
27
+ code: BroadcastErrorCode;
28
+ retryable: boolean;
29
+ /** Original provider/transport cause retained for diagnostics and logging. */
30
+ cause: unknown;
31
+ details?: BroadcastProviderDetails;
32
+ };
33
+ export type BroadcastTxResult = BroadcastAcceptedResult | BroadcastFailedResult;
34
+ export declare const broadcastAccepted: (txHash?: string, details?: BroadcastProviderDetails) => BroadcastAcceptedResult;
35
+ export declare const broadcastFailed: (cause: unknown, retryable: boolean, details?: BroadcastProviderDetails) => BroadcastFailedResult;
36
+ export declare const isRetryableBroadcastCause: (cause: unknown) => boolean;
37
+ export declare const isBroadcastTxResult: (value: unknown) => value is BroadcastTxResult;
4
38
  export type BroadcastTxResolver<T extends Chain = Chain> = Resolver<{
5
39
  chain: T;
6
40
  tx: SigningOutput<T>;
7
- }, Promise<unknown>>;
41
+ }, Promise<BroadcastTxResult>>;
8
42
  //# sourceMappingURL=resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI,QAAQ,CACjE;IACE,KAAK,EAAE,CAAC,CAAA;IACR,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CACrB,EACD,OAAO,CAAC,OAAO,CAAC,CACjB,CAAA"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGtD,eAAO,MAAM,kBAAkB;;;CAGrB,CAAA;AAEV,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAA;AAE7F,MAAM,MAAM,wBAAwB,GAAG;IACrC,gGAAgG;IAChG,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,UAAU,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,wBAAwB,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,QAAQ,CAAA;IAChB,IAAI,EAAE,kBAAkB,CAAA;IACxB,SAAS,EAAE,OAAO,CAAA;IAClB,8EAA8E;IAC9E,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,wBAAwB,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,GAAG,qBAAqB,CAAA;AAE/E,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,UAAU,wBAAwB,KAAG,uBAKtF,CAAA;AAEF,eAAO,MAAM,eAAe,GAC1B,OAAO,OAAO,EACd,WAAW,OAAO,EAClB,UAAU,wBAAwB,KACjC,qBAMD,CAAA;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,OAAO,KAAG,OAA2C,CAAA;AAYtG,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,iBAqB7D,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI,QAAQ,CACjE;IACE,KAAK,EAAE,CAAC,CAAA;IACR,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CACrB,EACD,OAAO,CAAC,iBAAiB,CAAC,CAC3B,CAAA"}
@@ -1,2 +1,43 @@
1
- export {};
1
+ import { isTransientBroadcastError } from './transientRetry.js';
2
+ export const BroadcastErrorCode = {
3
+ Rejected: 'BROADCAST_REJECTED',
4
+ Transport: 'BROADCAST_TRANSPORT_ERROR',
5
+ };
6
+ export const broadcastAccepted = (txHash, details) => ({
7
+ status: 'accepted',
8
+ finality: 'pending',
9
+ ...(txHash ? { txHash } : {}),
10
+ ...(details ? { details } : {}),
11
+ });
12
+ export const broadcastFailed = (cause, retryable, details) => ({
13
+ status: 'failed',
14
+ code: retryable ? BroadcastErrorCode.Transport : BroadcastErrorCode.Rejected,
15
+ retryable,
16
+ cause,
17
+ ...(details ? { details } : {}),
18
+ });
19
+ export const isRetryableBroadcastCause = (cause) => isTransientBroadcastError(cause);
20
+ const hasOnlyKeys = (value, allowedKeys) => Object.keys(value).every(key => allowedKeys.includes(key));
21
+ const hasValidDetails = (result) => result.details === undefined ||
22
+ (typeof result.details === 'object' &&
23
+ result.details !== null &&
24
+ 'provider' in result.details &&
25
+ hasOnlyKeys(result.details, ['provider']));
26
+ export const isBroadcastTxResult = (value) => {
27
+ if (!value || typeof value !== 'object')
28
+ return false;
29
+ const result = value;
30
+ if (result.status === 'accepted') {
31
+ return (result.finality === 'pending' &&
32
+ (result.txHash === undefined || (typeof result.txHash === 'string' && result.txHash.length > 0)) &&
33
+ hasValidDetails(result) &&
34
+ hasOnlyKeys(result, ['status', 'finality', 'txHash', 'details']));
35
+ }
36
+ return (result.status === 'failed' &&
37
+ ((result.code === BroadcastErrorCode.Rejected && result.retryable === false) ||
38
+ (result.code === BroadcastErrorCode.Transport && result.retryable === true)) &&
39
+ 'cause' in result &&
40
+ hasValidDetails(result) &&
41
+ hasOnlyKeys(result, ['status', 'code', 'retryable', 'cause', 'details']));
42
+ };
2
43
  //# sourceMappingURL=resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/resolver.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/resolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bittensor.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/bittensor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AASjD,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,CAAC,UAAU,CAAC,SAAS,CA0B1E,CAAA"}
1
+ {"version":3,"file":"bittensor.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/bittensor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAsC,mBAAmB,EAA6B,MAAM,aAAa,CAAA;AAShH,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAoC1E,CAAA"}
@@ -1,10 +1,19 @@
1
1
  import { bittensorRpcUrl } from '@vultisig/core-chain/chains/bittensor/client';
2
2
  import { ensureHexPrefix } from '@vultisig/lib-utils/hex/ensureHexPrefix';
3
3
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
4
+ import { broadcastAccepted, broadcastFailed, isRetryableBroadcastCause } from '../resolver.js';
4
5
  import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
5
6
  import { formatSubstrateRpcError, isIdempotentSubstrateBroadcastError } from './substrate.js';
6
7
  export const broadcastBittensorTx = async ({ chain, tx }) => {
7
8
  const hexWithPrefix = ensureHexPrefix(Buffer.from(tx.encoded).toString('hex'));
9
+ const verify = async (error, retryable = isRetryableBroadcastCause(error)) => {
10
+ try {
11
+ return broadcastAccepted(await verifyBroadcastByHash({ chain, tx, error }));
12
+ }
13
+ catch (cause) {
14
+ return broadcastFailed(cause, retryable);
15
+ }
16
+ };
8
17
  try {
9
18
  const response = await queryUrl(bittensorRpcUrl, {
10
19
  body: {
@@ -16,16 +25,18 @@ export const broadcastBittensorTx = async ({ chain, tx }) => {
16
25
  });
17
26
  if (response.error) {
18
27
  if (isIdempotentSubstrateBroadcastError(response.error)) {
19
- return;
28
+ return broadcastAccepted();
20
29
  }
21
- throw new Error(`Bittensor broadcast failed: ${formatSubstrateRpcError(response.error)}`);
30
+ const error = new Error(`Bittensor broadcast failed: ${formatSubstrateRpcError(response.error)}`);
31
+ return verify(error, false);
22
32
  }
23
- if (!response.result) {
24
- throw new Error('Bittensor broadcast failed: missing extrinsic hash in RPC response');
33
+ if (response.result) {
34
+ return broadcastAccepted(response.result);
25
35
  }
36
+ return verify(new Error('Bittensor broadcast failed: missing extrinsic hash in RPC response'), false);
26
37
  }
27
- catch (error) {
28
- await verifyBroadcastByHash({ chain, tx, error });
38
+ catch (cause) {
39
+ return verify(cause);
29
40
  }
30
41
  };
31
42
  //# sourceMappingURL=bittensor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bittensor.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/bittensor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAG7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,mCAAmC,EAAqB,MAAM,aAAa,CAAA;AAO7G,MAAM,CAAC,MAAM,oBAAoB,GAA8C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACrG,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAc,eAAe,EAAE;YAC5D,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,aAAa,CAAC;gBACvB,EAAE,EAAE,CAAC;aACN;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,mCAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAM;YACR,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3F,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACnD,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"bittensor.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/bittensor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAuB,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAChH,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,mCAAmC,EAAqB,MAAM,aAAa,CAAA;AAO7G,MAAM,CAAC,MAAM,oBAAoB,GAA8C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACrG,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9E,MAAM,MAAM,GAAG,KAAK,EAAE,KAAc,EAAE,SAAS,GAAG,yBAAyB,CAAC,KAAK,CAAC,EAAE,EAAE;QACpF,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC,CAAA;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAc,eAAe,EAAE;YAC5D,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,aAAa,CAAC;gBACvB,EAAE,EAAE,CAAC;aACN;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,mCAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,iBAAiB,EAAE,CAAA;YAC5B,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,+BAA+B,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACjG,OAAO,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC3C,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,oEAAoE,CAAC,EAAE,KAAK,CAAC,CAAA;IACvG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAQvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAoBjD,eAAO,MAAM,2BAA2B,GAAI,uBAGzC;IACD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;CACZ,KAAG,KAAK,GAAG,IAcX,CAAA;AAED,eAAO,MAAM,iCAAiC,GAAU,cAAc,UAAU,kBAQ/E,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAuBtE,CAAA"}
1
+ {"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAQvD,OAAO,EAAsC,mBAAmB,EAA6B,MAAM,aAAa,CAAA;AAoBhH,eAAO,MAAM,2BAA2B,GAAI,uBAGzC;IACD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;CACZ,KAAG,KAAK,GAAG,IAcX,CAAA;AAED,eAAO,MAAM,iCAAiC,GAAU,cAAc,UAAU,kBAQ/E,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CA8BtE,CAAA"}
@@ -4,6 +4,7 @@ import { cardanoBroadcastTtlSafetyMargin } from '@vultisig/core-chain/chains/car
4
4
  import { getCardanoTxHash } from '@vultisig/core-chain/tx/hash/resolvers/cardano';
5
5
  import { attempt } from '@vultisig/lib-utils/attempt';
6
6
  import { submitCardanoCbor } from '../../../chains/cardano/submit/submitCardanoCbor.js';
7
+ import { broadcastAccepted, broadcastFailed, isRetryableBroadcastCause } from '../resolver.js';
7
8
  import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
8
9
  import { selectEncodedBytes } from './utxo.js';
9
10
  /**
@@ -39,22 +40,31 @@ export const assertCardanoTtlFreshForBroadcast = async (encodedBytes) => {
39
40
  }
40
41
  };
41
42
  export const broadcastCardanoTx = async ({ chain, tx }) => {
42
- const encodedBytes = selectEncodedBytes(chain, tx);
43
- await assertCardanoTtlFreshForBroadcast(encodedBytes);
44
- const cborHex = Buffer.from(encodedBytes).toString('hex');
45
- const { txHash, errorMessage, rpcErrorCode } = await submitCardanoCbor(cborHex);
46
- if (txHash)
47
- return txHash;
48
- if (rpcErrorCode === alreadyCommittedCode) {
49
- return (await getCardanoTxHash(tx)).replace(/^0x/i, '');
43
+ try {
44
+ const encodedBytes = selectEncodedBytes(chain, tx);
45
+ await assertCardanoTtlFreshForBroadcast(encodedBytes);
46
+ const cborHex = Buffer.from(encodedBytes).toString('hex');
47
+ const { txHash, errorMessage, rpcErrorCode } = await submitCardanoCbor(cborHex);
48
+ if (txHash)
49
+ return broadcastAccepted(txHash);
50
+ if (rpcErrorCode === alreadyCommittedCode) {
51
+ return broadcastAccepted((await getCardanoTxHash(tx)).replace(/^0x/i, ''));
52
+ }
53
+ const error = errorMessage ?? 'unknown broadcast failure';
54
+ // Any submit error past this point is ambiguous — it could be a benign MPC-race duplicate (another
55
+ // device already broadcast the same signed tx) OR a genuine failure (e.g. BadInputsUTxO: spent/invalid
56
+ // inputs). String-matching alone can't tell them apart, so verify against the real chain: the hash
57
+ // either resolves on-chain (the race case — success) or it doesn't (the real failure — returns it).
58
+ const broadcastError = new Error(`Failed to broadcast transaction: ${error}`);
59
+ try {
60
+ return broadcastAccepted(await verifyBroadcastByHash({ chain, tx, error: broadcastError }));
61
+ }
62
+ catch (cause) {
63
+ return broadcastFailed(cause, isRetryableBroadcastCause(broadcastError));
64
+ }
65
+ }
66
+ catch (cause) {
67
+ return broadcastFailed(cause, isRetryableBroadcastCause(cause));
50
68
  }
51
- const error = errorMessage ?? 'unknown broadcast failure';
52
- // Any submit error past this point is ambiguous — it could be a benign MPC-race duplicate (another
53
- // device already broadcast the same signed tx) OR a genuine failure (e.g. BadInputsUTxO: spent/invalid
54
- // inputs). String-matching alone can't tell them apart, so verify against the real chain: the hash
55
- // either resolves on-chain (the race case — success) or it doesn't (the real failure — rethrows).
56
- const broadcastError = new Error(`Failed to broadcast transaction: ${error}`);
57
- await verifyBroadcastByHash({ chain, tx, error: broadcastError });
58
- return null;
59
69
  };
60
70
  //# sourceMappingURL=cardano.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cardano.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cardano.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wDAAwD,CAAA;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAA;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAA;AACpF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAuB,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAChH,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAE3C;;;GAGG;AACH,MAAM,oBAAoB,GAAG,IAAI,CAAA;AAEjC,MAAM,iCAAiC,GAAG,KAAK,IAA4B,EAAE;IAC3E,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAA;IACpD,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAA;IAE1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAA;IACrD,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAA;IAE5C,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,WAAW,EACX,GAAG,GAIJ,EAAgB,EAAE;IACjB,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,eAAe,GAAG,WAAW,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAA;IAE7E,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3B,OAAO,IAAI,KAAK,CACd,qGAAqG,GAAG,iBAAiB,WAAW,kBAAkB,+BAA+B,SAAS,CAC/L,CAAA;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iCAAiC,GAAG,KAAK,EAAE,YAAwB,EAAE,EAAE;IAClF,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,MAAM,WAAW,GAAG,MAAM,iCAAiC,EAAE,CAAA;IAE7D,MAAM,cAAc,GAAG,2BAA2B,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAA;IACxE,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,cAAc,CAAA;IACtB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAA4C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACjG,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAClD,MAAM,iCAAiC,CAAC,YAAY,CAAC,CAAA;QAErD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAEzD,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAE/E,IAAI,MAAM;YAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAE5C,IAAI,YAAY,KAAK,oBAAoB,EAAE,CAAC;YAC1C,OAAO,iBAAiB,CAAC,CAAC,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;QAC5E,CAAC;QAED,MAAM,KAAK,GAAG,YAAY,IAAI,2BAA2B,CAAA;QAEzD,mGAAmG;QACnG,uGAAuG;QACvG,mGAAmG;QACnG,oGAAoG;QACpG,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAA;QAC7E,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,eAAe,CAAC,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAA;IACjE,CAAC;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"cosmos.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cosmos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAMxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAIjD,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AAEtG,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAMvE,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,CAAC,WAAW,CAyC9D,CAAA"}
1
+ {"version":3,"file":"cosmos.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cosmos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAMxD,OAAO,EAAsC,mBAAmB,EAA6B,MAAM,aAAa,CAAA;AAIhH,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AAEtG,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAMvE,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,CAAC,WAAW,CAwC9D,CAAA"}
@@ -3,6 +3,7 @@ import { getCosmosClient } from '@vultisig/core-chain/chains/cosmos/client';
3
3
  import { attempt } from '@vultisig/lib-utils/attempt';
4
4
  import { isInError } from '@vultisig/lib-utils/error/isInError';
5
5
  import { toCosmosSequenceMismatchError } from '../cosmosSequenceMismatch.js';
6
+ import { broadcastAccepted, broadcastFailed, isRetryableBroadcastCause } from '../resolver.js';
6
7
  import { DeliverTxFailedError } from '../transientRetry.js';
7
8
  import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
8
9
  export { CosmosSequenceMismatchError, toCosmosSequenceMismatchError } from '../cosmosSequenceMismatch.js';
@@ -13,41 +14,42 @@ export const getCosmosBroadcastTimeoutTxId = (error) => {
13
14
  return txId.trim() || undefined;
14
15
  };
15
16
  export const broadcastCosmosTx = async ({ chain, tx }) => {
16
- const { serialized } = tx;
17
- const { tx_bytes } = JSON.parse(serialized);
18
- const decodedTxBytes = Buffer.from(tx_bytes, 'base64');
19
- const client = await getCosmosClient(chain);
20
- const { data, error } = await attempt(client.broadcastTx(decodedTxBytes));
21
- if (data) {
22
- // client.broadcastTx resolves (does not throw) once the tx is INCLUDED in a
23
- // block, even when execution itself failed (DeliverTx code !== 0 — e.g.
24
- // out-of-gas, wasm revert, a THORChain/Maya deposit-handler rejection). The
25
- // tx is on-chain but nothing moved, so this must not be reported as success.
17
+ try {
18
+ const { serialized } = tx;
19
+ const { tx_bytes } = JSON.parse(serialized);
20
+ const decodedTxBytes = Buffer.from(tx_bytes, 'base64');
21
+ const client = await getCosmosClient(chain);
22
+ const result = await attempt(client.broadcastTx(decodedTxBytes));
23
+ if (result.data !== undefined) {
24
+ try {
25
+ assertIsDeliverTxSuccess(result.data);
26
+ }
27
+ catch (deliverTxError) {
28
+ const message = deliverTxError instanceof Error ? deliverTxError.message : String(deliverTxError);
29
+ return broadcastFailed(new DeliverTxFailedError(message, { cause: deliverTxError }), false, {
30
+ provider: result.data,
31
+ });
32
+ }
33
+ return broadcastAccepted(result.data.transactionHash, { provider: result.data });
34
+ }
35
+ const { error } = result;
36
+ if (isInError(error, 'tx already exists in cache')) {
37
+ return broadcastAccepted();
38
+ }
39
+ const timeoutTxId = getCosmosBroadcastTimeoutTxId(error);
40
+ if (timeoutTxId) {
41
+ return broadcastAccepted(timeoutTxId);
42
+ }
43
+ const verificationError = toCosmosSequenceMismatchError(error) ?? error;
26
44
  try {
27
- assertIsDeliverTxSuccess(data);
45
+ return broadcastAccepted(await verifyBroadcastByHash({ chain, tx, error: verificationError }));
28
46
  }
29
- catch (deliverTxError) {
30
- // Marker type, not a bare Error: cosmos has no resolver-owned retry, so
31
- // this throws into `withTransientBroadcastRetry`. A rawLog like "wasm
32
- // contract aborted" would otherwise match the transient message regex
33
- // and get resent, then swallowed as an idempotent "already in cache"
34
- // success — reopening the bug this assert exists to close.
35
- const message = deliverTxError instanceof Error ? deliverTxError.message : String(deliverTxError);
36
- throw new DeliverTxFailedError(message, { cause: deliverTxError });
47
+ catch (cause) {
48
+ return broadcastFailed(cause, isRetryableBroadcastCause(cause));
37
49
  }
38
- return;
39
- }
40
- if (isInError(error, 'tx already exists in cache')) {
41
- return;
42
50
  }
43
- const timeoutTxId = getCosmosBroadcastTimeoutTxId(error);
44
- if (timeoutTxId) {
45
- return timeoutTxId;
51
+ catch (cause) {
52
+ return broadcastFailed(cause, isRetryableBroadcastCause(cause));
46
53
  }
47
- // Keep the hash-verification safety net first: another MPC participant may
48
- // have successfully broadcast these same bytes just before this node returned
49
- // a sequence rejection. When the hash is genuinely unknown, replace the raw
50
- // code-32 message with direction-aware recovery guidance.
51
- await verifyBroadcastByHash({ chain, tx, error: toCosmosSequenceMismatchError(error) ?? error });
52
54
  };
53
55
  //# sourceMappingURL=cosmos.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cosmos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAE/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AAEtG,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,KAAc,EAAsB,EAAE;IAClF,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC;QAAE,OAAO,SAAS,CAAA;IAEtD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IAEtB,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAqC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACzF,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAA;IACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAEtD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAA;IAEzE,IAAI,IAAI,EAAE,CAAC;QACT,4EAA4E;QAC5E,wEAAwE;QACxE,4EAA4E;QAC5E,6EAA6E;QAC7E,IAAI,CAAC;YACH,wBAAwB,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,cAAc,EAAE,CAAC;YACxB,wEAAwE;YACxE,sEAAsE;YACtE,sEAAsE;YACtE,qEAAqE;YACrE,2DAA2D;YAC3D,MAAM,OAAO,GAAG,cAAc,YAAY,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;YACjG,MAAM,IAAI,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;QACpE,CAAC;QACD,OAAM;IACR,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,4BAA4B,CAAC,EAAE,CAAC;QACnD,OAAM;IACR,CAAC;IAED,MAAM,WAAW,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAA;IACxD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,2EAA2E;IAC3E,8EAA8E;IAC9E,4EAA4E;IAC5E,0DAA0D;IAC1D,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,6BAA6B,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;AAClG,CAAC,CAAA"}
1
+ {"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cosmos.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAMrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,cAAc,EAAE,mBAAmB,CAAC,QAAQ,CAkBxD,CAAA"}
1
+ {"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAMrD,OAAO,EAAsC,mBAAmB,EAA6B,MAAM,aAAa,CAAA;AAGhH,eAAO,MAAM,cAAc,EAAE,mBAAmB,CAAC,QAAQ,CA2BxD,CAAA"}
@@ -2,18 +2,30 @@ import { getEvmClient } from '@vultisig/core-chain/chains/evm/client';
2
2
  import { attempt } from '@vultisig/lib-utils/attempt';
3
3
  import { isInError } from '@vultisig/lib-utils/error/isInError';
4
4
  import { ensureHexPrefix } from '@vultisig/lib-utils/hex/ensureHexPrefix';
5
+ import { broadcastAccepted, broadcastFailed, isRetryableBroadcastCause } from '../resolver.js';
5
6
  import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
6
7
  export const broadcastEvmTx = async ({ chain, tx }) => {
7
- const client = getEvmClient(chain);
8
- const { error } = await attempt(client.sendRawTransaction({
9
- serializedTransaction: ensureHexPrefix(Buffer.from(tx.encoded).toString('hex')),
10
- }));
11
- if (!error) {
12
- return;
8
+ try {
9
+ const client = getEvmClient(chain);
10
+ const result = await attempt(client.sendRawTransaction({
11
+ serializedTransaction: ensureHexPrefix(Buffer.from(tx.encoded).toString('hex')),
12
+ }));
13
+ if ('data' in result) {
14
+ return broadcastAccepted(result.data);
15
+ }
16
+ const { error } = result;
17
+ if (error && isInError(error, 'already known', 'transaction already exists', 'tx already in mempool')) {
18
+ return broadcastAccepted();
19
+ }
20
+ try {
21
+ return broadcastAccepted(await verifyBroadcastByHash({ chain, tx, error }));
22
+ }
23
+ catch (cause) {
24
+ return broadcastFailed(cause, isRetryableBroadcastCause(error));
25
+ }
13
26
  }
14
- if (isInError(error, 'already known', 'transaction already exists', 'tx already in mempool')) {
15
- return;
27
+ catch (cause) {
28
+ return broadcastFailed(cause, isRetryableBroadcastCause(cause));
16
29
  }
17
- await verifyBroadcastByHash({ chain, tx, error });
18
30
  };
19
31
  //# sourceMappingURL=evm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evm.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/evm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAGzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAkC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACnF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAElC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAC7B,MAAM,CAAC,kBAAkB,CAAC;QACxB,qBAAqB,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAChF,CAAC,CACH,CAAA;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAM;IACR,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,4BAA4B,EAAE,uBAAuB,CAAC,EAAE,CAAC;QAC7F,OAAM;IACR,CAAC;IAED,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;AACnD,CAAC,CAAA"}
1
+ {"version":3,"file":"evm.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/evm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAEzE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAuB,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAChH,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAkC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACnF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QAElC,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,MAAM,CAAC,kBAAkB,CAAC;YACxB,qBAAqB,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAChF,CAAC,CACH,CAAA;QAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YACrB,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACvC,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;QACxB,IAAI,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,4BAA4B,EAAE,uBAAuB,CAAC,EAAE,CAAC;YACtG,OAAO,iBAAiB,EAAE,CAAA;QAC5B,CAAC;QAED,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,eAAe,CAAC,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAA;IACjE,CAAC;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"polkadot.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AASjD,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAiCxE,CAAA"}
1
+ {"version":3,"file":"polkadot.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAsC,mBAAmB,EAA6B,MAAM,aAAa,CAAA;AAShH,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAgDxE,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { ensureHexPrefix } from '@vultisig/lib-utils/hex/ensureHexPrefix';
2
2
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
3
3
  import { polkadotRpcUrl } from '../../../chains/polkadot/client.js';
4
+ import { broadcastAccepted, broadcastFailed, isRetryableBroadcastCause } from '../resolver.js';
4
5
  import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
5
6
  import { formatSubstrateRpcError, isIdempotentSubstrateBroadcastError } from './substrate.js';
6
7
  export const broadcastPolkadotTx = async ({ chain, tx }) => {
@@ -20,19 +21,37 @@ export const broadcastPolkadotTx = async ({ chain, tx }) => {
20
21
  // (string usually in `message`) or, less commonly, an Invalid
21
22
  // Transaction variant whose duplicate signal lives in `data`.
22
23
  if (isIdempotentSubstrateBroadcastError(response.error)) {
23
- return;
24
+ return broadcastAccepted();
25
+ }
26
+ const error = new Error(`Polkadot broadcast failed: ${formatSubstrateRpcError(response.error)}`);
27
+ try {
28
+ return broadcastAccepted(await verifyBroadcastByHash({ chain, tx, error }));
29
+ }
30
+ catch (cause) {
31
+ return broadcastFailed(cause, false);
24
32
  }
25
- throw new Error(`Polkadot broadcast failed: ${formatSubstrateRpcError(response.error)}`);
26
33
  }
27
34
  // Per JSON-RPC 2.0 a valid response must have exactly one of `result` /
28
35
  // `error`. If both are missing (malformed gateway response, truncated
29
36
  // body, …) do not silently assume success — force hash verification.
30
37
  if (!response.result) {
31
- throw new Error('Polkadot broadcast failed: missing extrinsic hash in RPC response');
38
+ const error = new Error('Polkadot broadcast failed: missing extrinsic hash in RPC response');
39
+ try {
40
+ return broadcastAccepted(await verifyBroadcastByHash({ chain, tx, error }));
41
+ }
42
+ catch (cause) {
43
+ return broadcastFailed(cause, false);
44
+ }
32
45
  }
46
+ return broadcastAccepted(response.result);
33
47
  }
34
48
  catch (error) {
35
- await verifyBroadcastByHash({ chain, tx, error });
49
+ try {
50
+ return broadcastAccepted(await verifyBroadcastByHash({ chain, tx, error }));
51
+ }
52
+ catch (cause) {
53
+ return broadcastFailed(cause, isRetryableBroadcastCause(error));
54
+ }
36
55
  }
37
56
  };
38
57
  //# sourceMappingURL=polkadot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"polkadot.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,mCAAmC,EAAqB,MAAM,aAAa,CAAA;AAO7G,MAAM,CAAC,MAAM,mBAAmB,GAA6C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACnG,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAc,cAAc,EAAE;YAC3D,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,aAAa,CAAC;gBACvB,EAAE,EAAE,CAAC;aACN;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,sEAAsE;YACtE,uEAAuE;YACvE,8DAA8D;YAC9D,8DAA8D;YAC9D,IAAI,mCAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAM;YACR,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC1F,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACnD,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"polkadot.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAuB,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAChH,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,mCAAmC,EAAqB,MAAM,aAAa,CAAA;AAO7G,MAAM,CAAC,MAAM,mBAAmB,GAA6C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACnG,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAc,cAAc,EAAE;YAC3D,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,aAAa,CAAC;gBACvB,EAAE,EAAE,CAAC;aACN;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,sEAAsE;YACtE,uEAAuE;YACvE,8DAA8D;YAC9D,8DAA8D;YAC9D,IAAI,mCAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,iBAAiB,EAAE,CAAA;YAC5B,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,8BAA8B,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAChG,IAAI,CAAC;gBACH,OAAO,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YAC7E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;YAC5F,IAAI,CAAC;gBACH,OAAO,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YAC7E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"qbtc.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/qbtc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAMlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AASjD,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,OAAO,KAAK,CAAC,IAAI,CAqElE,CAAA"}
1
+ {"version":3,"file":"qbtc.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/qbtc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAOlD,OAAO,EAAsC,mBAAmB,EAA6B,MAAM,aAAa,CAAA;AAShH,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,OAAO,KAAK,CAAC,IAAI,CAoFlE,CAAA"}