@ton-community/ton-ledger 7.1.0-pre.1 → 7.2.0-pre.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,11 @@
1
1
  /// <reference types="node" />
2
2
  import Transport from "@ledgerhq/hw-transport";
3
3
  import { Address, Cell, SendMode, StateInit } from "@ton/core";
4
+ export type KnownJetton = {
5
+ symbol: string;
6
+ masterAddress: Address;
7
+ };
8
+ export declare const KNOWN_JETTONS: KnownJetton[];
4
9
  export type TonPayloadFormat = {
5
10
  type: 'unsafe';
6
11
  message: Cell;
@@ -16,6 +21,10 @@ export type TonPayloadFormat = {
16
21
  customPayload: Cell | null;
17
22
  forwardAmount: bigint;
18
23
  forwardPayload: Cell | null;
24
+ knownJetton: {
25
+ jettonId: number;
26
+ workchain: number;
27
+ } | null;
19
28
  } | {
20
29
  type: 'nft-transfer';
21
30
  queryId: bigint | null;
@@ -99,6 +108,8 @@ export declare class TonTransport {
99
108
  testOnly?: boolean;
100
109
  bounceable?: boolean;
101
110
  chain?: number;
111
+ subwalletId?: number;
112
+ walletVersion?: 'v3r2' | 'v4';
102
113
  }): Promise<{
103
114
  address: string;
104
115
  publicKey: Buffer;
@@ -107,6 +118,8 @@ export declare class TonTransport {
107
118
  testOnly?: boolean;
108
119
  bounceable?: boolean;
109
120
  chain?: number;
121
+ subwalletId?: number;
122
+ walletVersion?: 'v3r2' | 'v4';
110
123
  }): Promise<{
111
124
  address: string;
112
125
  publicKey: Buffer;
@@ -119,6 +132,8 @@ export declare class TonTransport {
119
132
  testOnly?: boolean;
120
133
  bounceable?: boolean;
121
134
  chain?: number;
135
+ subwalletId?: number;
136
+ walletVersion?: 'v3r2' | 'v4';
122
137
  }): Promise<{
123
138
  signature: Buffer;
124
139
  hash: Buffer;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TonTransport = exports.parseMessage = void 0;
3
+ exports.TonTransport = exports.parseMessage = exports.KNOWN_JETTONS = void 0;
4
4
  const core_1 = require("@ton/core");
5
5
  const crypto_1 = require("@ton/crypto");
6
6
  const teslabot_1 = require("teslabot");
@@ -15,6 +15,32 @@ const INS_PROOF = 0x08;
15
15
  const INS_SIGN_DATA = 0x09;
16
16
  const INS_SETTINGS = 0x0A;
17
17
  const DEFAULT_SUBWALLET_ID = 698983191;
18
+ exports.KNOWN_JETTONS = [
19
+ {
20
+ symbol: 'USDT',
21
+ masterAddress: core_1.Address.parse('EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs'),
22
+ },
23
+ {
24
+ symbol: 'NOT',
25
+ masterAddress: core_1.Address.parse('EQAvlWFDxGF2lXm67y4yzC17wYKD9A0guwPkMs1gOsM__NOT'),
26
+ },
27
+ {
28
+ symbol: 'tsTON',
29
+ masterAddress: core_1.Address.parse('EQC98_qAmNEptUtPc7W6xdHh_ZHrBUFpw5Ft_IzNU20QAJav'),
30
+ },
31
+ {
32
+ symbol: 'wsTON',
33
+ masterAddress: core_1.Address.parse('EQB0SoxuGDx5qjVt0P_bPICFeWdFLBmVopHhjgfs0q-wsTON'),
34
+ },
35
+ {
36
+ symbol: 'hTON',
37
+ masterAddress: core_1.Address.parse('EQDPdq8xjAhytYqfGSX8KcFWIReCufsB9Wdg0pLlYSO_h76w'),
38
+ },
39
+ {
40
+ symbol: 'stTON',
41
+ masterAddress: core_1.Address.parse('EQDNhy-nxYFgUqzfUzImBEP67JqsyMIcyk2S5_RwNNEYku0k'),
42
+ },
43
+ ];
18
44
  const dnsWalletKey = Buffer.from([0xe8, 0xd4, 0x40, 0x50, 0x87, 0x3d, 0xba, 0x86, 0x5a, 0xa7, 0xc1, 0x70, 0xab, 0x4c, 0xce, 0x64,
19
45
  0xd9, 0x08, 0x39, 0xa3, 0x4d, 0xcf, 0xd6, 0xcf, 0x71, 0xd1, 0x4e, 0x02, 0x05, 0x44, 0x3b, 0x1b]);
20
46
  function normalizeQueryId(qid) {
@@ -81,6 +107,7 @@ function parseMessage(cell, opts) {
81
107
  customPayload,
82
108
  forwardAmount,
83
109
  forwardPayload,
110
+ knownJetton: null,
84
111
  };
85
112
  }
86
113
  case 0x5fcc3d14: {
@@ -331,6 +358,9 @@ function processAddressFlags(opts) {
331
358
  const bounceable = opts?.bounceable ?? true;
332
359
  const testOnly = opts?.testOnly ?? false;
333
360
  const chain = opts?.chain ?? 0;
361
+ const subwalletId = opts?.subwalletId ?? 698983191;
362
+ const walletVersion = opts?.walletVersion ?? 'v3r2';
363
+ let specifiers = undefined;
334
364
  let flags = 0x00;
335
365
  if (testOnly) {
336
366
  flags |= 0x01;
@@ -338,7 +368,14 @@ function processAddressFlags(opts) {
338
368
  if (chain === -1) {
339
369
  flags |= 0x02;
340
370
  }
341
- return { bounceable, testOnly, chain, flags };
371
+ if (subwalletId !== 698983191 || walletVersion !== 'v4') {
372
+ flags |= 0x04;
373
+ specifiers = {
374
+ subwalletId,
375
+ isV3R2: walletVersion === 'v3r2',
376
+ };
377
+ }
378
+ return { bounceable, testOnly, chain, flags, specifiers };
342
379
  }
343
380
  function convertPayload(input) {
344
381
  let payload = null;
@@ -376,15 +413,25 @@ function convertPayload(input) {
376
413
  let b = (0, core_1.beginCell)()
377
414
  .storeUint(input.type === 'jetton-transfer' ? 0x0f8a7ea5 : 0x5fcc3d14, 32);
378
415
  let d = Buffer.alloc(0);
416
+ let flags = 0;
379
417
  if (input.queryId !== null) {
380
- d = Buffer.concat([d, (0, ledgerWriter_1.writeUint8)(1), (0, ledgerWriter_1.writeUint64)(input.queryId)]);
418
+ flags |= 1;
419
+ }
420
+ if (input.type === 'jetton-transfer' && input.knownJetton !== null) {
421
+ flags |= 2;
422
+ }
423
+ d = Buffer.concat([d, (0, ledgerWriter_1.writeUint8)(flags)]);
424
+ if (input.queryId !== null) {
425
+ d = Buffer.concat([d, (0, ledgerWriter_1.writeUint64)(input.queryId)]);
381
426
  b = b.storeUint(input.queryId, 64);
382
427
  }
383
428
  else {
384
- d = Buffer.concat([d, (0, ledgerWriter_1.writeUint8)(0)]);
385
429
  b = b.storeUint(0, 64);
386
430
  }
387
431
  if (input.type === 'jetton-transfer') {
432
+ if (input.knownJetton !== null) {
433
+ d = Buffer.concat([d, (0, ledgerWriter_1.writeUint16)(input.knownJetton.jettonId), (0, ledgerWriter_1.writeUint8)(input.knownJetton.workchain)]);
434
+ }
388
435
  d = Buffer.concat([d, (0, ledgerWriter_1.writeVarUInt)(input.amount)]);
389
436
  b = b.storeCoins(input.amount);
390
437
  d = Buffer.concat([d, (0, ledgerWriter_1.writeAddress)(input.destination)]);
@@ -702,14 +749,14 @@ class TonTransport {
702
749
  // Check path
703
750
  validatePath(path);
704
751
  // Resolve flags
705
- const { bounceable, testOnly, chain } = processAddressFlags(opts);
752
+ const { bounceable, testOnly, chain, specifiers } = processAddressFlags(opts);
706
753
  // Get public key
707
754
  let response = await this.#doRequest(INS_ADDRESS, 0x00, 0x00, pathElementsToBuffer(path.map((v) => v + 0x80000000)));
708
755
  if (response.length !== 32) {
709
756
  throw Error('Invalid response');
710
757
  }
711
758
  // Contract
712
- const contract = (0, getInit_1.getInit)(chain, response);
759
+ const contract = (0, getInit_1.getInit)(response, specifiers?.subwalletId ?? 698983191, specifiers?.isV3R2 ?? false);
713
760
  const address = (0, core_1.contractAddress)(chain, contract);
714
761
  return { address: address.toString({ bounceable, testOnly }), publicKey: response };
715
762
  }
@@ -717,14 +764,18 @@ class TonTransport {
717
764
  // Check path
718
765
  validatePath(path);
719
766
  // Resolve flags
720
- const { bounceable, testOnly, chain, flags } = processAddressFlags(opts);
767
+ const { bounceable, testOnly, chain, flags, specifiers } = processAddressFlags(opts);
768
+ let r = pathElementsToBuffer(path.map((v) => v + 0x80000000));
769
+ if (specifiers !== undefined) {
770
+ r = Buffer.concat([r, (0, ledgerWriter_1.writeUint8)(specifiers.isV3R2 ? 1 : 0), (0, ledgerWriter_1.writeUint32)(specifiers.subwalletId)]);
771
+ }
721
772
  // Get public key
722
- let response = await this.#doRequest(INS_ADDRESS, 0x01, flags, pathElementsToBuffer(path.map((v) => v + 0x80000000)));
773
+ let response = await this.#doRequest(INS_ADDRESS, 0x01, flags, r);
723
774
  if (response.length !== 32) {
724
775
  throw Error('Invalid response');
725
776
  }
726
777
  // Contract
727
- const contract = (0, getInit_1.getInit)(chain, response);
778
+ const contract = (0, getInit_1.getInit)(response, specifiers?.subwalletId ?? 698983191, specifiers?.isV3R2 ?? false);
728
779
  const address = (0, core_1.contractAddress)(chain, contract);
729
780
  return { address: address.toString({ bounceable, testOnly }), publicKey: response };
730
781
  }
@@ -733,10 +784,15 @@ class TonTransport {
733
784
  validatePath(path);
734
785
  let publicKey = (await this.getAddress(path)).publicKey;
735
786
  // Resolve flags
736
- const { flags } = processAddressFlags(opts);
787
+ const { flags, specifiers } = processAddressFlags(opts);
788
+ let specifiersBuf = Buffer.alloc(0);
789
+ if (specifiers !== undefined) {
790
+ specifiersBuf = Buffer.concat([(0, ledgerWriter_1.writeUint8)(specifiers.isV3R2 ? 1 : 0), (0, ledgerWriter_1.writeUint32)(specifiers.subwalletId)]);
791
+ }
737
792
  const domainBuf = Buffer.from(params.domain, 'utf-8');
738
793
  const reqBuf = Buffer.concat([
739
794
  pathElementsToBuffer(path.map((v) => v + 0x80000000)),
795
+ specifiersBuf,
740
796
  (0, ledgerWriter_1.writeUint8)(domainBuf.length),
741
797
  domainBuf,
742
798
  (0, ledgerWriter_1.writeUint64)(BigInt(params.timestamp)),
package/dist/index.d.ts CHANGED
@@ -1 +1 @@
1
- export { TonPayloadFormat, TonTransport, SignDataRequest, parseMessage } from './TonTransport';
1
+ export { TonPayloadFormat, TonTransport, SignDataRequest, parseMessage, KNOWN_JETTONS } from './TonTransport';
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseMessage = exports.TonTransport = void 0;
3
+ exports.KNOWN_JETTONS = exports.parseMessage = exports.TonTransport = void 0;
4
4
  var TonTransport_1 = require("./TonTransport");
5
5
  Object.defineProperty(exports, "TonTransport", { enumerable: true, get: function () { return TonTransport_1.TonTransport; } });
6
6
  Object.defineProperty(exports, "parseMessage", { enumerable: true, get: function () { return TonTransport_1.parseMessage; } });
7
+ Object.defineProperty(exports, "KNOWN_JETTONS", { enumerable: true, get: function () { return TonTransport_1.KNOWN_JETTONS; } });
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { Cell } from '@ton/core';
3
- export declare function getInit(workchain: number, publicKey: Buffer): {
3
+ export declare function getInit(publicKey: Buffer, subwalletId: number, isV3R2: boolean): {
4
4
  code: Cell;
5
5
  data: Cell;
6
6
  };
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getInit = void 0;
4
4
  const core_1 = require("@ton/core");
5
- function getInit(workchain, publicKey) {
6
- let code = core_1.Cell.fromBoc(Buffer.from('te6ccgECFAEAAtQAART/APSkE/S88sgLAQIBIAIDAgFIBAUE+PKDCNcYINMf0x/THwL4I7vyZO1E0NMf0x/T//QE0VFDuvKhUVG68qIF+QFUEGT5EPKj+AAkpMjLH1JAyx9SMMv/UhD0AMntVPgPAdMHIcAAn2xRkyDXSpbTB9QC+wDoMOAhwAHjACHAAuMAAcADkTDjDQOkyMsfEssfy/8QERITAubQAdDTAyFxsJJfBOAi10nBIJJfBOAC0x8hghBwbHVnvSKCEGRzdHK9sJJfBeAD+kAwIPpEAcjKB8v/ydDtRNCBAUDXIfQEMFyBAQj0Cm+hMbOSXwfgBdM/yCWCEHBsdWe6kjgw4w0DghBkc3RyupJfBuMNBgcCASAICQB4AfoA9AQw+CdvIjBQCqEhvvLgUIIQcGx1Z4MesXCAGFAEywUmzxZY+gIZ9ADLaRfLH1Jgyz8gyYBA+wAGAIpQBIEBCPRZMO1E0IEBQNcgyAHPFvQAye1UAXKwjiOCEGRzdHKDHrFwgBhQBcsFUAPPFiP6AhPLassfyz/JgED7AJJfA+ICASAKCwBZvSQrb2omhAgKBrkPoCGEcNQICEekk30pkQzmkD6f+YN4EoAbeBAUiYcVnzGEAgFYDA0AEbjJftRNDXCx+AA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA4PABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AAG7SB/oA1NQi+QAFyMoHFcv/ydB3dIAYyMsFywIizxZQBfoCFMtrEszMyXP7AMhAFIEBCPRR8qcCAHCBAQjXGPoA0z/IVCBHgQEI9FHyp4IQbm90ZXB0gBjIywXLAlAGzxZQBPoCFMtqEssfyz/Jc/sAAgBsgQEI1xj6ANM/MFIkgQEI9Fnyp4IQZHN0cnB0gBjIywXLAlAFzxZQA/oCE8tqyx8Syz/Jc/sAAAr0AMntVA==', 'base64'))[0];
5
+ function getInit(publicKey, subwalletId, isV3R2) {
7
6
  let data = (0, core_1.beginCell)()
8
7
  .storeUint(0, 32) // Seqno
9
- .storeUint(698983191 + workchain, 32)
10
- .storeBuffer(publicKey)
11
- .storeBit(0) // Empty plugins dict
12
- .endCell();
13
- return { code, data };
8
+ .storeUint(subwalletId, 32)
9
+ .storeBuffer(publicKey);
10
+ return {
11
+ code: isV3R2 ? core_1.Cell.fromBase64('te6cckEBAQEAcQAA3v8AIN0gggFMl7ohggEznLqxn3Gw7UTQ0x/THzHXC//jBOCk8mCDCNcYINMf0x/TH/gjE7vyY+1E0NMf0x/T/9FRMrryoVFEuvKiBPkBVBBV+RDyo/gAkyDXSpbTB9QC+wDo0QGkyMsfyx/L/8ntVBC9ba0=') : core_1.Cell.fromBase64('te6ccgECFAEAAtQAART/APSkE/S88sgLAQIBIAIDAgFIBAUE+PKDCNcYINMf0x/THwL4I7vyZO1E0NMf0x/T//QE0VFDuvKhUVG68qIF+QFUEGT5EPKj+AAkpMjLH1JAyx9SMMv/UhD0AMntVPgPAdMHIcAAn2xRkyDXSpbTB9QC+wDoMOAhwAHjACHAAuMAAcADkTDjDQOkyMsfEssfy/8QERITAubQAdDTAyFxsJJfBOAi10nBIJJfBOAC0x8hghBwbHVnvSKCEGRzdHK9sJJfBeAD+kAwIPpEAcjKB8v/ydDtRNCBAUDXIfQEMFyBAQj0Cm+hMbOSXwfgBdM/yCWCEHBsdWe6kjgw4w0DghBkc3RyupJfBuMNBgcCASAICQB4AfoA9AQw+CdvIjBQCqEhvvLgUIIQcGx1Z4MesXCAGFAEywUmzxZY+gIZ9ADLaRfLH1Jgyz8gyYBA+wAGAIpQBIEBCPRZMO1E0IEBQNcgyAHPFvQAye1UAXKwjiOCEGRzdHKDHrFwgBhQBcsFUAPPFiP6AhPLassfyz/JgED7AJJfA+ICASAKCwBZvSQrb2omhAgKBrkPoCGEcNQICEekk30pkQzmkD6f+YN4EoAbeBAUiYcVnzGEAgFYDA0AEbjJftRNDXCx+AA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA4PABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AAG7SB/oA1NQi+QAFyMoHFcv/ydB3dIAYyMsFywIizxZQBfoCFMtrEszMyXP7AMhAFIEBCPRR8qcCAHCBAQjXGPoA0z/IVCBHgQEI9FHyp4IQbm90ZXB0gBjIywXLAlAGzxZQBPoCFMtqEssfyz/Jc/sAAgBsgQEI1xj6ANM/MFIkgQEI9Fnyp4IQZHN0cnB0gBjIywXLAlAFzxZQA/oCE8tqyx8Syz/Jc/sAAAr0AMntVA=='),
12
+ data: isV3R2 ? data.endCell() : data.storeBit(0).endCell(),
13
+ };
14
14
  }
15
15
  exports.getInit = getInit;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ton-community/ton-ledger",
3
- "version": "7.1.0-pre.1",
3
+ "version": "7.2.0-pre.1",
4
4
  "repository": "https://github.com/ton-community/ton-ledger-ts",
5
5
  "author": "Steve Korshakov <steve@korshakov.com>",
6
6
  "license": "MIT",