@dynamic-labs-wallet/ton 0.0.230 → 0.0.231

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/index.cjs.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var browser = require('@dynamic-labs-wallet/browser');
4
+ var crypto = require('@ton/crypto');
4
5
  var ton = require('@ton/ton');
5
6
  var sdkApiCore = require('@dynamic-labs/sdk-api-core');
6
7
 
@@ -45,6 +46,7 @@ var sdkApiCore__namespace = /*#__PURE__*/_interopNamespaceDefault(sdkApiCore);
45
46
 
46
47
  var ERROR_KEYGEN_FAILED = 'Error with keygen';
47
48
  var ERROR_CREATE_WALLET_ACCOUNT = 'Error creating ton wallet account';
49
+ var ERROR_IMPORT_PRIVATE_KEY = 'Error importing private key';
48
50
  var ERROR_EXPORT_PRIVATE_KEY = 'Error exporting private key';
49
51
  var ERROR_SIGN_MESSAGE = 'Error signing message';
50
52
  var ERROR_ACCOUNT_ADDRESS_REQUIRED = 'Account address is required';
@@ -139,6 +141,13 @@ function _inherits(subClass, superClass) {
139
141
  });
140
142
  if (superClass) _set_prototype_of(subClass, superClass);
141
143
  }
144
+ function _instanceof(left, right) {
145
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
146
+ return !!right[Symbol.hasInstance](left);
147
+ } else {
148
+ return left instanceof right;
149
+ }
150
+ }
142
151
  function _object_spread(target) {
143
152
  for(var i = 1; i < arguments.length; i++){
144
153
  var source = arguments[i] != null ? arguments[i] : {};
@@ -609,6 +618,140 @@ var DynamicTonWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
609
618
  })();
610
619
  }
611
620
  },
