@vultisig/core-mpc 1.8.3 → 1.8.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,16 @@
1
1
  # @vultisig/core-mpc
2
2
 
3
+ ## 1.8.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [#809](https://github.com/vultisig/vultisig-sdk/pull/809) [`e53230e`](https://github.com/vultisig/vultisig-sdk/commit/e53230efd2bb8a4e68f85f74c24655190af405d4) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Honor native swap quote expiry and validate THORChain inbound vault addresses before broadcasting stale signed swaps.
8
+
9
+ - [#808](https://github.com/vultisig/vultisig-sdk/pull/808) [`ab9cc91`](https://github.com/vultisig/vultisig-sdk/commit/ab9cc91c48588e9ecd96ec7eb50fd8138b88ba13) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Apply native THORChain/Maya swap slippage tolerance to quote requests and signed payload limits so native swaps no longer use a zero minimum-output floor.
10
+
11
+ - Updated dependencies [[`e53230e`](https://github.com/vultisig/vultisig-sdk/commit/e53230efd2bb8a4e68f85f74c24655190af405d4), [`ab9cc91`](https://github.com/vultisig/vultisig-sdk/commit/ab9cc91c48588e9ecd96ec7eb50fd8138b88ba13)]:
12
+ - @vultisig/core-chain@2.17.7
13
+
3
14
  ## 1.8.3
4
15
 
5
16
  ### Patch Changes
@@ -11,6 +11,10 @@ type Input = {
11
11
  };
12
12
  amount: bigint;
13
13
  };
14
+ export declare const getNativeSwapToAmountLimit: ({ expectedAmountOut, slippageToleranceBps, }: {
15
+ expectedAmountOut: string;
16
+ slippageToleranceBps?: number;
17
+ }) => string;
14
18
  export declare const nativeSwapQuoteToSwapPayload: ({ quote, fromCoin, amount, toCoin }: Input) => CommKeysignSwapPayload;
15
19
  export {};
16
20
  //# sourceMappingURL=nativeSwapQuoteToSwapPayload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nativeSwapQuoteToSwapPayload.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/swap/native/utils/nativeSwapQuoteToSwapPayload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAA;AAMlF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AAIjF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,eAAe,CAAA;IACtB,QAAQ,EAAE,WAAW,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,MAAM,EAAE,WAAW,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,4BAA4B,GAAI,qCAAqC,KAAK,KAAG,sBA+BzF,CAAA"}
1
+ {"version":3,"file":"nativeSwapQuoteToSwapPayload.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/swap/native/utils/nativeSwapQuoteToSwapPayload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAA;AAIlF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AAIjF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,eAAe,CAAA;IACtB,QAAQ,EAAE,WAAW,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,MAAM,EAAE,WAAW,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAsBD,eAAO,MAAM,0BAA0B,GAAI,8CAGxC;IACD,iBAAiB,EAAE,MAAM,CAAA;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,KAAG,MAYH,CAAA;AAED,eAAO,MAAM,4BAA4B,GAAI,qCAAqC,KAAK,KAAG,sBAoCzF,CAAA"}
@@ -1,14 +1,37 @@
1
1
  import { create } from '@bufbuild/protobuf';
2
2
  import { fromChainAmount } from '@vultisig/core-chain/amount/fromChainAmount';
3
3
  import { Chain } from '@vultisig/core-chain/Chain';
4
+ import { DEFAULT_NATIVE_SWAP_SLIPPAGE_TOLERANCE_BPS } from '@vultisig/core-chain/swap/native/api/getNativeSwapQuote';
4
5
  import { nativeSwapPayloadCase, nativeSwapStreamingInterval } from '@vultisig/core-chain/swap/native/NativeSwapChain';
5
6
  import { getNativeSwapDecimals } from '@vultisig/core-chain/swap/native/utils/getNativeSwapDecimals';
6
7
  import { parseThorchainSwapMemoStreaming } from '@vultisig/core-chain/swap/native/utils/parseThorchainSwapMemoStreaming';
7
- import { convertDuration } from '@vultisig/lib-utils/time/convertDuration';
8
- import { addMinutes } from 'date-fns';
9
8
  import { toCommCoin } from '../../../types/utils/commCoin.js';
10
9
  import { THORChainSwapPayloadSchema } from '../../../types/vultisig/keysign/v1/thorchain_swap_payload_pb.js';
10
+ const assertQuoteNotExpired = (expirySeconds) => {
11
+ if (expirySeconds <= Math.floor(Date.now() / 1000)) {
12
+ throw new Error('Native swap quote is expired; refresh the quote before signing');
13
+ }
14
+ };
15
+ const BASIS_POINTS_DENOMINATOR = 10000n;
16
+ const assertValidSlippageToleranceBps = (slippageToleranceBps) => {
17
+ if (!Number.isSafeInteger(slippageToleranceBps) ||
18
+ slippageToleranceBps < 0 ||
19
+ slippageToleranceBps > Number(BASIS_POINTS_DENOMINATOR)) {
20
+ throw new Error(`slippageToleranceBps must be an integer between 0 and ${BASIS_POINTS_DENOMINATOR}. Received "${slippageToleranceBps}".`);
21
+ }
22
+ };
23
+ export const getNativeSwapToAmountLimit = ({ expectedAmountOut, slippageToleranceBps = DEFAULT_NATIVE_SWAP_SLIPPAGE_TOLERANCE_BPS, }) => {
24
+ assertValidSlippageToleranceBps(slippageToleranceBps);
25
+ const expected = BigInt(expectedAmountOut);
26
+ const tolerance = BigInt(slippageToleranceBps);
27
+ const limit = (expected * (BASIS_POINTS_DENOMINATOR - tolerance)) / BASIS_POINTS_DENOMINATOR;
28
+ if (expected > 0n && tolerance < BASIS_POINTS_DENOMINATOR && limit === 0n) {
29
+ return '1';
30
+ }
31
+ return limit.toString();
32
+ };
11
33
  export const nativeSwapQuoteToSwapPayload = ({ quote, fromCoin, amount, toCoin }) => {
34
+ assertQuoteNotExpired(quote.expiry);
12
35
  const isAffiliate = !!quote.fees.affiliate && Number(quote.fees.affiliate) > 0;
13
36
  const { streamingInterval, streamingQuantity } = quote.swapChain === Chain.THORChain
14
37
  ? parseThorchainSwapMemoStreaming(quote.memo)
@@ -27,10 +50,13 @@ export const nativeSwapQuoteToSwapPayload = ({ quote, fromCoin, amount, toCoin }
27
50
  routerAddress: quote.router,
28
51
  fromAmount: amount.toString(),
29
52
  toAmountDecimal: fromChainAmount(quote.expected_amount_out, toDecimals).toFixed(toDecimals),
30
- expirationTime: BigInt(Math.round(convertDuration(addMinutes(Date.now(), 15).getTime(), 'ms', 's'))),
53
+ expirationTime: BigInt(quote.expiry),
31
54
  streamingInterval,
32
55
  streamingQuantity,
33
- toAmountLimit: '0',
56
+ toAmountLimit: getNativeSwapToAmountLimit({
57
+ expectedAmountOut: quote.expected_amount_out,
58
+ slippageToleranceBps: quote.liquidity_tolerance_bps,
59
+ }),
34
60
  isAffiliate,
35
61
  fee: quote.fees.total,
36
62
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"nativeSwapQuoteToSwapPayload.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/swap/native/utils/nativeSwapQuoteToSwapPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAA;AAErH,OAAO,EAAE,qBAAqB,EAAE,MAAM,8DAA8D,CAAA;AACpG,OAAO,EAAE,+BAA+B,EAAE,MAAM,wEAAwE,CAAA;AACxH,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAGrC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8DAA8D,CAAA;AASzG,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAS,EAA0B,EAAE;IACjH,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAE9E,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,GAC5C,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QACjC,CAAC,CAAC,+BAA+B,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7C,CAAC,CAAC;YACE,iBAAiB,EAAE,MAAM,CAAC,2BAA2B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvE,iBAAiB,EAAE,GAAG;SACvB,CAAA;IAEP,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAEhD,OAAO;QACL,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC;QAC5C,KAAK,EAAE,MAAM,CAAC,0BAA0B,EAAE;YACxC,WAAW,EAAE,QAAQ,CAAC,OAAO;YAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC9B,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;YAC1B,YAAY,EAAE,KAAK,CAAC,eAAe,IAAI,QAAQ,CAAC,OAAO;YACvD,aAAa,EAAE,KAAK,CAAC,MAAM;YAC3B,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC7B,eAAe,EAAE,eAAe,CAAC,KAAK,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;YAC3F,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACpG,iBAAiB;YACjB,iBAAiB;YACjB,aAAa,EAAE,GAAG;YAClB,WAAW;YACX,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;SACtB,CAAC;KACH,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"nativeSwapQuoteToSwapPayload.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/swap/native/utils/nativeSwapQuoteToSwapPayload.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vultisig/core-mpc",
3
- "version": "1.8.3",
3
+ "version": "1.8.4",
4
4
  "description": "MPC, keysign, and vault types shared across Vultisig clients",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1014,7 +1014,7 @@
1014
1014
  "@noble/hashes": "^1.8.0",
1015
1015
  "@solana/web3.js": "^1.98.4",
1016
1016
  "@trustwallet/wallet-core": "^4.6.15",
1017
- "@vultisig/core-chain": "2.17.6",
1017
+ "@vultisig/core-chain": "2.17.7",
1018
1018
  "@vultisig/core-config": "0.9.1",
1019
1019
  "@vultisig/lib-dkls": "0.9.0",
1020
1020
  "@vultisig/lib-mldsa": "0.9.0",