@vultisig/core-chain 2.17.2 → 2.17.4

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 CHANGED
@@ -1,5 +1,19 @@
1
1
  # @vultisig/core-chain
2
2
 
3
+ ## 2.17.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [#773](https://github.com/vultisig/vultisig-sdk/pull/773) [`ba1372e`](https://github.com/vultisig/vultisig-sdk/commit/ba1372e6cc76243e6c44114d706ae0b00c524e47) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - Raise Zcash memo-send fees to the ZIP-317 conventional fee at plan time. WalletCore's `zip_0317` planner flat-sizes OP_RETURN and ignores `byteFee`, so memo sends planned one logical action short and were rejected by the network; the signing-input resolver now re-plans with `zip_0317` off and bumps `byteFee` until the fee clears.
8
+
9
+ ## 2.17.3
10
+
11
+ ### Patch Changes
12
+
13
+ - [#753](https://github.com/vultisig/vultisig-sdk/pull/753) [`e988851`](https://github.com/vultisig/vultisig-sdk/commit/e98885119f18078a0dde1f1ebdbca20f842c9325) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Fail Cardano broadcasts before submission when the signed transaction TTL is expired or too close to expiry.
14
+
15
+ - [#754](https://github.com/vultisig/vultisig-sdk/pull/754) [`35c48e3`](https://github.com/vultisig/vultisig-sdk/commit/35c48e3eac615d62697c9052f43a9dab918b94dd) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Route UTXO and Cardano broadcast timeouts through transaction hash verification before treating them as landed.
16
+
3
17
  ## 2.17.2
4
18
 
5
19
  ### Patch Changes
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Extract the absolute slot TTL from a signed Cardano transaction CBOR.
3
+ *
4
+ * Cardano transaction bodies are CBOR maps; key 3 is `ttl`. We only decode for
5
+ * inspection and never re-encode, so this cannot perturb the tx hash.
6
+ */
7
+ export declare const getCardanoTxTtl: (txCbor: Uint8Array) => bigint;
8
+ //# sourceMappingURL=cardanoTxTtl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardanoTxTtl.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cardano/cip30/cardanoTxTtl.ts"],"names":[],"mappings":"AA4BA;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,UAAU,KAAG,MAQpD,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { decode } from 'cbor-x';
2
+ const ttlBodyKey = 3;
3
+ const getBodyValue = (body, key) => {
4
+ if (body instanceof Map) {
5
+ return body.get(key);
6
+ }
7
+ if (body && typeof body === 'object') {
8
+ return body[String(key)];
9
+ }
10
+ return undefined;
11
+ };
12
+ const toTtl = (value) => {
13
+ if (typeof value === 'bigint')
14
+ return value;
15
+ if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) {
16
+ return BigInt(value);
17
+ }
18
+ if (typeof value === 'string' && /^\d+$/.test(value)) {
19
+ return BigInt(value);
20
+ }
21
+ throw new Error('Invalid Cardano transaction TTL');
22
+ };
23
+ /**
24
+ * Extract the absolute slot TTL from a signed Cardano transaction CBOR.
25
+ *
26
+ * Cardano transaction bodies are CBOR maps; key 3 is `ttl`. We only decode for
27
+ * inspection and never re-encode, so this cannot perturb the tx hash.
28
+ */
29
+ export const getCardanoTxTtl = (txCbor) => {
30
+ const decoded = decode(txCbor);
31
+ if (!Array.isArray(decoded) || decoded.length < 1) {
32
+ throw new Error('Invalid Cardano transaction CBOR: expected array');
33
+ }
34
+ return toTtl(getBodyValue(decoded[0], ttlBodyKey));
35
+ };
36
+ //# sourceMappingURL=cardanoTxTtl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardanoTxTtl.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cardano/cip30/cardanoTxTtl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,UAAU,GAAG,CAAC,CAAA;AAEpB,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,GAAW,EAAW,EAAE;IAC3D,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAQ,IAAgC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,KAAc,EAAU,EAAE;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;AACpD,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAU,EAAE;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAE9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACrE,CAAC;IAED,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAA;AACpD,CAAC,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export declare const cardanoSlotOffset = 720;
2
2
  export declare const cardanoDefaultFee = 180000n;
3
+ export declare const cardanoBroadcastTtlSafetyMargin = 60;
3
4
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cardano/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,MAAM,CAAA;AACpC,eAAO,MAAM,iBAAiB,UAAU,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cardano/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,MAAM,CAAA;AACpC,eAAO,MAAM,iBAAiB,UAAU,CAAA;AACxC,eAAO,MAAM,+BAA+B,KAAK,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export const cardanoSlotOffset = 720;
2
2
  export const cardanoDefaultFee = 180000n;
3
+ export const cardanoBroadcastTtlSafetyMargin = 60;
3
4
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cardano/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAA"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/cardano/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAA;AACxC,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAA"}
@@ -26,5 +26,26 @@ type GetZcashConventionalFeeInput = {
26
26
  * logical actions = max(ceil(tx_in bytes / 150), ceil(tx_out bytes / 34)).
27
27
  */
28
28
  export declare const getZcashConventionalFee: ({ inputCount, outputSizes }: GetZcashConventionalFeeInput) => bigint;
29
+ /**
30
+ * Serialized tx_out size of an OP_RETURN output carrying `memo`:
31
+ * 8 value + scriptLen CompactSize + script (OP_RETURN + push opcode(s) + data).
32
+ * WalletCore's planner sizes this output as a flat ~34 bytes regardless of
33
+ * memo length, so longer memos make its plan undercount ZIP-317 actions.
34
+ * Models the push-opcode (direct / PUSHDATA1 / PUSHDATA2 / PUSHDATA4) and the
35
+ * script-length CompactSize so long memos are not undercharged.
36
+ */
37
+ export declare const getZcashOpReturnOutputSize: (memo: string) => bigint;
38
+ type GetZcashTransparentOutputSizesInput = {
39
+ /** Change amount; a second P2PKH output is only present when this is positive. */
40
+ change: bigint;
41
+ /** OP_RETURN memo, if any. */
42
+ memo: string | undefined;
43
+ };
44
+ /**
45
+ * Serialized tx_out sizes for a transparent Zcash send: recipient P2PKH,
46
+ * optional change P2PKH, and an optional OP_RETURN memo. Feed into
47
+ * {@link getZcashConventionalFee} to size the conventional fee by real bytes.
48
+ */
49
+ export declare const getZcashTransparentOutputSizes: ({ change, memo }: GetZcashTransparentOutputSizesInput) => bigint[];
29
50
  export {};
30
51
  //# sourceMappingURL=zip317.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zip317.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/fee/zip317.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,QAAQ,CAAA;AACrC,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAMnC,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,OAAO,GAAI,oBAAoB,YAAY,KAAG,MAA0C,CAAA;AAErG,KAAK,4BAA4B,GAAG;IAClC,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAA;IAClB,gFAAgF;IAChF,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAAI,6BAA6B,4BAA4B,KAAG,MAYnG,CAAA"}
1
+ {"version":3,"file":"zip317.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/fee/zip317.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,QAAQ,CAAA;AACrC,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAQnC,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,OAAO,GAAI,oBAAoB,YAAY,KAAG,MAA0C,CAAA;AAErG,KAAK,4BAA4B,GAAG;IAClC,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAA;IAClB,gFAAgF;IAChF,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAAI,6BAA6B,4BAA4B,KAAG,MAYnG,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,KAAG,MAWzD,CAAA;AAED,KAAK,mCAAmC,GAAG;IACzC,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,kBAAkB,mCAAmC,KAAG,MAAM,EAM5G,CAAA"}
@@ -14,6 +14,8 @@ export const zcashGraceActions = 2n;
14
14
  const p2pkhInputSize = 148n;
15
15
  const inputActionSize = 150n;
16
16
  const outputActionSize = 34n;
17
+ /** Serialized tx_out size of a P2PKH output: 8 value + 1 scriptLen + 25 script. */
18
+ const p2pkhOutputSize = 34n;
17
19
  /** Ceiling division for bigints: smallest n such that n * divisor >= value. */
18
20
  export const ceilDiv = ({ value, divisor }) => (value + divisor - 1n) / divisor;
19
21
  /**
@@ -33,4 +35,34 @@ export const getZcashConventionalFee = ({ inputCount, outputSizes }) => {
33
35
  const logicalActions = bigIntMax(inputActions, outputActions);
34
36
  return zcashMarginalFee * bigIntMax(zcashGraceActions, logicalActions);
35
37
  };
38
+ /**
39
+ * Serialized tx_out size of an OP_RETURN output carrying `memo`:
40
+ * 8 value + scriptLen CompactSize + script (OP_RETURN + push opcode(s) + data).
41
+ * WalletCore's planner sizes this output as a flat ~34 bytes regardless of
42
+ * memo length, so longer memos make its plan undercount ZIP-317 actions.
43
+ * Models the push-opcode (direct / PUSHDATA1 / PUSHDATA2 / PUSHDATA4) and the
44
+ * script-length CompactSize so long memos are not undercharged.
45
+ */
46
+ export const getZcashOpReturnOutputSize = (memo) => {
47
+ const dataSize = BigInt(new TextEncoder().encode(memo).length);
48
+ // OP_RETURN (1 byte) + push opcode bytes for `dataSize`.
49
+ const pushOverhead = dataSize <= 75n ? 2n : dataSize <= 0xffn ? 3n : dataSize <= 0xffffn ? 4n : 6n;
50
+ const scriptSize = pushOverhead + dataSize;
51
+ // CompactSize encoding of the script length prefix.
52
+ const scriptLengthSize = scriptSize < 0xfdn ? 1n : scriptSize <= 0xffffn ? 3n : scriptSize <= 0xffffffffn ? 5n : 9n;
53
+ return 8n + scriptLengthSize + scriptSize;
54
+ };
55
+ /**
56
+ * Serialized tx_out sizes for a transparent Zcash send: recipient P2PKH,
57
+ * optional change P2PKH, and an optional OP_RETURN memo. Feed into
58
+ * {@link getZcashConventionalFee} to size the conventional fee by real bytes.
59
+ */
60
+ export const getZcashTransparentOutputSizes = ({ change, memo }) => {
61
+ const sizes = [p2pkhOutputSize];
62
+ if (change > 0n)
63
+ sizes.push(p2pkhOutputSize);
64
+ if (memo)
65
+ sizes.push(getZcashOpReturnOutputSize(memo));
66
+ return sizes;
67
+ };
36
68
  //# sourceMappingURL=zip317.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zip317.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/fee/zip317.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAEhE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAA;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AACnC,0EAA0E;AAC1E,MAAM,cAAc,GAAG,IAAI,CAAA;AAC3B,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAO5B,+EAA+E;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAgB,EAAU,EAAE,CAAC,CAAC,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC,GAAG,OAAO,CAAA;AASrG;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,EAAgC,EAAU,EAAE;IAC3G,MAAM,YAAY,GAAG,OAAO,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,cAAc;QAC1C,OAAO,EAAE,eAAe;KACzB,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,OAAO,CAAC;QAC5B,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC;QAC7B,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAA;IACF,MAAM,cAAc,GAAG,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;IAE7D,OAAO,gBAAgB,GAAG,SAAS,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAA;AACxE,CAAC,CAAA"}
1
+ {"version":3,"file":"zip317.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/utxo/fee/zip317.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAEhE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAA;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AACnC,0EAA0E;AAC1E,MAAM,cAAc,GAAG,IAAI,CAAA;AAC3B,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAC5B,mFAAmF;AACnF,MAAM,eAAe,GAAG,GAAG,CAAA;AAO3B,+EAA+E;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAgB,EAAU,EAAE,CAAC,CAAC,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC,GAAG,OAAO,CAAA;AASrG;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,EAAgC,EAAU,EAAE;IAC3G,MAAM,YAAY,GAAG,OAAO,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,cAAc;QAC1C,OAAO,EAAE,eAAe;KACzB,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,OAAO,CAAC;QAC5B,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC;QAC7B,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAA;IACF,MAAM,cAAc,GAAG,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;IAE7D,OAAO,gBAAgB,GAAG,SAAS,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAA;AACxE,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAU,EAAE;IACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;IAE9D,yDAAyD;IACzD,MAAM,YAAY,GAAG,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAClG,MAAM,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAA;IAE1C,oDAAoD;IACpD,MAAM,gBAAgB,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnH,OAAO,EAAE,GAAG,gBAAgB,GAAG,UAAU,CAAA;AAC3C,CAAC,CAAA;AASD;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAuC,EAAY,EAAE;IAChH,MAAM,KAAK,GAAG,CAAC,eAAe,CAAC,CAAA;IAC/B,IAAI,MAAM,GAAG,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC5C,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAA;IAEtD,OAAO,KAAK,CAAA;AACd,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;AAKvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAUjD,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAqBtE,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,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAsBjD,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAuBtE,CAAA"}
@@ -1,3 +1,6 @@
1
+ import { getCardanoTxTtl } from '@vultisig/core-chain/chains/cardano/cip30/cardanoTxTtl';
2
+ import { getCardanoCurrentSlot } from '@vultisig/core-chain/chains/cardano/client/currentSlot';
3
+ import { cardanoBroadcastTtlSafetyMargin } from '@vultisig/core-chain/chains/cardano/config';
1
4
  import { getCardanoTxHash } from '@vultisig/core-chain/tx/hash/resolvers/cardano';
2
5
  import { isInError } from '@vultisig/lib-utils/error/isInError';
3
6
  import { submitCardanoCbor } from '../../../chains/cardano/submit/submitCardanoCbor.js';
@@ -8,8 +11,17 @@ import { selectEncodedBytes } from './utxo.js';
8
11
  * reports this, we hash the tx locally to return the deterministic id.
9
12
  */
10
13
  const alreadyCommittedCode = 3117;
14
+ const assertCardanoTtlFreshForBroadcast = async (encodedBytes) => {
15
+ const ttl = getCardanoTxTtl(encodedBytes);
16
+ const currentSlot = await getCardanoCurrentSlot();
17
+ const minimumFreshTtl = currentSlot + BigInt(cardanoBroadcastTtlSafetyMargin);
18
+ if (ttl <= minimumFreshTtl) {
19
+ throw new Error(`Cardano transaction TTL is expired or too close to expiry; rebuild the transaction and retry (ttl=${ttl}, currentSlot=${currentSlot}, safetyMargin=${cardanoBroadcastTtlSafetyMargin} slots)`);
20
+ }
21
+ };
11
22
  export const broadcastCardanoTx = async ({ chain, tx }) => {
12
23
  const encodedBytes = selectEncodedBytes(chain, tx);
24
+ await assertCardanoTtlFreshForBroadcast(encodedBytes);
13
25
  const cborHex = Buffer.from(encodedBytes).toString('hex');
14
26
  const { txHash, errorMessage, rpcErrorCode } = await submitCardanoCbor(cborHex);
15
27
  if (txHash)
@@ -18,7 +30,7 @@ export const broadcastCardanoTx = async ({ chain, tx }) => {
18
30
  return (await getCardanoTxHash(tx)).replace(/^0x/i, '');
19
31
  }
20
32
  const error = errorMessage ?? 'unknown broadcast failure';
21
- if (isInError(error, 'BadInputsUTxO', 'timed out', 'txn-mempool-conflict', 'already known')) {
33
+ if (isInError(error, 'BadInputsUTxO', 'txn-mempool-conflict', 'already known')) {
22
34
  return null;
23
35
  }
24
36
  const broadcastError = new Error(`Failed to broadcast transaction: ${error}`);
@@ -1 +1 @@
1
- {"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/cardano.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAA;AAEpF,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,CAAC,MAAM,kBAAkB,GAA4C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACjG,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAE/E,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,YAAY,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,IAAI,2BAA2B,CAAA;IAEzD,IAAI,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,sBAAsB,EAAE,eAAe,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAA;IAC7E,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;IACjE,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
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,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAA;AAEpF,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,EAAE,YAAwB,EAAE,EAAE;IAC3E,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,MAAM,WAAW,GAAG,MAAM,qBAAqB,EAAE,CAAA;IACjD,MAAM,eAAe,GAAG,WAAW,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAA;IAE7E,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,qGAAqG,GAAG,iBAAiB,WAAW,kBAAkB,+BAA+B,SAAS,CAC/L,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAA4C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACjG,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClD,MAAM,iCAAiC,CAAC,YAAY,CAAC,CAAA;IAErD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAE/E,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,YAAY,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,IAAI,2BAA2B,CAAA;IAEzD,IAAI,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,CAAC,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAA;IAC7E,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;IACjE,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -17,7 +17,7 @@ export const broadcastUtxoTx = async ({ chain, tx }) => {
17
17
  return response.data.transaction_hash;
18
18
  }
19
19
  const error = 'context' in response ? response.context.error : extractErrorMsg(response);
20
- if (isInError(error, 'BadInputsUTxO', 'timed out', 'txn-mempool-conflict', 'already known')) {
20
+ if (isInError(error, 'BadInputsUTxO', 'txn-mempool-conflict', 'already known')) {
21
21
  return null;
22
22
  }
23
23
  const broadcastError = new Error(`Failed to broadcast transaction: ${extractErrorMsg(error)}`);
@@ -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;AAGvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAiBhE,MAAM,CAAC,MAAM,eAAe,GAAwC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1F,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,GAAG,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IAExF,IAAI,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,sBAAsB,EAAE,eAAe,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,oCAAoC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9F,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,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,iBAAiB,IAAI,EAAE,IAAI,CAAC,CAAE,EAAU,CAAC,eAAe,CAAA;AAErG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAqB,EAAE,EAAsB,EAAc,EAAE;IAC9F,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC3F,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;AAiBhE,MAAM,CAAC,MAAM,eAAe,GAAwC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1F,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,GAAG,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IAExF,IAAI,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,CAAC,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,oCAAoC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9F,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,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,iBAAiB,IAAI,EAAE,IAAI,CAAC,CAAE,EAAU,CAAC,eAAe,CAAA;AAErG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAqB,EAAE,EAAsB,EAAc,EAAE;IAC9F,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC3F,OAAO,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vultisig/core-chain",
3
- "version": "2.17.2",
3
+ "version": "2.17.4",
4
4
  "description": "Blockchain chain logic shared across Vultisig clients",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -110,6 +110,11 @@
110
110
  "import": "./dist/chains/cardano/cip30/cardanoTxBodyHash.js",
111
111
  "default": "./dist/chains/cardano/cip30/cardanoTxBodyHash.js"
112
112
  },
113
+ "./chains/cardano/cip30/cardanoTxTtl": {
114
+ "types": "./dist/chains/cardano/cip30/cardanoTxTtl.d.ts",
115
+ "import": "./dist/chains/cardano/cip30/cardanoTxTtl.js",
116
+ "default": "./dist/chains/cardano/cip30/cardanoTxTtl.js"
117
+ },
113
118
  "./chains/cardano/cip30/cborEncoder": {
114
119
  "types": "./dist/chains/cardano/cip30/cborEncoder.d.ts",
115
120
  "import": "./dist/chains/cardano/cip30/cborEncoder.js",