621
+ {
622
+ key: "importPrivateKey",
623
+ value: function importPrivateKey(param) {
624
+ var privateKey = param.privateKey, chainName = param.chainName, thresholdSignatureScheme = param.thresholdSignatureScheme, _param_password = param.password, password = _param_password === void 0 ? undefined : _param_password, signedSessionId = param.signedSessionId, onError = param.onError, publicAddressCheck = param.publicAddressCheck;
625
+ var _this = this;
626
+ return _async_to_generator(function() {
627
+ var ceremonyCeremonyCompleteResolver, ceremonyCompletePromise, formattedPrivateKey, publicKeyHex, derivedAddress, _ref, rawPublicKey, clientKeyShares, accountAddress, pubKeyBytes, error;
628
+ return _ts_generator(this, function(_state) {
629
+ switch(_state.label){
630
+ case 0:
631
+ _state.trys.push([
632
+ 0,
633
+ 5,
634
+ ,
635
+ 6
636
+ ]);
637
+ ceremonyCompletePromise = new Promise(function(resolve) {
638
+ ceremonyCeremonyCompleteResolver = resolve;
639
+ });
640
+ formattedPrivateKey = privateKey.startsWith('0x') ? privateKey.slice(2) : privateKey;
641
+ publicKeyHex = _this.getPublicKeyFromPrivateKey(formattedPrivateKey);
642
+ derivedAddress = deriveTonAddress({
643
+ publicKeyHex: publicKeyHex,
644
+ workchain: 0
645
+ });
646
+ if (publicAddressCheck && derivedAddress !== publicAddressCheck) {
647
+ throw new Error("Public address mismatch: derived address ".concat(derivedAddress, " !== public address ").concat(publicAddressCheck));
648
+ }
649
+ return [
650
+ 4,
651
+ _this.importRawPrivateKey({
652
+ chainName: chainName,
653
+ thresholdSignatureScheme: thresholdSignatureScheme,
654
+ privateKey: formattedPrivateKey,
655
+ onCeremonyComplete: function(accountAddress, walletId) {
656
+ _this.walletMap[accountAddress] = _object_spread_props(_object_spread({}, _this.walletMap[accountAddress]), {
657
+ accountAddress: accountAddress,
658
+ walletId: walletId,
659
+ thresholdSignatureScheme: thresholdSignatureScheme,
660
+ chainName: _this.chainName,
661
+ clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
662
+ });
663
+ _this.logger.debug('walletMap updated for wallet', {
664
+ context: {
665
+ accountAddress: accountAddress,
666
+ walletId: walletId,
667
+ walletMap: _this.walletMap
668
+ }
669
+ });
670
+ ceremonyCeremonyCompleteResolver(undefined);
671
+ },
672
+ onError: onError
673
+ })
674
+ ];
675
+ case 1:
676
+ _ref = _state.sent(), rawPublicKey = _ref.rawPublicKey, clientKeyShares = _ref.clientKeyShares;
677
+ return [
678
+ 4,
679
+ ceremonyCompletePromise
680
+ ];
681
+ case 2:
682
+ _state.sent();
683
+ if (!rawPublicKey || !clientKeyShares) {
684
+ throw new Error(ERROR_IMPORT_PRIVATE_KEY);
685
+ }
686
+ accountAddress = deriveTonAddress({
687
+ publicKeyHex: rawPublicKey,
688
+ workchain: 0
689
+ });
690
+ if (accountAddress !== derivedAddress) {
691
+ throw new Error("Public key mismatch: derived address ".concat(accountAddress, " !== expected ").concat(derivedAddress));
692
+ }
693
+ // Update client key shares in wallet map
694
+ return [
695
+ 4,
696
+ _this.setClientKeySharesToLocalStorage({
697
+ accountAddress: accountAddress,
698
+ clientKeyShares: clientKeyShares,
699
+ overwriteOrMerge: 'overwrite'
700
+ })
701
+ ];
702
+ case 3:
703
+ _state.sent();
704
+ return [
705
+ 4,
706
+ _this.storeEncryptedBackupByWalletWithRetry({
707
+ accountAddress: accountAddress,
708
+ clientKeyShares: clientKeyShares,
709
+ password: password,
710
+ signedSessionId: signedSessionId
711
+ })
712
+ ];
713
+ case 4:
714
+ _state.sent();
715
+ pubKeyBytes = Buffer.from(rawPublicKey, 'hex');
716
+ return [
717
+ 2,
718
+ {
719
+ accountAddress: accountAddress,
720
+ publicKeyHex: rawPublicKey,
721
+ rawPublicKey: new Uint8Array(pubKeyBytes),
722
+ clientKeyShares: clientKeyShares
723
+ }
724
+ ];
725
+ case 5:
726
+ error = _state.sent();
727
+ _this.logger.error(ERROR_IMPORT_PRIVATE_KEY, error);
728
+ onError === null || onError === void 0 ? void 0 : onError(error);
729
+ throw new Error(ERROR_IMPORT_PRIVATE_KEY);
730
+ case 6:
731
+ return [
732
+ 2
733
+ ];
734
+ }
735
+ });
736
+ })();
737
+ }
738
+ },
739
+ {
740
+ key: "getPublicKeyFromPrivateKey",
741
+ value: function getPublicKeyFromPrivateKey(privateKeyHex) {
742
+ try {
743
+ var privateKeyBytes = Buffer.from(privateKeyHex, 'hex');
744
+ if (privateKeyBytes.length !== 32) {
745
+ throw new Error("Invalid private key length: ".concat(privateKeyBytes.length, ", expected 32"));
746
+ }
747
+ var keyPair = crypto.keyPairFromSeed(privateKeyBytes);
748
+ return keyPair.publicKey.toString('hex');
749
+ } catch (error) {
750
+ this.logger.error('Unable to derive public key from private key. Check private key format', _instanceof(error, Error) ? error.message : 'Unknown error');
751
+ throw error;
752
+ }
753
+ }
754
+ },
612
755
  {
613
756
  key: "getTonWallets",
614
757
  value: function getTonWallets() {
package/index.esm.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { AuthMode, DynamicWalletClient, getClientKeyShareBackupInfo, WalletOperation } from '@dynamic-labs-wallet/browser';
2
+ import { keyPairFromSeed } from '@ton/crypto';
2
3
  import { WalletContractV5R1 } from '@ton/ton';
3
4
  import * as sdkApiCore from '@dynamic-labs/sdk-api-core';
4
5
  export { sdkApiCore };
@@ -25,6 +26,7 @@ export { sdkApiCore };
25
26
 
26
27
  var ERROR_KEYGEN_FAILED = 'Error with keygen';
27
28
  var ERROR_CREATE_WALLET_ACCOUNT = 'Error creating ton wallet account';
29
+ var ERROR_IMPORT_PRIVATE_KEY = 'Error importing private key';
28
30
  var ERROR_EXPORT_PRIVATE_KEY = 'Error exporting private key';
29
31
  var ERROR_SIGN_MESSAGE = 'Error signing message';
30
32
  var ERROR_ACCOUNT_ADDRESS_REQUIRED = 'Account address is required';
@@ -119,6 +121,13 @@ function _inherits(subClass, superClass) {
119
121
  });
120
122
  if (superClass) _set_prototype_of(subClass, superClass);
121
123
  }
124
+ function _instanceof(left, right) {
125
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
126
+ return !!right[Symbol.hasInstance](left);
127
+ } else {
128
+ return left instanceof right;
129
+ }
130
+ }
122
131
  function _object_spread(target) {
123
132
  for(var i = 1; i < arguments.length; i++){
124
133
  var source = arguments[i] != null ? arguments[i] : {};
@@ -589,6 +598,140 @@ var DynamicTonWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
589
598
  })();
