@talismn/keyring 1.0.12 → 2.0.0
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/LICENSE +253 -674
- package/dist/index.d.mts +130 -125
- package/dist/index.d.mts.map +1 -0
- package/dist/index.d.ts +130 -125
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +381 -473
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +362 -449
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.d.ts
CHANGED
|
@@ -1,99 +1,101 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { KeypairCurve } from "@talismn/crypto";
|
|
2
|
+
//#region src/types/account.d.ts
|
|
4
3
|
type LedgerPolkadotCurve = "ed25519" | "ethereum";
|
|
5
4
|
type AccountBase = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
address: string;
|
|
6
|
+
name: string;
|
|
7
|
+
createdAt: number;
|
|
9
8
|
};
|
|
10
9
|
type AccountKeypair = AccountBase & {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
type: "keypair";
|
|
11
|
+
curve: KeypairCurve;
|
|
12
|
+
mnemonicId?: string;
|
|
13
|
+
derivationPath?: string;
|
|
15
14
|
};
|
|
16
15
|
type AccountContact = AccountBase & {
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
type: "contact";
|
|
17
|
+
genesisHash?: `0x${string}`;
|
|
19
18
|
};
|
|
20
19
|
type AccountWatchOnly = AccountBase & {
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
type: "watch-only";
|
|
21
|
+
isPortfolio: boolean;
|
|
23
22
|
};
|
|
24
23
|
type AccountLedgerPolkadot = AccountBase & {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
type: "ledger-polkadot";
|
|
25
|
+
curve: LedgerPolkadotCurve;
|
|
26
|
+
app: string;
|
|
27
|
+
accountIndex: number;
|
|
28
|
+
addressOffset: number;
|
|
29
|
+
genesisHash?: `0x${string}`;
|
|
31
30
|
};
|
|
32
31
|
type AccountLedgerEthereum = AccountBase & {
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
type: "ledger-ethereum";
|
|
33
|
+
derivationPath: string;
|
|
35
34
|
};
|
|
36
35
|
type AccountLedgerSolana = AccountBase & {
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
type: "ledger-solana";
|
|
37
|
+
derivationPath: string;
|
|
39
38
|
};
|
|
40
39
|
type AccountPolkadotVault = AccountBase & {
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
type: "polkadot-vault";
|
|
41
|
+
genesisHash: `0x${string}` | null;
|
|
43
42
|
};
|
|
44
43
|
type AccountSignet = AccountBase & {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
type: "signet";
|
|
45
|
+
genesisHash: `0x${string}`;
|
|
46
|
+
url: string;
|
|
48
47
|
};
|
|
49
48
|
type Account = AccountKeypair | AccountContact | AccountWatchOnly | AccountLedgerEthereum | AccountLedgerPolkadot | AccountLedgerSolana | AccountPolkadotVault | AccountSignet;
|
|
50
49
|
type AccountType = Account["type"];
|
|
51
|
-
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/types/keyring.d.ts
|
|
52
52
|
type AddMnemonicOptions = {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
mnemonic: string;
|
|
54
|
+
name: string;
|
|
55
|
+
confirmed: boolean;
|
|
56
56
|
};
|
|
57
57
|
type UpdateMnemonicOptions = {
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
name?: string;
|
|
59
|
+
confirmed?: boolean;
|
|
60
60
|
};
|
|
61
61
|
type DeriveFromNewMnemonic = {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
type: "new-mnemonic";
|
|
63
|
+
mnemonic: string;
|
|
64
|
+
mnemonicName: string;
|
|
65
|
+
confirmed: boolean;
|
|
66
|
+
curve: KeypairCurve;
|
|
67
|
+
derivationPath: string;
|
|
68
68
|
};
|
|
69
69
|
type DeriveFromExistingMnemonic = {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
type: "existing-mnemonic";
|
|
71
|
+
mnemonicId: string;
|
|
72
|
+
curve: KeypairCurve;
|
|
73
|
+
derivationPath: string;
|
|
74
74
|
};
|
|
75
75
|
type DeriveFromMnemonicOptions = DeriveFromNewMnemonic | DeriveFromExistingMnemonic;
|
|
76
76
|
type AddAccountDeriveOptions = Omit<AccountBase, "createdAt" | "address"> & DeriveFromMnemonicOptions;
|
|
77
77
|
type AddAccountKeypairOptions = Omit<AccountBase, "createdAt" | "address"> & {
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
curve: KeypairCurve;
|
|
79
|
+
secretKey: Uint8Array;
|
|
80
80
|
};
|
|
81
81
|
type AddAccountExternalOptions = Omit<AccountContact, "createdAt"> | Omit<AccountWatchOnly, "createdAt"> | Omit<AccountLedgerEthereum, "createdAt"> | Omit<AccountLedgerPolkadot, "createdAt"> | Omit<AccountLedgerSolana, "createdAt"> | Omit<AccountPolkadotVault, "createdAt"> | Omit<AccountSignet, "createdAt">;
|
|
82
82
|
type UpdateAccountOptions = {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
name?: string;
|
|
84
|
+
isPortfolio?: boolean;
|
|
85
|
+
genesisHash?: `0x${string}`;
|
|
86
86
|
};
|
|
87
|
-
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src/types/mnemonic.d.ts
|
|
88
89
|
type Mnemonic = {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
id: string;
|
|
91
|
+
name: string;
|
|
92
|
+
confirmed: boolean;
|
|
93
|
+
createdAt: number;
|
|
93
94
|
};
|
|
94
|
-
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/types/utils.d.ts
|
|
95
97
|
type AccountOfType<Type extends AccountType> = Extract<Account, {
|
|
96
|
-
|
|
98
|
+
type: Type;
|
|
97
99
|
}>;
|
|
98
100
|
declare const isAccountOfType: <Type extends AccountType>(account: Account | null | undefined, type: Type) => account is AccountOfType<Type>;
|
|
99
101
|
declare const isAccountInTypes: <Types extends AccountType[]>(account: Account | null | undefined, types: Types) => account is AccountOfType<Types[number]>;
|
|
@@ -108,108 +110,111 @@ declare const ACCOUNT_TYPES_BITCOIN: readonly ["contact", "watch-only"];
|
|
|
108
110
|
declare const isAccountExternal: (account: Account | null | undefined) => account is AccountOfType<(typeof ACCOUNT_TYPES_EXTERNAL)[number]>;
|
|
109
111
|
declare const isAccountOwned: (account: Account | null | undefined) => account is AccountOfType<(typeof ACCOUNT_TYPES_OWNED)[number]>;
|
|
110
112
|
declare const isAccountPortfolio: (account: Account | null | undefined) => account is Account;
|
|
111
|
-
declare const isAccountNotContact: (acc: Account) => acc is AccountKeypair |
|
|
113
|
+
declare const isAccountNotContact: (acc: Account) => acc is AccountKeypair | AccountLedgerEthereum | AccountLedgerPolkadot | AccountLedgerSolana | AccountPolkadotVault | AccountSignet | AccountWatchOnly;
|
|
112
114
|
type AccountAddressEthereum = Extract<Account, {
|
|
113
|
-
|
|
115
|
+
type: (typeof ACCOUNT_TYPES_ADDRESS_ETHEREUM)[number];
|
|
114
116
|
}> & {
|
|
115
|
-
|
|
117
|
+
address: `0x${string}`;
|
|
116
118
|
};
|
|
117
119
|
declare const isAccountAddressEthereum: (account: Account | null | undefined) => account is AccountAddressEthereum;
|
|
118
120
|
type AccountPlatformEthereum = Extract<Account, {
|
|
119
|
-
|
|
121
|
+
type: (typeof ACCOUNT_TYPES_PLATFORM_ETHEREUM)[number];
|
|
120
122
|
}> & {
|
|
121
|
-
|
|
123
|
+
address: `0x${string}`;
|
|
122
124
|
};
|
|
123
125
|
declare const isAccountPlatformEthereum: (account: Account | null | undefined) => account is AccountPlatformEthereum;
|
|
124
126
|
type AccountPlatformSolana = Extract<Account, {
|
|
125
|
-
|
|
127
|
+
type: (typeof ACCOUNT_TYPES_PLATFORM_SOLANA)[number];
|
|
126
128
|
}>;
|
|
127
129
|
declare const isAccountPlatformSolana: (account: Account | null | undefined) => account is AccountPlatformSolana;
|
|
128
130
|
type AccountPlatformPolkadot = Extract<Account, {
|
|
129
|
-
|
|
131
|
+
type: (typeof ACCOUNT_TYPES_PLATFORM_POLKADOT)[number];
|
|
130
132
|
}>;
|
|
131
133
|
declare const isAccountPlatformPolkadot: (account: Account | null | undefined) => account is AccountPlatformPolkadot;
|
|
132
134
|
type AccountAddressSs58 = Extract<Account, {
|
|
133
|
-
|
|
135
|
+
type: (typeof ACCOUNT_TYPES_ADDRESS_SS58)[number];
|
|
134
136
|
}> & {
|
|
135
|
-
|
|
137
|
+
genesisHash?: `0x${string}`;
|
|
136
138
|
};
|
|
137
139
|
declare const isAccountAddressSs58: (account: Account | null | undefined) => account is AccountAddressSs58;
|
|
138
140
|
declare const isAccountLedgerPolkadot: (account: Account | null | undefined) => account is AccountLedgerPolkadot;
|
|
139
141
|
declare const isAccountLedgerPolkadotGeneric: (account: Account | null | undefined) => account is AccountLedgerPolkadot & {
|
|
140
|
-
|
|
142
|
+
genesisHash: undefined;
|
|
141
143
|
};
|
|
142
144
|
declare const isAccountLedgerPolkadotLegacy: (account: Account | null | undefined) => account is AccountLedgerPolkadot & {
|
|
143
|
-
|
|
145
|
+
genesisHash: `0x${string}`;
|
|
144
146
|
};
|
|
145
147
|
type AccountBitcoin = Extract<Account, {
|
|
146
|
-
|
|
148
|
+
type: (typeof ACCOUNT_TYPES_BITCOIN)[number];
|
|
147
149
|
}>;
|
|
148
150
|
declare const isAccountBitcoin: (account: Account | null | undefined) => account is AccountBitcoin;
|
|
149
151
|
declare const getAccountGenesisHash: (account: Account | null | undefined) => `0x${string}` | undefined;
|
|
150
152
|
declare const getAccountSignetUrl: (account: Account | null | undefined) => string | undefined;
|
|
151
|
-
declare const getAccountPlatform: (account: Account | null | undefined) =>
|
|
152
|
-
|
|
153
|
+
declare const getAccountPlatform: (account: Account | null | undefined) => import("@talismn/crypto").AccountPlatform | undefined;
|
|
154
|
+
//#endregion
|
|
155
|
+
//#region src/keyring/types.d.ts
|
|
153
156
|
type MnemonicStorage = Mnemonic & {
|
|
154
|
-
|
|
157
|
+
entropy: string;
|
|
155
158
|
};
|
|
156
159
|
type AccountKeypairStorage = AccountKeypair & {
|
|
157
|
-
|
|
160
|
+
secretKey: string;
|
|
158
161
|
};
|
|
159
162
|
type AccountStorage = AccountKeypairStorage | AccountContact | AccountWatchOnly | AccountLedgerEthereum | AccountLedgerPolkadot | AccountLedgerSolana | AccountPolkadotVault | AccountSignet;
|
|
160
|
-
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region src/keyring/Keyring.d.ts
|
|
161
165
|
type KeyringStorage = {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
166
|
+
passwordCheck: string | null;
|
|
167
|
+
mnemonics: MnemonicStorage[];
|
|
168
|
+
accounts: AccountStorage[];
|
|
165
169
|
};
|
|
166
170
|
declare class Keyring {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
171
|
+
#private;
|
|
172
|
+
protected constructor(data: KeyringStorage);
|
|
173
|
+
static create(): Keyring;
|
|
174
|
+
static load(data: KeyringStorage): Keyring;
|
|
175
|
+
private checkPassword;
|
|
176
|
+
/** Returns true if a password has been set on this keyring. */
|
|
177
|
+
hasPassword(): boolean;
|
|
178
|
+
/**
|
|
179
|
+
* Verify a password against the keyring's passwordCheck blob.
|
|
180
|
+
* Returns true on success, false on wrong password.
|
|
181
|
+
* Throws if no password has been set (caller should check hasPassword() first).
|
|
182
|
+
*/
|
|
183
|
+
verifyPassword(password: string): Promise<boolean>;
|
|
184
|
+
/**
|
|
185
|
+
* Initialize the password on a fresh keyring that has no password set.
|
|
186
|
+
* Throws if a password is already set (use changePassword flow instead).
|
|
187
|
+
*/
|
|
188
|
+
initializePassword(password: string): Promise<void>;
|
|
189
|
+
toJson(): KeyringStorage;
|
|
190
|
+
export(password: string, jsonPassword: string): Promise<KeyringStorage>;
|
|
191
|
+
getMnemonics(): Mnemonic[];
|
|
192
|
+
addMnemonic({ name, mnemonic, confirmed }: AddMnemonicOptions, password: string): Promise<Mnemonic>;
|
|
193
|
+
getMnemonic(id: string): Mnemonic | null;
|
|
194
|
+
updateMnemonic(id: string, { name, confirmed }: UpdateMnemonicOptions): Mnemonic;
|
|
195
|
+
removeMnemonic(id: string): void;
|
|
196
|
+
getMnemonicText(id: string, password: string): Promise<string>;
|
|
197
|
+
getExistingMnemonicId(mnemonic: string): string | null;
|
|
198
|
+
getAccounts(): Account[];
|
|
199
|
+
getAccount(address: string): Account | null;
|
|
200
|
+
updateAccount(address: string, { name, isPortfolio, genesisHash }: UpdateAccountOptions): Account;
|
|
201
|
+
removeAccount(address: string): void;
|
|
202
|
+
addAccountExternal(options: AddAccountExternalOptions): Account;
|
|
203
|
+
/**
|
|
204
|
+
* Needs to be called before deriving an account from a mnemonic.
|
|
205
|
+
*
|
|
206
|
+
* This will ensure that it is present (or add it if possible) in the keyring before actually creating the account.
|
|
207
|
+
*
|
|
208
|
+
* @param options
|
|
209
|
+
* @param password
|
|
210
|
+
* @returns the id of the mnemonic
|
|
211
|
+
*/
|
|
212
|
+
private ensureMnemonic;
|
|
213
|
+
addAccountDerive(options: AddAccountDeriveOptions, password: string): Promise<Account>;
|
|
214
|
+
addAccountKeypair({ curve, name, secretKey }: AddAccountKeypairOptions, password: string): Promise<Account>;
|
|
215
|
+
getAccountSecretKey(address: string, password: string): Promise<Uint8Array>;
|
|
216
|
+
getDerivedAddress(mnemonicId: string, derivationPath: string, curve: KeypairCurve, password: string): Promise<string>;
|
|
213
217
|
}
|
|
214
|
-
|
|
215
|
-
export {
|
|
218
|
+
//#endregion
|
|
219
|
+
export { Account, AccountBase, AccountContact, AccountKeypair, AccountLedgerEthereum, AccountLedgerPolkadot, AccountLedgerSolana, AccountOfType, AccountPolkadotVault, AccountSignet, AccountType, AccountWatchOnly, AddAccountDeriveOptions, AddAccountExternalOptions, AddAccountKeypairOptions, AddMnemonicOptions, Keyring, KeyringStorage, LedgerPolkadotCurve, Mnemonic, UpdateAccountOptions, UpdateMnemonicOptions, getAccountGenesisHash, getAccountPlatform, getAccountSignetUrl, isAccountAddressEthereum, isAccountAddressSs58, isAccountBitcoin, isAccountExternal, isAccountInTypes, isAccountLedgerPolkadot, isAccountLedgerPolkadotGeneric, isAccountLedgerPolkadotLegacy, isAccountNotContact, isAccountOfType, isAccountOwned, isAccountPlatformEthereum, isAccountPlatformPolkadot, isAccountPlatformSolana, isAccountPortfolio };
|
|
220
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/account.ts","../src/types/keyring.ts","../src/types/mnemonic.ts","../src/types/utils.ts","../src/keyring/types.ts","../src/keyring/Keyring.ts"],"mappings":"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"}
|