@ton-community/ton-ledger 7.1.0-pre.1 → 7.2.0-pre.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.
@@ -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,36 @@ 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
+ {
44
+ symbol: 'STAKED',
45
+ masterAddress: core_1.Address.parse('EQCqC6EhRJ_tpWngKxL6dV0k6DSnRUrs9GSVkLbfdCqsj6TE'),
46
+ },
47
+ ];
18
48
  const dnsWalletKey = Buffer.from([0xe8, 0xd4, 0x40, 0x50, 0x87, 0x3d, 0xba, 0x86, 0x5a, 0xa7, 0xc1, 0x70, 0xab, 0x4c, 0xce, 0x64,
19
49
  0xd9, 0x08, 0x39, 0xa3, 0x4d, 0xcf, 0xd6, 0xcf, 0x71, 0xd1, 0x4e, 0x02, 0x05, 0x44, 0x3b, 0x1b]);
20
50
  function normalizeQueryId(qid) {
@@ -81,6 +111,7 @@ function parseMessage(cell, opts) {
81
111
  customPayload,
82
112
  forwardAmount,
83
113
  forwardPayload,
114
+ knownJetton: null,
84
115
  };
85
116
  }
86
117
  case 0x5fcc3d14: {
@@ -331,6 +362,9 @@ function processAddressFlags(opts) {
331
362
  const bounceable = opts?.bounceable ?? true;
332
363
  const testOnly = opts?.testOnly ?? false;
333
364
  const chain = opts?.chain ?? 0;
365
+ const subwalletId = opts?.subwalletId ?? 698983191;
366
+ const walletVersion = opts?.walletVersion ?? 'v3r2';
367
+ let specifiers = undefined;
334
368
  let flags = 0x00;
335
369
  if (testOnly) {
336
370
  flags |= 0x01;
@@ -338,7 +372,14 @@ function processAddressFlags(opts) {
338
372
  if (chain === -1) {
339
373
  flags |= 0x02;
340
374
  }
341
- return { bounceable, testOnly, chain, flags };
375
+ if (subwalletId !== 698983191 || walletVersion !== 'v4') {
376
+ flags |= 0x04;
377
+ specifiers = {
378
+ subwalletId,
379
+ isV3R2: walletVersion === 'v3r2',
380
+ };
381
+ }
382
+ return { bounceable, testOnly, chain, flags, specifiers };
342
383
  }
343
384
  function convertPayload(input) {
344
385
  let payload = null;
@@ -376,15 +417,25 @@ function convertPayload(input) {
376
417
  let b = (0, core_1.beginCell)()
377
418
  .storeUint(input.type === 'jetton-transfer' ? 0x0f8a7ea5 : 0x5fcc3d14, 32);
378
419
  let d = Buffer.alloc(0);
420
+ let flags = 0;
379
421
  if (input.queryId !== null) {
380
- d = Buffer.concat([d, (0, ledgerWriter_1.writeUint8)(1), (0, ledgerWriter_1.writeUint64)(input.queryId)]);
422
+ flags |= 1;
423
+ }
424
+ if (input.type === 'jetton-transfer' && input.knownJetton !== null) {
425
+ flags |= 2;
426
+ }
427
+ d = Buffer.concat([d, (0, ledgerWriter_1.writeUint8)(flags)]);
428
+ if (input.queryId !== null) {
429
+ d = Buffer.concat([d, (0, ledgerWriter_1.writeUint64)(input.queryId)]);
381
430
  b = b.storeUint(input.queryId, 64);
382
431
  }
383
432
  else {
384
- d = Buffer.concat([d, (0, ledgerWriter_1.writeUint8)(0)]);
385
433
  b = b.storeUint(0, 64);
386
434
  }
387
435
  if (input.type === 'jetton-transfer') {
436
+ if (input.knownJetton !== null) {
437
+ d = Buffer.concat([d, (0, ledgerWriter_1.writeUint16)(input.knownJetton.jettonId), (0, ledgerWriter_1.writeUint8)(input.knownJetton.workchain)]);
438
+ }
388
439
  d = Buffer.concat([d, (0, ledgerWriter_1.writeVarUInt)(input.amount)]);
389
440
  b = b.storeCoins(input.amount);
390
441
  d = Buffer.concat([d, (0, ledgerWriter_1.writeAddress)(input.destination)]);
@@ -702,14 +753,14 @@ class TonTransport {
702
753
  // Check path
703
754
  validatePath(path);
704
755
  // Resolve flags
705
- const { bounceable, testOnly, chain } = processAddressFlags(opts);
756
+ const { bounceable, testOnly, chain, specifiers } = processAddressFlags(opts);
706
757
  // Get public key
707
758
  let response = await this.#doRequest(INS_ADDRESS, 0x00, 0x00, pathElementsToBuffer(path.map((v) => v + 0x80000000)));
708
759
  if (response.length !== 32) {
709
760
  throw Error('Invalid response');
710
761
  }
711
762
  // Contract
712
- const contract = (0, getInit_1.getInit)(chain, response);
763
+ const contract = (0, getInit_1.getInit)(response, specifiers?.subwalletId ?? 698983191, specifiers?.isV3R2 ?? false);
713
764
  const address = (0, core_1.contractAddress)(chain, contract);
714
765
  return { address: address.toString({ bounceable, testOnly }), publicKey: response };
715
766
  }
@@ -717,14 +768,18 @@ class TonTransport {
717
768
  // Check path
718
769
  validatePath(path);
719
770
  // Resolve flags
720
- const { bounceable, testOnly, chain, flags } = processAddressFlags(opts);
771
+ const { bounceable, testOnly, chain, flags, specifiers } = processAddressFlags(opts);
772
+ let r = pathElementsToBuffer(path.map((v) => v + 0x80000000));
773
+ if (specifiers !== undefined) {
774
+ r = Buffer.concat([r, (0, ledgerWriter_1.writeUint8)(specifiers.isV3R2 ? 1 : 0), (0, ledgerWriter_1.writeUint32)(specifiers.subwalletId)]);
775
+ }
721
776
  // Get public key
722
- let response = await this.#doRequest(INS_ADDRESS, 0x01, flags, pathElementsToBuffer(path.map((v) => v + 0x80000000)));
777
+ let response = await this.#doRequest(INS_ADDRESS, 0x01, flags, r);
723
778
  if (response.length !== 32) {
724
779
  throw Error('Invalid response');
725
780
  }
726
781
  // Contract
727
- const contract = (0, getInit_1.getInit)(chain, response);
782
+ const contract = (0, getInit_1.getInit)(response, specifiers?.subwalletId ?? 698983191, specifiers?.isV3R2 ?? false);
728
783
  const address = (0, core_1.contractAddress)(chain, contract);
729
784
  return { address: address.toString({ bounceable, testOnly }), publicKey: response };
730
785
  }
@@ -733,10 +788,15 @@ class TonTransport {
733
788
  validatePath(path);
734
789
  let publicKey = (await this.getAddress(path)).publicKey;
735
790
  // Resolve flags
736
- const { flags } = processAddressFlags(opts);
791
+ const { flags, specifiers } = processAddressFlags(opts);
792
+ let specifiersBuf = Buffer.alloc(0);
793
+ if (specifiers !== undefined) {
794
+ specifiersBuf = Buffer.concat([(0, ledgerWriter_1.writeUint8)(specifiers.isV3R2 ? 1 : 0), (0, ledgerWriter_1.writeUint32)(specifiers.subwalletId)]);
795
+ }
737
796
  const domainBuf = Buffer.from(params.domain, 'utf-8');
738
797
  const reqBuf = Buffer.concat([
739
798
  pathElementsToBuffer(path.map((v) => v + 0x80000000)),
799
+ specifiersBuf,
740
800
  (0, ledgerWriter_1.writeUint8)(domainBuf.length),
741
801
  domainBuf,
742
802
  (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.2",
4
4
  "repository": "https://github.com/ton-community/ton-ledger-ts",
5
5
  "author": "Steve Korshakov <steve@korshakov.com>",
6
6
  "license": "MIT",