@vultisig/core-chain 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/chains/cosmos/cosmosMsgTypes.d.ts +5 -1
  3. package/dist/chains/cosmos/cosmosMsgTypes.d.ts.map +1 -1
  4. package/dist/chains/cosmos/cosmosMsgTypes.js +5 -0
  5. package/dist/chains/cosmos/cosmosMsgTypes.js.map +1 -1
  6. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.d.ts +4 -2
  7. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.d.ts.map +1 -1
  8. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js +17 -6
  9. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js.map +1 -1
  10. package/dist/chains/cosmos/staking/lcdQueries.d.ts +117 -0
  11. package/dist/chains/cosmos/staking/lcdQueries.d.ts.map +1 -0
  12. package/dist/chains/cosmos/staking/lcdQueries.js +80 -0
  13. package/dist/chains/cosmos/staking/lcdQueries.js.map +1 -0
  14. package/dist/chains/cosmos/thor/lp/pools.d.ts +1 -1
  15. package/dist/chains/cosmos/thor/lp/pools.d.ts.map +1 -1
  16. package/dist/chains/cosmos/thor/lp/pools.js +1 -1
  17. package/dist/chains/cosmos/thor/lp/pools.js.map +1 -1
  18. package/dist/chains/solana/client.d.ts.map +1 -1
  19. package/dist/chains/solana/client.js +1 -3
  20. package/dist/chains/solana/client.js.map +1 -1
  21. package/dist/chains/ton/messageBody/decode.d.ts +42 -0
  22. package/dist/chains/ton/messageBody/decode.d.ts.map +1 -0
  23. package/dist/chains/ton/messageBody/decode.js +337 -0
  24. package/dist/chains/ton/messageBody/decode.js.map +1 -0
  25. package/dist/chains/ton/messageBody/knownRouters.d.ts +19 -0
  26. package/dist/chains/ton/messageBody/knownRouters.d.ts.map +1 -0
  27. package/dist/chains/ton/messageBody/knownRouters.js +179 -0
  28. package/dist/chains/ton/messageBody/knownRouters.js.map +1 -0
  29. package/dist/chains/ton/messageBody/opcodes.d.ts +23 -0
  30. package/dist/chains/ton/messageBody/opcodes.d.ts.map +1 -0
  31. package/dist/chains/ton/messageBody/opcodes.js +22 -0
  32. package/dist/chains/ton/messageBody/opcodes.js.map +1 -0
  33. package/dist/chains/ton/messageBody/types.d.ts +50 -0
  34. package/dist/chains/ton/messageBody/types.d.ts.map +1 -0
  35. package/dist/chains/ton/messageBody/types.js +2 -0
  36. package/dist/chains/ton/messageBody/types.js.map +1 -0
  37. package/dist/coin/balance/resolvers/polkadot.d.ts.map +1 -1
  38. package/dist/coin/balance/resolvers/polkadot.js +72 -6
  39. package/dist/coin/balance/resolvers/polkadot.js.map +1 -1
  40. package/dist/publicKey/ecdsa/derivePublicKey.d.ts.map +1 -1
  41. package/dist/publicKey/ecdsa/derivePublicKey.js +6 -0
  42. package/dist/publicKey/ecdsa/derivePublicKey.js.map +1 -1
  43. package/dist/security/blockaid/tx/simulation/api/core.d.ts.map +1 -1
  44. package/dist/security/blockaid/tx/simulation/api/core.js +30 -29
  45. package/dist/security/blockaid/tx/simulation/api/core.js.map +1 -1
  46. package/package.json +31 -4
