@vultisig/core-chain 2.39.0 → 4.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 (100) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/chains/cardano/cip30/cardanoTxBodyHash.js +1 -1
  3. package/dist/chains/cardano/cip30/cardanoTxBodyHash.js.map +1 -1
  4. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js +2 -2
  5. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js.map +1 -1
  6. package/dist/chains/solana/kamino/config.d.ts +11 -2
  7. package/dist/chains/solana/kamino/config.d.ts.map +1 -1
  8. package/dist/chains/solana/kamino/config.js +12 -2
  9. package/dist/chains/solana/kamino/config.js.map +1 -1
  10. package/dist/chains/sui/sign.js +1 -1
  11. package/dist/chains/sui/sign.js.map +1 -1
  12. package/dist/coin/balance/resolvers/bittensor.js +2 -2
  13. package/dist/coin/balance/resolvers/bittensor.js.map +1 -1
  14. package/dist/coin/balance/resolvers/polkadot.js +2 -2
  15. package/dist/coin/balance/resolvers/polkadot.js.map +1 -1
  16. package/dist/coin/balance/resolvers/ripple.d.ts +13 -0
  17. package/dist/coin/balance/resolvers/ripple.d.ts.map +1 -1
  18. package/dist/coin/balance/resolvers/ripple.js +14 -6
  19. package/dist/coin/balance/resolvers/ripple.js.map +1 -1
  20. package/dist/coin/find/resolvers/evm/index.d.ts.map +1 -1
  21. package/dist/coin/find/resolvers/evm/index.js +14 -6
  22. package/dist/coin/find/resolvers/evm/index.js.map +1 -1
  23. package/dist/coin/knownTokens/index.d.ts.map +1 -1
  24. package/dist/coin/knownTokens/index.js +11 -0
  25. package/dist/coin/knownTokens/index.js.map +1 -1
  26. package/dist/coin/price/evm/getErc20Prices.d.ts.map +1 -1
  27. package/dist/coin/price/evm/getErc20Prices.js +28 -1
  28. package/dist/coin/price/evm/getErc20Prices.js.map +1 -1
  29. package/dist/coin/price/evm/getEvmVaultTokenPrices.d.ts +16 -0
  30. package/dist/coin/price/evm/getEvmVaultTokenPrices.d.ts.map +1 -0
  31. package/dist/coin/price/evm/getEvmVaultTokenPrices.js +67 -0
  32. package/dist/coin/price/evm/getEvmVaultTokenPrices.js.map +1 -0
  33. package/dist/coin/price/evm/getLifiTokenPrices.d.ts +15 -0
  34. package/dist/coin/price/evm/getLifiTokenPrices.d.ts.map +1 -0
  35. package/dist/coin/price/evm/getLifiTokenPrices.js +28 -0
  36. package/dist/coin/price/evm/getLifiTokenPrices.js.map +1 -0
  37. package/dist/coin/price/getUsdToFiatRate.d.ts +8 -0
  38. package/dist/coin/price/getUsdToFiatRate.d.ts.map +1 -0
  39. package/dist/coin/price/getUsdToFiatRate.js +20 -0
  40. package/dist/coin/price/getUsdToFiatRate.js.map +1 -0
  41. package/dist/publicKey/address/cardano.js +1 -1
  42. package/dist/publicKey/address/cardano.js.map +1 -1
  43. package/dist/publicKey/address/deriveQbtcAddress.js +2 -2
  44. package/dist/publicKey/address/deriveQbtcAddress.js.map +1 -1
  45. package/dist/swap/quote/getSwapQuoteSafetyFingerprint.js +2 -2
  46. package/dist/swap/quote/getSwapQuoteSafetyFingerprint.js.map +1 -1
  47. package/dist/tx/broadcast/index.d.ts +2 -0
  48. package/dist/tx/broadcast/index.d.ts.map +1 -1
  49. package/dist/tx/broadcast/index.js +34 -3
  50. package/dist/tx/broadcast/index.js.map +1 -1
  51. package/dist/tx/broadcast/resolver.d.ts +35 -1
  52. package/dist/tx/broadcast/resolver.d.ts.map +1 -1
  53. package/dist/tx/broadcast/resolver.js +42 -1
  54. package/dist/tx/broadcast/resolver.js.map +1 -1
  55. package/dist/tx/broadcast/resolvers/bittensor.d.ts.map +1 -1
  56. package/dist/tx/broadcast/resolvers/bittensor.js +17 -6
  57. package/dist/tx/broadcast/resolvers/bittensor.js.map +1 -1
  58. package/dist/tx/broadcast/resolvers/cardano.d.ts.map +1 -1
  59. package/dist/tx/broadcast/resolvers/cardano.js +26 -16
  60. package/dist/tx/broadcast/resolvers/cardano.js.map +1 -1
  61. package/dist/tx/broadcast/resolvers/cosmos.d.ts.map +1 -1
  62. package/dist/tx/broadcast/resolvers/cosmos.js +33 -31
  63. package/dist/tx/broadcast/resolvers/cosmos.js.map +1 -1
  64. package/dist/tx/broadcast/resolvers/evm.d.ts.map +1 -1
  65. package/dist/tx/broadcast/resolvers/evm.js +21 -9
  66. package/dist/tx/broadcast/resolvers/evm.js.map +1 -1
  67. package/dist/tx/broadcast/resolvers/polkadot.d.ts.map +1 -1
  68. package/dist/tx/broadcast/resolvers/polkadot.js +23 -4
  69. package/dist/tx/broadcast/resolvers/polkadot.js.map +1 -1
  70. package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
  71. package/dist/tx/broadcast/resolvers/qbtc.js +69 -52
  72. package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
  73. package/dist/tx/broadcast/resolvers/ripple.d.ts.map +1 -1
  74. package/dist/tx/broadcast/resolvers/ripple.js +24 -9
  75. package/dist/tx/broadcast/resolvers/ripple.js.map +1 -1
  76. package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
  77. package/dist/tx/broadcast/resolvers/solana.js +19 -10
  78. package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
  79. package/dist/tx/broadcast/resolvers/sui.d.ts.map +1 -1
  80. package/dist/tx/broadcast/resolvers/sui.js +20 -14
  81. package/dist/tx/broadcast/resolvers/sui.js.map +1 -1
  82. package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
  83. package/dist/tx/broadcast/resolvers/ton.js +16 -5
  84. package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
  85. package/dist/tx/broadcast/resolvers/tron.d.ts.map +1 -1
  86. package/dist/tx/broadcast/resolvers/tron.js +15 -6
  87. package/dist/tx/broadcast/resolvers/tron.js.map +1 -1
  88. package/dist/tx/broadcast/resolvers/utxo.d.ts.map +1 -1
  89. package/dist/tx/broadcast/resolvers/utxo.js +27 -17
  90. package/dist/tx/broadcast/resolvers/utxo.js.map +1 -1
  91. package/dist/tx/broadcast/transientRetry.d.ts.map +1 -1
  92. package/dist/tx/broadcast/transientRetry.js +4 -2
  93. package/dist/tx/broadcast/transientRetry.js.map +1 -1
  94. package/dist/tx/broadcast/verifyBroadcastByHash.d.ts +1 -1
  95. package/dist/tx/broadcast/verifyBroadcastByHash.d.ts.map +1 -1
  96. package/dist/tx/broadcast/verifyBroadcastByHash.js +1 -1
  97. package/dist/tx/broadcast/verifyBroadcastByHash.js.map +1 -1
  98. package/dist/tx/hash/resolvers/cardano.js +1 -1
  99. package/dist/tx/hash/resolvers/cardano.js.map +1 -1
  100. package/package.json +18 -3