590
599
  }
591
600
  },
601
+ {
602
+ key: "importPrivateKey",
603
+ value: function importPrivateKey(param) {
604
+ var privateKey = param.privateKey, chainName = param.chainName, thresholdSignatureScheme = param.thresholdSignatureScheme, _param_password = param.password, password = _param_password === void 0 ? undefined : _param_password, signedSessionId = param.signedSessionId, onError = param.onError, publicAddressCheck = param.publicAddressCheck;
605
+ var _this = this;
606
+ return _async_to_generator(function() {
607
+ var ceremonyCeremonyCompleteResolver, ceremonyCompletePromise, formattedPrivateKey, publicKeyHex, derivedAddress, _ref, rawPublicKey, clientKeyShares, accountAddress, pubKeyBytes, error;
608
+ return _ts_generator(this, function(_state) {
609
+ switch(_state.label){
610
+ case 0:
611
+ _state.trys.push([
612
+ 0,
613
+ 5,
614
+ ,
615
+ 6
616
+ ]);
617
+ ceremonyCompletePromise = new Promise(function(resolve) {
618
+ ceremonyCeremonyCompleteResolver = resolve;
619
+ });
620
+ formattedPrivateKey = privateKey.startsWith('0x') ? privateKey.slice(2) : privateKey;
621
+ publicKeyHex = _this.getPublicKeyFromPrivateKey(formattedPrivateKey);
622
+ derivedAddress = deriveTonAddress({
623
+ publicKeyHex: publicKeyHex,
624
+ workchain: 0
625
+ });
626
+ if (publicAddressCheck && derivedAddress !== publicAddressCheck) {
627
+ throw new Error("Public address mismatch: derived address ".concat(derivedAddress, " !== public address ").concat(publicAddressCheck));
628
+ }
629
+ return [
630
+ 4,
631
+ _this.importRawPrivateKey({
632
+ chainName: chainName,
633
+ thresholdSignatureScheme: thresholdSignatureScheme,
634
+ privateKey: formattedPrivateKey,
635
+ onCeremonyComplete: function(accountAddress, walletId) {
636
+ _this.walletMap[accountAddress] = _object_spread_props(_object_spread({}, _this.walletMap[accountAddress]), {
637
+ accountAddress: accountAddress,
638
+ walletId: walletId,
639
+ thresholdSignatureScheme: thresholdSignatureScheme,
640
+ chainName: _this.chainName,
641
+ clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
642
+ });
643
+ _this.logger.debug('walletMap updated for wallet', {
644
+ context: {
645
+ accountAddress: accountAddress,
646
+ walletId: walletId,
647
+ walletMap: _this.walletMap
648
+ }
649
+ });
650
+ ceremonyCeremonyCompleteResolver(undefined);
651
+ },
652
+ onError: onError
653
+ })
654
+ ];
655
+ case 1:
656
+ _ref = _state.sent(), rawPublicKey = _ref.rawPublicKey, clientKeyShares = _ref.clientKeyShares;
657
+ return [
658
+ 4,
659
+ ceremonyCompletePromise
660
+ ];
661
+ case 2:
662
+ _state.sent();
663
+ if (!rawPublicKey || !clientKeyShares) {
664
+ throw new Error(ERROR_IMPORT_PRIVATE_KEY);
665
+ }
666
+ accountAddress = deriveTonAddress({
667
+ publicKeyHex: rawPublicKey,
668
+ workchain: 0
669
+ });
670
+ if (accountAddress !== derivedAddress) {
671
+ throw new Error("Public key mismatch: derived address ".concat(accountAddress, " !== expected ").concat(derivedAddress));
672
+ }
673
+ // Update client key shares in wallet map
674
+ return [
675
+ 4,
676
+ _this.setClientKeySharesToLocalStorage({
677
+ accountAddress: accountAddress,
678
+ clientKeyShares: clientKeyShares,
679
+ overwriteOrMerge: 'overwrite'
680
+ })
681
+ ];
682
+ case 3:
683
+ _state.sent();
684
+ return [
685
+ 4,
686
+ _this.storeEncryptedBackupByWalletWithRetry({
687
+ accountAddress: accountAddress,
688
+ clientKeyShares: clientKeyShares,
689
+ password: password,
690
+ signedSessionId: signedSessionId
691
+ })
692
+ ];
693
+ case 4:
694
+ _state.sent();
695
+ pubKeyBytes = Buffer.from(rawPublicKey, 'hex');
696
+ return [
697
+ 2,
698
+ {
699
+ accountAddress: accountAddress,
700
+ publicKeyHex: rawPublicKey,
701
+ rawPublicKey: new Uint8Array(pubKeyBytes),
702
+ clientKeyShares: clientKeyShares
703
+ }
704
+ ];
705
+ case 5:
706
+ error = _state.sent();
707
+ _this.logger.error(ERROR_IMPORT_PRIVATE_KEY, error);
708
+ onError === null || onError === void 0 ? void 0 : onError(error);
709
+ throw new Error(ERROR_IMPORT_PRIVATE_KEY);
710
+ case 6:
711
+ return [
712
+ 2
713
+ ];
714
+ }
715
+ });
716
+ })();
717
+ }
718
+ },
719
+ {
720
+ key: "getPublicKeyFromPrivateKey",
721
+ value: function getPublicKeyFromPrivateKey(privateKeyHex) {
722
+ try {
723
+ var privateKeyBytes = Buffer.from(privateKeyHex, 'hex');
724
+ if (privateKeyBytes.length !== 32) {
725
+ throw new Error("Invalid private key length: ".concat(privateKeyBytes.length, ", expected 32"));
726
+ }
727
+ var keyPair = keyPairFromSeed(privateKeyBytes);
728
+ return keyPair.publicKey.toString('hex');
729
+ } catch (error) {
730
+ this.logger.error('Unable to derive public key from private key. Check private key format', _instanceof(error, Error) ? error.message : 'Unknown error');
731
+ throw error;
732
+ }
733
+ }
734
+ },
592
735
  {
593
736
  key: "getTonWallets",
594
737
  value: function getTonWallets() {
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/ton",
3
- "version": "0.0.230",
3
+ "version": "0.0.231",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
7
- "@dynamic-labs-wallet/browser": "0.0.230",
7
+ "@dynamic-labs-wallet/browser": "0.0.231",
8
+ "@ton/crypto": "^3.3.0",
8
9
  "@ton/ton": "^16.0.0",
9
10
  "@dynamic-labs/sdk-api-core": "^0.0.828"
10
11
  },
@@ -1,4 +1,4 @@
1
- import { DynamicWalletClient, type DynamicWalletClientProps, type ThresholdSignatureScheme } from '@dynamic-labs-wallet/browser';
1
+ import { type ClientKeyShare, DynamicWalletClient, type DynamicWalletClientProps, type ThresholdSignatureScheme } from '@dynamic-labs-wallet/browser';
2
2
  import type { SignMessageContext } from '@dynamic-labs/sdk-api-core';
3
3
  export declare class DynamicTonWalletClient extends DynamicWalletClient {
4
4
  readonly chainName = "TON";
@@ -37,6 +37,21 @@ export declare class DynamicTonWalletClient extends DynamicWalletClient {
37
37
  signedSessionId: string;
38
38
  mfaToken?: string;
39
39
  }): Promise<string>;
40
+ importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password, signedSessionId, onError, publicAddressCheck, }: {
41
+ privateKey: string;
42
+ chainName: string;
43
+ thresholdSignatureScheme: ThresholdSignatureScheme;
44
+ password?: string;
45
+ signedSessionId: string;
46
+ onError?: (error: Error) => void;
47
+ publicAddressCheck?: string;
48
+ }): Promise<{
49
+ accountAddress: string;
50
+ publicKeyHex: string;
51
+ rawPublicKey: Uint8Array;
52
+ clientKeyShares: ClientKeyShare[];
53
+ }>;
54
+ getPublicKeyFromPrivateKey(privateKeyHex: string): string;
40
55
  getTonWallets(): Promise<any>;
41
56
  }
42
57
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,KAAK,wBAAwB,EAE7B,KAAK,wBAAwB,EAE9B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAUrE,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;gBAEf,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,KAAK,EACL,YAAY,EACZ,QAA0B,EAC1B,UAAU,EACV,gBAAgB,GACjB,EAAE,wBAAwB;IAerB,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,EACpB,OAAO,EACP,eAAe,GAChB,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,UAAU,CAAC;KAC1B,CAAC;IA0EI,WAAW,CAAC,EAChB,OAAO,EACP,cAAc,EACd,QAAoB,EACpB,eAAe,EACf,QAAQ,EACR,OAAO,EACP,OAAO,GACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,kBAAkB,CAAC;QAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCb,eAAe,CAAC,EACpB,aAAa,EACb,WAAW,EACX,QAAoB,EACpB,eAAe,EACf,QAAQ,EACR,OAAO,EACP,OAAO,GACR,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,kBAAkB,CAAC;QAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC,GAAG,OAAO,CAAC,MAAM,CAAC;IAyCb,gBAAgB,CAAC,EACrB,cAAc,EACd,QAAoB,EACpB,eAAe,EACf,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAqBK,aAAa;CAOpB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}