@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.
- package/CHANGELOG.md +61 -0
- package/dist/chains/evm/contract/universalRouter/decode.d.ts +12 -0
- package/dist/chains/evm/contract/universalRouter/decode.d.ts.map +1 -0
- package/dist/chains/evm/contract/universalRouter/decode.js +333 -0
- package/dist/chains/evm/contract/universalRouter/decode.js.map +1 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.d.ts +39 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.d.ts.map +1 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.js +39 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.js.map +1 -0
- package/dist/chains/evm/contract/universalRouter/types.d.ts +24 -0
- package/dist/chains/evm/contract/universalRouter/types.d.ts.map +1 -0
- package/dist/chains/evm/contract/universalRouter/types.js +2 -0
- package/dist/chains/evm/contract/universalRouter/types.js.map +1 -0
- package/dist/chains/solana/client.d.ts.map +1 -1
- package/dist/chains/solana/client.js +1 -3
- package/dist/chains/solana/client.js.map +1 -1
- package/dist/coin/balance/resolvers/bittensor.d.ts.map +1 -1
- package/dist/coin/balance/resolvers/bittensor.js +16 -6
- package/dist/coin/balance/resolvers/bittensor.js.map +1 -1
- package/dist/publicKey/ecdsa/derivePublicKey.d.ts.map +1 -1
- package/dist/publicKey/ecdsa/derivePublicKey.js +6 -0
- package/dist/publicKey/ecdsa/derivePublicKey.js.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.d.ts.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.js +30 -29
- package/dist/security/blockaid/tx/simulation/api/core.js.map +1 -1
- package/dist/swap/general/kyber/api/quote.d.ts +2 -2
- package/dist/swap/general/kyber/api/quote.d.ts.map +1 -1
- package/dist/swap/general/kyber/api/quote.js +6 -4
- package/dist/swap/general/kyber/api/quote.js.map +1 -1
- package/dist/swap/general/kyber/api/route.d.ts +2 -2
- package/dist/swap/general/kyber/api/route.d.ts.map +1 -1
- package/dist/swap/general/kyber/api/route.js +3 -3
- package/dist/swap/general/kyber/api/route.js.map +1 -1
- package/dist/swap/general/kyber/api/tx.d.ts +4 -4
- package/dist/swap/general/kyber/api/tx.d.ts.map +1 -1
- package/dist/swap/general/kyber/api/tx.js +23 -3
- package/dist/swap/general/kyber/api/tx.js.map +1 -1
- package/dist/swap/general/kyber/config.d.ts +8 -0
- package/dist/swap/general/kyber/config.d.ts.map +1 -1
- package/dist/swap/general/kyber/config.js +10 -0
- package/dist/swap/general/kyber/config.js.map +1 -1
- package/dist/swap/quote/findSwapQuote.js +2 -2
- package/dist/swap/quote/findSwapQuote.js.map +1 -1
- package/dist/tx/broadcast/resolvers/bittensor.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/bittensor.js +5 -3
- package/dist/tx/broadcast/resolvers/bittensor.js.map +1 -1
- package/dist/tx/broadcast/resolvers/cardano.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/cardano.js +4 -1
- package/dist/tx/broadcast/resolvers/cardano.js.map +1 -1
- package/dist/tx/broadcast/resolvers/cosmos.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/cosmos.js +9 -3
- package/dist/tx/broadcast/resolvers/cosmos.js.map +1 -1
- package/dist/tx/broadcast/resolvers/evm.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/evm.js +7 -3
- package/dist/tx/broadcast/resolvers/evm.js.map +1 -1
- package/dist/tx/broadcast/resolvers/polkadot.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/polkadot.js +25 -10
- package/dist/tx/broadcast/resolvers/polkadot.js.map +1 -1
- package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/qbtc.js +12 -4
- package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
- package/dist/tx/broadcast/resolvers/ripple.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ripple.js +22 -5
- package/dist/tx/broadcast/resolvers/ripple.js.map +1 -1
- package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/solana.js +13 -7
- package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
- package/dist/tx/broadcast/resolvers/sui.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/sui.js +12 -4
- package/dist/tx/broadcast/resolvers/sui.js.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.js +8 -3
- package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
- package/dist/tx/broadcast/resolvers/tron.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/tron.js +16 -10
- package/dist/tx/broadcast/resolvers/tron.js.map +1 -1
- package/dist/tx/broadcast/resolvers/utxo.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/utxo.js +4 -1
- package/dist/tx/broadcast/resolvers/utxo.js.map +1 -1
- package/dist/tx/broadcast/verifyBroadcastByHash.d.ts +29 -0
- package/dist/tx/broadcast/verifyBroadcastByHash.d.ts.map +1 -0
- package/dist/tx/broadcast/verifyBroadcastByHash.js +35 -0
- package/dist/tx/broadcast/verifyBroadcastByHash.js.map +1 -0
- 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;
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
28
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
2
|
+
import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
|
|
3
|
+
export const broadcastRippleTx = async ({ chain, tx }) => {
|
|
3
4
|
const client = await getRippleClient();
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
5
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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 (
|
|
11
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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;
|
|
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
|
+
"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",
|