@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/dist/index.d.ts CHANGED
@@ -1,99 +1,101 @@
1
- import * as _talismn_crypto from '@talismn/crypto';
2
- import { KeypairCurve } from '@talismn/crypto';
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
- address: string;
7
- name: string;
8
- createdAt: number;
5
+ address: string;
6
+ name: string;
7
+ createdAt: number;
9
8
  };
10
9
  type AccountKeypair = AccountBase & {
11
- type: "keypair";
12
- curve: KeypairCurve;
13
- mnemonicId?: string;
14
- derivationPath?: string;
10
+ type: "keypair";
11
+ curve: KeypairCurve;
12
+ mnemonicId?: string;
13
+ derivationPath?: string;
15
14
  };
16
15
  type AccountContact = AccountBase & {
17
- type: "contact";
18
- genesisHash?: `0x${string}`;
16
+ type: "contact";
17
+ genesisHash?: `0x${string}`;
19
18
  };
20
19
  type AccountWatchOnly = AccountBase & {
21
- type: "watch-only";
22
- isPortfolio: boolean;
20
+ type: "watch-only";
21
+ isPortfolio: boolean;
23
22
  };
24
23
  type AccountLedgerPolkadot = AccountBase & {
25
- type: "ledger-polkadot";
26
- curve: LedgerPolkadotCurve;
27
- app: string;
28
- accountIndex: number;
29
- addressOffset: number;
30
- genesisHash?: `0x${string}`;
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
- type: "ledger-ethereum";
34
- derivationPath: string;
32
+ type: "ledger-ethereum";
33
+ derivationPath: string;
35
34
  };
36
35
  type AccountLedgerSolana = AccountBase & {
37
- type: "ledger-solana";
38
- derivationPath: string;
36
+ type: "ledger-solana";
37
+ derivationPath: string;
39
38
  };
40
39
  type AccountPolkadotVault = AccountBase & {
41
- type: "polkadot-vault";
42
- genesisHash: `0x${string}` | null;
40
+ type: "polkadot-vault";
41
+ genesisHash: `0x${string}` | null;
43
42
  };
44
43
  type AccountSignet = AccountBase & {
45
- type: "signet";
46
- genesisHash: `0x${string}`;
47
- url: string;
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
- mnemonic: string;
54
- name: string;
55
- confirmed: boolean;
53
+ mnemonic: string;
54
+ name: string;
55
+ confirmed: boolean;
56
56
  };
57
57
  type UpdateMnemonicOptions = {
58
- name?: string;
59
- confirmed?: boolean;
58
+ name?: string;
59
+ confirmed?: boolean;
60
60
  };
61
61
  type DeriveFromNewMnemonic = {
62
- type: "new-mnemonic";
63
- mnemonic: string;
64
- mnemonicName: string;
65
- confirmed: boolean;
66
- curve: KeypairCurve;
67
- derivationPath: string;
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
- type: "existing-mnemonic";
71
- mnemonicId: string;
72
- curve: KeypairCurve;
73
- derivationPath: string;
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
- curve: KeypairCurve;
79
- secretKey: Uint8Array;
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
- name?: string;
84
- isPortfolio?: boolean;
85
- genesisHash?: `0x${string}`;
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
- id: string;
90
- name: string;
91
- confirmed: boolean;
92
- createdAt: number;
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
- type: Type;
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 | AccountWatchOnly | AccountLedgerPolkadot | AccountLedgerEthereum | AccountLedgerSolana | AccountPolkadotVault | AccountSignet;
113
+ declare const isAccountNotContact: (acc: Account) => acc is AccountKeypair | AccountLedgerEthereum | AccountLedgerPolkadot | AccountLedgerSolana | AccountPolkadotVault | AccountSignet | AccountWatchOnly;
112
114
  type AccountAddressEthereum = Extract<Account, {
113
- type: (typeof ACCOUNT_TYPES_ADDRESS_ETHEREUM)[number];
115
+ type: (typeof ACCOUNT_TYPES_ADDRESS_ETHEREUM)[number];
114
116
  }> & {
115
- address: `0x${string}`;
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
- type: (typeof ACCOUNT_TYPES_PLATFORM_ETHEREUM)[number];
121
+ type: (typeof ACCOUNT_TYPES_PLATFORM_ETHEREUM)[number];
120
122
  }> & {
121
- address: `0x${string}`;
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
- type: (typeof ACCOUNT_TYPES_PLATFORM_SOLANA)[number];
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
- type: (typeof ACCOUNT_TYPES_PLATFORM_POLKADOT)[number];
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
- type: (typeof ACCOUNT_TYPES_ADDRESS_SS58)[number];
135
+ type: (typeof ACCOUNT_TYPES_ADDRESS_SS58)[number];
134
136
  }> & {
135
- genesisHash?: `0x${string}`;
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
- genesisHash: undefined;
142
+ genesisHash: undefined;
141
143
  };
142
144
  declare const isAccountLedgerPolkadotLegacy: (account: Account | null | undefined) => account is AccountLedgerPolkadot & {
143
- genesisHash: `0x${string}`;
145
+ genesisHash: `0x${string}`;
144
146
  };
145
147
  type AccountBitcoin = Extract<Account, {
146
- type: (typeof ACCOUNT_TYPES_BITCOIN)[number];
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) => _talismn_crypto.AccountPlatform | 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
- entropy: string;
157
+ entropy: string;
155
158
  };