@@ -1 +1 @@
1
- {"version":3,"file":"getErc20Prices.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/price/evm/getErc20Prices.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAgB,MAAM,oCAAoC,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,OAAO,GAAG,GAAG,UAAU,wCAAwC,CAAA;AAQrE,MAAM,gBAAgB,GAA6B;IACjD,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU;IAC/B,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW;IACjC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IACvB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IACzB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc;IACnC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa;IACjC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB;IAC1C,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,qBAAqB;IACrC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC3B,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ;IAChC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC3B,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa;IACrC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa;IAC7B,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW;CAClC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,GAAG,mBAAmB,EAAE,KAAK,EAAS,EAAE,EAAE;IAChG,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE;QAClE,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;QACjC,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;QACzC,GAAG;QACH,YAAY;KACb,CAAC,CAAA;IAEF,mEAAmE;IACnE,qEAAqE;IACrE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACzF,CAAC,CAAA"}
1
+ {"version":3,"file":"getErc20Prices.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/price/evm/getErc20Prices.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { EvmChain } from '@vultisig/core-chain/Chain';
2
+ import { FiatCurrency } from '@vultisig/core-config/FiatCurrency';
3
+ type GetEvmVaultTokenPricesInput = {
4
+ ids: string[];
5
+ chain: EvmChain;
6
+ fiatCurrency?: FiatCurrency;
7
+ };
8
+ /**
9
+ * Prices the NAV-priced vault receipts among `ids`, keyed by lowercase
10
+ * contract address; unregistered ids are ignored. A vault whose on-chain
11
+ * reads or underlying quote fail is omitted so callers can fall back to
12
+ * other sources.
13
+ */
14
+ export declare const getEvmVaultTokenPrices: ({ ids, chain, fiatCurrency, }: GetEvmVaultTokenPricesInput) => Promise<Record<string, number>>;
15
+ export {};
16
+ //# sourceMappingURL=getEvmVaultTokenPrices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEvmVaultTokenPrices.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/price/evm/getEvmVaultTokenPrices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AA+BjE,KAAK,2BAA2B,GAAG;IACjC,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,KAAK,EAAE,QAAQ,CAAA;IACf,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAU,+BAI1C,2BAA2B,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2C9D,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { EvmChain } from '@vultisig/core-chain/Chain';
2
+ import { getEvmClient } from '@vultisig/core-chain/chains/evm/client';
3
+ import { isEmpty } from '@vultisig/lib-utils/array/isEmpty';
4
+ import { attempt } from '@vultisig/lib-utils/attempt';
5
+ import { toEntries } from '@vultisig/lib-utils/record/toEntries';
6
+ import { erc20Abi } from 'viem';
7
+ import { getCoinPrices } from '../getCoinPrices.js';
8
+ /**
9
+ * EVM staking-vault receipt tokens priced by redemption value instead of a
10
+ * market feed. These tokens barely trade, so market quotes (LiFi included) go
11
+ * stale; what a holder can actually redeem is
12
+ * `underlying price x underlying.balanceOf(vault) / vault.totalSupply()`.
13
+ * Keys are lowercase receipt-token addresses; the vault and its underlying
14
+ * must share decimals for the unscaled ratio to hold.
15
+ */
16
+ const navPricedEvmTokens = {
17
+ [EvmChain.Ethereum]: {
18
+ // vTHOR: xSushi-style THOR staking vault (vultisig-windows#4732).
19
+ '0x815c23eca83261b6ec689b60cc4a58b54bc24d8d': {
20
+ underlyingId: '0xa5f2211b9b8170f694421f2046281775e8468044',
21
+ underlyingPriceProviderId: 'thorswap',
22
+ },
23
+ },
24
+ };
25
+ /**
26
+ * Prices the NAV-priced vault receipts among `ids`, keyed by lowercase
27
+ * contract address; unregistered ids are ignored. A vault whose on-chain
28
+ * reads or underlying quote fail is omitted so callers can fall back to
29
+ * other sources.
30
+ */
31
+ export const getEvmVaultTokenPrices = async ({ ids, chain, fiatCurrency, }) => {
32
+ const registry = navPricedEvmTokens[chain] ?? {};
33
+ const requestedIds = new Set(ids.map(id => id.toLowerCase()));
34
+ const vaults = toEntries(registry).filter(({ key }) => requestedIds.has(key));
35
+ if (isEmpty(vaults))
36
+ return {};
37
+ const client = getEvmClient(chain);
38
+ const prices = {};
39
+ await Promise.all(vaults.map(async ({ key: vaultId, value: { underlyingId, underlyingPriceProviderId } }) => {
40
+ const result = await attempt(async () => {
41
+ const [underlyingBalance, vaultSupply, underlyingPrices] = await Promise.all([
42
+ client.readContract({
43
+ address: underlyingId,
44
+ abi: erc20Abi,
45
+ functionName: 'balanceOf',
46
+ args: [vaultId],
47
+ }),
48
+ client.readContract({
49
+ address: vaultId,
50
+ abi: erc20Abi,
51
+ functionName: 'totalSupply',
52
+ }),
53
+ getCoinPrices({ ids: [underlyingPriceProviderId], fiatCurrency }),
54
+ ]);
55
+ const underlyingPrice = underlyingPrices[underlyingPriceProviderId];
56
+ if (!Number.isFinite(underlyingPrice) || underlyingPrice <= 0 || vaultSupply === 0n) {
57
+ throw new Error(`Cannot derive NAV for ${vaultId} on ${chain}`);
58
+ }
59
+ return (Number(underlyingBalance) / Number(vaultSupply)) * underlyingPrice;
60
+ });
61
+ if ('error' in result)
62
+ return;
63
+ prices[vaultId] = result.data;
64
+ }));
65
+ return prices;
66
+ };
67
+ //# sourceMappingURL=getEvmVaultTokenPrices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEvmVaultTokenPrices.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/price/evm/getEvmVaultTokenPrices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { EvmChain } from '@vultisig/core-chain/Chain';
2
+ type GetLifiTokenPricesInput = {
3
+ ids: string[];
4
+ chain: EvmChain;
5
+ };
6
+ /**
7
+ * Prices EVM tokens in USD through LI.FI's token endpoint, keyed by lowercase
8
+ * contract address. Serves as the fallback for contracts CoinGecko does not
9
+ * list (e.g. vTHOR). Tokens LI.FI cannot price are omitted, and per-token
10
+ * request failures are swallowed so one unpriceable token never blocks the
11
+ * rest.
12
+ */
13
+ export declare const getLifiTokenPrices: ({ ids, chain }: GetLifiTokenPricesInput) => Promise<Record<string, number>>;
14
+ export {};
15
+ //# sourceMappingURL=getLifiTokenPrices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLifiTokenPrices.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/price/evm/getLifiTokenPrices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAarD,KAAK,uBAAuB,GAAG;IAC7B,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,KAAK,EAAE,QAAQ,CAAA;CAChB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAU,gBAAgB,uBAAuB,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBhH,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { getEvmChainId } from '@vultisig/core-chain/chains/evm/chainInfo';
2
+ import { attempt } from '@vultisig/lib-utils/attempt';
3
+ import { hexToNumber } from '@vultisig/lib-utils/hex/hexToNumber';
4
+ import { addQueryParams } from '@vultisig/lib-utils/query/addQueryParams';
5
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
6
+ const lifiTokenBaseUrl = 'https://li.quest/v1/token';
7
+ /**
8
+ * Prices EVM tokens in USD through LI.FI's token endpoint, keyed by lowercase
9
+ * contract address. Serves as the fallback for contracts CoinGecko does not
10
+ * list (e.g. vTHOR). Tokens LI.FI cannot price are omitted, and per-token
11
+ * request failures are swallowed so one unpriceable token never blocks the
12
+ * rest.
13
+ */
14
+ export const getLifiTokenPrices = async ({ ids, chain }) => {
15
+ const chainId = hexToNumber(getEvmChainId(chain));
16
+ const prices = {};
17
+ await Promise.all(ids.map(async (id) => {
18
+ const result = await attempt(queryUrl(addQueryParams(lifiTokenBaseUrl, { chain: chainId, token: id })));
19
+ if ('error' in result)
20
+ return;
21
+ const price = Number(result.data.priceUSD);
22
+ if (Number.isFinite(price) && price > 0) {
23
+ prices[id.toLowerCase()] = price;
24
+ }
25
+ }));
26
+ return prices;
27
+ };
28
+ //# sourceMappingURL=getLifiTokenPrices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLifiTokenPrices.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/price/evm/getLifiTokenPrices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,MAAM,gBAAgB,GAAG,2BAA2B,CAAA;AAWpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAA2B,EAAmC,EAAE;IACnH,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAEjD,MAAM,MAAM,GAA2B,EAAE,CAAA;IAEzC,MAAM,OAAO,CAAC,GAAG,CACf,GAAG,CAAC,GAAG,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,QAAQ,CAAoB,cAAc,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAC7F,CAAA;QACD,IAAI,OAAO,IAAI,MAAM;YAAE,OAAM;QAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CACH,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { FiatCurrency } from '@vultisig/core-config/FiatCurrency';
2
+ /**
3
+ * Resolves the USD -> fiat conversion rate for USD-denominated price sources
4
+ * (e.g. LI.FI). Throws when the anchor quote is unavailable rather than
5
+ * letting callers mislabel raw USD values as the selected fiat.
6
+ */
7
+ export declare const getUsdToFiatRate: (fiatCurrency: FiatCurrency) => Promise<number>;
8
+ //# sourceMappingURL=getUsdToFiatRate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUsdToFiatRate.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/price/getUsdToFiatRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAQjE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAU,cAAc,YAAY,KAAG,OAAO,CAAC,MAAM,CAUjF,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { getCoinPrices } from './getCoinPrices.js';
2
+ // USD stablecoin anchor: its CoinGecko price in a given fiat currency serves
3
+ // as the USD -> fiat conversion rate.
4
+ const usdAnchorPriceProviderId = 'usd-coin';
5
+ /**
6
+ * Resolves the USD -> fiat conversion rate for USD-denominated price sources
7
+ * (e.g. LI.FI). Throws when the anchor quote is unavailable rather than
8
+ * letting callers mislabel raw USD values as the selected fiat.
9
+ */
10
+ export const getUsdToFiatRate = async (fiatCurrency) => {
11
+ if (fiatCurrency === 'usd')
12
+ return 1;
13
+ const anchorPrices = await getCoinPrices({ ids: [usdAnchorPriceProviderId], fiatCurrency });
14
+ const rate = anchorPrices[usdAnchorPriceProviderId];
15
+ if (!Number.isFinite(rate) || rate <= 0) {
16
+ throw new Error(`Missing ${usdAnchorPriceProviderId} anchor price for ${fiatCurrency}`);
17
+ }
18
+ return rate;
19
+ };
20
+ //# sourceMappingURL=getUsdToFiatRate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUsdToFiatRate.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/price/getUsdToFiatRate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,6EAA6E;AAC7E,sCAAsC;AACtC,MAAM,wBAAwB,GAAG,UAAU,CAAA;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,YAA0B,EAAmB,EAAE;IACpF,IAAI,YAAY,KAAK,KAAK;QAAE,OAAO,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;IAC3F,MAAM,IAAI,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAA;IACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,WAAW,wBAAwB,qBAAqB,YAAY,EAAE,CAAC,CAAA;IACzF,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- import { blake2b } from '@noble/hashes/blake2b';
1
+ import { blake2b } from '@noble/hashes/blake2.js';
2
2
  export const deriveCardanoAddress = ({ publicKey, walletCore }) => {
3
3
  const extendedKeyData = publicKey.data();
4
4
  const spendingKeyData = extendedKeyData.slice(0, 32);
@@ -1 +1 @@
1
- {"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAQ/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAS,EAAE,EAAE;IACvE,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IACxC,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEpD,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;IAEpD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IACtC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAExB,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AACtD,CAAC,CAAA"}
1
+ {"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAQjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAS,EAAE,EAAE;IACvE,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IACxC,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEpD,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;IAEpD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IACtC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAExB,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AACtD,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { toBech32 } from '@cosmjs/encoding';
2
- import { ripemd160 } from '@noble/hashes/ripemd160';
3
- import { sha256 } from '@noble/hashes/sha256';
2
+ import { ripemd160 } from '@noble/hashes/legacy.js';
3
+ import { sha256 } from '@noble/hashes/sha2.js';
4
4
  const qbtcBech32Prefix = 'qbtc';
5
5
  /** Derives a QBTC address from an MLDSA public key using Bech32(RIPEMD160(SHA256(pubkey))). */
6
6
  export const deriveQbtcAddress = (mldsaPublicKeyHex) => {
@@ -1 +1 @@
1
- {"version":3,"file":"deriveQbtcAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/deriveQbtcAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAE/B,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,iBAAyB,EAAU,EAAE;IACrE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;IACzD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAC3C,OAAO,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;AACzC,CAAC,CAAA"}
1
+ {"version":3,"file":"deriveQbtcAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/deriveQbtcAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAE/B,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,iBAAyB,EAAU,EAAE;IACrE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;IACzD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAC3C,OAAO,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;AACzC,CAAC,CAAA"}
@@ -1,5 +1,5 @@
1
- import { sha256 } from '@noble/hashes/sha256';
2
- import { bytesToHex } from '@noble/hashes/utils';
1
+ import { sha256 } from '@noble/hashes/sha2.js';
2
+ import { bytesToHex } from '@noble/hashes/utils.js';
3
3
  export const cloneSwapSafetyValue = (value) => {
4
4
  if (value === null || typeof value !== 'object')
5
5
  return value;
@@ -1 +1 @@
1
- {"version":3,"file":"getSwapQuoteSafetyFingerprint.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/getSwapQuoteSafetyFingerprint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getSwapQuoteSafetyFingerprint.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/getSwapQuoteSafetyFingerprint.ts"],"names":[],"mappings":"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"}
@@ -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"}