@dynamic-labs-wallet/browser 0.0.32 → 0.0.33
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 +199 -91
- package/index.esm.js +191 -93
- package/package.json +2 -2
- package/src/client.d.ts +36 -16
- package/src/client.d.ts.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.d.ts.map +1 -1
- package/src/types.d.ts +25 -1
- package/src/types.d.ts.map +1 -1
- package/src/utils.d.ts +12 -0
- package/src/utils.d.ts.map +1 -1
package/index.cjs.js
CHANGED
|
@@ -63,6 +63,47 @@ const isHexString = (str)=>{
|
|
|
63
63
|
const getClientKeyShareExportFileName = ({ thresholdSignatureScheme, accountAddress })=>{
|
|
64
64
|
return `${CLIENT_KEYSHARE_EXPORT_FILENAME_PREFIX}-${thresholdSignatureScheme}-${accountAddress}.json`;
|
|
65
65
|
};
|
|
66
|
+
const getClientKeyShareBackupInfo = (params)=>{
|
|
67
|
+
var _params_walletProperties, _params_walletProperties_keyShares_;
|
|
68
|
+
const backups = {
|
|
69
|
+
[core.BackupLocation.DYNAMIC]: [],
|
|
70
|
+
[core.BackupLocation.GOOGLE_DRIVE]: [],
|
|
71
|
+
[core.BackupLocation.ICLOUD]: [],
|
|
72
|
+
[core.BackupLocation.USER]: [],
|
|
73
|
+
[core.BackupLocation.EXTERNAL]: []
|
|
74
|
+
};
|
|
75
|
+
if (!(params == null ? void 0 : (_params_walletProperties = params.walletProperties) == null ? void 0 : _params_walletProperties.keyShares)) {
|
|
76
|
+
return {
|
|
77
|
+
backups,
|
|
78
|
+
passwordEncrypted: false
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
params.walletProperties.keyShares.forEach((keyShare)=>{
|
|
82
|
+
if (backups[keyShare.backupLocation]) {
|
|
83
|
+
backups[keyShare.backupLocation].push(keyShare.id);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const passwordEncrypted = Boolean((_params_walletProperties_keyShares_ = params.walletProperties.keyShares[0]) == null ? void 0 : _params_walletProperties_keyShares_.passwordEncrypted);
|
|
87
|
+
return {
|
|
88
|
+
backups,
|
|
89
|
+
passwordEncrypted
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Helper function to merge keyshares and remove duplicates based on pubkey and secretShare
|
|
94
|
+
* @param existingKeyShares - Array of existing keyshares
|
|
95
|
+
* @param newKeyShares - Array of new keyshares to merge
|
|
96
|
+
* @returns Array of merged unique keyshares
|
|
97
|
+
*/ const mergeUniqueKeyShares = (existingKeyShares, newKeyShares)=>{
|
|
98
|
+
const uniqueKeyShares = newKeyShares.filter((newShare)=>!existingKeyShares.some((existingShare)=>{
|
|
99
|
+
if (!(newShare == null ? void 0 : newShare.pubkey) || !(existingShare == null ? void 0 : existingShare.pubkey)) return false;
|
|
100
|
+
return newShare.pubkey.toString() === existingShare.pubkey.toString() && newShare.secretShare === existingShare.secretShare;
|
|
101
|
+
}));
|
|
102
|
+
return [
|
|
103
|
+
...existingKeyShares,
|
|
104
|
+
...uniqueKeyShares
|
|
105
|
+
];
|
|
106
|
+
};
|
|
66
107
|
|
|
67
108
|
const PBKDF2_ALGORITHM = 'PBKDF2';
|
|
68
109
|
const PBKDF2_ITERATIONS = 100000;
|
|
@@ -307,6 +348,17 @@ const localStorageWriteTest = {
|
|
|
307
348
|
}
|
|
308
349
|
});
|
|
309
350
|
|
|
351
|
+
var WalletOperation = /*#__PURE__*/ function(WalletOperation) {
|
|
352
|
+
WalletOperation["REACH_THRESHOLD"] = "REACH_THRESHOLD";
|
|
353
|
+
WalletOperation["REACH_ALL_PARTIES"] = "REACH_ALL_PARTIES";
|
|
354
|
+
WalletOperation["SIGN_MESSAGE"] = "SIGN_MESSAGE";
|
|
355
|
+
WalletOperation["SIGN_TRANSACTION"] = "SIGN_TRANSACTION";
|
|
356
|
+
WalletOperation["REFRESH"] = "REFRESH";
|
|
357
|
+
WalletOperation["RESHARE"] = "RESHARE";
|
|
358
|
+
WalletOperation["EXPORT_PRIVATE_KEY"] = "EXPORT_PRIVATE_KEY";
|
|
359
|
+
return WalletOperation;
|
|
360
|
+
}({});
|
|
361
|
+
|
|
310
362
|
const logger = new logger$1.Logger('DynamicWaasWalletClient');
|
|
311
363
|
|
|
312
364
|
class DynamicWalletClient {
|
|
@@ -495,7 +547,8 @@ class DynamicWalletClient {
|
|
|
495
547
|
}
|
|
496
548
|
async refreshWalletAccountShares({ accountAddress, chainName }) {
|
|
497
549
|
const wallet = await this.getWallet({
|
|
498
|
-
accountAddress
|
|
550
|
+
accountAddress,
|
|
551
|
+
walletOperation: WalletOperation.REFRESH
|
|
499
552
|
});
|
|
500
553
|
const mpcSigner = getMPCSigner({
|
|
501
554
|
chainName,
|
|
@@ -566,8 +619,14 @@ class DynamicWalletClient {
|
|
|
566
619
|
};
|
|
567
620
|
}
|
|
568
621
|
async reshare({ chainName, accountAddress, oldThresholdSignatureScheme, newThresholdSignatureScheme }) {
|
|
622
|
+
const { existingClientShareCount } = core.getReshareConfig({
|
|
623
|
+
oldThresholdSignatureScheme,
|
|
624
|
+
newThresholdSignatureScheme
|
|
625
|
+
});
|
|
569
626
|
const wallet = await this.getWallet({
|
|
570
|
-
accountAddress
|
|
627
|
+
accountAddress,
|
|
628
|
+
walletOperation: WalletOperation.RESHARE,
|
|
629
|
+
shareCount: existingClientShareCount
|
|
571
630
|
});
|
|
572
631
|
console.log(`Resharing from ${oldThresholdSignatureScheme} to ${newThresholdSignatureScheme}`);
|
|
573
632
|
const { newClientInitKeygenResults, newClientKeygenIds, existingClientKeygenIds, existingClientKeyShares } = await this.reshareStrategy({
|
|
@@ -714,28 +773,51 @@ class DynamicWalletClient {
|
|
|
714
773
|
const deserializedKeyShare = JSON.parse(decryptedKeyShare);
|
|
715
774
|
return deserializedKeyShare;
|
|
716
775
|
}
|
|
717
|
-
|
|
776
|
+
/**
|
|
777
|
+
* Helper function to determine keyshare recovery strategy for dynamic shares.
|
|
778
|
+
* For REFRESH operations, retrieves enough shares to meet the client threshold.
|
|
779
|
+
* For all other operations, retrieves just 1 share.
|
|
780
|
+
*
|
|
781
|
+
* @param clientKeyShareBackupInfo - Information about backed up key shares
|
|
782
|
+
* @param thresholdSignatureScheme - The signature scheme being used (2-of-2, 2-of-3, etc)
|
|
783
|
+
* @param walletOperation - The operation being performed (REFRESH, SIGN_MESSAGE, etc)
|
|
784
|
+
* @param shareCount - The number of shares to recover if specified for reshare operations
|
|
785
|
+
* @returns Object mapping backup locations to arrays of share IDs to recover
|
|
786
|
+
*/ async recoverStrategy({ clientKeyShareBackupInfo, thresholdSignatureScheme, walletOperation, shareCount = undefined }) {
|
|
787
|
+
const { backups } = clientKeyShareBackupInfo;
|
|
788
|
+
const { clientThreshold } = core.MPC_CONFIG[thresholdSignatureScheme];
|
|
789
|
+
let requiredBackupCount = walletOperation === WalletOperation.REFRESH || walletOperation === WalletOperation.REACH_ALL_PARTIES || walletOperation === WalletOperation.RESHARE ? clientThreshold : 1;
|
|
790
|
+
// Override requiredBackupCount if shareCount is provided
|
|
791
|
+
if (shareCount !== undefined) {
|
|
792
|
+
requiredBackupCount = shareCount;
|
|
793
|
+
}
|
|
794
|
+
const dynamicShares = backups[core.BackupLocation.DYNAMIC].slice(0, requiredBackupCount);
|
|
795
|
+
return {
|
|
796
|
+
[core.BackupLocation.DYNAMIC]: dynamicShares
|
|
797
|
+
};
|
|
798
|
+
}
|
|
799
|
+
async recoverEncryptedBackupByWallet({ accountAddress, password, walletOperation, shareCount = undefined }) {
|
|
718
800
|
const wallet = this.walletMap[accountAddress];
|
|
719
|
-
this.logger.debug(
|
|
801
|
+
this.logger.debug(`recoverEncryptedBackupByWallet wallet: ${walletOperation}`, wallet);
|
|
802
|
+
const { dynamic: dynamicKeyShareIds } = await this.recoverStrategy({
|
|
803
|
+
clientKeyShareBackupInfo: wallet.clientKeySharesBackupInfo,
|
|
804
|
+
thresholdSignatureScheme: wallet.thresholdSignatureScheme,
|
|
805
|
+
walletOperation,
|
|
806
|
+
shareCount
|
|
807
|
+
});
|
|
720
808
|
const data = await this.apiClient.recoverEncryptedBackupByWallet({
|
|
721
|
-
walletId: wallet.walletId
|
|
809
|
+
walletId: wallet.walletId,
|
|
810
|
+
keyShareIds: dynamicKeyShareIds
|
|
722
811
|
});
|
|
723
|
-
|
|
724
|
-
const dynamicKeyShares = data.keyShares.filter((keyShare)=>keyShare.encryptedAccountCredential !== null && keyShare.backupLocation === 'dynamic');
|
|
812
|
+
const dynamicKeyShares = data.keyShares.filter((keyShare)=>keyShare.encryptedAccountCredential !== null && keyShare.backupLocation === core.BackupLocation.DYNAMIC);
|
|
725
813
|
const decryptedKeyShares = await Promise.all(dynamicKeyShares.map((keyShare)=>this.decryptKeyShare({
|
|
726
814
|
keyShare: keyShare.encryptedAccountCredential,
|
|
727
815
|
password: password != null ? password : this.environmentId
|
|
728
816
|
})));
|
|
729
|
-
|
|
730
|
-
this.
|
|
731
|
-
walletId: wallet.walletId,
|
|
732
|
-
accountAddress,
|
|
733
|
-
chainName: data.chainName,
|
|
734
|
-
keyShare,
|
|
735
|
-
thresholdSignatureScheme: wallet.thresholdSignatureScheme,
|
|
736
|
-
derivationPath: wallet.derivationPath
|
|
737
|
-
});
|
|
817
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress], {
|
|
818
|
+
clientKeyShares: mergeUniqueKeyShares(this.walletMap[accountAddress].clientKeyShares || [], decryptedKeyShares)
|
|
738
819
|
});
|
|
820
|
+
await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
|
|
739
821
|
return decryptedKeyShares;
|
|
740
822
|
}
|
|
741
823
|
async restoreWallets() {
|
|
@@ -746,33 +828,10 @@ class DynamicWalletClient {
|
|
|
746
828
|
}
|
|
747
829
|
this.walletMap = JSON.parse(wallets);
|
|
748
830
|
}
|
|
749
|
-
async restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme, derivationPath }) {
|
|
750
|
-
var _this_walletMap_accountAddress;
|
|
751
|
-
// Get existing shares if any
|
|
752
|
-
const existingShares = ((_this_walletMap_accountAddress = this.walletMap[accountAddress]) == null ? void 0 : _this_walletMap_accountAddress.clientKeyShares) || [];
|
|
753
|
-
// Check if this share already exists to prevent duplicates
|
|
754
|
-
const isDuplicate = existingShares.some((existingShare)=>{
|
|
755
|
-
var _existingShare_pubkey, _keyShare_pubkey;
|
|
756
|
-
return ((_existingShare_pubkey = existingShare.pubkey) == null ? void 0 : _existingShare_pubkey.toString()) === ((_keyShare_pubkey = keyShare.pubkey) == null ? void 0 : _keyShare_pubkey.toString()) && existingShare.secretShare === keyShare.secretShare;
|
|
757
|
-
});
|
|
758
|
-
// Only add the share if it's not a duplicate
|
|
759
|
-
const updatedShares = isDuplicate ? existingShares : [
|
|
760
|
-
...existingShares,
|
|
761
|
-
keyShare
|
|
762
|
-
];
|
|
763
|
-
this.walletMap[accountAddress] = {
|
|
764
|
-
walletId,
|
|
765
|
-
chainName,
|
|
766
|
-
accountAddress,
|
|
767
|
-
clientKeyShares: updatedShares,
|
|
768
|
-
thresholdSignatureScheme,
|
|
769
|
-
derivationPath
|
|
770
|
-
};
|
|
771
|
-
await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
|
|
772
|
-
}
|
|
773
831
|
async backupKeySharesToGoogleDrive({ accountAddress, fileName, oauthAccountId, password }) {
|
|
774
832
|
await this.getWallet({
|
|
775
|
-
accountAddress
|
|
833
|
+
accountAddress,
|
|
834
|
+
walletOperation: WalletOperation.REACH_ALL_PARTIES
|
|
776
835
|
});
|
|
777
836
|
const clientKeyShares = this.walletMap[accountAddress].clientKeyShares;
|
|
778
837
|
if (clientKeyShares.length === 0) {
|
|
@@ -857,16 +916,8 @@ class DynamicWalletClient {
|
|
|
857
916
|
keyShare,
|
|
858
917
|
password
|
|
859
918
|
})));
|
|
860
|
-
const existingKeyShares = this.walletMap[accountAddress].clientKeyShares || [];
|
|
861
|
-
const uniqueKeyShares = decryptedKeyShares.filter((newShare)=>!existingKeyShares.some((existingShare)=>{
|
|
862
|
-
if (!(newShare == null ? void 0 : newShare.pubkey) || !(existingShare == null ? void 0 : existingShare.pubkey)) return false;
|
|
863
|
-
return newShare.pubkey.toString() === existingShare.pubkey.toString() && newShare.secretShare === existingShare.secretShare;
|
|
864
|
-
}));
|
|
865
919
|
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress], {
|
|
866
|
-
clientKeyShares: [
|
|
867
|
-
...existingKeyShares,
|
|
868
|
-
...uniqueKeyShares
|
|
869
|
-
]
|
|
920
|
+
clientKeyShares: mergeUniqueKeyShares(this.walletMap[accountAddress].clientKeyShares || [], decryptedKeyShares)
|
|
870
921
|
});
|
|
871
922
|
return decryptedKeyShares;
|
|
872
923
|
}
|
|
@@ -915,6 +966,10 @@ class DynamicWalletClient {
|
|
|
915
966
|
};
|
|
916
967
|
}
|
|
917
968
|
async exportClientKeyshares({ accountAddress }) {
|
|
969
|
+
await this.getWallet({
|
|
970
|
+
accountAddress,
|
|
971
|
+
walletOperation: WalletOperation.REACH_ALL_PARTIES
|
|
972
|
+
});
|
|
918
973
|
const clientKeyShares = await this.getClientKeyShares({
|
|
919
974
|
accountAddress
|
|
920
975
|
});
|
|
@@ -943,69 +998,112 @@ class DynamicWalletClient {
|
|
|
943
998
|
});
|
|
944
999
|
return wallet.clientKeyShares;
|
|
945
1000
|
}
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
1001
|
+
/**
|
|
1002
|
+
* Helper function to check if the required wallet fields are present and valid
|
|
1003
|
+
* @param accountAddress - The account address of the wallet to check
|
|
1004
|
+
* @param walletOperation - The wallet operation that determines required fields
|
|
1005
|
+
* @returns boolean indicating if wallet needs to be re-fetched and restored from server
|
|
1006
|
+
*/ async checkWalletFields({ accountAddress, walletOperation = WalletOperation.REACH_THRESHOLD, shareCount }) {
|
|
1007
|
+
let keyshareCheck = false;
|
|
1008
|
+
let walletCheck = false;
|
|
1009
|
+
let thresholdSignatureSchemeCheck = false;
|
|
1010
|
+
// check if wallet exists
|
|
1011
|
+
const existingWallet = this.walletMap[accountAddress];
|
|
1012
|
+
if (existingWallet) {
|
|
1013
|
+
walletCheck = true;
|
|
1014
|
+
}
|
|
1015
|
+
// check if threshold signature scheme exists
|
|
1016
|
+
if (existingWallet == null ? void 0 : existingWallet.thresholdSignatureScheme) {
|
|
1017
|
+
thresholdSignatureSchemeCheck = true;
|
|
1018
|
+
}
|
|
1019
|
+
// check if wallet already exists with sufficient keyshares
|
|
1020
|
+
if (existingWallet) {
|
|
1021
|
+
var _existingWallet_clientKeyShares;
|
|
1022
|
+
const { dynamic: requiredDynamicKeyShareIds = [] } = await this.recoverStrategy({
|
|
1023
|
+
clientKeyShareBackupInfo: existingWallet.clientKeySharesBackupInfo || {
|
|
1024
|
+
backups: getClientKeyShareBackupInfo()
|
|
1025
|
+
},
|
|
1026
|
+
thresholdSignatureScheme: existingWallet.thresholdSignatureScheme,
|
|
1027
|
+
walletOperation,
|
|
1028
|
+
shareCount
|
|
1029
|
+
});
|
|
1030
|
+
if (requiredDynamicKeyShareIds.length <= (((_existingWallet_clientKeyShares = existingWallet.clientKeyShares) == null ? void 0 : _existingWallet_clientKeyShares.length) || 0)) {
|
|
1031
|
+
keyshareCheck = true;
|
|
974
1032
|
}
|
|
975
1033
|
}
|
|
1034
|
+
return walletCheck && thresholdSignatureSchemeCheck && keyshareCheck;
|
|
1035
|
+
}
|
|
1036
|
+
async getWallet({ accountAddress, walletOperation = WalletOperation.REACH_THRESHOLD, shareCount = undefined }) {
|
|
1037
|
+
var _user_verifiedCredentials;
|
|
1038
|
+
const existingWalletCheck = await this.checkWalletFields({
|
|
1039
|
+
accountAddress,
|
|
1040
|
+
walletOperation,
|
|
1041
|
+
shareCount
|
|
1042
|
+
});
|
|
1043
|
+
if (existingWalletCheck) {
|
|
1044
|
+
this.logger.debug(`Wallet ${accountAddress} already exists`);
|
|
1045
|
+
return this.walletMap[accountAddress];
|
|
1046
|
+
}
|
|
1047
|
+
// Fetch and restore wallet from server
|
|
1048
|
+
const user = await this.apiClient.getUser();
|
|
1049
|
+
const wallet = (_user_verifiedCredentials = user.verifiedCredentials) == null ? void 0 : _user_verifiedCredentials.find((vc)=>vc.address.toLowerCase() === accountAddress.toLowerCase());
|
|
1050
|
+
this.logger.debug('Restoring wallet', wallet);
|
|
1051
|
+
const walletProperties = wallet.walletProperties;
|
|
1052
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress], {
|
|
1053
|
+
walletId: wallet.id,
|
|
1054
|
+
chainName: wallet.chainName,
|
|
1055
|
+
accountAddress,
|
|
1056
|
+
thresholdSignatureScheme: walletProperties.thresholdSignatureScheme,
|
|
1057
|
+
derivationPath: walletProperties.derivationPath,
|
|
1058
|
+
clientKeySharesBackupInfo: getClientKeyShareBackupInfo({
|
|
1059
|
+
walletProperties
|
|
1060
|
+
})
|
|
1061
|
+
});
|
|
1062
|
+
// Restore backup to reach threshold
|
|
1063
|
+
const decryptedKeyShares = await this.recoverEncryptedBackupByWallet({
|
|
1064
|
+
accountAddress,
|
|
1065
|
+
password: this.environmentId,
|
|
1066
|
+
walletOperation: walletOperation,
|
|
1067
|
+
shareCount
|
|
1068
|
+
});
|
|
1069
|
+
this.logger.debug('Recovered backup', decryptedKeyShares);
|
|
976
1070
|
const walletCount = Object.keys(this.walletMap).length;
|
|
977
|
-
// if there are no wallets, throw an error
|
|
978
1071
|
if (walletCount === 0) {
|
|
979
1072
|
throw new Error('No wallets found');
|
|
980
1073
|
}
|
|
981
|
-
//
|
|
1074
|
+
// Return the only wallet if there's just one
|
|
982
1075
|
if (walletCount === 1) {
|
|
983
1076
|
return Object.values(this.walletMap)[0];
|
|
984
1077
|
}
|
|
985
|
-
if (!accountAddress) {
|
|
986
|
-
throw new Error('Must provide an account address');
|
|
987
|
-
}
|
|
988
1078
|
return this.walletMap[accountAddress];
|
|
989
1079
|
}
|
|
990
1080
|
async getWallets() {
|
|
991
1081
|
var _user_verifiedCredentials;
|
|
992
1082
|
const user = await this.apiClient.getUser();
|
|
993
1083
|
const waasWallets = (_user_verifiedCredentials = user.verifiedCredentials) == null ? void 0 : _user_verifiedCredentials.filter((vc)=>vc.walletName === 'dynamicwaas');
|
|
994
|
-
const wallets = waasWallets.map((vc)=>
|
|
1084
|
+
const wallets = waasWallets.map((vc)=>{
|
|
1085
|
+
var _vc_walletProperties;
|
|
1086
|
+
return {
|
|
995
1087
|
walletId: vc.id,
|
|
996
1088
|
chainName: vc.chain,
|
|
997
|
-
accountAddress: vc.address
|
|
998
|
-
|
|
1089
|
+
accountAddress: vc.address,
|
|
1090
|
+
clientKeySharesBackupInfo: getClientKeyShareBackupInfo({
|
|
1091
|
+
walletProperties: vc.walletProperties || {}
|
|
1092
|
+
}),
|
|
1093
|
+
thresholdSignatureScheme: (_vc_walletProperties = vc.walletProperties) == null ? void 0 : _vc_walletProperties.thresholdSignatureScheme
|
|
1094
|
+
};
|
|
1095
|
+
});
|
|
999
1096
|
this.walletMap = wallets.reduce((acc, wallet)=>{
|
|
1000
|
-
var
|
|
1097
|
+
var _acc_wallet_accountAddress, _acc_accountAddress;
|
|
1001
1098
|
const accountAddress = wallet.accountAddress;
|
|
1002
1099
|
acc[wallet.accountAddress] = {
|
|
1003
1100
|
walletId: wallet.walletId,
|
|
1004
1101
|
chainName: wallet.chainName,
|
|
1005
|
-
accountAddress: accountAddress,
|
|
1006
|
-
clientKeyShares: ((
|
|
1007
|
-
|
|
1008
|
-
derivationPath: ((
|
|
1102
|
+
accountAddress: wallet.accountAddress,
|
|
1103
|
+
clientKeyShares: ((_acc_wallet_accountAddress = acc[wallet.accountAddress]) == null ? void 0 : _acc_wallet_accountAddress.clientKeyShares) || [],
|
|
1104
|
+
clientKeySharesBackupInfo: wallet.clientKeySharesBackupInfo,
|
|
1105
|
+
derivationPath: ((_acc_accountAddress = acc[accountAddress]) == null ? void 0 : _acc_accountAddress.derivationPath) || undefined,
|
|
1106
|
+
thresholdSignatureScheme: wallet.thresholdSignatureScheme
|
|
1009
1107
|
};
|
|
1010
1108
|
return acc;
|
|
1011
1109
|
}, {});
|
|
@@ -1088,8 +1186,18 @@ Object.defineProperty(exports, "MessageHash", {
|
|
|
1088
1186
|
get: function () { return web.MessageHash; }
|
|
1089
1187
|
});
|
|
1090
1188
|
exports.DynamicWalletClient = DynamicWalletClient;
|
|
1189
|
+
exports.WalletOperation = WalletOperation;
|
|
1190
|
+
exports.base64ToBytes = base64ToBytes;
|
|
1191
|
+
exports.bytesToBase64 = bytesToBase64;
|
|
1192
|
+
exports.ensureBase64Padding = ensureBase64Padding;
|
|
1193
|
+
exports.getClientKeyShareBackupInfo = getClientKeyShareBackupInfo;
|
|
1194
|
+
exports.getClientKeyShareExportFileName = getClientKeyShareExportFileName;
|
|
1091
1195
|
exports.getMPCSignatureScheme = getMPCSignatureScheme;
|
|
1092
1196
|
exports.getMPCSigner = getMPCSigner;
|
|
1197
|
+
exports.isBrowser = isBrowser;
|
|
1198
|
+
exports.isHexString = isHexString;
|
|
1199
|
+
exports.mergeUniqueKeyShares = mergeUniqueKeyShares;
|
|
1200
|
+
exports.stringToBytes = stringToBytes;
|
|
1093
1201
|
Object.keys(core).forEach(function (k) {
|
|
1094
1202
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
1095
1203
|
enumerable: true,
|
package/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SigningAlgorithm, MPC_RELAY_PROD_API_URL, getMPCChainConfig, getClientThreshold, MPC_CONFIG, getReshareConfig, getTSSConfig, DynamicApiClient } from '@dynamic-labs-wallet/core';
|
|
1
|
+
import { SigningAlgorithm, MPC_RELAY_PROD_API_URL, getMPCChainConfig, BackupLocation, getClientThreshold, MPC_CONFIG, getReshareConfig, getTSSConfig, DynamicApiClient } from '@dynamic-labs-wallet/core';
|
|
2
2
|
export * from '@dynamic-labs-wallet/core';
|
|
3
3
|
import { BIP340, Ed25519, Ecdsa, MessageHash, EcdsaKeygenResult, Ed25519KeygenResult, BIP340KeygenResult } from './internal/web';
|
|
4
4
|
export { BIP340, BIP340InitKeygenResult, BIP340KeygenResult, Ecdsa, EcdsaInitKeygenResult, EcdsaKeygenResult, EcdsaPublicKey, EcdsaSignature, Ed25519, Ed25519InitKeygenResult, Ed25519KeygenResult, MessageHash } from './internal/web';
|
|
@@ -63,6 +63,47 @@ const isHexString = (str)=>{
|
|
|
63
63
|
const getClientKeyShareExportFileName = ({ thresholdSignatureScheme, accountAddress })=>{
|
|
64
64
|
return `${CLIENT_KEYSHARE_EXPORT_FILENAME_PREFIX}-${thresholdSignatureScheme}-${accountAddress}.json`;
|
|
65
65
|
};
|
|
66
|
+
const getClientKeyShareBackupInfo = (params)=>{
|
|
67
|
+
var _params_walletProperties, _params_walletProperties_keyShares_;
|
|
68
|
+
const backups = {
|
|
69
|
+
[BackupLocation.DYNAMIC]: [],
|
|
70
|
+
[BackupLocation.GOOGLE_DRIVE]: [],
|
|
71
|
+
[BackupLocation.ICLOUD]: [],
|
|
72
|
+
[BackupLocation.USER]: [],
|
|
73
|
+
[BackupLocation.EXTERNAL]: []
|
|
74
|
+
};
|
|
75
|
+
if (!(params == null ? void 0 : (_params_walletProperties = params.walletProperties) == null ? void 0 : _params_walletProperties.keyShares)) {
|
|
76
|
+
return {
|
|
77
|
+
backups,
|
|
78
|
+
passwordEncrypted: false
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
params.walletProperties.keyShares.forEach((keyShare)=>{
|
|
82
|
+
if (backups[keyShare.backupLocation]) {
|
|
83
|
+
backups[keyShare.backupLocation].push(keyShare.id);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const passwordEncrypted = Boolean((_params_walletProperties_keyShares_ = params.walletProperties.keyShares[0]) == null ? void 0 : _params_walletProperties_keyShares_.passwordEncrypted);
|
|
87
|
+
return {
|
|
88
|
+
backups,
|
|
89
|
+
passwordEncrypted
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Helper function to merge keyshares and remove duplicates based on pubkey and secretShare
|
|
94
|
+
* @param existingKeyShares - Array of existing keyshares
|
|
95
|
+
* @param newKeyShares - Array of new keyshares to merge
|
|
96
|
+
* @returns Array of merged unique keyshares
|
|
97
|
+
*/ const mergeUniqueKeyShares = (existingKeyShares, newKeyShares)=>{
|
|
98
|
+
const uniqueKeyShares = newKeyShares.filter((newShare)=>!existingKeyShares.some((existingShare)=>{
|
|
99
|
+
if (!(newShare == null ? void 0 : newShare.pubkey) || !(existingShare == null ? void 0 : existingShare.pubkey)) return false;
|
|
100
|
+
return newShare.pubkey.toString() === existingShare.pubkey.toString() && newShare.secretShare === existingShare.secretShare;
|
|
101
|
+
}));
|
|
102
|
+
return [
|
|
103
|
+
...existingKeyShares,
|
|
104
|
+
...uniqueKeyShares
|
|
105
|
+
];
|
|
106
|
+
};
|
|
66
107
|
|
|
67
108
|
const PBKDF2_ALGORITHM = 'PBKDF2';
|
|
68
109
|
const PBKDF2_ITERATIONS = 100000;
|
|
@@ -307,6 +348,17 @@ const localStorageWriteTest = {
|
|
|
307
348
|
}
|
|
308
349
|
});
|
|
309
350
|
|
|
351
|
+
var WalletOperation = /*#__PURE__*/ function(WalletOperation) {
|
|
352
|
+
WalletOperation["REACH_THRESHOLD"] = "REACH_THRESHOLD";
|
|
353
|
+
WalletOperation["REACH_ALL_PARTIES"] = "REACH_ALL_PARTIES";
|
|
354
|
+
WalletOperation["SIGN_MESSAGE"] = "SIGN_MESSAGE";
|
|
355
|
+
WalletOperation["SIGN_TRANSACTION"] = "SIGN_TRANSACTION";
|
|
356
|
+
WalletOperation["REFRESH"] = "REFRESH";
|
|
357
|
+
WalletOperation["RESHARE"] = "RESHARE";
|
|
358
|
+
WalletOperation["EXPORT_PRIVATE_KEY"] = "EXPORT_PRIVATE_KEY";
|
|
359
|
+
return WalletOperation;
|
|
360
|
+
}({});
|
|
361
|
+
|
|
310
362
|
const logger = new Logger('DynamicWaasWalletClient');
|
|
311
363
|
|
|
312
364
|
class DynamicWalletClient {
|
|
@@ -495,7 +547,8 @@ class DynamicWalletClient {
|
|
|
495
547
|
}
|
|
496
548
|
async refreshWalletAccountShares({ accountAddress, chainName }) {
|
|
497
549
|
const wallet = await this.getWallet({
|
|
498
|
-
accountAddress
|
|
550
|
+
accountAddress,
|
|
551
|
+
walletOperation: WalletOperation.REFRESH
|
|
499
552
|
});
|
|
500
553
|
const mpcSigner = getMPCSigner({
|
|
501
554
|
chainName,
|
|
@@ -566,8 +619,14 @@ class DynamicWalletClient {
|
|
|
566
619
|
};
|
|
567
620
|
}
|
|
568
621
|
async reshare({ chainName, accountAddress, oldThresholdSignatureScheme, newThresholdSignatureScheme }) {
|
|
622
|
+
const { existingClientShareCount } = getReshareConfig({
|
|
623
|
+
oldThresholdSignatureScheme,
|
|
624
|
+
newThresholdSignatureScheme
|
|
625
|
+
});
|
|
569
626
|
const wallet = await this.getWallet({
|
|
570
|
-
accountAddress
|
|
627
|
+
accountAddress,
|
|
628
|
+
walletOperation: WalletOperation.RESHARE,
|
|
629
|
+
shareCount: existingClientShareCount
|
|
571
630
|
});
|
|
572
631
|
console.log(`Resharing from ${oldThresholdSignatureScheme} to ${newThresholdSignatureScheme}`);
|
|
573
632
|
const { newClientInitKeygenResults, newClientKeygenIds, existingClientKeygenIds, existingClientKeyShares } = await this.reshareStrategy({
|
|
@@ -714,28 +773,51 @@ class DynamicWalletClient {
|
|
|
714
773
|
const deserializedKeyShare = JSON.parse(decryptedKeyShare);
|
|
715
774
|
return deserializedKeyShare;
|
|
716
775
|
}
|
|
717
|
-
|
|
776
|
+
/**
|
|
777
|
+
* Helper function to determine keyshare recovery strategy for dynamic shares.
|
|
778
|
+
* For REFRESH operations, retrieves enough shares to meet the client threshold.
|
|
779
|
+
* For all other operations, retrieves just 1 share.
|
|
780
|
+
*
|
|
781
|
+
* @param clientKeyShareBackupInfo - Information about backed up key shares
|
|
782
|
+
* @param thresholdSignatureScheme - The signature scheme being used (2-of-2, 2-of-3, etc)
|
|
783
|
+
* @param walletOperation - The operation being performed (REFRESH, SIGN_MESSAGE, etc)
|
|
784
|
+
* @param shareCount - The number of shares to recover if specified for reshare operations
|
|
785
|
+
* @returns Object mapping backup locations to arrays of share IDs to recover
|
|
786
|
+
*/ async recoverStrategy({ clientKeyShareBackupInfo, thresholdSignatureScheme, walletOperation, shareCount = undefined }) {
|
|
787
|
+
const { backups } = clientKeyShareBackupInfo;
|
|
788
|
+
const { clientThreshold } = MPC_CONFIG[thresholdSignatureScheme];
|
|
789
|
+
let requiredBackupCount = walletOperation === WalletOperation.REFRESH || walletOperation === WalletOperation.REACH_ALL_PARTIES || walletOperation === WalletOperation.RESHARE ? clientThreshold : 1;
|
|
790
|
+
// Override requiredBackupCount if shareCount is provided
|
|
791
|
+
if (shareCount !== undefined) {
|
|
792
|
+
requiredBackupCount = shareCount;
|
|
793
|
+
}
|
|
794
|
+
const dynamicShares = backups[BackupLocation.DYNAMIC].slice(0, requiredBackupCount);
|
|
795
|
+
return {
|
|
796
|
+
[BackupLocation.DYNAMIC]: dynamicShares
|
|
797
|
+
};
|
|
798
|
+
}
|
|
799
|
+
async recoverEncryptedBackupByWallet({ accountAddress, password, walletOperation, shareCount = undefined }) {
|
|
718
800
|
const wallet = this.walletMap[accountAddress];
|
|
719
|
-
this.logger.debug(
|
|
801
|
+
this.logger.debug(`recoverEncryptedBackupByWallet wallet: ${walletOperation}`, wallet);
|
|
802
|
+
const { dynamic: dynamicKeyShareIds } = await this.recoverStrategy({
|
|
803
|
+
clientKeyShareBackupInfo: wallet.clientKeySharesBackupInfo,
|
|
804
|
+
thresholdSignatureScheme: wallet.thresholdSignatureScheme,
|
|
805
|
+
walletOperation,
|
|
806
|
+
shareCount
|
|
807
|
+
});
|
|
720
808
|
const data = await this.apiClient.recoverEncryptedBackupByWallet({
|
|
721
|
-
walletId: wallet.walletId
|
|
809
|
+
walletId: wallet.walletId,
|
|
810
|
+
keyShareIds: dynamicKeyShareIds
|
|
722
811
|
});
|
|
723
|
-
|
|
724
|
-
const dynamicKeyShares = data.keyShares.filter((keyShare)=>keyShare.encryptedAccountCredential !== null && keyShare.backupLocation === 'dynamic');
|
|
812
|
+
const dynamicKeyShares = data.keyShares.filter((keyShare)=>keyShare.encryptedAccountCredential !== null && keyShare.backupLocation === BackupLocation.DYNAMIC);
|
|
725
813
|
const decryptedKeyShares = await Promise.all(dynamicKeyShares.map((keyShare)=>this.decryptKeyShare({
|
|
726
814
|
keyShare: keyShare.encryptedAccountCredential,
|
|
727
815
|
password: password != null ? password : this.environmentId
|
|
728
816
|
})));
|
|
729
|
-
|
|
730
|
-
this.
|
|
731
|
-
walletId: wallet.walletId,
|
|
732
|
-
accountAddress,
|
|
733
|
-
chainName: data.chainName,
|
|
734
|
-
keyShare,
|
|
735
|
-
thresholdSignatureScheme: wallet.thresholdSignatureScheme,
|
|
736
|
-
derivationPath: wallet.derivationPath
|
|
737
|
-
});
|
|
817
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress], {
|
|
818
|
+
clientKeyShares: mergeUniqueKeyShares(this.walletMap[accountAddress].clientKeyShares || [], decryptedKeyShares)
|
|
738
819
|
});
|
|
820
|
+
await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
|
|
739
821
|
return decryptedKeyShares;
|
|
740
822
|
}
|
|
741
823
|
async restoreWallets() {
|
|
@@ -746,33 +828,10 @@ class DynamicWalletClient {
|
|
|
746
828
|
}
|
|
747
829
|
this.walletMap = JSON.parse(wallets);
|
|
748
830
|
}
|
|
749
|
-
async restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme, derivationPath }) {
|
|
750
|
-
var _this_walletMap_accountAddress;
|
|
751
|
-
// Get existing shares if any
|
|
752
|
-
const existingShares = ((_this_walletMap_accountAddress = this.walletMap[accountAddress]) == null ? void 0 : _this_walletMap_accountAddress.clientKeyShares) || [];
|
|
753
|
-
// Check if this share already exists to prevent duplicates
|
|
754
|
-
const isDuplicate = existingShares.some((existingShare)=>{
|
|
755
|
-
var _existingShare_pubkey, _keyShare_pubkey;
|
|
756
|
-
return ((_existingShare_pubkey = existingShare.pubkey) == null ? void 0 : _existingShare_pubkey.toString()) === ((_keyShare_pubkey = keyShare.pubkey) == null ? void 0 : _keyShare_pubkey.toString()) && existingShare.secretShare === keyShare.secretShare;
|
|
757
|
-
});
|
|
758
|
-
// Only add the share if it's not a duplicate
|
|
759
|
-
const updatedShares = isDuplicate ? existingShares : [
|
|
760
|
-
...existingShares,
|
|
761
|
-
keyShare
|
|
762
|
-
];
|
|
763
|
-
this.walletMap[accountAddress] = {
|
|
764
|
-
walletId,
|
|
765
|
-
chainName,
|
|
766
|
-
accountAddress,
|
|
767
|
-
clientKeyShares: updatedShares,
|
|
768
|
-
thresholdSignatureScheme,
|
|
769
|
-
derivationPath
|
|
770
|
-
};
|
|
771
|
-
await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
|
|
772
|
-
}
|
|
773
831
|
async backupKeySharesToGoogleDrive({ accountAddress, fileName, oauthAccountId, password }) {
|
|
774
832
|
await this.getWallet({
|
|
775
|
-
accountAddress
|
|
833
|
+
accountAddress,
|
|
834
|
+
walletOperation: WalletOperation.REACH_ALL_PARTIES
|
|
776
835
|
});
|
|
777
836
|
const clientKeyShares = this.walletMap[accountAddress].clientKeyShares;
|
|
778
837
|
if (clientKeyShares.length === 0) {
|
|
@@ -857,16 +916,8 @@ class DynamicWalletClient {
|
|
|
857
916
|
keyShare,
|
|
858
917
|
password
|
|
859
918
|
})));
|
|
860
|
-
const existingKeyShares = this.walletMap[accountAddress].clientKeyShares || [];
|
|
861
|
-
const uniqueKeyShares = decryptedKeyShares.filter((newShare)=>!existingKeyShares.some((existingShare)=>{
|
|
862
|
-
if (!(newShare == null ? void 0 : newShare.pubkey) || !(existingShare == null ? void 0 : existingShare.pubkey)) return false;
|
|
863
|
-
return newShare.pubkey.toString() === existingShare.pubkey.toString() && newShare.secretShare === existingShare.secretShare;
|
|
864
|
-
}));
|
|
865
919
|
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress], {
|
|
866
|
-
clientKeyShares: [
|
|
867
|
-
...existingKeyShares,
|
|
868
|
-
...uniqueKeyShares
|
|
869
|
-
]
|
|
920
|
+
clientKeyShares: mergeUniqueKeyShares(this.walletMap[accountAddress].clientKeyShares || [], decryptedKeyShares)
|
|
870
921
|
});
|
|
871
922
|
return decryptedKeyShares;
|
|
872
923
|
}
|
|
@@ -915,6 +966,10 @@ class DynamicWalletClient {
|
|
|
915
966
|
};
|
|
916
967
|
}
|
|
917
968
|
async exportClientKeyshares({ accountAddress }) {
|
|
969
|
+
await this.getWallet({
|
|
970
|
+
accountAddress,
|
|
971
|
+
walletOperation: WalletOperation.REACH_ALL_PARTIES
|
|
972
|
+
});
|
|
918
973
|
const clientKeyShares = await this.getClientKeyShares({
|
|
919
974
|
accountAddress
|
|
920
975
|
});
|
|
@@ -943,69 +998,112 @@ class DynamicWalletClient {
|
|
|
943
998
|
});
|
|
944
999
|
return wallet.clientKeyShares;
|
|
945
1000
|
}
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
1001
|
+
/**
|
|
1002
|
+
* Helper function to check if the required wallet fields are present and valid
|
|
1003
|
+
* @param accountAddress - The account address of the wallet to check
|
|
1004
|
+
* @param walletOperation - The wallet operation that determines required fields
|
|
1005
|
+
* @returns boolean indicating if wallet needs to be re-fetched and restored from server
|
|
1006
|
+
*/ async checkWalletFields({ accountAddress, walletOperation = WalletOperation.REACH_THRESHOLD, shareCount }) {
|
|
1007
|
+
let keyshareCheck = false;
|
|
1008
|
+
let walletCheck = false;
|
|
1009
|
+
let thresholdSignatureSchemeCheck = false;
|
|
1010
|
+
// check if wallet exists
|
|
1011
|
+
const existingWallet = this.walletMap[accountAddress];
|
|
1012
|
+
if (existingWallet) {
|
|
1013
|
+
walletCheck = true;
|
|
1014
|
+
}
|
|
1015
|
+
// check if threshold signature scheme exists
|
|
1016
|
+
if (existingWallet == null ? void 0 : existingWallet.thresholdSignatureScheme) {
|
|
1017
|
+
thresholdSignatureSchemeCheck = true;
|
|
1018
|
+
}
|
|
1019
|
+
// check if wallet already exists with sufficient keyshares
|
|
1020
|
+
if (existingWallet) {
|
|
1021
|
+
var _existingWallet_clientKeyShares;
|
|
1022
|
+
const { dynamic: requiredDynamicKeyShareIds = [] } = await this.recoverStrategy({
|
|
1023
|
+
clientKeyShareBackupInfo: existingWallet.clientKeySharesBackupInfo || {
|
|
1024
|
+
backups: getClientKeyShareBackupInfo()
|
|
1025
|
+
},
|
|
1026
|
+
thresholdSignatureScheme: existingWallet.thresholdSignatureScheme,
|
|
1027
|
+
walletOperation,
|
|
1028
|
+
shareCount
|
|
1029
|
+
});
|
|
1030
|
+
if (requiredDynamicKeyShareIds.length <= (((_existingWallet_clientKeyShares = existingWallet.clientKeyShares) == null ? void 0 : _existingWallet_clientKeyShares.length) || 0)) {
|
|
1031
|
+
keyshareCheck = true;
|
|
974
1032
|
}
|
|
975
1033
|
}
|
|
1034
|
+
return walletCheck && thresholdSignatureSchemeCheck && keyshareCheck;
|
|
1035
|
+
}
|
|
1036
|
+
async getWallet({ accountAddress, walletOperation = WalletOperation.REACH_THRESHOLD, shareCount = undefined }) {
|
|
1037
|
+
var _user_verifiedCredentials;
|
|
1038
|
+
const existingWalletCheck = await this.checkWalletFields({
|
|
1039
|
+
accountAddress,
|
|
1040
|
+
walletOperation,
|
|
1041
|
+
shareCount
|
|
1042
|
+
});
|
|
1043
|
+
if (existingWalletCheck) {
|
|
1044
|
+
this.logger.debug(`Wallet ${accountAddress} already exists`);
|
|
1045
|
+
return this.walletMap[accountAddress];
|
|
1046
|
+
}
|
|
1047
|
+
// Fetch and restore wallet from server
|
|
1048
|
+
const user = await this.apiClient.getUser();
|
|
1049
|
+
const wallet = (_user_verifiedCredentials = user.verifiedCredentials) == null ? void 0 : _user_verifiedCredentials.find((vc)=>vc.address.toLowerCase() === accountAddress.toLowerCase());
|
|
1050
|
+
this.logger.debug('Restoring wallet', wallet);
|
|
1051
|
+
const walletProperties = wallet.walletProperties;
|
|
1052
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress], {
|
|
1053
|
+
walletId: wallet.id,
|
|
1054
|
+
chainName: wallet.chainName,
|
|
1055
|
+
accountAddress,
|
|
1056
|
+
thresholdSignatureScheme: walletProperties.thresholdSignatureScheme,
|
|
1057
|
+
derivationPath: walletProperties.derivationPath,
|
|
1058
|
+
clientKeySharesBackupInfo: getClientKeyShareBackupInfo({
|
|
1059
|
+
walletProperties
|
|
1060
|
+
})
|
|
1061
|
+
});
|
|
1062
|
+
// Restore backup to reach threshold
|
|
1063
|
+
const decryptedKeyShares = await this.recoverEncryptedBackupByWallet({
|
|
1064
|
+
accountAddress,
|
|
1065
|
+
password: this.environmentId,
|
|
1066
|
+
walletOperation: walletOperation,
|
|
1067
|
+
shareCount
|
|
1068
|
+
});
|
|
1069
|
+
this.logger.debug('Recovered backup', decryptedKeyShares);
|
|
976
1070
|
const walletCount = Object.keys(this.walletMap).length;
|
|
977
|
-
// if there are no wallets, throw an error
|
|
978
1071
|
if (walletCount === 0) {
|
|
979
1072
|
throw new Error('No wallets found');
|
|
980
1073
|
}
|
|
981
|
-
//
|
|
1074
|
+
// Return the only wallet if there's just one
|
|
982
1075
|
if (walletCount === 1) {
|
|
983
1076
|
return Object.values(this.walletMap)[0];
|
|
984
1077
|
}
|
|
985
|
-
if (!accountAddress) {
|
|
986
|
-
throw new Error('Must provide an account address');
|
|
987
|
-
}
|
|
988
1078
|
return this.walletMap[accountAddress];
|
|
989
1079
|
}
|
|
990
1080
|
async getWallets() {
|
|
991
1081
|
var _user_verifiedCredentials;
|
|
992
1082
|
const user = await this.apiClient.getUser();
|
|
993
1083
|
const waasWallets = (_user_verifiedCredentials = user.verifiedCredentials) == null ? void 0 : _user_verifiedCredentials.filter((vc)=>vc.walletName === 'dynamicwaas');
|
|
994
|
-
const wallets = waasWallets.map((vc)=>
|
|
1084
|
+
const wallets = waasWallets.map((vc)=>{
|
|
1085
|
+
var _vc_walletProperties;
|
|
1086
|
+
return {
|
|
995
1087
|
walletId: vc.id,
|
|
996
1088
|
chainName: vc.chain,
|
|
997
|
-
accountAddress: vc.address
|
|
998
|
-
|
|
1089
|
+
accountAddress: vc.address,
|
|
1090
|
+
clientKeySharesBackupInfo: getClientKeyShareBackupInfo({
|
|
1091
|
+
walletProperties: vc.walletProperties || {}
|
|
1092
|
+
}),
|
|
1093
|
+
thresholdSignatureScheme: (_vc_walletProperties = vc.walletProperties) == null ? void 0 : _vc_walletProperties.thresholdSignatureScheme
|
|
1094
|
+
};
|
|
1095
|
+
});
|
|
999
1096
|
this.walletMap = wallets.reduce((acc, wallet)=>{
|
|
1000
|
-
var
|
|
1097
|
+
var _acc_wallet_accountAddress, _acc_accountAddress;
|
|
1001
1098
|
const accountAddress = wallet.accountAddress;
|
|
1002
1099
|
acc[wallet.accountAddress] = {
|
|
1003
1100
|
walletId: wallet.walletId,
|
|
1004
1101
|
chainName: wallet.chainName,
|
|
1005
|
-
accountAddress: accountAddress,
|
|
1006
|
-
clientKeyShares: ((
|
|
1007
|
-
|
|
1008
|
-
derivationPath: ((
|
|
1102
|
+
accountAddress: wallet.accountAddress,
|
|
1103
|
+
clientKeyShares: ((_acc_wallet_accountAddress = acc[wallet.accountAddress]) == null ? void 0 : _acc_wallet_accountAddress.clientKeyShares) || [],
|
|
1104
|
+
clientKeySharesBackupInfo: wallet.clientKeySharesBackupInfo,
|
|
1105
|
+
derivationPath: ((_acc_accountAddress = acc[accountAddress]) == null ? void 0 : _acc_accountAddress.derivationPath) || undefined,
|
|
1106
|
+
thresholdSignatureScheme: wallet.thresholdSignatureScheme
|
|
1009
1107
|
};
|
|
1010
1108
|
return acc;
|
|
1011
1109
|
}, {});
|
|
@@ -1039,4 +1137,4 @@ class DynamicWalletClient {
|
|
|
1039
1137
|
}
|
|
1040
1138
|
}
|
|
1041
1139
|
|
|
1042
|
-
export { DynamicWalletClient, getMPCSignatureScheme, getMPCSigner };
|
|
1140
|
+
export { DynamicWalletClient, WalletOperation, base64ToBytes, bytesToBase64, ensureBase64Padding, getClientKeyShareBackupInfo, getClientKeyShareExportFileName, getMPCSignatureScheme, getMPCSigner, isBrowser, isHexString, mergeUniqueKeyShares, stringToBytes };
|
package/package.json
CHANGED
package/src/client.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ThresholdSignatureScheme, DynamicApiClient } from '@dynamic-labs-wallet/core';
|
|
1
|
+
import { ThresholdSignatureScheme, DynamicApiClient, BackupLocation } from '@dynamic-labs-wallet/core';
|
|
2
2
|
import { EcdsaPublicKey, EcdsaKeygenResult, Ed25519KeygenResult, BIP340KeygenResult, EcdsaSignature } from '../../internal/web';
|
|
3
3
|
import { ClientInitKeygenResult, ClientKeyShare } from './mpc/types';
|
|
4
4
|
import { SupportedStorage } from './services/localStorage';
|
|
5
|
-
import { DynamicWalletClientProps, InitializeResult, WalletProperties } from './types';
|
|
5
|
+
import { DynamicWalletClientProps, InitializeResult, KeyShareBackupInfo, WalletProperties, WalletOperation } from './types';
|
|
6
6
|
export declare class DynamicWalletClient {
|
|
7
7
|
environmentId: string;
|
|
8
8
|
storageKey: string;
|
|
@@ -65,7 +65,7 @@ export declare class DynamicWalletClient {
|
|
|
65
65
|
derivationPath: Uint32Array | undefined;
|
|
66
66
|
}): Promise<Uint8Array | EcdsaSignature>;
|
|
67
67
|
sign({ accountAddress, message, chainName, }: {
|
|
68
|
-
accountAddress
|
|
68
|
+
accountAddress: string;
|
|
69
69
|
message: string | Uint8Array;
|
|
70
70
|
chainName: string;
|
|
71
71
|
}): Promise<Uint8Array | EcdsaSignature>;
|
|
@@ -133,19 +133,30 @@ export declare class DynamicWalletClient {
|
|
|
133
133
|
keyShare: string;
|
|
134
134
|
password?: string;
|
|
135
135
|
}): Promise<ClientKeyShare>;
|
|
136
|
-
|
|
136
|
+
/**
|
|
137
|
+
* Helper function to determine keyshare recovery strategy for dynamic shares.
|
|
138
|
+
* For REFRESH operations, retrieves enough shares to meet the client threshold.
|
|
139
|
+
* For all other operations, retrieves just 1 share.
|
|
140
|
+
*
|
|
141
|
+
* @param clientKeyShareBackupInfo - Information about backed up key shares
|
|
142
|
+
* @param thresholdSignatureScheme - The signature scheme being used (2-of-2, 2-of-3, etc)
|
|
143
|
+
* @param walletOperation - The operation being performed (REFRESH, SIGN_MESSAGE, etc)
|
|
144
|
+
* @param shareCount - The number of shares to recover if specified for reshare operations
|
|
145
|
+
* @returns Object mapping backup locations to arrays of share IDs to recover
|
|
146
|
+
*/
|
|
147
|
+
recoverStrategy({ clientKeyShareBackupInfo, thresholdSignatureScheme, walletOperation, shareCount, }: {
|
|
148
|
+
clientKeyShareBackupInfo: KeyShareBackupInfo;
|
|
149
|
+
thresholdSignatureScheme: ThresholdSignatureScheme;
|
|
150
|
+
walletOperation: WalletOperation;
|
|
151
|
+
shareCount?: number;
|
|
152
|
+
}): Promise<Partial<Record<BackupLocation, string[]>>>;
|
|
153
|
+
recoverEncryptedBackupByWallet({ accountAddress, password, walletOperation, shareCount, }: {
|
|
137
154
|
accountAddress: string;
|
|
138
155
|
password?: string;
|
|
156
|
+
walletOperation: WalletOperation;
|
|
157
|
+
shareCount?: number;
|
|
139
158
|
}): Promise<any[]>;
|
|
140
159
|
restoreWallets(): Promise<void>;
|
|
141
|
-
restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme, derivationPath, }: {
|
|
142
|
-
walletId: string;
|
|
143
|
-
accountAddress: string;
|
|
144
|
-
chainName: string;
|
|
145
|
-
keyShare: ClientKeyShare;
|
|
146
|
-
thresholdSignatureScheme: ThresholdSignatureScheme;
|
|
147
|
-
derivationPath?: string;
|
|
148
|
-
}): Promise<void>;
|
|
149
160
|
backupKeySharesToGoogleDrive({ accountAddress, fileName, oauthAccountId, password, }: {
|
|
150
161
|
accountAddress: string;
|
|
151
162
|
fileName?: string;
|
|
@@ -170,13 +181,22 @@ export declare class DynamicWalletClient {
|
|
|
170
181
|
clientKeyShares: ClientKeyShare[];
|
|
171
182
|
}>;
|
|
172
183
|
exportClientKeyshares({ accountAddress }: {
|
|
173
|
-
accountAddress
|
|
184
|
+
accountAddress: string;
|
|
174
185
|
}): Promise<void>;
|
|
175
186
|
getClientKeyShares({ accountAddress }: {
|
|
176
|
-
accountAddress
|
|
187
|
+
accountAddress: string;
|
|
177
188
|
}): Promise<ClientKeyShare[]>;
|
|
178
|
-
|
|
179
|
-
|
|
189
|
+
/**
|
|
190
|
+
* Helper function to check if the required wallet fields are present and valid
|
|
191
|
+
* @param accountAddress - The account address of the wallet to check
|
|
192
|
+
* @param walletOperation - The wallet operation that determines required fields
|
|
193
|
+
* @returns boolean indicating if wallet needs to be re-fetched and restored from server
|
|
194
|
+
*/
|
|
195
|
+
private checkWalletFields;
|
|
196
|
+
getWallet({ accountAddress, walletOperation, shareCount, }: {
|
|
197
|
+
accountAddress: string;
|
|
198
|
+
walletOperation?: WalletOperation;
|
|
199
|
+
shareCount?: number;
|
|
180
200
|
}): Promise<WalletProperties>;
|
|
181
201
|
getWallets(): Promise<any>;
|
|
182
202
|
}
|
package/src/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../packages/src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,wBAAwB,EACxB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../packages/src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,wBAAwB,EACxB,gBAAgB,EAIhB,cAAc,EACf,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAIL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAElB,cAAc,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoBrE,OAAO,EAGL,gBAAgB,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEL,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,SAAS,CAAC;AAIjB,qBAAa,mBAAmB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IAEtB,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAQ;IACrE,SAAS,CAAC,MAAM,wCAAU;IAC1B,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACtC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAM;IAC3D,SAAS,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACpC,SAAS,CAAC,aAAa,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IACjE,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;gBAE1B,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,KAAK,GACN,EAAE,wBAAwB;IA0BrB,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAY7C;;OAEG;YACW,WAAW;IAanB,sBAAsB,CAAC,EAC3B,SAAS,EACT,eAAe,EACf,wBAAwB,GACzB,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,wBAAwB,EAAE,wBAAwB,CAAC;KACpD;IAYK,sBAAsB,CAAC,EAC3B,SAAS,EACT,wBAAwB,GACzB,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,wBAAwB,EAAE,wBAAwB,CAAC;KACpD,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAkB/B,eAAe,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,cAAc,GACf,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,cAAc,CAAC;QACzB,cAAc,EAAE,WAAW,GAAG,SAAS,CAAC;KACzC;IAcK,YAAY,CAAC,EACjB,SAAS,EACT,MAAM,EACN,eAAe,EACf,uBAAuB,EACvB,wBAAwB,GACzB,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,uBAAuB,EAAE,sBAAsB,EAAE,CAAC;QAClD,wBAAwB,EAAE,wBAAwB,CAAC;KACpD,GAAG,OAAO,CAAC;QACV,YAAY,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;QACtD,mBAAmB,EAAE,cAAc,EAAE,CAAC;KACvC,CAAC;IAgDI,MAAM,CAAC,EACX,SAAS,EACT,wBAAwB,GACzB,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,wBAAwB,EAAE,wBAAwB,CAAC;KACpD,GAAG,OAAO,CAAC;QACV,YAAY,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;QACtD,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;IAkCI,UAAU,CAAC,EACf,QAAQ,EACR,OAAO,GACR,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;KAC9B;IAWK,UAAU,CAAC,EACf,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,GACf,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,cAAc,CAAC;QACzB,cAAc,EAAE,WAAW,GAAG,SAAS,CAAC;KACzC,GAAG,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC;IAwClC,IAAI,CAAC,EACT,cAAc,EACd,OAAO,EACP,SAAS,GACV,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC;IAsBlC,0BAA0B,CAAC,EAC/B,cAAc,EACd,SAAS,GACV,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB;IAoCK,WAAW,CAAC,EAChB,SAAS,EACT,cAAc,GACf,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EACV,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,CAAC;KACxB;IASD;;;;;;;;;;;;;OAaG;IACG,eAAe,CAAC,EACpB,SAAS,EACT,MAAM,EACN,2BAA2B,EAC3B,2BAA2B,GAC5B,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,gBAAgB,CAAC;QACzB,2BAA2B,EAAE,wBAAwB,CAAC;QACtD,2BAA2B,EAAE,wBAAwB,CAAC;KACvD,GAAG,OAAO,CAAC;QACV,0BAA0B,EAAE,sBAAsB,EAAE,CAAC;QACrD,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,uBAAuB,EAAE,cAAc,EAAE,CAAC;KAC3C,CAAC;IA2CI,OAAO,CAAC,EACZ,SAAS,EACT,cAAc,EACd,2BAA2B,EAC3B,2BAA2B,GAC5B,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,2BAA2B,EAAE,wBAAwB,CAAC;QACtD,2BAA2B,EAAE,wBAAwB,CAAC;KACvD;IAsFK,SAAS,CAAC,EACd,cAAc,EACd,SAAS,GACV,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB;;;IA8CK,gBAAgB,CAAC,EACrB,SAAS,EACT,SAAS,EACT,cAAc,GACf,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,cAAc,EAAE,CAAC;QAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;;;IA+DK,eAAe,CAAC,EACpB,QAAQ,EACR,QAAQ,GACT,EAAE;QACD,QAAQ,EAAE,cAAc,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAaK,4BAA4B,CAAC,EACjC,cAAc,EACd,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAiBK,eAAe,CAAC,EACpB,QAAQ,EACR,QAAQ,GACT,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,CAAC;IAY3B;;;;;;;;;;OAUG;IACG,eAAe,CAAC,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,UAAsB,GACvB,EAAE;QACD,wBAAwB,EAAE,kBAAkB,CAAC;QAC7C,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,eAAe,EAAE,eAAe,CAAC;QACjC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAuBhD,8BAA8B,CAAC,EACnC,cAAc,EACd,QAAQ,EACR,eAAe,EACf,UAAsB,GACvB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,eAAe,CAAC;QACjC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IA8CK,cAAc;IASd,4BAA4B,CAAC,EACjC,cAAc,EACd,QAAQ,EACR,cAAc,EACd,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;;IAiEK,4BAA4B,CAAC,EACjC,cAAc,EACd,cAAc,EACd,IAAI,EACJ,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC;IAkD9B,mBAAmB,CAAC,EACxB,SAAS,EACT,UAAU,EACV,wBAAwB,GACzB,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,wBAAwB,EAAE,wBAAwB,CAAC;KACpD,GAAG,OAAO,CAAC;QACV,YAAY,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;QACtD,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;IAkEI,qBAAqB,CAAC,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;IAyBpE,kBAAkB,CAAC,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;IAKvE;;;;;OAKG;YACW,iBAAiB;IA2CzB,SAAS,CAAC,EACd,cAAc,EACd,eAAiD,EACjD,UAAsB,GACvB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IAqDK,UAAU;CAiCjB"}
|
package/src/index.d.ts
CHANGED
package/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAE1C,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AAExB,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAE1C,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AAExB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
|
package/src/types.d.ts
CHANGED
|
@@ -1,16 +1,40 @@
|
|
|
1
|
-
import { ThresholdSignatureScheme } from '.';
|
|
1
|
+
import { BackupLocation, ThresholdSignatureScheme } from '.';
|
|
2
2
|
import { ClientKeyShare } from './mpc/types';
|
|
3
3
|
export type InitializeResult = {
|
|
4
4
|
error: unknown | null;
|
|
5
5
|
};
|
|
6
|
+
export declare enum WalletOperation {
|
|
7
|
+
REACH_THRESHOLD = "REACH_THRESHOLD",
|
|
8
|
+
REACH_ALL_PARTIES = "REACH_ALL_PARTIES",
|
|
9
|
+
SIGN_MESSAGE = "SIGN_MESSAGE",
|
|
10
|
+
SIGN_TRANSACTION = "SIGN_TRANSACTION",
|
|
11
|
+
REFRESH = "REFRESH",
|
|
12
|
+
RESHARE = "RESHARE",
|
|
13
|
+
EXPORT_PRIVATE_KEY = "EXPORT_PRIVATE_KEY"
|
|
14
|
+
}
|
|
6
15
|
export interface WalletProperties {
|
|
7
16
|
chainName: string;
|
|
8
17
|
walletId: string;
|
|
9
18
|
accountAddress: string;
|
|
10
19
|
clientKeyShares: ClientKeyShare[];
|
|
20
|
+
clientKeySharesBackupInfo: KeyShareBackupInfo;
|
|
11
21
|
thresholdSignatureScheme: ThresholdSignatureScheme;
|
|
12
22
|
derivationPath?: string;
|
|
13
23
|
}
|
|
24
|
+
export interface KeyShareBackupInfo {
|
|
25
|
+
passwordEncrypted: boolean;
|
|
26
|
+
backups: Record<BackupLocation, string[]>;
|
|
27
|
+
}
|
|
28
|
+
export interface WaasWalletProperties {
|
|
29
|
+
derivationPath: string;
|
|
30
|
+
keyShares: KeyShareInfo[];
|
|
31
|
+
thresholdSignatureScheme: ThresholdSignatureScheme;
|
|
32
|
+
}
|
|
33
|
+
export interface KeyShareInfo {
|
|
34
|
+
id: string;
|
|
35
|
+
backupLocation: BackupLocation;
|
|
36
|
+
passwordEncrypted: boolean;
|
|
37
|
+
}
|
|
14
38
|
export interface DynamicWalletClientProps {
|
|
15
39
|
environmentId: string;
|
|
16
40
|
authToken: string;
|
package/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../packages/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../packages/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,GAAG,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,CAAC;AAEzD,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;IAC7B,gBAAgB,qBAAqB;IACrC,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,yBAAyB,EAAE,kBAAkB,CAAC;IAC9C,wBAAwB,EAAE,wBAAwB,CAAC;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,wBAAwB,EAAE,wBAAwB,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,CAAC,EAAE;YACX,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,CAAC;YACtB,UAAU,EAAE,MAAM,CAAC;YACnB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC"}
|
package/src/utils.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { ThresholdSignatureScheme } from "@dynamic-labs-wallet/core";
|
|
2
|
+
import { KeyShareBackupInfo, WaasWalletProperties } from "./types";
|
|
3
|
+
import { ClientKeyShare } from "./mpc/types";
|
|
2
4
|
export declare const bytesToBase64: (arr: Uint8Array) => string;
|
|
3
5
|
export declare const stringToBytes: (str: string) => Uint8Array;
|
|
4
6
|
export declare const base64ToBytes: (base64: string) => Uint8Array;
|
|
@@ -9,4 +11,14 @@ export declare const getClientKeyShareExportFileName: ({ thresholdSignatureSchem
|
|
|
9
11
|
thresholdSignatureScheme: ThresholdSignatureScheme;
|
|
10
12
|
accountAddress: string;
|
|
11
13
|
}) => string;
|
|
14
|
+
export declare const getClientKeyShareBackupInfo: (params?: {
|
|
15
|
+
walletProperties: WaasWalletProperties;
|
|
16
|
+
}) => KeyShareBackupInfo;
|
|
17
|
+
/**
|
|
18
|
+
* Helper function to merge keyshares and remove duplicates based on pubkey and secretShare
|
|
19
|
+
* @param existingKeyShares - Array of existing keyshares
|
|
20
|
+
* @param newKeyShares - Array of new keyshares to merge
|
|
21
|
+
* @returns Array of merged unique keyshares
|
|
22
|
+
*/
|
|
23
|
+
export declare const mergeUniqueKeyShares: (existingKeyShares: ClientKeyShare[], newKeyShares: ClientKeyShare[]) => ClientKeyShare[];
|
|
12
24
|
//# sourceMappingURL=utils.d.ts.map
|
package/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../packages/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../packages/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,eAAO,MAAM,aAAa,QAAS,UAAU,WAE5C,CAAC;AAEF,eAAO,MAAM,aAAa,QAAS,MAAM,eAExC,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,MAAM,eAE3C,CAAC;AAGF,eAAO,MAAM,mBAAmB,QAAS,MAAM,KAAG,MAEjD,CAAC;AAEF,eAAO,MAAM,SAAS,eAAsC,CAAC;AAE7D,eAAO,MAAM,WAAW,QAAS,MAAM,YAKtC,CAAC;AAEF,eAAO,MAAM,+BAA+B,kDAGzC;IACD,wBAAwB,EAAE,wBAAwB,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB,WAEE,CAAC;AAEJ,eAAO,MAAM,2BAA2B,YAAa;IACnD,gBAAgB,EAAE,oBAAoB,CAAC;CACxC,KAAG,kBA4BH,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,sBACZ,cAAc,EAAE,gBACrB,cAAc,EAAE,KAC7B,cAAc,EAchB,CAAC"}
|