@vultisig/core-chain 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/dist/chains/evm/contract/universalRouter/decode.d.ts +12 -0
  3. package/dist/chains/evm/contract/universalRouter/decode.d.ts.map +1 -0
  4. package/dist/chains/evm/contract/universalRouter/decode.js +333 -0
  5. package/dist/chains/evm/contract/universalRouter/decode.js.map +1 -0
  6. package/dist/chains/evm/contract/universalRouter/opcodes.d.ts +39 -0
  7. package/dist/chains/evm/contract/universalRouter/opcodes.d.ts.map +1 -0
  8. package/dist/chains/evm/contract/universalRouter/opcodes.js +39 -0
  9. package/dist/chains/evm/contract/universalRouter/opcodes.js.map +1 -0
  10. package/dist/chains/evm/contract/universalRouter/types.d.ts +24 -0
  11. package/dist/chains/evm/contract/universalRouter/types.d.ts.map +1 -0
  12. package/dist/chains/evm/contract/universalRouter/types.js +2 -0
  13. package/dist/chains/evm/contract/universalRouter/types.js.map +1 -0
  14. package/dist/chains/solana/client.d.ts.map +1 -1
  15. package/dist/chains/solana/client.js +1 -3
  16. package/dist/chains/solana/client.js.map +1 -1
  17. package/dist/coin/balance/resolvers/bittensor.d.ts.map +1 -1
  18. package/dist/coin/balance/resolvers/bittensor.js +16 -6
  19. package/dist/coin/balance/resolvers/bittensor.js.map +1 -1
  20. package/dist/publicKey/ecdsa/derivePublicKey.d.ts.map +1 -1
  21. package/dist/publicKey/ecdsa/derivePublicKey.js +6 -0
  22. package/dist/publicKey/ecdsa/derivePublicKey.js.map +1 -1
  23. package/dist/security/blockaid/tx/simulation/api/core.d.ts.map +1 -1
  24. package/dist/security/blockaid/tx/simulation/api/core.js +30 -29
  25. package/dist/security/blockaid/tx/simulation/api/core.js.map +1 -1
  26. package/dist/swap/general/kyber/api/quote.d.ts +2 -2
  27. package/dist/swap/general/kyber/api/quote.d.ts.map +1 -1
  28. package/dist/swap/general/kyber/api/quote.js +6 -4
  29. package/dist/swap/general/kyber/api/quote.js.map +1 -1
  30. package/dist/swap/general/kyber/api/route.d.ts +2 -2
  31. package/dist/swap/general/kyber/api/route.d.ts.map +1 -1
  32. package/dist/swap/general/kyber/api/route.js +3 -3
  33. package/dist/swap/general/kyber/api/route.js.map +1 -1
  34. package/dist/swap/general/kyber/api/tx.d.ts +4 -4
  35. package/dist/swap/general/kyber/api/tx.d.ts.map +1 -1
  36. package/dist/swap/general/kyber/api/tx.js +23 -3
  37. package/dist/swap/general/kyber/api/tx.js.map +1 -1
  38. package/dist/swap/general/kyber/config.d.ts +8 -0
  39. package/dist/swap/general/kyber/config.d.ts.map +1 -1
  40. package/dist/swap/general/kyber/config.js +10 -0
  41. package/dist/swap/general/kyber/config.js.map +1 -1
  42. package/dist/swap/quote/findSwapQuote.js +2 -2
  43. package/dist/swap/quote/findSwapQuote.js.map +1 -1
  44. package/dist/tx/broadcast/resolvers/bittensor.d.ts.map +1 -1
  45. package/dist/tx/broadcast/resolvers/bittensor.js +5 -3
  46. package/dist/tx/broadcast/resolvers/bittensor.js.map +1 -1
  47. package/dist/tx/broadcast/resolvers/cardano.d.ts.map +1 -1
  48. package/dist/tx/broadcast/resolvers/cardano.js +4 -1
  49. package/dist/tx/broadcast/resolvers/cardano.js.map +1 -1
  50. package/dist/tx/broadcast/resolvers/cosmos.d.ts.map +1 -1
  51. package/dist/tx/broadcast/resolvers/cosmos.js +9 -3
  52. package/dist/tx/broadcast/resolvers/cosmos.js.map +1 -1
  53. package/dist/tx/broadcast/resolvers/evm.d.ts.map +1 -1
  54. package/dist/tx/broadcast/resolvers/evm.js +7 -3
  55. package/dist/tx/broadcast/resolvers/evm.js.map +1 -1
  56. package/dist/tx/broadcast/resolvers/polkadot.d.ts.map +1 -1
  57. package/dist/tx/broadcast/resolvers/polkadot.js +25 -10
  58. package/dist/tx/broadcast/resolvers/polkadot.js.map +1 -1
  59. package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
  60. package/dist/tx/broadcast/resolvers/qbtc.js +12 -4
  61. package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
  62. package/dist/tx/broadcast/resolvers/ripple.d.ts.map +1 -1
  63. package/dist/tx/broadcast/resolvers/ripple.js +22 -5
  64. package/dist/tx/broadcast/resolvers/ripple.js.map +1 -1
  65. package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
  66. package/dist/tx/broadcast/resolvers/solana.js +13 -7
  67. package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
  68. package/dist/tx/broadcast/resolvers/sui.d.ts.map +1 -1
  69. package/dist/tx/broadcast/resolvers/sui.js +12 -4
  70. package/dist/tx/broadcast/resolvers/sui.js.map +1 -1
  71. package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
  72. package/dist/tx/broadcast/resolvers/ton.js +8 -3
  73. package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
  74. package/dist/tx/broadcast/resolvers/tron.d.ts.map +1 -1
  75. package/dist/tx/broadcast/resolvers/tron.js +16 -10
  76. package/dist/tx/broadcast/resolvers/tron.js.map +1 -1
  77. package/dist/tx/broadcast/resolvers/utxo.d.ts.map +1 -1
  78. package/dist/tx/broadcast/resolvers/utxo.js +4 -1
  79. package/dist/tx/broadcast/resolvers/utxo.js.map +1 -1
  80. package/dist/tx/broadcast/verifyBroadcastByHash.d.ts +29 -0
  81. package/dist/tx/broadcast/verifyBroadcastByHash.d.ts.map +1 -0
  82. package/dist/tx/broadcast/verifyBroadcastByHash.js +35 -0
  83. package/dist/tx/broadcast/verifyBroadcastByHash.js.map +1 -0
  84. package/package.json +21 -1