@@ -0,0 +1,337 @@
1
+ import { Cell } from '@ton/core';
2
+ import { DEDUST_NATIVE_VAULTS, isKnownRouterAddress, STONFI_V2_PTON_WALLETS, STONFI_V2_ROUTERS, } from './knownRouters.js';
3
+ import { TonOp } from './opcodes.js';
4
+ /**
5
+ * `Address.toString()` defaults to URL-safe + bounceable, which matches the
6
+ * mainnet user-friendly form (`EQ.../UQ...`) the wallet UI shows everywhere
7
+ * else. Centralized so all decoded addresses share the same encoding.
8
+ */
9
+ const formatAddress = (address) => address.toString();
10
+ const safeDecode = (fn) => {
11
+ try {
12
+ return fn();
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ };
18
+ const HEX_BOC_MAGIC_PREFIXES = ['b5ee9c72', '68ff65f3', 'acc3a728'];
19
+ const isHexBoc = (payload) => {
20
+ if (payload.length % 2 !== 0)
21
+ return false;
22
+ if (!/^[\da-f]+$/i.test(payload))
23
+ return false;
24
+ const lower = payload.toLowerCase();
25
+ return HEX_BOC_MAGIC_PREFIXES.some(magic => lower.startsWith(magic));
26
+ };
27
+ export const tonPayloadToBase64 = (payload) => {
28
+ if (!payload)
29
+ return null;
30
+ const value = payload.trim();
31
+ if (!isHexBoc(value))
32
+ return value;
33
+ return Buffer.from(value, 'hex').toString('base64');
34
+ };
35
+ const loadAddress = (slice) => formatAddress(slice.loadAddress());
36
+ const loadMaybeAddress = (slice) => {
37
+ const address = slice.loadMaybeAddress();
38
+ return address ? formatAddress(address) : null;
39
+ };
40
+ const loadMaybeRef = (slice) => {
41
+ if (slice.remainingBits < 1) {
42
+ throw new Error('Maybe-^Cell discriminator missing');
43
+ }
44
+ const hasRef = slice.loadBit();
45
+ if (!hasRef)
46
+ return null;
47
+ if (slice.remainingRefs < 1) {
48
+ throw new Error('Maybe-^Cell discriminator set but no ref available');
49
+ }
50
+ return slice.loadRef();
51
+ };
52
+ const loadForwardPayload = (slice) => {
53
+ if (slice.remainingBits < 1) {
54
+ throw new Error('Either-Cell discriminator missing');
55
+ }
56
+ const isRef = slice.loadBit();
57
+ if (isRef) {
58
+ if (slice.remainingRefs < 1) {
59
+ throw new Error('Either-Cell discriminator set but no ref available');
60
+ }
61
+ return slice.loadRef();
62
+ }
63
+ return slice.asCell();
64
+ };
65
+ const parseStonfiV2Swap = (payload, offer) => safeDecode(() => {
66
+ const slice = payload.beginParse();
67
+ if (slice.remainingBits < 32)
68
+ return null;
69
+ const op = slice.loadUint(32);
70
+ if (op !== TonOp.STONFI_V2_SWAP)
71
+ return null;
72
+ const targetAddress = loadAddress(slice);
73
+ const refundAddress = loadAddress(slice);
74
+ const excessesAddress = loadAddress(slice);
75
+ slice.loadUintBig(64);
76
+ // additional_data ref shape (STON.fi v2 swap body — same layout used
77
+ // by both `createSwapBody` and `createCrossSwapBody` in the SDK):
78
+ // min_out:Coins
79
+ // receiver:MsgAddressInt
80
+ // custom_payload_fwd_gas:Coins
81
+ // custom_payload:(Maybe ^Cell)
82
+ // refund_fwd_gas:Coins
83
+ // refund_payload:(Maybe ^Cell)
84
+ // referral_value:uint16
85
+ // referral_address:MsgAddressInt
86
+ //
87
+ // Source: @ston-fi/sdk@2.x BaseRouterV2_1.createSwapBody
88
+ // (chunk-YSE6O2GU.cjs:96), confirmed against the v2 router smart-contract
89
+ // docs. We must consume ALL fields — without them, a body with a valid
90
+ // prefix (op + addresses + min_out + receiver) and garbage tail decodes
91
+ // as a "swap" because parseStonfiV2Swap stops after receiver. Codex
92
+ // adversarial review on PR #352 flagged this as fail-open.
93
+ //
94
+ // Reading all 8 fields turns "garbage tail" into a parse error caught
95
+ // by safeDecode. We DO NOT require the slice to be fully consumed
96
+ // afterwards — STON.fi may extend the cell shape with appended fields
97
+ // in a future protocol revision, and we want forward-compat over a
98
+ // brittle exact-shape assertion. The threshold is that an attacker
99
+ // must successfully encode all 8 typed fields before junk space, which
100
+ // is materially harder than just appending bits.
101
+ const additionalData = slice.loadRef().beginParse();
102
+ const minOut = additionalData.loadCoins();
103
+ const receiverAddress = loadAddress(additionalData);
104
+ additionalData.loadCoins(); // custom_payload_fwd_gas
105
+ loadMaybeRef(additionalData); // custom_payload
106
+ additionalData.loadCoins(); // refund_fwd_gas
107
+ loadMaybeRef(additionalData); // refund_payload
108
+ additionalData.loadUint(16); // referral_value (BPS)
109
+ additionalData.loadMaybeAddress(); // referral_address — addr_none on no-referral swaps; loadMaybeAddress tolerates that, plain loadAddress would throw and safeDecode would misclassify a real no-referral swap as a non-swap
110
+ return {
111
+ kind: 'swap',
112
+ provider: 'stonfi',
113
+ ...offer,
114
+ minOut,
115
+ receiverAddress,
116
+ refundAddress,
117
+ excessesAddress,
118
+ targetAddress,
119
+ };
120
+ });
121
+ const parseDedustSwapStep = (slice) => {
122
+ const targetAddress = loadAddress(slice);
123
+ // SwapStepParams: kind:SwapKind limit:Coins next:(Maybe ^SwapStep)
124
+ // SwapKind is a 1-bit prefix: given_in$0 | given_out$1, and per
125
+ // https://docs.dedust.io/reference/tlb-schemes the docs explicitly state
126
+ // given_out is "Not implemented." Fail closed on kind=1 so a body with
127
+ // garbage in the SwapKind slot (or one crafted to look like a swap but
128
+ // actually using an unsupported kind) doesn't surface as `swap`. Codex
129
+ // adversarial review on PR #352 flagged the original `slice.loadBit()`-
130
+ // and-discard as a should-fix.
131
+ const kind = slice.loadBit();
132
+ if (kind) {
133
+ throw new Error('DeDust SwapKind given_out (kind=1) is not implemented');
134
+ }
135
+ const minOut = slice.loadCoins();
136
+ loadMaybeRef(slice);
137
+ return { targetAddress, minOut };
138
+ };
139
+ const parseDedustSwapParams = (slice) => {
140
+ slice.loadUint(32);
141
+ const receiverAddress = loadMaybeAddress(slice);
142
+ loadMaybeAddress(slice);
143
+ loadMaybeRef(slice);
144
+ loadMaybeRef(slice);
145
+ return receiverAddress;
146
+ };
147
+ const parseDedustSwap = (payload, offer) => safeDecode(() => {
148
+ const slice = payload.beginParse();
149
+ if (slice.remainingBits < 32)
150
+ return null;
151
+ const op = slice.loadUint(32);
152
+ const isNativeSwap = op === TonOp.DEDUST_NATIVE_SWAP;
153
+ const isJettonSwap = op === TonOp.DEDUST_JETTON_SWAP;
154
+ if (!isNativeSwap && !isJettonSwap)
155
+ return null;
156
+ const normalizedOffer = isNativeSwap
157
+ ? (() => {
158
+ slice.loadUintBig(64);
159
+ return {
160
+ offerAsset: 'ton',
161
+ offerAmount: slice.loadCoins(),
162
+ };
163
+ })()
164
+ : offer;
165
+ const { targetAddress, minOut } = parseDedustSwapStep(slice);
166
+ const receiverAddress = parseDedustSwapParams(slice);
167
+ return {
168
+ kind: 'swap',
169
+ provider: 'dedust',
170
+ ...normalizedOffer,
171
+ minOut,
172
+ receiverAddress,
173
+ refundAddress: null,
174
+ excessesAddress: null,
175
+ targetAddress,
176
+ };
177
+ });
178
+ /**
179
+ * Swap classification of the inner `forward_payload` of a STON.fi v2 jetton
180
+ * transfer. Caller MUST already have verified that the jetton transfer's
181
+ * inner destination is a known STON.fi v2 router; without that binding the
182
+ * STON.fi swap opcode is forgeable and can be used to mislabel a transfer to
183
+ * an attacker as a swap.
184
+ */
185
+ const parseStonfiSwapPayload = (payload, offer) => parseStonfiV2Swap(payload, offer);
186
+ const parsePtonTransferSwap = (slice) => safeDecode(() => {
187
+ slice.loadUintBig(64);
188
+ const offerAmount = slice.loadCoins();
189
+ slice.loadAddress();
190
+ const forwardPayload = loadForwardPayload(slice);
191
+ if (!forwardPayload)
192
+ return null;
193
+ return parseStonfiSwapPayload(forwardPayload, {
194
+ offerAsset: 'ton',
195
+ offerAmount,
196
+ });
197
+ });
198
+ const parseJettonTransfer = (slice) => {
199
+ return safeDecode(() => {
200
+ const queryId = slice.loadUintBig(64);
201
+ const amount = slice.loadCoins();
202
+ const destination = slice.loadAddress();
203
+ const responseDestination = slice.loadMaybeAddress();
204
+ // custom_payload is `Maybe ^Cell` — load and discard; we don't surface it.
205
+ loadMaybeRef(slice);
206
+ const forwardTonAmount = slice.loadCoins();
207
+ const forwardPayload = loadForwardPayload(slice);
208
+ const innerDestination = formatAddress(destination);
209
+ // Swap classification is gated on the jetton transfer's inner destination
210
+ // being a known STON.fi v2 router. DeDust jetton swaps are intentionally
211
+ // not classified — DeDust uses one vault per jetton, and the vault set is
212
+ // not statically enumerable. Callers needing DeDust jetton-swap detection
213
+ // must verify the destination via DeDust factory `get_vault_address`.
214
+ const swapIntent = forwardPayload && isKnownRouterAddress(innerDestination, STONFI_V2_ROUTERS)
215
+ ? parseStonfiSwapPayload(forwardPayload, {
216
+ offerAsset: 'jetton',
217
+ offerAmount: amount,
218
+ })
219
+ : null;
220
+ if (swapIntent)
221
+ return swapIntent;
222
+ return {
223
+ kind: 'jettonTransfer',
224
+ queryId,
225
+ amount,
226
+ destination: innerDestination,
227
+ responseDestination: responseDestination
228
+ ? formatAddress(responseDestination)
229
+ : null,
230
+ forwardTonAmount,
231
+ };
232
+ });
233
+ };
234
+ const parseNftTransfer = (slice) => {
235
+ return safeDecode(() => {
236
+ const queryId = slice.loadUintBig(64);
237
+ const newOwner = slice.loadAddress();
238
+ const responseDestination = slice.loadMaybeAddress();
239
+ loadMaybeRef(slice);
240
+ const forwardAmount = slice.loadCoins();
241
+ // forward_payload:(Either Cell ^Cell) — required by TEP-62; we don't
242
+ // surface its content, but we must consume it to reject bodies truncated
243
+ // before this field.
244
+ loadForwardPayload(slice);
245
+ return {
246
+ kind: 'nftTransfer',
247
+ queryId,
248
+ newOwner: formatAddress(newOwner),
249
+ responseDestination: responseDestination
250
+ ? formatAddress(responseDestination)
251
+ : null,
252
+ forwardAmount,
253
+ };
254
+ });
255
+ };
256
+ const parseExcesses = (slice) => {
257
+ return safeDecode(() => ({
258
+ kind: 'excesses',
259
+ queryId: slice.loadUintBig(64),
260
+ }));
261
+ };
262
+ /**
263
+ * Decode the body BOC of a TON internal message into a structured intent.
264
+ *
265
+ * Accepts the base64 BOC carried in `TonMessage.payload` (Vultisig's keysign
266
+ * payload schema) along with the outer message destination. Returns `null`
267
+ * when the payload is empty, not a parseable BOC, has no opcode header, or
268
+ * carries an opcode this decoder doesn't yet handle — callers should fall
269
+ * back to displaying the raw TON transfer.
270
+ *
271
+ * **Router binding.** Opcodes are contract-local in TON, so an attacker can
272
+ * craft a body whose leading 32 bits collide with a known DEX swap opcode. To
273
+ * prevent the keysign UI from labeling such a body as a "swap":
274
+ *
275
+ * - `DEDUST_NATIVE_SWAP` is dispatched only when `outerDestination` is a
276
+ * known DeDust **native vault** (NOT the factory — the factory only
277
+ * receives `create_vault`/`create_pool` ops; `swap#ea06185d` lives on
278
+ * the per-asset vault contracts per
279
+ * https://docs.dedust.io/reference/tlb-schemes).
280
+ * - `PTON_TRANSFER` (STON.fi v2 TON-side swap) is dispatched only when
281
+ * `outerDestination` is a known STON.fi v2 pTON wallet.
282
+ * - STON.fi v2 jetton-swap detection inside `JETTON_TRANSFER` is gated on
283
+ * the inner `destination` field being a known STON.fi v2 router.
284
+ *
285
+ * DeDust jetton-swap detection is intentionally not provided — DeDust vaults
286
+ * are per-jetton and not statically enumerable.
287
+ *
288
+ * Note: dApps sometimes prefix a jetton transfer body with an empty 32-bit
289
+ * "text comment" header (op = 0). In that case, we look at the next 32 bits.
290
+ */
291
+ export const decodeTonMessageBody = ({ payload: payloadBase64, outerDestination, }) => {
292
+ const payload = tonPayloadToBase64(payloadBase64);
293
+ if (!payload)
294
+ return null;
295
+ const cell = safeDecode(() => Cell.fromBase64(payload));
296
+ if (!cell)
297
+ return null;
298
+ const slice = safeDecode(() => cell.beginParse());
299
+ if (!slice)
300
+ return null;
301
+ const dispatch = (op) => {
302
+ if (op === TonOp.JETTON_TRANSFER)
303
+ return parseJettonTransfer(slice);
304
+ if (op === TonOp.NFT_TRANSFER)
305
+ return parseNftTransfer(slice);
306
+ if (op === TonOp.EXCESSES)
307
+ return parseExcesses(slice);
308
+ if (op === TonOp.PTON_TRANSFER) {
309
+ if (!isKnownRouterAddress(outerDestination, STONFI_V2_PTON_WALLETS)) {
310
+ return null;
311
+ }
312
+ return parsePtonTransferSwap(slice);
313
+ }
314
+ if (op === TonOp.DEDUST_NATIVE_SWAP) {
315
+ if (!isKnownRouterAddress(outerDestination, DEDUST_NATIVE_VAULTS)) {
316
+ return null;
317
+ }
318
+ return parseDedustSwap(cell, { offerAsset: 'ton', offerAmount: 0n });
319
+ }
320
+ return null;
321
+ };
322
+ if (slice.remainingBits < 32)
323
+ return null;
324
+ const op = safeDecode(() => slice.loadUint(32));
325
+ if (op === null)
326
+ return null;
327
+ if (op === 0) {
328
+ if (slice.remainingBits < 32)
329
+ return null;
330
+ const nestedOp = safeDecode(() => slice.loadUint(32));
331
+ if (nestedOp === null)
332
+ return null;
333
+ return dispatch(nestedOp);
334
+ }
335
+ return dispatch(op);
336
+ };
337
+ //# sourceMappingURL=decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/messageBody/decode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** STON.fi v2 router addresses on TON mainnet (jetton-swap destinations). */
2
+ export declare const STONFI_V2_ROUTERS: ReadonlySet<string>;
3
+ /** STON.fi v2 pTON wallet addresses on TON mainnet (TON-swap destinations). */
4
+ export declare const STONFI_V2_PTON_WALLETS: ReadonlySet<string>;
5
+ /**
6
+ * DeDust mainnet TON Native Vault addresses — the destinations for the
7
+ * `swap#ea06185d` op when offering native TON. Used to gate
8
+ * DEDUST_NATIVE_SWAP classification so the keysign UI only labels a
9
+ * message as a "swap" when it's actually addressed to a real vault.
10
+ */
11
+ export declare const DEDUST_NATIVE_VAULTS: ReadonlySet<string>;
12
+ /**
13
+ * Returns whether `address` matches any entry in `routerSet`. Both sides are
14
+ * normalised to user-friendly bounceable form so URL-safe and raw variants of
15
+ * the same address compare as equal. Returns false on null/undefined or any
16
+ * unparseable address.
17
+ */
18
+ export declare const isKnownRouterAddress: (address: string | null | undefined, routerSet: ReadonlySet<string>) => boolean;
19
+ //# sourceMappingURL=knownRouters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knownRouters.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/messageBody/knownRouters.ts"],"names":[],"mappings":"AAiKA,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CACR,CAAA;AAE1C,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAEtD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CACR,CAAA;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,WAAW,WAAW,CAAC,MAAM,CAAC,KAC7B,OAOF,CAAA"}
@@ -0,0 +1,179 @@
1
+ import { Address } from '@ton/core';
2
+ /**
3
+ * Known router/factory addresses used to bind opcode-based swap classification
4
+ * to specific contracts. Without these checks, an attacker could craft a body
5
+ * that decodes as a "swap" and have it labeled as such in the keysign UI even
6
+ * though it is actually a transfer to an attacker-controlled destination — the
7
+ * TON message-body opcodes are contract-local, not globally unique.
8
+ *
9
+ * **Refresh:** STON.fi addresses are sourced from
10
+ * <https://api.ston.fi/v1/routers>, filtered to `major_version >= 2`. To
11
+ * regenerate this list, run:
12
+ *
13
+ * ```sh
14
+ * curl -s https://api.ston.fi/v1/routers | jq -r '
15
+ * [.[] | select(.major_version >= 2)] |
16
+ * { routers: ([.[].address] | sort | unique),
17
+ * pton_wallets: ([.[].pton_wallet_address] | sort | unique) }
18
+ * '
19
+ * ```
20
+ *
21
+ * The DeDust mainnet **native vault** address is the destination of
22
+ * `swap#ea06185d` per https://docs.dedust.io/reference/tlb-schemes (the
23
+ * factory at `EQBfBWT7…` only receives `create_vault` / `create_pool` ops).
24
+ * The native vault is a singleton on mainnet; its address is computed
25
+ * deterministically from the factory's `get_vault_address(asset.native())`
26
+ * TVM call. Verified live against mainnet via:
27
+ *
28
+ * ```ts
29
+ * import { TonClient4 } from '@ton/ton'
30
+ * import { Factory, MAINNET_FACTORY_ADDR } from '@dedust/sdk'
31
+ * const factory = new TonClient4({ endpoint: 'https://mainnet-v4.tonhubapi.com' })
32
+ * .open(Factory.createFromAddress(MAINNET_FACTORY_ADDR))
33
+ * console.log((await factory.getNativeVault()).address.toString())
34
+ * // → EQDa4VOnTYlLvDJ0gZjNYm5PXfSmmtL6Vs6A_CZEtXCNICq_
35
+ * ```
36
+ *
37
+ * A future revision could resolve the address dynamically via the same
38
+ * factory call so we don't need to chase a redeploy, but the current
39
+ * mainnet vault is the only one in production.
40
+ */
41
+ const stonfiV2RouterAddresses = [
42
+ 'EQABT9GCyDI60CbC4c6uS33HFDwaqd6MddiwIIw7CXTgNR3A',
43
+ 'EQACn16m9OrZ-mw186M4NlIpVP8Tb3q6SV9aX8NjSgVfJTo9',
44
+ 'EQADEFMTMnC-gu5v2U0ZY8AYaGhAOk9TcECg1TOquAW3r-IE',
45
+ 'EQAGV9vw11tKW2QOCYCXEmIdyufM3p5CfcgHcY9NiiBLfZGH',
46
+ 'EQAJG5pyZPWEiQiMVJdf7bDRgRLzg6QR57qKeRsOrMO-ncZN',
47
+ 'EQAQYbnb1EGK0Wb8mk3vEW4vbHTyv7cOcfJlPWQ87_6_qfzR',
48
+ 'EQATvO_BXfkFocOXhlve01EZfsiyFjoV-0k9CLmpgwtzVtcN',
49
+ 'EQAgERF5tvrNn0AM2Rrrvk-MutGP60ZL70bJPuqvCTGY-17_',
50
+ 'EQAiLV677BgHNXEUuDJ3Cw8K5WOiJSO86xh8YQq2LthJEoED',
51
+ 'EQAiv3IuxYA6ZGEunOgZSTuMBzbpjwRbWw09-WsE-iqKKMrK',
52
+ 'EQAyD7O8CvVdR8AEJcr96fHI1ifFq21S8QMt1czi5IfJPyfA',
53
+ 'EQAyY2lBQ6RsVe88CKTmeH3BWWsUCWu7ugQNaf5kwLDYAoKt',
54
+ 'EQAz1D0ZUiG_9XCyjrJ1-xTx-CnmnQ3J3LMKQ7sZTr-XlNZP',
55
+ 'EQBCl1JANkTpMpJ9N3lZktPMpp2btRe2vVwHon0la8ibRied',
56
+ 'EQBCtlN7Zy96qx-3yH0Yi4V0SNtQ-8RbhYaNs65MC4Hwfq31',
57
+ 'EQBQErJi0DHgKYseIHtrQk4N5CQLCr3XYwkQIEw0HNs470OG',
58
+ 'EQBQ_UBQvR9ryUjKDwijtoiyyga2Wl-yJm6Y8gl0k-HDh_5x',
59
+ 'EQBSNX_5mSikBVttWhIaIb0f8jJU7fL6kvyyFVppd7dWRO6M',
60
+ 'EQBZj7nhXNhB4O9rRCn4qGS82DZaPUPlyM2k6ZrbvQ1j3Ge7',
61
+ 'EQBigMnbY4NU1uwdvzertV5mv_yI7282R-ffW7XZFWPEVRDG',
62
+ 'EQBjK_kjY5R_DoyTRff109VzFrSlKFCC_gOOWIMtyEvCcv2J',
63
+ 'EQBjM7B2PKa82IPKrUFbMFaKeQDFGTMRnrvY1TmptC7Kxz7B',
64
+ 'EQBqgCTdrtSod76UrcOeALSiLCp3WuNIFQBQvyjjlQMvwLkc',
65
+ 'EQBwpBGEAb-NgjUxpmARAgVl8C4F_5GsXxZ3dpsA1qzQerNl',
66
+ 'EQByADL5Ra2dldrMSBctgfSm2X2W1P61NVW2RYDb8eJNJGx6',
67
+ 'EQBzkqAN4ViYdS24lD2fFPe8odHn2rUkfMYbEJ88EBKBAS1b',
68
+ 'EQC67o2-2UzR1cJFrUGL5M7OAnLgG8oY_tHaTgGmR63LQNV-',
69
+ 'EQCCdNmj4QbNjrg_PM-JJE-B9f_czXLkYmrO7P9UkA6tt95m',
70
+ 'EQCDT9dCT52pdfsLNW0e6qP5T3cgq7M4Ug72zkGYgP17tsWD',
71
+ 'EQCRgwuFbPRR7TGodkJwbjiBtNtb0hfzJIliV-5kY6lKr_18',
72
+ 'EQCS4UEa5UaJLzOyyKieqQOQ2P9M-7kXpkO5HnP3Bv250cN3',
73
+ 'EQChoROpuUM4cpN6IRzqNTrkP9iVZHYoHgxMABDVU28vlUiG',
74
+ 'EQCiypoBWNIEPlarBp04UePyEj5zH0ZDHxuRNqJ1WQx3FCY-',
75
+ 'EQCiz74FCV2lYlvFPEYhL3Jql8WwIO7QvbvYT-LQH0SmtCgI',
76
+ 'EQCpuYtq55nhkwYDmL4OWjsrdYy83gj5_49nNRQ5CrPOze49',
77
+ 'EQCx0HDJ_DxLxDSQyfsEqHI8Rs65nygvdmeD9Ra7rY15OWN8',
78
+ 'EQCxkYVQcfXKw9uJ-MMtutvR2Cu0DVCZFfLNBp6NwXgO8vQY',
79
+ 'EQD11suHkrO_1Mb5IIdYFx5ZPy38MuHoeHx6dA-QRaD8w0UJ',
80
+ 'EQDAPye7HAPAAl4WXpz5jOCdhf2H9h9QkkzRQ-6K5usiuQeC',
81
+ 'EQDBYUj5KEPUQrbj7da742UYJIeT9QU5C2dKsi12SdQ3yh9a',
82
+ 'EQDQ6j53q21HuZtw6oclm7z4LU2cG6S2OKvpSSMH548d7kJT',
83
+ 'EQDTb1w1TCohFqnNcyPrrbbBJQdAwwPn8DbCoaSUd0S5T4fB',
84
+ 'EQDgebEMA6yriI7SMffE65DIVA9rzSRmfGV_gy3ylIhLicY8',
85
+ 'EQDh5oHPvfRwPu2bORBGCoLEO4WQZKL4fk5DD1gydeNG9oEH',
86
+ 'EQDi1eWU3HWWst8owY8OMq2Dz9nJJEHUROza8R-_wEGb8yu6',
87
+ 'EQDkncuJ267Py3EmL2XAN7YsSNQMUu8u-GHsW9jVljcH8fr5',
88
+ 'EQDwyjgjnTXJVPjXji3OPtUilcCjceGVQOLGwr9_sRLjImfG',
89
+ 'EQDx--jUU9PUtHltPYZX7wdzIi0SPY3KZ8nvOs0iZvQJd6Ql',
90
+ ];
91
+ const stonfiV2PtonWalletAddresses = [
92
+ 'EQA2O81nzig4IUsCp_8dpzglywsCx-1ESPFzl0ygs1hFYUa2',
93
+ 'EQACuz151snlY46PKdUOkyiCf0zzcxMsN6XmKQkSKZjkvyFH',
94
+ 'EQAD2AcAb4blnbeGPPugZoxSpeibAMTB5kyDMIpUgKrsqk-z',
95
+ 'EQADMtjROtxVRcr1PZ8Zoq6Uxv-5O6uRw7v2XktW0WRtZDnK',
96
+ 'EQAGM0cbPP-HmOONE_RBFnPtHJDkY5qZ_crocAns0QW25e8p',
97
+ 'EQAIuYlddISZbBf7iymZ-WPP9zHaVj9Kg45OH-PgntVz9QbQ',
98
+ 'EQAKz7pQ4mi88Br4WKWcRozQbuRP3xi3eNnwlKa12ECcPfZG',
99
+ 'EQARZ1hF4v95ELsH7pCPMN79_UeqKOOgOjt8xrkW9HhIM-u1',
100
+ 'EQARs8oCeUBx5sWfazL6gZzTFAA9-RgnicsGhHBA8tDLIXgS',
101
+ 'EQAg3Rfrs5JAy31xPIv0hVsAkjDmF8yTxxxkygNvpzNBcJAB',
102
+ 'EQAgXtyQlqVF2V3F4mKlbvYzUijlGjUmJbPWkWuiFNdpzWL_',
103
+ 'EQAmV2BzRi6c-S1263Ar9HhyCLrvtMEae_qfEzhxnK7qSpr0',
104
+ 'EQAyEwoQcmDv0385t9szG-XIUcWMpYlUAOpA5I4HAViY-FnW',
105
+ 'EQAyvcnP0RexLvnsQMXfKYnk18Bzl3Y-iGt6bXqFB75ugXmE',
106
+ 'EQBB_dTiG6u4IIbDT80yirqwmLpwRp7cDGkdrmvQ3Xs_39xM',
107
+ 'EQBDOw08nLEwr9TTXyXDiPuBogHZM_1Rk42Ks8h-FQkP330_',
108
+ 'EQBS0OA18gacX-knOwi7kYuZms3JFwSs4A6j3DvowxfCX9aC',
109
+ 'EQBSDTCjmP35i5CnqT0IiankTmJeOBnUzq7eJ19oO6JgOPgs',
110
+ 'EQBTYCx7TGgVgaIr3tuJ3r_91E6FUBBWLtT73lTYYmrIc5gb',
111
+ 'EQBiLHuQjDj4fNyCD7Ch5HwpNGldlb5g-LMwQ1kStQ4NM5kv',
112
+ 'EQBicl-T79f0FwI_nygtAm_ISq15BVusRKEbZnC2_2QFjH34',
113
+ 'EQBiy9ltu3lkML1i_MAVW2yaXOsPeJ3NXCXQLlcAx-6lKrN1',
114
+ 'EQBvwdaM2LT9JPZGYdqYMCtIuLzjjAqHDSdaJW8fErAU7JUM',
115
+ 'EQBwU5CgFHiNsGKIBetAsMqnoDCtEQIcC3m8HW12GGDz6KfN',
116
+ 'EQByjaOja6-prxDrniGIzs-lBmNnP-nsvGxH1X2y4M3M5sjm',
117
+ 'EQBzIe_KYGrezmSS3ua9buM0P8vzEnMFDrsv1prFnwP43hFk',
118
+ 'EQC4V6MEH2RGiHw5a9g74AXEjyPR1qA-N9mzMEIs9hOSZzVP',
119
+ 'EQCCcuEVMGOSBQwv8Wmak1zbB8WpIuQbfavZYc3cL3QPNlK7',
120
+ 'EQCCgTcJEugMCmQjJDJLTFlu56od9fJDfkTSNv4QEGpHihJx',
121
+ 'EQCSIMGBps_qzRG3uPYhON8bucyCtu0mYdL1-u4gSz77IBa3',
122
+ 'EQCSQy327bW5cik1IycFmY4Qvsmgt-o4F6Ze54-lv2AOPBSk',
123
+ 'EQCcM8n2_K5D9Gu-YkyxM2W35WFs7ekYSbV9lgjXUDYofYt4',
124
+ 'EQCh82fvi6mY0FdoKprvfDLE2q-nE9FIU3SWTVLgNqMJliOO',
125
+ 'EQChdJmlvKnQVkiOwUYnUKJU_zgoyLT81XIyYxVH6RO8OtlH',
126
+ 'EQCjEo7QNUH5S2tVjYgFFdEh1pherydH9K-nrHx0aScsq7U5',
127
+ 'EQClcxRtn7nhZ3zzwsLk_itGaSe0r1r0Dj8fBLAxonkKNsZh',
128
+ 'EQCyfHYh17xx-KwZvcc1t61tLVVCxSk0jYxwRznbpHqQ-R0k',
129
+ 'EQCzUiz7TFS7p7ByYXt-c3lJDmyGvmHTQIm0vhwSiiiaLpVj',
130
+ 'EQD-zKpOa1GjFQDOMnP4A-tX3ntmgV7vs127m0tS_SrJY3kG',
131
+ 'EQDARm-e3yRFmxAabT5OfXKjFp23PS6p7hXBwwrgmvkdbXCr',
132
+ 'EQDBXpJBctAKlbAMWqH2iTPyBPfdBPeQZ6CGRp1oKBqQkEDL',
133
+ 'EQDTN22aBi-Pa_GyDWi8wBuVUxLhOwfAklgN5-bbTk87-uBh',
134
+ 'EQDTx6o7gmGo8cuJt_3EHEgO1RmGnLtGTzgTOsG5pAYs0uYd',
135
+ 'EQDgXEo6f94Bq90eHGFTVK0LyhGaePDhXEgiv1JK6LHFEYRP',
136
+ 'EQDiolbUI-wbmncBen7bYEG1pK_F27RKlqoRWCzSSA8mpqfe',
137
+ 'EQDix2qMOc-QO05Nn9X7oKFnYTb3bvtxN7ySmzoGljrFv2bX',
138
+ 'EQDwOyDlewGw8MkeXgZ_oOmPTIhJIlaJwhJmf4ffIPKv-294',
139
+ 'EQDwVbvZWrXEWQ_lL_69WehyNkNKm4pkswOSeJQtzx1gcHMF',
140
+ ];
141
+ /**
142
+ * DeDust mainnet TON Native Vault — the contract that receives the
143
+ * `swap#ea06185d` op for native-TON-in swaps. NOT the factory: the factory
144
+ * only handles `create_vault` / `create_pool`. See file-level comment for
145
+ * the dynamic-resolution recipe.
146
+ */
147
+ const dedustNativeVaultAddresses = [
148
+ 'EQDa4VOnTYlLvDJ0gZjNYm5PXfSmmtL6Vs6A_CZEtXCNICq_',
149
+ ];
150
+ const normalizeAddress = (address) => Address.parse(address).toString();
151
+ const buildAddressSet = (addresses) => new Set(addresses.map(normalizeAddress));
152
+ /** STON.fi v2 router addresses on TON mainnet (jetton-swap destinations). */
153
+ export const STONFI_V2_ROUTERS = buildAddressSet(stonfiV2RouterAddresses);
154
+ /** STON.fi v2 pTON wallet addresses on TON mainnet (TON-swap destinations). */
155
+ export const STONFI_V2_PTON_WALLETS = buildAddressSet(stonfiV2PtonWalletAddresses);
156
+ /**
157
+ * DeDust mainnet TON Native Vault addresses — the destinations for the
158
+ * `swap#ea06185d` op when offering native TON. Used to gate
159
+ * DEDUST_NATIVE_SWAP classification so the keysign UI only labels a
160
+ * message as a "swap" when it's actually addressed to a real vault.
161
+ */
162
+ export const DEDUST_NATIVE_VAULTS = buildAddressSet(dedustNativeVaultAddresses);
163
+ /**
164
+ * Returns whether `address` matches any entry in `routerSet`. Both sides are
165
+ * normalised to user-friendly bounceable form so URL-safe and raw variants of
166
+ * the same address compare as equal. Returns false on null/undefined or any
167
+ * unparseable address.
168
+ */
169
+ export const isKnownRouterAddress = (address, routerSet) => {
170
+ if (!address)
171
+ return false;
172
+ try {
173
+ return routerSet.has(normalizeAddress(address));
174
+ }
175
+ catch {
176
+ return false;
177
+ }
178
+ };
179
+ //# sourceMappingURL=knownRouters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knownRouters.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/messageBody/knownRouters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TON internal-message body opcodes for the operations Vultisig surfaces in
3
+ * keysign verify/done screens. The opcode is encoded as the first 32 bits of
4
+ * the message body cell.
5
+ *
6
+ * Sources:
7
+ * - Jetton transfer: TEP-74 (https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md)
8
+ * - NFT transfer: TEP-62 (https://github.com/ton-blockchain/TEPs/blob/master/text/0062-nft-standard.md)
9
+ * - Excesses: TEP-74 (return-of-gas notification)
10
+ * - STON.fi v2 swap: https://docs.ston.fi/developer-section/api-reference-v2/ops
11
+ * - DeDust swaps: https://docs.tact-lang.org/cookbook/dexes/dedust/
12
+ */
13
+ export declare const TonOp: {
14
+ readonly JETTON_TRANSFER: 260734629;
15
+ readonly NFT_TRANSFER: 1607220500;
16
+ readonly EXCESSES: 3576854235;
17
+ readonly PTON_TRANSFER: 32736093;
18
+ readonly STONFI_V2_SWAP: 1717886506;
19
+ readonly DEDUST_NATIVE_SWAP: 3926267997;
20
+ readonly DEDUST_JETTON_SWAP: 3818968194;
21
+ };
22
+ export type TonOp = (typeof TonOp)[keyof typeof TonOp];
23
+ //# sourceMappingURL=opcodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opcodes.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/messageBody/opcodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK;;;;;;;;CAQR,CAAA;AAEV,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,OAAO,KAAK,CAAC,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * TON internal-message body opcodes for the operations Vultisig surfaces in
3
+ * keysign verify/done screens. The opcode is encoded as the first 32 bits of
4
+ * the message body cell.
5
+ *
6
+ * Sources:
7
+ * - Jetton transfer: TEP-74 (https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md)
8
+ * - NFT transfer: TEP-62 (https://github.com/ton-blockchain/TEPs/blob/master/text/0062-nft-standard.md)
9
+ * - Excesses: TEP-74 (return-of-gas notification)
10
+ * - STON.fi v2 swap: https://docs.ston.fi/developer-section/api-reference-v2/ops
11
+ * - DeDust swaps: https://docs.tact-lang.org/cookbook/dexes/dedust/
12
+ */
13
+ export const TonOp = {
14
+ JETTON_TRANSFER: 0x0f8a7ea5,
15
+ NFT_TRANSFER: 0x5fcc3d14,
16
+ EXCESSES: 0xd53276db,
17
+ PTON_TRANSFER: 0x01f3835d,
18
+ STONFI_V2_SWAP: 0x6664de2a,
19
+ DEDUST_NATIVE_SWAP: 0xea06185d,
20
+ DEDUST_JETTON_SWAP: 0xe3a0d482,
21
+ };
22
+ //# sourceMappingURL=opcodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opcodes.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/messageBody/opcodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,eAAe,EAAE,UAAU;IAC3B,YAAY,EAAE,UAAU;IACxB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,UAAU;IACzB,cAAc,EAAE,UAAU;IAC1B,kBAAkB,EAAE,UAAU;IAC9B,kBAAkB,EAAE,UAAU;CACtB,CAAA"}