@vultisig/core-mpc 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -0
- package/dist/keysign/chainSpecific/resolver.d.ts +7 -0
- package/dist/keysign/chainSpecific/resolver.d.ts.map +1 -1
- package/dist/keysign/chainSpecific/resolvers/ripple.d.ts +11 -0
- package/dist/keysign/chainSpecific/resolvers/ripple.d.ts.map +1 -1
- package/dist/keysign/chainSpecific/resolvers/ripple.js +95 -2
- package/dist/keysign/chainSpecific/resolvers/ripple.js.map +1 -1
- package/dist/keysign/chainSpecific/resolvers/ton/index.d.ts.map +1 -1
- package/dist/keysign/chainSpecific/resolvers/ton/index.js +56 -22
- package/dist/keysign/chainSpecific/resolvers/ton/index.js.map +1 -1
- package/dist/keysign/error.d.ts +1 -1
- package/dist/keysign/error.d.ts.map +1 -1
- package/dist/keysign/error.js.map +1 -1
- package/dist/keysign/send/build.d.ts.map +1 -1
- package/dist/keysign/send/build.js +15 -3
- package/dist/keysign/send/build.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/index.d.ts.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/index.js +22 -2
- package/dist/keysign/signingInputs/resolvers/ton/index.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/jetton.d.ts +3 -1
- package/dist/keysign/signingInputs/resolvers/ton/jetton.d.ts.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/jetton.js +3 -3
- package/dist/keysign/signingInputs/resolvers/ton/jetton.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/native.d.ts +17 -2
- package/dist/keysign/signingInputs/resolvers/ton/native.d.ts.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/native.js +20 -4
- package/dist/keysign/signingInputs/resolvers/ton/native.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# @vultisig/core-mpc
|
|
2
2
|
|
|
3
|
+
## 3.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#2299](https://github.com/vultisig/vultisig-sdk/pull/2299) [`bcca32c`](https://github.com/vultisig/vultisig-sdk/commit/bcca32c885066e2bf224aa37d6666c68a3684956) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - feat(ton): W5 (wallet v5r1) support as an explicit per-account opt-in
|
|
8
|
+
|
|
9
|
+
Every Vultisig TON account has been hard-pinned to the V4R2 wallet contract. W5 is the default for new wallets in Tonkeeper and Telegram Wallet and is the gateway to what users now expect from TON — up to 255 messages per request instead of 4, lower fees, and relayer-paid ("gasless") transactions. WalletCore has supported it for a while; nothing here used it.
|
|
10
|
+
|
|
11
|
+
A W5 wallet is a _different address_ for the same key, with its own balance, so this is not a switch: V4R2 stays the default everywhere and W5 is selected per account.
|
|
12
|
+
|
|
13
|
+
- `@vultisig/core-chain/chains/ton/wallet` (new): `TonWalletVersion` (`'v4r2' | 'v5r1'`), `deriveTonAddress` for either contract, `resolveTonWalletVersion` to tell which contract an address is for a key, the W5 mainnet wallet id, and the per-contract message limits.
|
|
14
|
+
- `vault.setTonWalletVersion('v5r1')` selects which of the key's two TON accounts the vault acts on: `send`, balances, swaps, fee estimation and every other address lookup follow it, so one selected account is used consistently. `vault.address(chain, { tonWalletVersion })` — like `deriveAddress` / `getChainAddress` / `deriveAddressFromKeys` — names a contract for a single lookup without changing the selection, so a client can show both accounts side by side for a migration flow.
|
|
15
|
+
- Balance cache keys name a chain and an asset, not an account, so switching between the two accounts drops the balance scope and any fetch already in flight for the old account is neither cached nor announced: it still answers its own caller, but `balanceUpdated` carries no account identity, so emitting it after a switch would credit the old account's balance to the new one.
|
|
16
|
+
- The keysign signing-input resolver derives the contract from the sender address — the payload has no wallet-version field, and every co-signer reaches the same answer from the shared vault key — and refuses an address that is neither of the key's wallets rather than assuming V4R2. W5 requests carry `IGNORE_ACTION_PHASE_ERRORS`, which the W5 code requires of every external action (its replay protection) and WalletCore enforces; the TON status resolver's action-phase check covers the blindness that flag would otherwise cause. Message counts are capped per contract.
|
|
17
|
+
- The RN-safe builders (`buildTonSendTx`, `buildTonJettonTransferTx`, `buildTonTxFromSigningPayload`, `deriveTonAddress`, `prepareJettonTransferTxFromKeys`) take `walletVersion`; W5 uses the `signed_external` request layout with the signature appended, byte-identical to WalletCore. New `buildV5R1Wallet` / `TON_V5R1_WALLET_ID` alongside the V4R2 helpers.
|
|
18
|
+
|
|
19
|
+
Golden vectors (`testdata/cross-encoder-golden/ton-w5-*.json`) pin the W5 pre-images and are verified against real WalletCore, including the full signed external message. Client-side migration UI (show both accounts, move funds, reconnect dApps) is separate work per platform.
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [[`a5def09`](https://github.com/vultisig/vultisig-sdk/commit/a5def098e06cf7269174eb6840dc516d78ec55f9), [`bcca32c`](https://github.com/vultisig/vultisig-sdk/commit/bcca32c885066e2bf224aa37d6666c68a3684956)]:
|
|
24
|
+
- @vultisig/core-chain@5.2.0
|
|
25
|
+
|
|
26
|
+
## 3.0.1
|
|
27
|
+
|
|
28
|
+
### Patch Changes
|
|
29
|
+
|
|
30
|
+
- [#2323](https://github.com/vultisig/vultisig-sdk/pull/2323) [`8a50970`](https://github.com/vultisig/vultisig-sdk/commit/8a50970438de64cdbeb281cf73925026e3ce3cf7) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - Refuse XRPL issued-currency Payments the ledger would reject — a destination holding no trust line for the token, and an issuer that charges a transfer fee the payload cannot yet cover with a SendMax — instead of burning the fee on-chain. Accept the lowercase standard currency codes XRPL permits, report bad amounts and unusable destinations as domain errors, and pin both encoders against a shared issued-currency signing vector.
|
|
31
|
+
|
|
32
|
+
- [#2310](https://github.com/vultisig/vultisig-sdk/pull/2310) [`af6c643`](https://github.com/vultisig/vultisig-sdk/commit/af6c643e9afa39cb0b4432a01cec40e4de4d8ecc) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - fix(ton): let a dApp deadline tighten the signed expiry
|
|
33
|
+
|
|
34
|
+
`getTonChainSpecific` always signed `expireAt = now + 600`, so the `valid_until` a TonConnect `sendTransaction` carries never reached the wallet message: a request with a 60-second window was signed with a ten-minute one, and a broadcast landing after the dApp's window could execute on chain while the dApp already treated it as expired and retried.
|
|
35
|
+
|
|
36
|
+
`GetChainSpecificInput` now takes an optional `validUntil` (unix seconds) for `tonSpecific`. The signed `expireAt` is `min(now + 600, validUntil)` — the wallet's own window remains the ceiling — and a deadline already in the past fails the build instead of signing a transaction the network would reject. Callers that pass nothing keep the previous behaviour; co-signers read `expireAt` from the payload, so only what the initiator writes changes.
|
|
37
|
+
|
|
38
|
+
The expiry is computed last, after the seqno, bounceability and jetton-metadata lookups: each is a network round trip, so a deadline still ahead when the build starts can be behind by the time it finishes, and the wallet's own ten-minute window now starts when the payload is finished rather than being partly spent on those lookups.
|
|
39
|
+
|
|
40
|
+
- Updated dependencies [[`8a50970`](https://github.com/vultisig/vultisig-sdk/commit/8a50970438de64cdbeb281cf73925026e3ce3cf7), [`af6c643`](https://github.com/vultisig/vultisig-sdk/commit/af6c643e9afa39cb0b4432a01cec40e4de4d8ecc), [`20de22f`](https://github.com/vultisig/vultisig-sdk/commit/20de22f49c244ffc065011291754f89ef0d6e61a), [`34f0faa`](https://github.com/vultisig/vultisig-sdk/commit/34f0faa7208ad594b8d18a3a2806c0f7867f2c85)]:
|
|
41
|
+
- @vultisig/core-chain@5.1.0
|
|
42
|
+
|
|
3
43
|
## 3.0.0
|
|
4
44
|
|
|
5
45
|
### Major Changes
|
|
@@ -43,6 +43,13 @@ export type GetChainSpecificInput<C extends KeysignChainSpecificKey = KeysignCha
|
|
|
43
43
|
} : C extends 'rippleSpecific' ? {
|
|
44
44
|
/** Explicit send intent overrides the legacy issuer-address TrustSet inference. */
|
|
45
45
|
transactionType?: TransactionType.RIPPLE_PAYMENT | TransactionType.RIPPLE_TRUST_SET;
|
|
46
|
+
} : C extends 'tonSpecific' ? {
|
|
47
|
+
/**
|
|
48
|
+
* Deadline (unix seconds) a dApp attached to the request — a TonConnect
|
|
49
|
+
* `sendTransaction` `valid_until`. Caps the wallet's own expiry; a deadline
|
|
50
|
+
* already in the past fails the build instead of signing a dead transaction.
|
|
51
|
+
*/
|
|
52
|
+
validUntil?: number;
|
|
46
53
|
} : {});
|
|
47
54
|
export type GetChainSpecificResolver<C extends KeysignChainSpecificKey = KeysignChainSpecificKey> = Resolver<GetChainSpecificInput<C>, Promise<ValueForCase<C>>>;
|
|
48
55
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/chainSpecific/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qEAAqE,CAAA;AAC1G,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAEtF,KAAK,YAAY,CAAC,CAAC,SAAS,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC,OAAO,CAAC,CAAA;AAE1G,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,IAAI;IAC/F,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GAAG,CAAC,CAAC,SAAS,kBAAkB,GAC7B;IACE,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;IAChC,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC,GACD,CAAC,SAAS,cAAc,GACtB;IAAE,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAClD,CAAC,SAAS,gBAAgB,GACxB;IACE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,GACD,CAAC,SAAS,mBAAmB,GAC3B;IACE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC,GACD,CAAC,SAAS,cAAc,GACtB;IACE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,GACD,CAAC,SAAS,cAAc,GACtB;IACE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC,GACD,CAAC,SAAS,gBAAgB,GACxB;IACE,mFAAmF;IACnF,eAAe,CAAC,EAAE,eAAe,CAAC,cAAc,GAAG,eAAe,CAAC,gBAAgB,CAAA;CACpF,GACD,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/chainSpecific/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qEAAqE,CAAA;AAC1G,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAA;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAEtF,KAAK,YAAY,CAAC,CAAC,SAAS,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC,OAAO,CAAC,CAAA;AAE1G,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,IAAI;IAC/F,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GAAG,CAAC,CAAC,SAAS,kBAAkB,GAC7B;IACE,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;IAChC,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC,GACD,CAAC,SAAS,cAAc,GACtB;IAAE,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAClD,CAAC,SAAS,gBAAgB,GACxB;IACE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,GACD,CAAC,SAAS,mBAAmB,GAC3B;IACE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC,GACD,CAAC,SAAS,cAAc,GACtB;IACE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,GACD,CAAC,SAAS,cAAc,GACtB;IACE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC,GACD,CAAC,SAAS,gBAAgB,GACxB;IACE,mFAAmF;IACnF,eAAe,CAAC,EAAE,eAAe,CAAC,cAAc,GAAG,eAAe,CAAC,gBAAgB,CAAA;CACpF,GACD,CAAC,SAAS,aAAa,GACrB;IACE;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACD,EAAE,CAAC,CAAA;AAErB,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,IAAI,QAAQ,CAC1G,qBAAqB,CAAC,CAAC,CAAC,EACxB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CACzB,CAAA"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import { GetChainSpecificResolver } from '../resolver.js';
|
|
2
2
|
export declare const getRippleLastLedgerSequence: (ledgerCurrentIndex: number | undefined) => bigint;
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the per-ceremony XRPL fields — sequence, network fee, ledger
|
|
5
|
+
* validity window, destination tag and the operation discriminator — and
|
|
6
|
+
* refuses, before the user reviews anything, a transaction the ledger would
|
|
7
|
+
* apply without delivering: a Payment missing a required DestinationTag, a
|
|
8
|
+
* native send too small to activate a fresh destination, and an issued-currency
|
|
9
|
+
* Payment whose destination or issuer cannot receive it.
|
|
10
|
+
*
|
|
11
|
+
* Deterministic bad input surfaces as a [BuildKeysignPayloadError] so callers
|
|
12
|
+
* stop retrying; lookups that merely failed stay retryable.
|
|
13
|
+
*/
|
|
3
14
|
export declare const getRippleChainSpecific: GetChainSpecificResolver<'rippleSpecific'>;
|
|
4
15
|
//# sourceMappingURL=ripple.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ripple.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ripple.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAmFtD,eAAO,MAAM,2BAA2B,GAAI,oBAAoB,MAAM,GAAG,SAAS,KAAG,MAMpF,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,wBAAwB,CAAC,gBAAgB,CAsJ7E,CAAA"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { create } from '@bufbuild/protobuf';
|
|
2
2
|
import { getRippleAccountInfo } from '@vultisig/core-chain/chains/ripple/account/info';
|
|
3
|
+
import { getRippleAccountLines } from '@vultisig/core-chain/chains/ripple/account/lines';
|
|
4
|
+
import { parseRippleTokenId } from '@vultisig/core-chain/chains/ripple/issuedCurrency';
|
|
5
|
+
import { findRippleTrustLine } from '@vultisig/core-chain/chains/ripple/trustLine';
|
|
3
6
|
import { getRippleNetworkInfo } from '@vultisig/core-chain/chains/ripple/network/info';
|
|
4
7
|
import { RippleSpecificSchema, TransactionType, } from '@vultisig/core-mpc/types/vultisig/keysign/v1/blockchain_specific_pb';
|
|
5
8
|
import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
6
|
-
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
9
|
+
import { attempt, withFallback } from '@vultisig/lib-utils/attempt';
|
|
7
10
|
import { isInError } from '@vultisig/lib-utils/error/isInError';
|
|
8
11
|
import { maxBigInt } from '@vultisig/lib-utils/math/maxBigInt';
|
|
9
12
|
import { BuildKeysignPayloadError } from '../../error.js';
|
|
@@ -14,12 +17,73 @@ const minProtocolFee = 15n;
|
|
|
14
17
|
const baseFeeMultiplier = 2n;
|
|
15
18
|
const rippleRequireDestinationTagFlag = 0x00020000;
|
|
16
19
|
const lastLedgerSequenceOffset = 60;
|
|
20
|
+
/**
|
|
21
|
+
* `AccountRoot.TransferRate` encoding for "no transfer fee". The field is
|
|
22
|
+
* absent or zero on most issuers; anything above this billionths-denominated
|
|
23
|
+
* unit rate means the issuer charges a fee on every hop.
|
|
24
|
+
* @see https://xrpl.org/docs/concepts/tokens/transfer-fees
|
|
25
|
+
*/
|
|
26
|
+
const rippleNoTransferFeeRate = 1_000_000_000;
|
|
27
|
+
/**
|
|
28
|
+
* Rejects an issued-currency Payment the XRP Ledger would refuse to deliver,
|
|
29
|
+
* while the payload is still being built.
|
|
30
|
+
*
|
|
31
|
+
* Both shapes it catches are *applied* transactions on-ledger: the fee is
|
|
32
|
+
* burned and the sequence consumed even though nothing moves. A destination
|
|
33
|
+
* holding no trust line for the exact (currency, issuer) fails with
|
|
34
|
+
* tecNO_LINE/tecPATH_DRY, and an issuer charging a TransferRate fails with
|
|
35
|
+
* tecPATH_PARTIAL because the sender owes `Amount x (1 + rate)` while XRPL
|
|
36
|
+
* defaults SendMax to Amount alone.
|
|
37
|
+
*
|
|
38
|
+
* Fails closed: a lookup that does not come back is not evidence of a usable
|
|
39
|
+
* trust line, and those failures stay retryable rather than becoming a
|
|
40
|
+
* [BuildKeysignPayloadError].
|
|
41
|
+
*
|
|
42
|
+
* Not for redemptions — sending a token back to its own issuer needs no trust
|
|
43
|
+
* line and pays no transfer fee. Callers skip it in that case.
|
|
44
|
+
*/
|
|
45
|
+
const assertRippleTokenIsDeliverable = async ({ ticker, senderAddress, toAddress, issuedCurrency, }) => {
|
|
46
|
+
const [linesResult, issuerResult] = await Promise.all([
|
|
47
|
+
attempt(getRippleAccountLines(toAddress)),
|
|
48
|
+
// An issuer never charges itself a transfer fee on its own token.
|
|
49
|
+
senderAddress === issuedCurrency.issuer ? undefined : attempt(getRippleAccountInfo(issuedCurrency.issuer)),
|
|
50
|
+
]);
|
|
51
|
+
if ('error' in linesResult) {
|
|
52
|
+
throw new Error(`Unable to verify whether XRP destination ${toAddress} holds a trust line for ${ticker}`);
|
|
53
|
+
}
|
|
54
|
+
if (!findRippleTrustLine({ lines: linesResult.data, ...issuedCurrency })) {
|
|
55
|
+
throw new BuildKeysignPayloadError('ripple-destination-trust-line-missing', `Cannot send ${ticker} to ${toAddress}: that account holds no trust line for this token, ` +
|
|
56
|
+
'so the XRP Ledger would reject the payment. The recipient has to open one first.');
|
|
57
|
+
}
|
|
58
|
+
if (issuerResult === undefined) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if ('error' in issuerResult) {
|
|
62
|
+
throw new Error(`Unable to verify whether the ${ticker} issuer charges an XRP transfer fee`);
|
|
63
|
+
}
|
|
64
|
+
const { TransferRate } = issuerResult.data.account_data;
|
|
65
|
+
if (TransferRate !== undefined && TransferRate > rippleNoTransferFeeRate) {
|
|
66
|
+
throw new BuildKeysignPayloadError('ripple-issuer-transfer-fee-unsupported', `Cannot send ${ticker}: its issuer charges a transfer fee, which needs a SendMax this ` +
|
|
67
|
+
'payload cannot express yet. Sending it back to the issuer still works.');
|
|
68
|
+
}
|
|
69
|
+
};
|
|
17
70
|
export const getRippleLastLedgerSequence = (ledgerCurrentIndex) => {
|
|
18
71
|
if (ledgerCurrentIndex === undefined || !Number.isSafeInteger(ledgerCurrentIndex) || ledgerCurrentIndex <= 0) {
|
|
19
72
|
throw new Error('Ripple account_info response is missing a valid ledger_current_index.');
|
|
20
73
|
}
|
|
21
74
|
return BigInt(ledgerCurrentIndex + lastLedgerSequenceOffset);
|
|
22
75
|
};
|
|
76
|
+
/**
|
|
77
|
+
* Resolves the per-ceremony XRPL fields — sequence, network fee, ledger
|
|
78
|
+
* validity window, destination tag and the operation discriminator — and
|
|
79
|
+
* refuses, before the user reviews anything, a transaction the ledger would
|
|
80
|
+
* apply without delivering: a Payment missing a required DestinationTag, a
|
|
81
|
+
* native send too small to activate a fresh destination, and an issued-currency
|
|
82
|
+
* Payment whose destination or issuer cannot receive it.
|
|
83
|
+
*
|
|
84
|
+
* Deterministic bad input surfaces as a [BuildKeysignPayloadError] so callers
|
|
85
|
+
* stop retrying; lookups that merely failed stay retryable.
|
|
86
|
+
*/
|
|
23
87
|
export const getRippleChainSpecific = async ({ keysignPayload, destinationTag, transactionType, }) => {
|
|
24
88
|
const coin = getKeysignCoin(keysignPayload);
|
|
25
89
|
const { address } = coin;
|
|
@@ -37,6 +101,21 @@ export const getRippleChainSpecific = async ({ keysignPayload, destinationTag, t
|
|
|
37
101
|
const isTrustSet = transactionType === undefined
|
|
38
102
|
? originatesRippleTrustSet(keysignPayload)
|
|
39
103
|
: transactionType === TransactionType.RIPPLE_TRUST_SET;
|
|
104
|
+
// A verbatim dApp transaction is signed exactly as supplied, so the token
|
|
105
|
+
// pre-flights below — which describe a Payment this resolver would build —
|
|
106
|
+
// do not apply to it.
|
|
107
|
+
const isVerbatimDappTx = keysignPayload.signData.case === 'signRipple';
|
|
108
|
+
const isIssuedCurrencySend = !isTrustSet && !isVerbatimDappTx && !!keysignPayload.coin && !keysignPayload.coin.isNativeToken;
|
|
109
|
+
// A payload with no parseable token id cannot name an asset to pre-flight.
|
|
110
|
+
// The signing-input resolver rejects that shape outright; here it only means
|
|
111
|
+
// there is nothing to look up.
|
|
112
|
+
const tokenId = isIssuedCurrencySend ? coin.id : undefined;
|
|
113
|
+
const issuedCurrency = tokenId
|
|
114
|
+
? withFallback(attempt(() => parseRippleTokenId(tokenId)), undefined)
|
|
115
|
+
: undefined;
|
|
116
|
+
// Sending a token back to its issuer redeems it: the issuer needs no trust
|
|
117
|
+
// line to itself and charges no transfer fee, so neither pre-flight applies.
|
|
118
|
+
const redeemsToIssuer = issuedCurrency !== undefined && toAddress === issuedCurrency.issuer;
|
|
40
119
|
const [senderAccount, networkInfo, destinationAccountResult] = await Promise.all([
|
|
41
120
|
getRippleAccountInfo(address),
|
|
42
121
|
getRippleNetworkInfo(),
|
|
@@ -72,8 +151,14 @@ export const getRippleChainSpecific = async ({ keysignPayload, destinationTag, t
|
|
|
72
151
|
}
|
|
73
152
|
}
|
|
74
153
|
if (destinationUnfunded) {
|
|
154
|
+
// A TrustSet is addressed to the issuer, not to a payee. Saying "activate
|
|
155
|
+
// it before sending tokens" would tell the user to fund somebody else's
|
|
156
|
+
// account; an issuer that does not exist simply cannot be trusted.
|
|
157
|
+
if (isTrustSet) {
|
|
158
|
+
throw new BuildKeysignPayloadError('ripple-trust-line-issuer-not-activated', `Cannot open an XRP trust line to ${toAddress}: that issuer account does not exist on the ledger.`);
|
|
159
|
+
}
|
|
75
160
|
if (!keysignPayload.coin?.isNativeToken) {
|
|
76
|
-
throw new
|
|
161
|
+
throw new BuildKeysignPayloadError('ripple-destination-not-activated', `Cannot send an XRP issued currency to ${toAddress}: the destination account is not activated. ` +
|
|
77
162
|
'Activate it with the XRP base reserve before sending tokens.');
|
|
78
163
|
}
|
|
79
164
|
const toAmount = BigInt(shouldBePresent(keysignPayload.toAmount));
|
|
@@ -84,6 +169,14 @@ export const getRippleChainSpecific = async ({ keysignPayload, destinationTag, t
|
|
|
84
169
|
`the reserve, or send to an already-activated account.`);
|
|
85
170
|
}
|
|
86
171
|
}
|
|
172
|
+
if (issuedCurrency && toAddress && !redeemsToIssuer) {
|
|
173
|
+
await assertRippleTokenIsDeliverable({
|
|
174
|
+
ticker: coin.ticker,
|
|
175
|
+
senderAddress: address,
|
|
176
|
+
toAddress,
|
|
177
|
+
issuedCurrency,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
87
180
|
const { account_data, ledger_current_index: ledgerCurrentIndex } = senderAccount;
|
|
88
181
|
// State the operation on the wire rather than leaving every signer to infer
|
|
89
182
|
// it from the coin. A non-native Ripple coin means either "open a trust line"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAA;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAA;AACtF,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,qEAAqE,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ripple.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ton/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ton/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAkCzD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,wBAAwB,CAAC,aAAa,CAyGvE,CAAA"}
|
|
@@ -7,6 +7,27 @@ import { attempt } from '@vultisig/lib-utils/attempt';
|
|
|
7
7
|
import { getKeysignSwapPayload } from '../../../swap/getKeysignSwapPayload.js';
|
|
8
8
|
import { getKeysignCoin } from '../../../utils/getKeysignCoin.js';
|
|
9
9
|
const tonWalletStateUninitialized = 'uninit';
|
|
10
|
+
/** How long a wallet message stays valid when the caller sets no tighter deadline. */
|
|
11
|
+
const tonWalletExpirySeconds = 600;
|
|
12
|
+
/**
|
|
13
|
+
* The `expireAt` to sign. The wallet's own 10-minute window is the ceiling; a dApp
|
|
14
|
+
* deadline (`valid_until`) can only tighten it, never extend it. A deadline that has
|
|
15
|
+
* already passed by build time fails here rather than producing a transaction the
|
|
16
|
+
* network will reject.
|
|
17
|
+
*/
|
|
18
|
+
const resolveTonExpireAt = ({ now, validUntil }) => {
|
|
19
|
+
const walletDeadline = now + tonWalletExpirySeconds;
|
|
20
|
+
if (validUntil === undefined) {
|
|
21
|
+
return walletDeadline;
|
|
22
|
+
}
|
|
23
|
+
// Whole seconds only: flooring first means a deadline less than a second out is
|
|
24
|
+
// caught here rather than signed as an expiry equal to `now`.
|
|
25
|
+
const deadline = Number.isFinite(validUntil) ? Math.floor(validUntil) : Number.NaN;
|
|
26
|
+
if (!(deadline > now)) {
|
|
27
|
+
throw new Error(`TON request deadline (valid_until ${validUntil}) has already passed`);
|
|
28
|
+
}
|
|
29
|
+
return Math.min(walletDeadline, deadline);
|
|
30
|
+
};
|
|
10
31
|
/**
|
|
11
32
|
* Resolves the TON-specific keysign fields: the sender's seqno, an expiry, whether the
|
|
12
33
|
* transfer bounces on rejection, and — for Jettons — the sender's Jetton wallet and
|
|
@@ -14,7 +35,7 @@ const tonWalletStateUninitialized = 'uninit';
|
|
|
14
35
|
* rather than inferred, so an ordinary send that happens to sit close to the balance is
|
|
15
36
|
* not relabelled a MAX send.
|
|
16
37
|
*/
|
|
17
|
-
export const getTonChainSpecific = async ({ keysignPayload, sendMaxAmount = false, }) => {
|
|
38
|
+
export const getTonChainSpecific = async ({ keysignPayload, sendMaxAmount = false, validUntil, }) => {
|
|
18
39
|
const coin = getKeysignCoin(keysignPayload);
|
|
19
40
|
const { address } = coin;
|
|
20
41
|
const receiver = keysignPayload.toAddress;
|
|
@@ -53,21 +74,16 @@ export const getTonChainSpecific = async ({ keysignPayload, sendMaxAmount = fals
|
|
|
53
74
|
// opts out.
|
|
54
75
|
return getTonAddressBounceability(receiver) !== 'nonBounceable';
|
|
55
76
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
// that address there is no transaction to build. Leaving the empty-string default
|
|
67
|
-
// in place does not stop anything downstream — the signing path's presence check
|
|
68
|
-
// only rejects null/undefined — so a failed lookup would otherwise be signed as a
|
|
69
|
-
// transfer to nowhere. This lookup fails transiently (RPC timeout, indexer lag),
|
|
70
|
-
// so it stays a plain retryable Error rather than a BuildKeysignPayloadError.
|
|
77
|
+
// A Jetton transfer is a message to the SENDER's own jetton wallet, so without
|
|
78
|
+
// that address there is no transaction to build. Leaving the empty-string default
|
|
79
|
+
// in place does not stop anything downstream — the signing path's presence check
|
|
80
|
+
// only rejects null/undefined — so a failed lookup would otherwise be signed as a
|
|
81
|
+
// transfer to nowhere. This lookup fails transiently (RPC timeout, indexer lag),
|
|
82
|
+
// so it stays a plain retryable Error rather than a BuildKeysignPayloadError.
|
|
83
|
+
const getJettonFields = async () => {
|
|
84
|
+
if (!coin.id) {
|
|
85
|
+
return { jettonAddress: '', isActiveDestination: false };
|
|
86
|
+
}
|
|
71
87
|
const jettonWallet = await attempt(getJettonWalletAddress({
|
|
72
88
|
ownerAddress: address,
|
|
73
89
|
jettonMasterAddress: coin.id,
|
|
@@ -76,12 +92,30 @@ export const getTonChainSpecific = async ({ keysignPayload, sendMaxAmount = fals
|
|
|
76
92
|
throw new Error(`Unable to resolve the ${coin.ticker} jetton wallet owned by ${address}. ` +
|
|
77
93
|
'Refusing to build a Jetton transfer without it.', 'error' in jettonWallet ? { cause: jettonWallet.error } : undefined);
|
|
78
94
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const { data: destWalletState } = await attempt(getTonWalletState(receiver));
|
|
82
|
-
result.isActiveDestination = destWalletState !== tonWalletStateUninitialized;
|
|
95
|
+
if (!receiver) {
|
|
96
|
+
return { jettonAddress: jettonWallet.data, isActiveDestination: false };
|
|
83
97
|
}
|
|
84
|
-
|
|
85
|
-
|
|
98
|
+
const { data: destWalletState } = await attempt(getTonWalletState(receiver));
|
|
99
|
+
return {
|
|
100
|
+
jettonAddress: jettonWallet.data,
|
|
101
|
+
isActiveDestination: destWalletState !== tonWalletStateUninitialized,
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
const bounceable = await getIsBounceable();
|
|
105
|
+
const { jettonAddress, isActiveDestination } = await getJettonFields();
|
|
106
|
+
// Read the clock last. Every lookup above is a network round trip, and a deadline
|
|
107
|
+
// that was still ahead when the build started can be behind by the time it
|
|
108
|
+
// finishes — computing the expiry up front would sign that dead deadline instead
|
|
109
|
+
// of refusing it, and would also spend part of the wallet's own ten-minute window
|
|
110
|
+
// on the lookups.
|
|
111
|
+
const expireAt = BigInt(resolveTonExpireAt({ now: Math.floor(Date.now() / 1000), validUntil }));
|
|
112
|
+
return create(TonSpecificSchema, {
|
|
113
|
+
sequenceNumber,
|
|
114
|
+
expireAt,
|
|
115
|
+
bounceable,
|
|
116
|
+
sendMaxAmount,
|
|
117
|
+
jettonAddress,
|
|
118
|
+
isActiveDestination,
|
|
119
|
+
});
|
|
86
120
|
};
|
|
87
121
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ton/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2DAA2D,CAAA;AAC7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,qEAAqE,CAAA;AACvG,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAG9D,MAAM,2BAA2B,GAAG,QAAQ,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA4C,KAAK,EAAE,EACjF,cAAc,EACd,aAAa,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/ton/index.ts"],"names":[],"mappings":"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"}
|
package/dist/keysign/error.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type BuildKeysignPayloadErrorType = 'not-enough-funds' | 'ripple-destination-tag-invalid' | 'ripple-destination-tag-required' | 'ton-memo-too-long';
|
|
1
|
+
export type BuildKeysignPayloadErrorType = 'not-enough-funds' | 'ripple-destination-not-activated' | 'ripple-destination-tag-invalid' | 'ripple-destination-tag-required' | 'ripple-destination-trust-line-missing' | 'ripple-issued-currency-amount-invalid' | 'ripple-issuer-transfer-fee-unsupported' | 'ripple-trust-line-issuer-not-activated' | 'ton-memo-too-long';
|
|
2
2
|
export declare class BuildKeysignPayloadError extends Error {
|
|
3
3
|
readonly type: BuildKeysignPayloadErrorType;
|
|
4
4
|
constructor(type: BuildKeysignPayloadErrorType, message?: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../packages/core/mpc/keysign/error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GACpC,kBAAkB,GAClB,gCAAgC,GAChC,iCAAiC,GACjC,mBAAmB,CAAA;AAEvB,qBAAa,wBAAyB,SAAQ,KAAK;aAE/B,IAAI,EAAE,4BAA4B;gBAAlC,IAAI,EAAE,4BAA4B,EAClD,OAAO,GAAE,MAAa;CAKzB;AAKD,qBAAa,uBAAwB,SAAQ,KAAK;aAYpB,IAAI,EAAE,MAAM;IAHxC,SAAgB,UAAU,EAAE,MAAM,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;gBAEK,IAAI,EAAE,MAAM;CAMzC;AAED,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,YAC+C,CAAA;AAEtG,eAAO,MAAM,2BAA2B,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAiCrE,CAAA"}
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../packages/core/mpc/keysign/error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GACpC,kBAAkB,GAClB,kCAAkC,GAClC,gCAAgC,GAChC,iCAAiC,GACjC,uCAAuC,GACvC,uCAAuC,GACvC,wCAAwC,GACxC,wCAAwC,GACxC,mBAAmB,CAAA;AAEvB,qBAAa,wBAAyB,SAAQ,KAAK;aAE/B,IAAI,EAAE,4BAA4B;gBAAlC,IAAI,EAAE,4BAA4B,EAClD,OAAO,GAAE,MAAa;CAKzB;AAKD,qBAAa,uBAAwB,SAAQ,KAAK;aAYpB,IAAI,EAAE,MAAM;IAHxC,SAAgB,UAAU,EAAE,MAAM,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;gBAEK,IAAI,EAAE,MAAM;CAMzC;AAED,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,YAC+C,CAAA;AAEtG,eAAO,MAAM,2BAA2B,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAiCrE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../../../packages/core/mpc/keysign/error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../../../packages/core/mpc/keysign/error.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/send/build.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/send/build.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAKnE,OAAO,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAA;AAIlF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG1D,OAAO,EAAE,cAAc,EAAwB,MAAM,iEAAiE,CAAA;AACtH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAQzE,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,gGAAgG;IAChG,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAwCD,eAAO,MAAM,uBAAuB,GAAU,4JAc3C,4BAA4B,4BAmH9B,CAAA"}
|
|
@@ -6,6 +6,7 @@ import { normalizeRippleDestination } from '@vultisig/core-chain/chains/ripple/a
|
|
|
6
6
|
import { getSignableIssuedCurrencyAmount, parseRippleTokenId } from '@vultisig/core-chain/chains/ripple/issuedCurrency';
|
|
7
7
|
import { validateTonComment } from '@vultisig/core-chain/chains/ton/comment';
|
|
8
8
|
import { getCoinBalance } from '@vultisig/core-chain/coin/balance';
|
|
9
|
+
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
9
10
|
import { isFeeCoin } from '@vultisig/core-chain/coin/utils/isFeeCoin';
|
|
10
11
|
import { getChainSpecific } from '@vultisig/core-mpc/keysign/chainSpecific';
|
|
11
12
|
import { refineKeysignAmount } from '@vultisig/core-mpc/keysign/refine/amount';
|
|
@@ -66,10 +67,21 @@ export const buildSendKeysignPayload = async ({ coin, receiver, amount, memo, de
|
|
|
66
67
|
const effectiveDestinationTag = destinationTag ?? embeddedDestinationTag;
|
|
67
68
|
if (effectiveDestinationTag !== undefined)
|
|
68
69
|
validateDestinationTag(effectiveDestinationTag);
|
|
70
|
+
// Reject an amount the ledger cannot carry exactly while the payload is still
|
|
71
|
+
// being built, so the user sees why instead of a WalletCore error after
|
|
72
|
+
// review. Raised as a [BuildKeysignPayloadError] because it is bad input, not
|
|
73
|
+
// a transient failure: callers stop retrying and show it.
|
|
69
74
|
if (coin.chain === Chain.Ripple && coin.id) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
const tokenId = coin.id;
|
|
76
|
+
const signable = attempt(() => {
|
|
77
|
+
if (amount <= 0n) {
|
|
78
|
+
throw new Error('XRP issued-currency Payment amount must be positive');
|
|
79
|
+
}
|
|
80
|
+
return getSignableIssuedCurrencyAmount({ ...parseRippleTokenId(tokenId), amount, decimals: coin.decimals });
|
|
81
|
+
});
|
|
82
|
+
if ('error' in signable) {
|
|
83
|
+
throw new BuildKeysignPayloadError('ripple-issued-currency-amount-invalid', signable.error instanceof Error ? signable.error.message : String(signable.error));
|
|
84
|
+
}
|
|
73
85
|
}
|
|
74
86
|
const cosmosWasmTokenTransferPayload = getCosmosWasmTokenTransferPayload({
|
|
75
87
|
coin,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/send/build.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/send/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAItD,eAAO,MAAM,mBAAmB,EAAE,qBAAqB,CAAC,KAAK,CA2E5D,CAAA"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getTonMessageBounceable } from '@vultisig/core-chain/chains/ton/messageBounce';
|
|
2
2
|
import { isTonStakingComment } from '@vultisig/core-chain/chains/ton/staking';
|
|
3
|
+
import { resolveTonWalletVersion, tonMaxMessagesPerRequest } from '@vultisig/core-chain/chains/ton/wallet';
|
|
3
4
|
import { isFeeCoin } from '@vultisig/core-chain/coin/utils/isFeeCoin';
|
|
5
|
+
import { match } from '@vultisig/lib-utils/match';
|
|
4
6
|
import { TW } from '@trustwallet/wallet-core';
|
|
5
7
|
import { getBlockchainSpecificValue } from '../../../chainSpecific/KeysignChainSpecific.js';
|
|
6
8
|
import { getKeysignTwPublicKey } from '../../../tw/getKeysignTwPublicKey.js';
|
|
@@ -9,6 +11,14 @@ import { buildJettonTransfer } from './jetton.js';
|
|
|
9
11
|
import { buildNativeTonTransfer, buildNativeTonTransferFromMessage } from './native.js';
|
|
10
12
|
export const getTonSigningInputs = ({ keysignPayload, walletCore }) => {
|
|
11
13
|
const coin = getKeysignCoin(keysignPayload);
|
|
14
|
+
const publicKeyBytes = getKeysignTwPublicKey(keysignPayload);
|
|
15
|
+
// The payload does not say which wallet contract the sender is; its address
|
|
16
|
+
// does. Every co-signer derives the same answer from the shared vault key.
|
|
17
|
+
const walletVersion = resolveTonWalletVersion({
|
|
18
|
+
address: coin.address,
|
|
19
|
+
publicKey: walletCore.PublicKey.createWithData(publicKeyBytes, walletCore.PublicKeyType.ed25519),
|
|
20
|
+
walletCore,
|
|
21
|
+
});
|
|
12
22
|
// `sendMaxAmount` is deliberately not read here. A MAX send is the displayed
|
|
13
23
|
// `balance - fee` carried in `toAmount` like any other amount, so the signed bytes
|
|
14
24
|
// are identical either way and the flag stays descriptive metadata.
|
|
@@ -25,26 +35,36 @@ export const getTonSigningInputs = ({ keysignPayload, walletCore }) => {
|
|
|
25
35
|
// tag. The wallet-level flag describes only `toAddress` — the first message —
|
|
26
36
|
// and applying it to the whole batch signs the wrong bit on the others.
|
|
27
37
|
bounceable: getTonMessageBounceable(msg.to, !!msg.stateInit),
|
|
38
|
+
walletVersion,
|
|
28
39
|
}))
|
|
29
40
|
: [
|
|
30
41
|
isFeeCoin(coin)
|
|
31
42
|
? buildNativeTonTransfer({
|
|
32
43
|
keysignPayload,
|
|
33
44
|
bounceable: isStakeOp ? true : !!bounceable,
|
|
45
|
+
walletVersion,
|
|
34
46
|
})
|
|
35
47
|
: buildJettonTransfer({
|
|
36
48
|
keysignPayload,
|
|
37
49
|
walletCore,
|
|
38
50
|
jettonAddress,
|
|
39
51
|
isActiveDestination,
|
|
52
|
+
walletVersion,
|
|
40
53
|
}),
|
|
41
54
|
];
|
|
55
|
+
const maxMessages = tonMaxMessagesPerRequest[walletVersion];
|
|
56
|
+
if (messages.length > maxMessages) {
|
|
57
|
+
throw new Error(`A ${walletVersion} TON wallet can send at most ${maxMessages} messages per request, got ${messages.length}`);
|
|
58
|
+
}
|
|
42
59
|
const input = TW.TheOpenNetwork.Proto.SigningInput.create({
|
|
43
|
-
walletVersion:
|
|
60
|
+
walletVersion: match(walletVersion, {
|
|
61
|
+
v4r2: () => TW.TheOpenNetwork.Proto.WalletVersion.WALLET_V4_R2,
|
|
62
|
+
v5r1: () => TW.TheOpenNetwork.Proto.WalletVersion.WALLET_V5_R1,
|
|
63
|
+
}),
|
|
44
64
|
expireAt: Number(expireAt.toString()),
|
|
45
65
|
sequenceNumber: Number(sequenceNumber.toString()),
|
|
46
66
|
messages,
|
|
47
|
-
publicKey:
|
|
67
|
+
publicKey: publicKeyBytes,
|
|
48
68
|
});
|
|
49
69
|
return [input];
|
|
50
70
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAA;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAA;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAA;AAE7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAA;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAA;AAEpF,MAAM,CAAC,MAAM,mBAAmB,GAAiC,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE;IAClG,MAAM,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TonWalletVersion } from '@vultisig/core-chain/chains/ton/wallet';
|
|
1
2
|
import { KeysignPayload } from '@vultisig/core-mpc/types/vultisig/keysign/v1/keysign_message_pb';
|
|
2
3
|
import { TW } from '@trustwallet/wallet-core';
|
|
3
4
|
import { WalletCore } from '@trustwallet/wallet-core';
|
|
@@ -6,6 +7,7 @@ type BuildJettonTransferInput = {
|
|
|
6
7
|
walletCore: WalletCore;
|
|
7
8
|
jettonAddress: string;
|
|
8
9
|
isActiveDestination: boolean;
|
|
10
|
+
walletVersion: TonWalletVersion;
|
|
9
11
|
};
|
|
10
12
|
/**
|
|
11
13
|
* Builds the transfer that carries a Jetton send: a fixed TON amount to the
|
|
@@ -13,6 +15,6 @@ type BuildJettonTransferInput = {
|
|
|
13
15
|
* nanoton only when the destination is already active, so an inactive recipient
|
|
14
16
|
* isn't charged for a notification it cannot receive.
|
|
15
17
|
*/
|
|
16
|
-
export declare const buildJettonTransfer: ({ keysignPayload, walletCore, jettonAddress, isActiveDestination, }: BuildJettonTransferInput) => TW.TheOpenNetwork.Proto.Transfer;
|
|
18
|
+
export declare const buildJettonTransfer: ({ keysignPayload, walletCore, jettonAddress, isActiveDestination, walletVersion, }: BuildJettonTransferInput) => TW.TheOpenNetwork.Proto.Transfer;
|
|
17
19
|
export {};
|
|
18
20
|
//# sourceMappingURL=jetton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jetton.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/jetton.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iEAAiE,CAAA;AAEhG,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAMrD,KAAK,wBAAwB,GAAG;IAC9B,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"jetton.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/jetton.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,iEAAiE,CAAA;AAEhG,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAMrD,KAAK,wBAAwB,GAAG;IAC9B,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,aAAa,EAAE,gBAAgB,CAAA;CAChC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,oFAMjC,wBAAwB,KAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,QAsCrD,CAAA"}
|
|
@@ -4,14 +4,14 @@ import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
|
4
4
|
import { TW } from '@trustwallet/wallet-core';
|
|
5
5
|
import { getKeysignAmount } from '../../../utils/getKeysignAmount.js';
|
|
6
6
|
import { getKeysignCoin } from '../../../utils/getKeysignCoin.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getTonSendMode, tonAmountToBytes } from './native.js';
|
|
8
8
|
/**
|
|
9
9
|
* Builds the transfer that carries a Jetton send: a fixed TON amount to the
|
|
10
10
|
* sender's own Jetton wallet, wrapping the Jetton payload. `forwardAmount` is 1
|
|
11
11
|
* nanoton only when the destination is already active, so an inactive recipient
|
|
12
12
|
* isn't charged for a notification it cannot receive.
|
|
13
13
|
*/
|
|
14
|
-
export const buildJettonTransfer = ({ keysignPayload, walletCore, jettonAddress, isActiveDestination, }) => {
|
|
14
|
+
export const buildJettonTransfer = ({ keysignPayload, walletCore, jettonAddress, isActiveDestination, walletVersion, }) => {
|
|
15
15
|
// `TonSpecific.jettonAddress` is a plain proto string that defaults to '' when the
|
|
16
16
|
// sender's jetton wallet could not be resolved, and '' survives every null/undefined
|
|
17
17
|
// check on the way here. Signing that would broadcast a transfer to no destination,
|
|
@@ -40,7 +40,7 @@ export const buildJettonTransfer = ({ keysignPayload, walletCore, jettonAddress,
|
|
|
40
40
|
amount: tonAmountToBytes(tonConfig.jettonAmount),
|
|
41
41
|
bounceable: true,
|
|
42
42
|
comment: keysignPayload.memo ?? '',
|
|
43
|
-
mode:
|
|
43
|
+
mode: getTonSendMode(walletVersion),
|
|
44
44
|
jettonTransfer,
|
|
45
45
|
});
|
|
46
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jetton.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/jetton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;
|
|
1
|
+
{"version":3,"file":"jetton.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/jetton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAA;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAU3D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,cAAc,EACd,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,aAAa,GACY,EAAoC,EAAE;IAC/D,mFAAmF;IACnF,qFAAqF;IACrF,oFAAoF;IACpF,qEAAqE;IACrE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAA;IACpG,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;IAE3C,MAAM,kBAAkB,GAAG,UAAU,CAAC,mBAAmB,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAE/G,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAA;IAChE,MAAM,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnD,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,8EAA8E;IAC9E,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;IAEhG,MAAM,cAAc,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;QACnE,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC;QACtC,OAAO,EAAE,kBAAkB;QAC3B,eAAe,EAAE,IAAI,CAAC,OAAO;QAC7B,aAAa,EAAE,gBAAgB,CAAC,aAAa,CAAC;KAC/C,CAAC,CAAA;IAEF,OAAO,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,gBAAgB,CAAC,SAAS,CAAC,YAAY,CAAC;QAChD,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,cAAc,CAAC,IAAI,IAAI,EAAE;QAClC,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC;QACnC,cAAc;KACf,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Buffer } from 'buffer';
|
|
2
|
+
import { TonWalletVersion } from '@vultisig/core-chain/chains/ton/wallet';
|
|
2
3
|
import { KeysignPayload } from '@vultisig/core-mpc/types/vultisig/keysign/v1/keysign_message_pb';
|
|
3
4
|
import { TW } from '@trustwallet/wallet-core';
|
|
4
5
|
type BuildNativeTonTransferFromMessageInput = {
|
|
@@ -7,10 +8,12 @@ type BuildNativeTonTransferFromMessageInput = {
|
|
|
7
8
|
payload?: string;
|
|
8
9
|
stateInit?: string;
|
|
9
10
|
bounceable: boolean;
|
|
11
|
+
walletVersion: TonWalletVersion;
|
|
10
12
|
};
|
|
11
13
|
type BuildNativeTonTransferInput = {
|
|
12
14
|
keysignPayload: KeysignPayload;
|
|
13
15
|
bounceable: boolean;
|
|
16
|
+
walletVersion: TonWalletVersion;
|
|
14
17
|
};
|
|
15
18
|
export declare const tonAmountToBytes: (amount: string | bigint) => Buffer;
|
|
16
19
|
/**
|
|
@@ -29,6 +32,18 @@ export declare const tonAmountToBytes: (amount: string | bigint) => Buffer;
|
|
|
29
32
|
* this payload, so changing it here breaks keysign with any client that has not changed too.
|
|
30
33
|
*/
|
|
31
34
|
export declare const tonSendMode = TW.TheOpenNetwork.Proto.SendMode.PAY_FEES_SEPARATELY;
|
|
35
|
+
/**
|
|
36
|
+
* The send mode for a given wallet contract.
|
|
37
|
+
*
|
|
38
|
+
* W5 is the exception to the rule above: its code refuses an external request
|
|
39
|
+
* unless every action carries `IGNORE_ACTION_PHASE_ERRORS`, because that is
|
|
40
|
+
* how it guarantees the seqno advances even when an action fails — the
|
|
41
|
+
* contract's own replay protection. WalletCore enforces the same check before
|
|
42
|
+
* it will build the message. The blindness the flag causes is covered on the
|
|
43
|
+
* other side: the status resolver reads the action phase, so a W5 send whose
|
|
44
|
+
* transfer was skipped reports as failed instead of confirmed.
|
|
45
|
+
*/
|
|
46
|
+
export declare const getTonSendMode: (walletVersion: TonWalletVersion) => number;
|
|
32
47
|
/**
|
|
33
48
|
* Builds the single WalletCore transfer for an app-initiated native TON send.
|
|
34
49
|
*
|
|
@@ -39,11 +54,11 @@ export declare const tonSendMode = TW.TheOpenNetwork.Proto.SendMode.PAY_FEES_SEP
|
|
|
39
54
|
* send is just `balance - fee` as an ordinary amount, and that fee is the reserve the
|
|
40
55
|
* send mode then draws on.
|
|
41
56
|
*/
|
|
42
|
-
export declare const buildNativeTonTransfer: ({ keysignPayload, bounceable, }: BuildNativeTonTransferInput) => TW.TheOpenNetwork.Proto.Transfer;
|
|
57
|
+
export declare const buildNativeTonTransfer: ({ keysignPayload, bounceable, walletVersion, }: BuildNativeTonTransferInput) => TW.TheOpenNetwork.Proto.Transfer;
|
|
43
58
|
/**
|
|
44
59
|
* Builds a transfer for one message of a dApp-supplied `signTon` request. The
|
|
45
60
|
* message carries its own payload/stateInit, so no comment is attached here.
|
|
46
61
|
*/
|
|
47
|
-
export declare const buildNativeTonTransferFromMessage: ({ to, amount, payload, stateInit, bounceable, }: BuildNativeTonTransferFromMessageInput) => TW.TheOpenNetwork.Proto.Transfer;
|
|
62
|
+
export declare const buildNativeTonTransferFromMessage: ({ to, amount, payload, stateInit, bounceable, walletVersion, }: BuildNativeTonTransferFromMessageInput) => TW.TheOpenNetwork.Proto.Transfer;
|
|
48
63
|
export {};
|
|
49
64
|
//# sourceMappingURL=native.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,iEAAiE,CAAA;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,iEAAiE,CAAA;AAGhG,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAA;AAE7C,KAAK,sCAAsC,GAAG;IAC5C,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,gBAAgB,CAAA;CAChC,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,gBAAgB,CAAA;CAChC,CAAA;AAMD,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,GAAG,MAAM,KAAG,MAuB1D,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,uDAAuD,CAAA;AAE/E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,GAAI,eAAe,gBAAgB,KAAG,MAI7D,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,GAAI,gDAIpC,2BAA2B,KAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,QAWxD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iCAAiC,GAAI,gEAO/C,sCAAsC,KAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,QAUnE,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Buffer } from 'buffer';
|
|
2
2
|
import { validateTonComment } from '@vultisig/core-chain/chains/ton/comment';
|
|
3
3
|
import { numberToEvenHex } from '@vultisig/lib-utils/hex/numberToHex';
|
|
4
|
+
import { match } from '@vultisig/lib-utils/match';
|
|
4
5
|
import { TW } from '@trustwallet/wallet-core';
|
|
5
6
|
const tonUnsignedDecimalRegex = /^\d+$/;
|
|
6
7
|
const tonMaxAmount = (1n << 120n) - 1n;
|
|
@@ -40,6 +41,21 @@ export const tonAmountToBytes = (amount) => {
|
|
|
40
41
|
* this payload, so changing it here breaks keysign with any client that has not changed too.
|
|
41
42
|
*/
|
|
42
43
|
export const tonSendMode = TW.TheOpenNetwork.Proto.SendMode.PAY_FEES_SEPARATELY;
|
|
44
|
+
/**
|
|
45
|
+
* The send mode for a given wallet contract.
|
|
46
|
+
*
|
|
47
|
+
* W5 is the exception to the rule above: its code refuses an external request
|
|
48
|
+
* unless every action carries `IGNORE_ACTION_PHASE_ERRORS`, because that is
|
|
49
|
+
* how it guarantees the seqno advances even when an action fails — the
|
|
50
|
+
* contract's own replay protection. WalletCore enforces the same check before
|
|
51
|
+
* it will build the message. The blindness the flag causes is covered on the
|
|
52
|
+
* other side: the status resolver reads the action phase, so a W5 send whose
|
|
53
|
+
* transfer was skipped reports as failed instead of confirmed.
|
|
54
|
+
*/
|
|
55
|
+
export const getTonSendMode = (walletVersion) => match(walletVersion, {
|
|
56
|
+
v4r2: () => tonSendMode,
|
|
57
|
+
v5r1: () => tonSendMode | TW.TheOpenNetwork.Proto.SendMode.IGNORE_ACTION_PHASE_ERRORS,
|
|
58
|
+
});
|
|
43
59
|
/**
|
|
44
60
|
* Builds the single WalletCore transfer for an app-initiated native TON send.
|
|
45
61
|
*
|
|
@@ -50,7 +66,7 @@ export const tonSendMode = TW.TheOpenNetwork.Proto.SendMode.PAY_FEES_SEPARATELY;
|
|
|
50
66
|
* send is just `balance - fee` as an ordinary amount, and that fee is the reserve the
|
|
51
67
|
* send mode then draws on.
|
|
52
68
|
*/
|
|
53
|
-
export const buildNativeTonTransfer = ({ keysignPayload, bounceable, }) => {
|
|
69
|
+
export const buildNativeTonTransfer = ({ keysignPayload, bounceable, walletVersion, }) => {
|
|
54
70
|
const comment = keysignPayload.memo || '';
|
|
55
71
|
validateTonComment({ memo: comment });
|
|
56
72
|
return TW.TheOpenNetwork.Proto.Transfer.create({
|
|
@@ -58,14 +74,14 @@ export const buildNativeTonTransfer = ({ keysignPayload, bounceable, }) => {
|
|
|
58
74
|
amount: tonAmountToBytes(keysignPayload.toAmount),
|
|
59
75
|
bounceable,
|
|
60
76
|
comment,
|
|
61
|
-
mode:
|
|
77
|
+
mode: getTonSendMode(walletVersion),
|
|
62
78
|
});
|
|
63
79
|
};
|
|
64
80
|
/**
|
|
65
81
|
* Builds a transfer for one message of a dApp-supplied `signTon` request. The
|
|
66
82
|
* message carries its own payload/stateInit, so no comment is attached here.
|
|
67
83
|
*/
|
|
68
|
-
export const buildNativeTonTransferFromMessage = ({ to, amount, payload = '', stateInit, bounceable, }) => {
|
|
84
|
+
export const buildNativeTonTransferFromMessage = ({ to, amount, payload = '', stateInit, bounceable, walletVersion, }) => {
|
|
69
85
|
return TW.TheOpenNetwork.Proto.Transfer.create({
|
|
70
86
|
dest: to,
|
|
71
87
|
amount: tonAmountToBytes(amount),
|
|
@@ -73,7 +89,7 @@ export const buildNativeTonTransferFromMessage = ({ to, amount, payload = '', st
|
|
|
73
89
|
comment: '',
|
|
74
90
|
customPayload: payload || undefined,
|
|
75
91
|
stateInit: stateInit || undefined,
|
|
76
|
-
mode:
|
|
92
|
+
mode: getTonSendMode(walletVersion),
|
|
77
93
|
});
|
|
78
94
|
};
|
|
79
95
|
//# sourceMappingURL=native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/ton/native.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": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "MPC, keysign, and vault types shared across Vultisig clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -1094,7 +1094,7 @@
|
|
|
1094
1094
|
"@noble/hashes": "^2.2.0",
|
|
1095
1095
|
"@solana/web3.js": "^1.98.4",
|
|
1096
1096
|
"@trustwallet/wallet-core": "^4.7.3",
|
|
1097
|
-
"@vultisig/core-chain": "5.
|
|
1097
|
+
"@vultisig/core-chain": "5.2.0",
|
|
1098
1098
|
"@vultisig/core-config": "0.9.1",
|
|
1099
1099
|
"@vultisig/lib-dkls": "0.9.0",
|
|
1100
1100
|
"@vultisig/lib-mldsa": "0.9.0",
|