@@ -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;AAEjD,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CACnD,UAAU,CAAC,QAAQ,CAYpB,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,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAQjD,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CACnD,UAAU,CAAC,QAAQ,CA+BpB,CAAA"}
@@ -1,15 +1,30 @@
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
- export const broadcastPolkadotTx = async ({ tx: { encoded } }) => {
5
- const hexWithPrefix = ensureHexPrefix(Buffer.from(encoded).toString('hex'));
6
- await queryUrl(polkadotRpcUrl, {
7
- body: {
8
- jsonrpc: '2.0',
9
- method: 'author_submitExtrinsic',
10
- params: [hexWithPrefix],
11
- id: 1,
12
- },
13
- });
4
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
5
+ export const broadcastPolkadotTx = async ({ chain, tx }) => {
6
+ const hexWithPrefix = ensureHexPrefix(Buffer.from(tx.encoded).toString('hex'));
7
+ try {
8
+ const response = await queryUrl(polkadotRpcUrl, {
9
+ body: {
10
+ jsonrpc: '2.0',
11
+ method: 'author_submitExtrinsic',
12
+ params: [hexWithPrefix],
13
+ id: 1,
14
+ },
15
+ });
16
+ if (response.error) {
17
+ throw new Error(`Polkadot broadcast failed: ${response.error.message ?? `code ${response.error.code}`}`);
18
+ }
19
+ // Per JSON-RPC 2.0 a valid response must have exactly one of `result` /
20
+ // `error`. If both are missing (malformed gateway response, truncated
21
+ // body, …) do not silently assume success — force hash verification.
22
+ if (!response.result) {
23
+ throw new Error('Polkadot broadcast failed: missing extrinsic hash in RPC response');
24
+ }
25
+ }
26
+ catch (error) {
27
+ await verifyBroadcastByHash({ chain, tx, error });
28
+ }
14
29
  };
15
30
  //# 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;AAGhE,MAAM,CAAC,MAAM,mBAAmB,GAE5B,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE;IAChC,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAE3E,MAAM,QAAQ,CAAC,cAAc,EAAE;QAC7B,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,wBAAwB;YAChC,MAAM,EAAE,CAAC,aAAa,CAAC;YACvB,EAAE,EAAE,CAAC;SACN;KACF,CAAC,CAAA;AACJ,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;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAOhE,MAAM,CAAC,MAAM,mBAAmB,GAE5B,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1B,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,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CACxF,CAAA;QACH,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAA;QACH,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 +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;AAKlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,OAAO,KAAK,CAAC,IAAI,CAoClE,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;AAKlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,OAAO,KAAK,CAAC,IAAI,CA8ClE,CAAA"}
@@ -1,7 +1,9 @@
1
1
  import { qbtcRestUrl } from '@vultisig/core-chain/chains/cosmos/qbtc/tendermintRpcUrl';
2
2
  import { attempt } from '@vultisig/lib-utils/attempt';
3
3
  import { isInError } from '@vultisig/lib-utils/error/isInError';
4
- export const broadcastQbtcTx = async ({ tx: { serialized }, }) => {
4
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
5
+ export const broadcastQbtcTx = async ({ chain, tx, }) => {
6
+ const { serialized } = tx;
5
7
  const { tx_bytes } = JSON.parse(serialized);
6
8
  const resp = await fetch(`${qbtcRestUrl}/cosmos/tx/v1beta1/txs`, {
7
9
  method: 'POST',
@@ -16,7 +18,9 @@ export const broadcastQbtcTx = async ({ tx: { serialized }, }) => {
16
18
  if (isInError(text, 'tx already exists in cache')) {
17
19
  return;
18
20
  }
19
- throw new Error(`QBTC broadcast failed (${resp.status}): ${text}`);
21
+ const err = new Error(`QBTC broadcast failed (${resp.status}): ${text}`);
22
+ await verifyBroadcastByHash({ chain, tx, error: err });
23
+ return;
20
24
  }
21
25
  const data = (await resp.json());
22
26
  const { error } = await attempt(async () => {
@@ -24,8 +28,12 @@ export const broadcastQbtcTx = async ({ tx: { serialized }, }) => {
24
28
  throw new Error(`QBTC tx error: ${data.tx_response.raw_log || data.tx_response.log}`);
25
29
  }
26
30
  });
27
- if (error && !isInError(error, 'tx already exists in cache')) {
28
- throw error;
31
+ if (!error) {
32
+ return;
29
33
  }
34
+ if (isInError(error, 'tx already exists in cache')) {
35
+ return;
36
+ }
37
+ await verifyBroadcastByHash({ chain, tx, error });
30
38
  };
31
39
  //# sourceMappingURL=qbtc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"qbtc.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/qbtc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0DAA0D,CAAA;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAI/D,MAAM,CAAC,MAAM,eAAe,GAA2C,KAAK,EAAE,EAC5E,EAAE,EAAE,EAAE,UAAU,EAAE,GACnB,EAAE,EAAE;IACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAyB,CAAA;IAEnE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,wBAAwB,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ;YACR,IAAI,EAAE,qBAAqB;SAC5B,CAAC;KACH,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,SAAS,CAAC,IAAI,EAAE,4BAA4B,CAAC,EAAE,CAAC;YAClD,OAAM;QACR,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAA;IACD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CACrE,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,4BAA4B,CAAC,EAAE,CAAC;QAC7D,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"qbtc.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/qbtc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0DAA0D,CAAA;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAG/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,eAAe,GAA2C,KAAK,EAAE,EAC5E,KAAK,EACL,EAAE,GACH,EAAE,EAAE;IACH,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAA;IACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAyB,CAAA;IAEnE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,wBAAwB,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ;YACR,IAAI,EAAE,qBAAqB;SAC5B,CAAC;KACH,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,SAAS,CAAC,IAAI,EAAE,4BAA4B,CAAC,EAAE,CAAC;YAClD,OAAM;QACR,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAA;QACxE,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QACtD,OAAM;IACR,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAA;IACD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CACrE,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAM;IACR,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,4BAA4B,CAAC,EAAE,CAAC;QACnD,OAAM;IACR,CAAC;IAED,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;AACnD,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,CACjD,UAAU,CAAC,MAAM,CAQlB,CAAA"}
1
+ {"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,CACjD,UAAU,CAAC,MAAM,CAyBlB,CAAA"}
@@ -1,9 +1,26 @@
1
1
  import { getRippleClient } from '@vultisig/core-chain/chains/ripple/client';
2
- export const broadcastRippleTx = async ({ tx: { encoded } }) => {
2
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
3
+ export const broadcastRippleTx = async ({ chain, tx }) => {
3
4
  const client = await getRippleClient();
4
- await client.request({
5
- command: 'submit',
6
- tx_blob: Buffer.from(encoded).toString('hex'),
7
- });
5
+ try {
6
+ // XRPL's `submit` resolves successfully even when the tx is rejected
7
+ // (e.g. `tefPAST_SEQ` / `tefALREADY` for duplicates, `tec*` for fee or
8
+ // balance failures). The rejection is carried in the response payload,
9
+ // not via a thrown error — inspect `engine_result` / `engine_result_code`
10
+ // so non-success outcomes still take the hash-verify path.
11
+ const response = await client.request({
12
+ command: 'submit',
13
+ tx_blob: Buffer.from(tx.encoded).toString('hex'),
14
+ });
15
+ const engineResultCode = response?.result?.engine_result_code;
16
+ if (typeof engineResultCode === 'number' && engineResultCode !== 0) {
17
+ const engineResult = response.result.engine_result ?? 'unknown';
18
+ const engineResultMessage = response.result.engine_result_message ?? '';
19
+ throw new Error(`Ripple broadcast rejected: ${engineResult}${engineResultMessage ? ` — ${engineResultMessage}` : ''}`);
20
+ }
21
+ }
22
+ catch (error) {
23
+ await verifyBroadcastByHash({ chain, tx, error });
24
+ }
8
25
  };
9
26
  //# sourceMappingURL=ripple.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAI3E,MAAM,CAAC,MAAM,iBAAiB,GAE1B,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE;IAChC,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAA;IAEtC,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;KAC9C,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ripple.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,iBAAiB,GAE1B,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAA;IAEtC,IAAI,CAAC;QACH,qEAAqE;QACrE,uEAAuE;QACvE,uEAAuE;QACvE,0EAA0E;QAC1E,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;SACjD,CAAC,CAAA;QACF,MAAM,gBAAgB,GAAG,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAA;QAC7D,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;YACnE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAA;YAC/D,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAA;YACvE,MAAM,IAAI,KAAK,CACb,8BAA8B,YAAY,GAAG,mBAAmB,CAAC,CAAC,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACtG,CAAA;QACH,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 +1 @@
1
- {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,CACjD,UAAU,CAAC,MAAM,CAoBlB,CAAA"}
1
+ {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,CACjD,UAAU,CAAC,MAAM,CAwBlB,CAAA"}
@@ -1,8 +1,9 @@
1
1
  import { getSolanaClient } from '@vultisig/core-chain/chains/solana/client';
2
2
  import { sendJitoTransaction } from '@vultisig/core-chain/chains/solana/jito';
3
3
  import base58 from 'bs58';
4
- export const broadcastSolanaTx = async ({ tx: { encoded } }) => {
5
- const rawTransaction = base58.decode(encoded);
4
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
5
+ export const broadcastSolanaTx = async ({ chain, tx }) => {
6
+ const rawTransaction = base58.decode(tx.encoded);
6
7
  // Route all Solana transactions through JITO's sendTransaction endpoint
7
8
  // for free MEV protection (private mempool). Falls back to standard RPC
8
9
  // if JITO is unavailable.
@@ -14,10 +15,15 @@ export const broadcastSolanaTx = async ({ tx: { encoded } }) => {
14
15
  console.warn('[solana] JITO sendTransaction failed, falling back to standard RPC:', err);
15
16
  }
16
17
  const client = getSolanaClient();
17
- await client.sendRawTransaction(rawTransaction, {
18
- skipPreflight: false,
19
- preflightCommitment: 'confirmed',
20
- maxRetries: 3,
21
- });
18
+ try {
19
+ await client.sendRawTransaction(rawTransaction, {
20
+ skipPreflight: false,
21
+ preflightCommitment: 'confirmed',
22
+ maxRetries: 3,
23
+ });
24
+ }
25
+ catch (error) {
26
+ await verifyBroadcastByHash({ chain, tx, error });
27
+ }
22
28
  };
23
29
  //# sourceMappingURL=solana.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"solana.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/solana.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAC7E,OAAO,MAAM,MAAM,MAAM,CAAA;AAIzB,MAAM,CAAC,MAAM,iBAAiB,GAE1B,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE;IAChC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE7C,wEAAwE;IACxE,wEAAwE;IACxE,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,cAAc,CAAC,CAAA;QACzC,OAAM;IACR,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,qEAAqE,EAAE,GAAG,CAAC,CAAA;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE;QAC9C,aAAa,EAAE,KAAK;QACpB,mBAAmB,EAAE,WAAW;QAChC,UAAU,EAAE,CAAC;KACd,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"solana.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/solana.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAC7E,OAAO,MAAM,MAAM,MAAM,CAAA;AAGzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,iBAAiB,GAE1B,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;IAEhD,wEAAwE;IACxE,wEAAwE;IACxE,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,cAAc,CAAC,CAAA;QACzC,OAAM;IACR,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,qEAAqE,EAAE,GAAG,CAAC,CAAA;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE;YAC9C,aAAa,EAAE,KAAK;YACpB,mBAAmB,EAAE,WAAW;YAChC,UAAU,EAAE,CAAC;SACd,CAAC,CAAA;IACJ,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 +1 @@
1
- {"version":3,"file":"sui.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/sui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAM3D,CAAA"}
1
+ {"version":3,"file":"sui.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/sui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,cAAc,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAY9D,CAAA"}
@@ -1,6 +1,14 @@
1
1
  import { getSuiClient } from '@vultisig/core-chain/chains/sui/client';
2
- export const broadcastSuiTx = async ({ tx, }) => getSuiClient().executeTransactionBlock({
3
- transactionBlock: tx.unsignedTx,
4
- signature: [tx.signature],
5
- });
2
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
3
+ export const broadcastSuiTx = async ({ chain, tx, }) => {
4
+ try {
5
+ return await getSuiClient().executeTransactionBlock({
6
+ transactionBlock: tx.unsignedTx,
7
+ signature: [tx.signature],
8
+ });
9
+ }
10
+ catch (error) {
11
+ await verifyBroadcastByHash({ chain, tx, error });
12
+ }
13
+ };
6
14
  //# sourceMappingURL=sui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sui.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/sui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAIrE,MAAM,CAAC,MAAM,cAAc,GAAwC,KAAK,EAAE,EACxE,EAAE,GACH,EAAE,EAAE,CACH,YAAY,EAAE,CAAC,uBAAuB,CAAC;IACrC,gBAAgB,EAAE,EAAE,CAAC,UAAU;IAC/B,SAAS,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;CAC1B,CAAC,CAAA"}
1
+ {"version":3,"file":"sui.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/sui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAGrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAwC,KAAK,EAAE,EACxE,KAAK,EACL,EAAE,GACH,EAAE,EAAE;IACH,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,EAAE,CAAC,uBAAuB,CAAC;YAClD,gBAAgB,EAAE,EAAE,CAAC,UAAU;YAC/B,SAAS,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;SAC1B,CAAC,CAAA;IACJ,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 +1 @@
1
- {"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAMvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAc9D,CAAA"}
1
+ {"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAMvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,cAAc,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAqB9D,CAAA"}
@@ -2,13 +2,18 @@ import { rootApiUrl } from '@vultisig/core-config';
2
2
  import { attempt } from '@vultisig/lib-utils/attempt';
3
3
  import { isInError } from '@vultisig/lib-utils/error/isInError';
4
4
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
5
- export const broadcastTonTx = async ({ tx, }) => {
5
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
6
+ export const broadcastTonTx = async ({ chain, tx, }) => {
6
7
  const url = `${rootApiUrl}/ton/v2/sendBocReturnHash`;
7
8
  const { error } = await attempt(queryUrl(url, {
8
9
  body: { boc: tx.encoded },
9
10
  }));
10
- if (error && !isInError(error, 'duplicate message', 'duplicate msg_seqno')) {
11
- throw error;
11
+ if (!error) {
12
+ return;
12
13
  }
14
+ if (isInError(error, 'duplicate message', 'duplicate msg_seqno')) {
15
+ return;
16
+ }
17
+ await verifyBroadcastByHash({ chain, tx, error });
13
18
  };
14
19
  //# sourceMappingURL=ton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ton.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ton.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAI7D,MAAM,CAAC,MAAM,cAAc,GAAwC,KAAK,EAAE,EACxE,EAAE,GACH,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,GAAG,UAAU,2BAA2B,CAAA;IAEpD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAC7B,QAAQ,CAA+B,GAAG,EAAE;QAC1C,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE;KAC1B,CAAC,CACH,CAAA;IAED,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC;QAC3E,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"ton.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/ton.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAG7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAwC,KAAK,EAAE,EACxE,KAAK,EACL,EAAE,GACH,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,GAAG,UAAU,2BAA2B,CAAA;IAEpD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAC7B,QAAQ,CAA+B,GAAG,EAAE;QAC1C,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE;KAC1B,CAAC,CACH,CAAA;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAM;IACR,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC;QACjE,OAAM;IACR,CAAC;IAED,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;AACnD,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tron.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/tron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAIvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAehE,CAAA"}
1
+ {"version":3,"file":"tron.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/tron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAIvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAoBhE,CAAA"}
@@ -1,15 +1,21 @@
1
1
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
2
2
  import { tronRpcUrl } from '../../../chains/tron/config.js';
3
- export const broadcastTronTx = async ({ tx, }) => {
4
- const result = await queryUrl(`${tronRpcUrl}/wallet/broadcasttransaction`, {
5
- body: tx.json,
6
- });
7
- if (result.result === false || result.code) {
8
- const msg = result.message
9
- ? Buffer.from(result.message, 'hex').toString('utf8')
10
- : result.code ?? 'Unknown error';
11
- throw new Error(`Tron broadcast failed: ${msg}`);
3
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
4
+ export const broadcastTronTx = async ({ chain, tx, }) => {
5
+ try {
6
+ const result = await queryUrl(`${tronRpcUrl}/wallet/broadcasttransaction`, {
7
+ body: tx.json,
8
+ });
9
+ if (result.result === false || result.code) {
10
+ const msg = result.message
11
+ ? Buffer.from(result.message, 'hex').toString('utf8')
12
+ : result.code ?? 'Unknown error';
13
+ throw new Error(`Tron broadcast failed: ${msg}`);
14
+ }
15
+ return result;
16
+ }
17
+ catch (error) {
18
+ await verifyBroadcastByHash({ chain, tx, error });
12
19
  }
13
- return result;
14
20
  };
15
21
  //# sourceMappingURL=tron.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tron.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/tron.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,MAAM,CAAC,MAAM,eAAe,GAAyC,KAAK,EAAE,EAC1E,EAAE,GACH,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAsE,GAAG,UAAU,8BAA8B,EAAE;QAC9I,IAAI,EAAE,EAAE,CAAC,IAAI;KACd,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO;YACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrD,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,eAAe,CAAA;QAClC,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
1
+ {"version":3,"file":"tron.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/tron.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,CAAC,MAAM,eAAe,GAAyC,KAAK,EAAE,EAC1E,KAAK,EACL,EAAE,GACH,EAAE,EAAE;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAsE,GAAG,UAAU,8BAA8B,EAAE;YAC9I,IAAI,EAAE,EAAE,CAAC,IAAI;SACd,CAAC,CAAA;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO;gBACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrD,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,eAAe,CAAA;YAClC,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,OAAO,MAAM,CAAA;IACf,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 +1 @@
1
- {"version":3,"file":"utxo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/utxo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAQlF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,KAAK,kBAAkB,GACnB,aAAa,CAAC,SAAS,CAAC,GACxB,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;AAerC,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,cAAc,CAiC/D,CAAA;AAYD,eAAO,MAAM,kBAAkB,GAC7B,OAAO,cAAc,EACrB,IAAI,kBAAkB,KACrB,UASF,CAAA"}
1
+ {"version":3,"file":"utxo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/utxo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAQlF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,KAAK,kBAAkB,GACnB,aAAa,CAAC,SAAS,CAAC,GACxB,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;AAerC,eAAO,MAAM,eAAe,EAAE,mBAAmB,CAAC,cAAc,CAqC/D,CAAA;AAYD,eAAO,MAAM,kBAAkB,GAC7B,OAAO,cAAc,EACrB,IAAI,kBAAkB,KACrB,UASF,CAAA"}
@@ -4,6 +4,7 @@ import { isInError } from '@vultisig/lib-utils/error/isInError';
4
4
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
5
5
  import { getChainKind } from '../../../ChainKind.js';
6
6
  import { getBlockchairBaseUrl } from '../../../chains/utxo/client/getBlockchairBaseUrl.js';
7
+ import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
7
8
  export const broadcastUtxoTx = async ({ chain, tx, }) => {
8
9
  const url = `${getBlockchairBaseUrl(chain)}/push/transaction`;
9
10
  const encodedBytes = selectEncodedBytes(chain, tx);
@@ -19,7 +20,9 @@ export const broadcastUtxoTx = async ({ chain, tx, }) => {
19
20
  if (isInError(error, 'BadInputsUTxO', 'timed out', 'txn-mempool-conflict', 'already known')) {
20
21
  return null;
21
22
  }
22
- throw new Error(`Failed to broadcast transaction: ${extractErrorMsg(error)}`);
23
+ const broadcastError = new Error(`Failed to broadcast transaction: ${extractErrorMsg(error)}`);
24
+ await verifyBroadcastByHash({ chain, tx, error: broadcastError });
25
+ return null;
23
26
  };
24
27
  const hasSigningResultV2 = (tx) => tx != null &&
25
28
  typeof tx === 'object' &&
@@ -1 +1 @@
1
- {"version":3,"file":"utxo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/utxo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAA;AAqBvF,MAAM,CAAC,MAAM,eAAe,GAAwC,KAAK,EAAE,EACzE,KAAK,EACL,EAAE,GACH,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,mBAAmB,CAAA;IAC7D,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAwB,CAAC,CAAA;IAExE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAA8B,GAAG,EAAE;QAChE,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;SAChD;KACF,CAAC,CAAA;IAEF,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAA;IACvC,CAAC;IAED,MAAM,KAAK,GACT,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IAE5E,IACE,SAAS,CACP,KAAK,EACL,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,eAAe,CAChB,EACD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AAC/E,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CACzB,EAAsB,EAGtB,EAAE,CACF,EAAE,IAAI,IAAI;IACV,OAAO,EAAE,KAAK,QAAQ;IACtB,iBAAiB,IAAI,EAAE;IACvB,CAAC,CAAE,EAAU,CAAC,eAAe,CAAA;AAE/B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAqB,EACrB,EAAsB,EACV,EAAE;IACd,IACE,YAAY,CAAC,KAAK,CAAC,KAAK,MAAM;QAC9B,kBAAkB,CAAC,EAAE,CAAC;QACtB,EAAE,CAAC,eAAe,CAAC,OAAO,EAC1B,CAAC;QACD,OAAO,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC,CAAA"}
1
+ {"version":3,"file":"utxo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/utxo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAA;AAGvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAmBhE,MAAM,CAAC,MAAM,eAAe,GAAwC,KAAK,EAAE,EACzE,KAAK,EACL,EAAE,GACH,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,mBAAmB,CAAA;IAC7D,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAwB,CAAC,CAAA;IAExE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAA8B,GAAG,EAAE;QAChE,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;SAChD;KACF,CAAC,CAAA;IAEF,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAA;IACvC,CAAC;IAED,MAAM,KAAK,GACT,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IAE5E,IACE,SAAS,CACP,KAAK,EACL,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,eAAe,CAChB,EACD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,KAAK,CAC9B,oCAAoC,eAAe,CAAC,KAAK,CAAC,EAAE,CAC7D,CAAA;IACD,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;IACjE,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CACzB,EAAsB,EAGtB,EAAE,CACF,EAAE,IAAI,IAAI;IACV,OAAO,EAAE,KAAK,QAAQ;IACtB,iBAAiB,IAAI,EAAE;IACvB,CAAC,CAAE,EAAU,CAAC,eAAe,CAAA;AAE/B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAqB,EACrB,EAAsB,EACV,EAAE;IACd,IACE,YAAY,CAAC,KAAK,CAAC,KAAK,MAAM;QAC9B,kBAAkB,CAAC,EAAE,CAAC;QACtB,EAAE,CAAC,eAAe,CAAC,OAAO,EAC1B,CAAC;QACD,OAAO,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { Chain } from '../../Chain.js';
2
+ import { SigningOutput } from '../../tw/signingOutput.js';
3
+ type VerifyInput<T extends Chain> = {
4
+ chain: T;
5
+ tx: SigningOutput<T>;
6
+ error: unknown;
7
+ };
8
+ /**
9
+ * Hash-verification safety net for broadcast resolvers.
10
+ *
11
+ * In MPC keysign every participating device broadcasts the same signed
12
+ * transaction independently. When a peer wins the RPC race, the slower
13
+ * device gets an "already known / duplicate / in mempool" error, but the
14
+ * transaction is in fact on-chain (or in the mempool). Per-chain error
15
+ * string matching is fragile across RPC providers and versions; the
16
+ * deterministic signal is the tx hash itself.
17
+ *
18
+ * This helper re-runs `getTxHash` + `getTxStatus` on the signed output.
19
+ * If the status lookup confirms the transaction exists (pending or
20
+ * success), the broadcast error is swallowed. Otherwise the original
21
+ * error is re-thrown so the caller sees the real failure.
22
+ *
23
+ * Any failure inside verification (hash/status RPC down, tx not indexed
24
+ * yet, network error) falls through to re-throwing the original error —
25
+ * verification is a safety net, never a new failure mode.
26
+ */
27
+ export declare const verifyBroadcastByHash: <T extends Chain>({ chain, tx, error, }: VerifyInput<T>) => Promise<void>;
28
+ export {};
29
+ //# sourceMappingURL=verifyBroadcastByHash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyBroadcastByHash.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/verifyBroadcastByHash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAItD,KAAK,WAAW,CAAC,CAAC,SAAS,KAAK,IAAI;IAClC,KAAK,EAAE,CAAC,CAAA;IACR,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACpB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,qBAAqB,GAAU,CAAC,SAAS,KAAK,EAAE,uBAI1D,WAAW,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,IAAI,CAW/B,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { getTxHash } from '../hash/index.js';
2
+ import { getTxStatus } from '../status/index.js';
3
+ /**
4
+ * Hash-verification safety net for broadcast resolvers.
5
+ *
6
+ * In MPC keysign every participating device broadcasts the same signed
7
+ * transaction independently. When a peer wins the RPC race, the slower
8
+ * device gets an "already known / duplicate / in mempool" error, but the
9
+ * transaction is in fact on-chain (or in the mempool). Per-chain error
10
+ * string matching is fragile across RPC providers and versions; the
11
+ * deterministic signal is the tx hash itself.
12
+ *
13
+ * This helper re-runs `getTxHash` + `getTxStatus` on the signed output.
14
+ * If the status lookup confirms the transaction exists (pending or
15
+ * success), the broadcast error is swallowed. Otherwise the original
16
+ * error is re-thrown so the caller sees the real failure.
17
+ *
18
+ * Any failure inside verification (hash/status RPC down, tx not indexed
19
+ * yet, network error) falls through to re-throwing the original error —
20
+ * verification is a safety net, never a new failure mode.
21
+ */
22
+ export const verifyBroadcastByHash = async ({ chain, tx, error, }) => {
23
+ try {
24
+ const hash = await getTxHash({ chain, tx });
25
+ const result = await getTxStatus({ chain, hash });
26
+ if (result.status === 'pending' || result.status === 'success') {
27
+ return;
28
+ }
29
+ }
30
+ catch {
31
+ // fall through — verification unavailable, rethrow the original error
32
+ }
33
+ throw error;
34
+ };
35
+ //# sourceMappingURL=verifyBroadcastByHash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyBroadcastByHash.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/broadcast/verifyBroadcastByHash.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAQvC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAmB,EAC3D,KAAK,EACL,EAAE,EACF,KAAK,GACU,EAAiB,EAAE;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACjD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/D,OAAM;QACR,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;IACD,MAAM,KAAK,CAAA;AACb,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vultisig/core-chain",
3
- "version": "1.3.1",
3
+ "version": "1.4.1",
4
4
  "description": "Blockchain chain logic shared across Vultisig clients",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -454,6 +454,21 @@
454
454
  "import": "./dist/chains/evm/contract/call/signatures.js",
455
455
  "default": "./dist/chains/evm/contract/call/signatures.js"
456
456
  },
457
+ "./chains/evm/contract/universalRouter/decode": {
458
+ "types": "./dist/chains/evm/contract/universalRouter/decode.d.ts",
459
+ "import": "./dist/chains/evm/contract/universalRouter/decode.js",
460
+ "default": "./dist/chains/evm/contract/universalRouter/decode.js"
461
+ },
462
+ "./chains/evm/contract/universalRouter/opcodes": {
463
+ "types": "./dist/chains/evm/contract/universalRouter/opcodes.d.ts",
464
+ "import": "./dist/chains/evm/contract/universalRouter/opcodes.js",
465
+ "default": "./dist/chains/evm/contract/universalRouter/opcodes.js"
466
+ },
467
+ "./chains/evm/contract/universalRouter/types": {
468
+ "types": "./dist/chains/evm/contract/universalRouter/types.d.ts",
469
+ "import": "./dist/chains/evm/contract/universalRouter/types.js",
470
+ "default": "./dist/chains/evm/contract/universalRouter/types.js"
471
+ },
457
472
  "./chains/evm/erc20/getErc20Allowance": {
458
473
  "types": "./dist/chains/evm/erc20/getErc20Allowance.d.ts",
459
474
  "import": "./dist/chains/evm/erc20/getErc20Allowance.js",
@@ -1410,6 +1425,11 @@
1410
1425
  "import": "./dist/tx/broadcast/resolvers/utxo.js",
1411
1426
  "default": "./dist/tx/broadcast/resolvers/utxo.js"
1412
1427
  },
1428
+ "./tx/broadcast/verifyBroadcastByHash": {
1429
+ "types": "./dist/tx/broadcast/verifyBroadcastByHash.d.ts",
1430
+ "import": "./dist/tx/broadcast/verifyBroadcastByHash.js",
1431
+ "default": "./dist/tx/broadcast/verifyBroadcastByHash.js"
1432
+ },
1413
1433
  "./tx/fee/evm/baseFee": {
1414
1434
  "types": "./dist/tx/fee/evm/baseFee.d.ts",
1415
1435
  "import": "./dist/tx/fee/evm/baseFee.js",