156
159
  type AccountKeypairStorage = AccountKeypair & {
157
- secretKey: string;
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
- passwordCheck: string | null;
163
- mnemonics: MnemonicStorage[];
164
- accounts: AccountStorage[];
166
+ passwordCheck: string | null;
167
+ mnemonics: MnemonicStorage[];
168
+ accounts: AccountStorage[];
165
169
  };
166
170
  declare class Keyring {
167
- #private;
168
- protected constructor(data: KeyringStorage);
169
- static create(): Keyring;
170
- static load(data: KeyringStorage): Keyring;
171
- private checkPassword;
172
- /** Returns true if a password has been set on this keyring. */
173
- hasPassword(): boolean;
174
- /**
175
- * Verify a password against the keyring's passwordCheck blob.
176
- * Returns true on success, false on wrong password.
177
- * Throws if no password has been set (caller should check hasPassword() first).
178
- */
179
- verifyPassword(password: string): Promise<boolean>;
180
- /**
181
- * Initialize the password on a fresh keyring that has no password set.
182
- * Throws if a password is already set (use changePassword flow instead).
183
- */
184
- initializePassword(password: string): Promise<void>;
185
- toJson(): KeyringStorage;
186
- export(password: string, jsonPassword: string): Promise<KeyringStorage>;
187
- getMnemonics(): Mnemonic[];
188
- addMnemonic({ name, mnemonic, confirmed }: AddMnemonicOptions, password: string): Promise<Mnemonic>;
189
- getMnemonic(id: string): Mnemonic | null;
190
- updateMnemonic(id: string, { name, confirmed }: UpdateMnemonicOptions): Mnemonic;
191
- removeMnemonic(id: string): void;
192
- getMnemonicText(id: string, password: string): Promise<string>;
193
- getExistingMnemonicId(mnemonic: string): string | null;
194
- getAccounts(): Account[];
195
- getAccount(address: string): Account | null;
196
- updateAccount(address: string, { name, isPortfolio, genesisHash }: UpdateAccountOptions): Account;
197
- removeAccount(address: string): void;
198
- addAccountExternal(options: AddAccountExternalOptions): Account;
199
- /**
200
- * Needs to be called before deriving an account from a mnemonic.
201
- *
202
- * This will ensure that it is present (or add it if possible) in the keyring before actually creating the account.
203
- *
204
- * @param options
205
- * @param password
206
- * @returns the id of the mnemonic
207
- */
208
- private ensureMnemonic;
209
- addAccountDerive(options: AddAccountDeriveOptions, password: string): Promise<Account>;
210
- addAccountKeypair({ curve, name, secretKey }: AddAccountKeypairOptions, password: string): Promise<Account>;
211
- getAccountSecretKey(address: string, password: string): Promise<Uint8Array>;
212
- getDerivedAddress(mnemonicId: string, derivationPath: string, curve: KeypairCurve, password: string): Promise<string>;
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 { type Account, type AccountBase, type AccountContact, type AccountKeypair, type AccountLedgerEthereum, type AccountLedgerPolkadot, type AccountLedgerSolana, type AccountOfType, type AccountPolkadotVault, type AccountSignet, type AccountType, type AccountWatchOnly, type AddAccountDeriveOptions, type AddAccountExternalOptions, type AddAccountKeypairOptions, type AddMnemonicOptions, Keyring, type KeyringStorage, type LedgerPolkadotCurve, type Mnemonic, type UpdateAccountOptions, type UpdateMnemonicOptions, getAccountGenesisHash, getAccountPlatform, getAccountSignetUrl, isAccountAddressEthereum, isAccountAddressSs58, isAccountBitcoin, isAccountExternal, isAccountInTypes, isAccountLedgerPolkadot, isAccountLedgerPolkadotGeneric, isAccountLedgerPolkadotLegacy, isAccountNotContact, isAccountOfType, isAccountOwned, isAccountPlatformEthereum, isAccountPlatformPolkadot, isAccountPlatformSolana, isAccountPortfolio };
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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"}