@metamask-previews/eth-simple-keyring 11.1.2-5c366be → 11.1.2-ea8175e
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/CHANGELOG.md +11 -0
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +0 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/dist/v2/index.cjs +6 -0
- package/dist/v2/index.cjs.map +1 -0
- package/dist/v2/index.d.cts +2 -0
- package/dist/v2/index.d.cts.map +1 -0
- package/dist/v2/index.d.mts +2 -0
- package/dist/v2/index.d.mts.map +1 -0
- package/dist/v2/index.mjs +2 -0
- package/dist/v2/index.mjs.map +1 -0
- package/dist/{simple-keyring-v2.cjs → v2/simple-keyring.cjs} +34 -33
- package/dist/v2/simple-keyring.cjs.map +1 -0
- package/dist/{simple-keyring-v2.d.mts → v2/simple-keyring.d.cts} +9 -8
- package/dist/v2/simple-keyring.d.cts.map +1 -0
- package/dist/{simple-keyring-v2.d.cts → v2/simple-keyring.d.mts} +9 -8
- package/dist/v2/simple-keyring.d.mts.map +1 -0
- package/dist/{simple-keyring-v2.mjs → v2/simple-keyring.mjs} +24 -23
- package/dist/v2/simple-keyring.mjs.map +1 -0
- package/package.json +11 -1
- package/dist/simple-keyring-v2.cjs.map +0 -1
- package/dist/simple-keyring-v2.d.cts.map +0 -1
- package/dist/simple-keyring-v2.d.mts.map +0 -1
- package/dist/simple-keyring-v2.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Add `./v2` subpath export for keyring v2 implementation ([#513](https://github.com/MetaMask/accounts/pull/513))
|
|
13
|
+
- `SimpleKeyring` and `SimpleKeyringOptions` are now available from `@metamask/eth-simple-keyring/v2`.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **BREAKING:** Move and rename `SimpleKeyringV2` and `SimpleKeyringV2Options` to the new `./v2` subpath export ([#513](https://github.com/MetaMask/accounts/pull/513))
|
|
18
|
+
- `SimpleKeyringV2` is now `SimpleKeyring` from `@metamask/eth-simple-keyring/v2`.
|
|
19
|
+
- `SimpleKeyringV2Options` is now `SimpleKeyringOptions` from `@metamask/eth-simple-keyring/v2`.
|
|
20
|
+
|
|
10
21
|
## [11.1.2]
|
|
11
22
|
|
|
12
23
|
### Changed
|
package/dist/index.cjs
CHANGED
|
@@ -3,9 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.default = void 0;
|
|
7
7
|
var simple_keyring_1 = require("./simple-keyring.cjs");
|
|
8
8
|
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(simple_keyring_1).default; } });
|
|
9
|
-
var simple_keyring_v2_1 = require("./simple-keyring-v2.cjs");
|
|
10
|
-
Object.defineProperty(exports, "SimpleKeyringV2", { enumerable: true, get: function () { return simple_keyring_v2_1.SimpleKeyringV2; } });
|
|
11
9
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,uDAA2C;AAAlC,0HAAA,OAAO,OAAA
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,uDAA2C;AAAlC,0HAAA,OAAO,OAAA","sourcesContent":["export { default } from './simple-keyring';\n"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,6BAAyB
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,6BAAyB"}
|
package/dist/index.d.mts
CHANGED
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,6BAAyB
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,6BAAyB"}
|
package/dist/index.mjs
CHANGED
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,6BAAyB
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,6BAAyB","sourcesContent":["export { default } from './simple-keyring';\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SimpleKeyring = void 0;
|
|
4
|
+
var simple_keyring_1 = require("./simple-keyring.cjs");
|
|
5
|
+
Object.defineProperty(exports, "SimpleKeyring", { enumerable: true, get: function () { return simple_keyring_1.SimpleKeyring; } });
|
|
6
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/v2/index.ts"],"names":[],"mappings":";;;AAAA,uDAA4E;AAAnE,+GAAA,aAAa,OAAA","sourcesContent":["export { SimpleKeyring, type SimpleKeyringOptions } from './simple-keyring';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/v2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,6BAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/v2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,6BAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/v2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,6BAAyB","sourcesContent":["export { SimpleKeyring, type SimpleKeyringOptions } from './simple-keyring';\n"]}
|
|
@@ -4,10 +4,11 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
4
4
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
5
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
6
|
};
|
|
7
|
-
var
|
|
7
|
+
var _SimpleKeyring_instances, _SimpleKeyring_createKeyringAccount, _SimpleKeyring_getPrivateKeys, _SimpleKeyring_setPrivateKeys, _SimpleKeyring_withRollback, _SimpleKeyring_importPrivateKeyOrRollback;
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.
|
|
9
|
+
exports.SimpleKeyring = void 0;
|
|
10
10
|
const keyring_api_1 = require("@metamask/keyring-api");
|
|
11
|
+
const v2_1 = require("@metamask/keyring-api/v2");
|
|
11
12
|
const keyring_sdk_1 = require("@metamask/keyring-sdk");
|
|
12
13
|
const utils_1 = require("@metamask/utils");
|
|
13
14
|
/**
|
|
@@ -26,23 +27,23 @@ const SIMPLE_KEYRING_METHODS = [
|
|
|
26
27
|
keyring_sdk_1.EthKeyringMethod.GetAppKeyAddress,
|
|
27
28
|
keyring_sdk_1.EthKeyringMethod.SignEip7702Authorization,
|
|
28
29
|
];
|
|
29
|
-
const
|
|
30
|
+
const simpleKeyringCapabilities = {
|
|
30
31
|
scopes: [keyring_api_1.EthScope.Eoa],
|
|
31
32
|
privateKey: {
|
|
32
33
|
importFormats: [
|
|
33
|
-
{ encoding:
|
|
34
|
+
{ encoding: v2_1.PrivateKeyEncoding.Hexadecimal, type: keyring_api_1.EthAccountType.Eoa },
|
|
34
35
|
],
|
|
35
|
-
exportFormats: [{ encoding:
|
|
36
|
+
exportFormats: [{ encoding: v2_1.PrivateKeyEncoding.Hexadecimal }],
|
|
36
37
|
},
|
|
37
38
|
};
|
|
38
|
-
class
|
|
39
|
+
class SimpleKeyring extends keyring_sdk_1.EthKeyringWrapper {
|
|
39
40
|
constructor(options) {
|
|
40
41
|
super({
|
|
41
|
-
type:
|
|
42
|
+
type: v2_1.KeyringType.PrivateKey,
|
|
42
43
|
inner: options.legacyKeyring,
|
|
43
|
-
capabilities:
|
|
44
|
+
capabilities: simpleKeyringCapabilities,
|
|
44
45
|
});
|
|
45
|
-
|
|
46
|
+
_SimpleKeyring_instances.add(this);
|
|
46
47
|
}
|
|
47
48
|
async getAccounts() {
|
|
48
49
|
const addresses = await this.inner.getAccounts();
|
|
@@ -56,7 +57,7 @@ class SimpleKeyringV2 extends keyring_sdk_1.EthKeyringWrapper {
|
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
// Create and register the account if not already cached
|
|
59
|
-
return __classPrivateFieldGet(this,
|
|
60
|
+
return __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_createKeyringAccount).call(this, address);
|
|
60
61
|
});
|
|
61
62
|
}
|
|
62
63
|
async createAccounts(options) {
|
|
@@ -71,13 +72,13 @@ class SimpleKeyringV2 extends keyring_sdk_1.EthKeyringWrapper {
|
|
|
71
72
|
}
|
|
72
73
|
const { encoding, privateKey } = options;
|
|
73
74
|
// Validate encoding
|
|
74
|
-
if (encoding !==
|
|
75
|
-
throw new Error(`Unsupported encoding for SimpleKeyring: ${encoding}. Only '${
|
|
75
|
+
if (encoding !== v2_1.PrivateKeyEncoding.Hexadecimal) {
|
|
76
|
+
throw new Error(`Unsupported encoding for SimpleKeyring: ${encoding}. Only '${v2_1.PrivateKeyEncoding.Hexadecimal}' is supported.`);
|
|
76
77
|
}
|
|
77
78
|
// Import the private key (with automatic rollback on failure)
|
|
78
|
-
const newAddress = await __classPrivateFieldGet(this,
|
|
79
|
+
const newAddress = await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_importPrivateKeyOrRollback).call(this, privateKey);
|
|
79
80
|
// Create and return the new KeyringAccount
|
|
80
|
-
const newAccount = __classPrivateFieldGet(this,
|
|
81
|
+
const newAccount = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_createKeyringAccount).call(this, newAddress);
|
|
81
82
|
return [newAccount];
|
|
82
83
|
});
|
|
83
84
|
}
|
|
@@ -104,9 +105,9 @@ class SimpleKeyringV2 extends keyring_sdk_1.EthKeyringWrapper {
|
|
|
104
105
|
*/
|
|
105
106
|
async exportAccount(accountId, options) {
|
|
106
107
|
const account = await this.getAccount(accountId);
|
|
107
|
-
const requestedEncoding = options?.encoding ??
|
|
108
|
-
if (requestedEncoding !==
|
|
109
|
-
throw new Error(`Unsupported encoding for SimpleKeyring: ${requestedEncoding}. Only '${
|
|
108
|
+
const requestedEncoding = options?.encoding ?? v2_1.PrivateKeyEncoding.Hexadecimal;
|
|
109
|
+
if (requestedEncoding !== v2_1.PrivateKeyEncoding.Hexadecimal) {
|
|
110
|
+
throw new Error(`Unsupported encoding for SimpleKeyring: ${requestedEncoding}. Only '${v2_1.PrivateKeyEncoding.Hexadecimal}' is supported.`);
|
|
110
111
|
}
|
|
111
112
|
const privateKeyHex = await this.inner.exportAccount(this.toHexAddress(account.address));
|
|
112
113
|
// Sanitize private key format
|
|
@@ -114,13 +115,13 @@ class SimpleKeyringV2 extends keyring_sdk_1.EthKeyringWrapper {
|
|
|
114
115
|
const exported = {
|
|
115
116
|
type: 'private-key',
|
|
116
117
|
privateKey,
|
|
117
|
-
encoding:
|
|
118
|
+
encoding: v2_1.PrivateKeyEncoding.Hexadecimal,
|
|
118
119
|
};
|
|
119
120
|
return exported;
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
|
-
exports.
|
|
123
|
-
|
|
123
|
+
exports.SimpleKeyring = SimpleKeyring;
|
|
124
|
+
_SimpleKeyring_instances = new WeakSet(), _SimpleKeyring_createKeyringAccount = function _SimpleKeyring_createKeyringAccount(address) {
|
|
124
125
|
const id = this.registry.register(address);
|
|
125
126
|
const account = {
|
|
126
127
|
id,
|
|
@@ -138,23 +139,23 @@ _SimpleKeyringV2_instances = new WeakSet(), _SimpleKeyringV2_createKeyringAccoun
|
|
|
138
139
|
// Add the account to the registry
|
|
139
140
|
this.registry.set(account);
|
|
140
141
|
return account;
|
|
141
|
-
},
|
|
142
|
+
}, _SimpleKeyring_getPrivateKeys =
|
|
142
143
|
/**
|
|
143
144
|
* Get all private keys from the inner SimpleKeyring.
|
|
144
145
|
*
|
|
145
146
|
* @returns An array of private keys in hexadecimal format.
|
|
146
147
|
*/
|
|
147
|
-
async function
|
|
148
|
+
async function _SimpleKeyring_getPrivateKeys() {
|
|
148
149
|
return await this.inner.serialize();
|
|
149
|
-
},
|
|
150
|
+
}, _SimpleKeyring_setPrivateKeys =
|
|
150
151
|
/**
|
|
151
152
|
* Set private keys in the inner SimpleKeyring.
|
|
152
153
|
*
|
|
153
154
|
* @param privateKeys - An array of private keys in hexadecimal format.
|
|
154
155
|
*/
|
|
155
|
-
async function
|
|
156
|
+
async function _SimpleKeyring_setPrivateKeys(privateKeys) {
|
|
156
157
|
await this.inner.deserialize(privateKeys);
|
|
157
|
-
},
|
|
158
|
+
}, _SimpleKeyring_withRollback =
|
|
158
159
|
/**
|
|
159
160
|
* Executes a transactional update on the inner keyring state.
|
|
160
161
|
* If the callback throws, the state is automatically rolled back.
|
|
@@ -164,17 +165,17 @@ async function _SimpleKeyringV2_setPrivateKeys(privateKeys) {
|
|
|
164
165
|
* @returns The result of the callback.
|
|
165
166
|
* @throws Error if the callback throws (after rollback).
|
|
166
167
|
*/
|
|
167
|
-
async function
|
|
168
|
-
const originalPrivateKeys = await __classPrivateFieldGet(this,
|
|
168
|
+
async function _SimpleKeyring_withRollback(callback) {
|
|
169
|
+
const originalPrivateKeys = await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeys).call(this);
|
|
169
170
|
try {
|
|
170
171
|
return await callback(originalPrivateKeys);
|
|
171
172
|
}
|
|
172
173
|
catch (error) {
|
|
173
174
|
// Rollback on error
|
|
174
|
-
await __classPrivateFieldGet(this,
|
|
175
|
+
await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_setPrivateKeys).call(this, originalPrivateKeys);
|
|
175
176
|
throw error;
|
|
176
177
|
}
|
|
177
|
-
},
|
|
178
|
+
}, _SimpleKeyring_importPrivateKeyOrRollback =
|
|
178
179
|
/**
|
|
179
180
|
* Import a private key and return the new address.
|
|
180
181
|
* If the import fails (no new address added), rolls back to the original state.
|
|
@@ -183,12 +184,12 @@ async function _SimpleKeyringV2_withRollback(callback) {
|
|
|
183
184
|
* @returns The address of the newly imported account.
|
|
184
185
|
* @throws Error if the import fails or no new address is added.
|
|
185
186
|
*/
|
|
186
|
-
async function
|
|
187
|
-
return __classPrivateFieldGet(this,
|
|
187
|
+
async function _SimpleKeyring_importPrivateKeyOrRollback(privateKey) {
|
|
188
|
+
return __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_withRollback).call(this, async (currentPrivateKeys) => {
|
|
188
189
|
// Get current addresses before import
|
|
189
190
|
const addressesBefore = new Set(await this.inner.getAccounts());
|
|
190
191
|
// Import the new private key
|
|
191
|
-
await __classPrivateFieldGet(this,
|
|
192
|
+
await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_setPrivateKeys).call(this, [...currentPrivateKeys, privateKey]);
|
|
192
193
|
// Get addresses after import and find the newly added one
|
|
193
194
|
const addressesAfter = await this.inner.getAccounts();
|
|
194
195
|
// Find the new address by diffing the two sets
|
|
@@ -199,4 +200,4 @@ async function _SimpleKeyringV2_importPrivateKeyOrRollback(privateKey) {
|
|
|
199
200
|
return newAddresses[0];
|
|
200
201
|
});
|
|
201
202
|
};
|
|
202
|
-
//# sourceMappingURL=simple-keyring
|
|
203
|
+
//# sourceMappingURL=simple-keyring.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-keyring.cjs","sourceRoot":"","sources":["../../src/v2/simple-keyring.ts"],"names":[],"mappings":";;;;;;;;;AAAA,uDAM+B;AAC/B,iDAQkC;AAClC,uDAA4E;AAE5E,2CAAkD;AAKlD;;;GAGG;AACH,MAAM,sBAAsB,GAAG;IAC7B,uBAAS,CAAC,eAAe;IACzB,uBAAS,CAAC,IAAI;IACd,uBAAS,CAAC,YAAY;IACtB,uBAAS,CAAC,eAAe;IACzB,uBAAS,CAAC,eAAe;IACzB,uBAAS,CAAC,eAAe;IACzB,8BAAgB,CAAC,OAAO;IACxB,8BAAgB,CAAC,sBAAsB;IACvC,8BAAgB,CAAC,gBAAgB;IACjC,8BAAgB,CAAC,wBAAwB;CAC1C,CAAC;AAEF,MAAM,yBAAyB,GAAwB;IACrD,MAAM,EAAE,CAAC,sBAAQ,CAAC,GAAG,CAAC;IACtB,UAAU,EAAE;QACV,aAAa,EAAE;YACb,EAAE,QAAQ,EAAE,uBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,4BAAc,CAAC,GAAG,EAAE;SACvE;QACD,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAkB,CAAC,WAAW,EAAE,CAAC;KAC9D;CACF,CAAC;AAYF,MAAa,aACX,SAAQ,+BAAsC;IAG9C,YAAY,OAA6B;QACvC,KAAK,CAAC;YACJ,IAAI,EAAE,gBAAW,CAAC,UAAU;YAC5B,KAAK,EAAE,OAAO,CAAC,aAAa;YAC5B,YAAY,EAAE,yBAAyB;SACxC,CAAC,CAAC;;IACL,CAAC;IAwGD,KAAK,CAAC,WAAW;QACf,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAEjD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,wDAAwD;YACxD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC7C,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YAED,wDAAwD;YACxD,OAAO,uBAAA,IAAI,qEAAsB,MAA1B,IAAI,EAAuB,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,OAA6B;QAE7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC9B,wDAAwD;YACxD,IAAI,OAAO,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CACb,wDAAwD,OAAO,CAAC,IAAI,EAAE,CACvE,CAAC;YACJ,CAAC;YAED,wBAAwB;YACxB,IAAI,OAAO,CAAC,WAAW,KAAK,4BAAc,CAAC,GAAG,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CACb,+CAA+C,OAAO,CAAC,WAAW,WAAW,4BAAc,CAAC,GAAG,iBAAiB,CACjH,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;YAEzC,oBAAoB;YACpB,IAAI,QAAQ,KAAK,uBAAkB,CAAC,WAAW,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CACb,2CAA2C,QAAQ,WAAW,uBAAkB,CAAC,WAAW,iBAAiB,CAC9G,CAAC;YACJ,CAAC;YAED,8DAA8D;YAC9D,MAAM,UAAU,GAAG,MAAM,uBAAA,IAAI,2EAA4B,MAAhC,IAAI,EAA6B,UAAU,CAAC,CAAC;YAEtE,2CAA2C;YAC3C,MAAM,UAAU,GAAG,uBAAA,IAAI,qEAAsB,MAA1B,IAAI,EAAuB,UAAU,CAAC,CAAC;YAC1D,OAAO,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,SAAoB;QACtC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAEjD,iCAAiC;YACjC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE1C,2BAA2B;YAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,SAAoB,EACpB,OAA8B;QAE9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEjD,MAAM,iBAAiB,GACrB,OAAO,EAAE,QAAQ,IAAI,uBAAkB,CAAC,WAAW,CAAC;QAEtD,IAAI,iBAAiB,KAAK,uBAAkB,CAAC,WAAW,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,2CAA2C,iBAAiB,WAAW,uBAAkB,CAAC,WAAW,iBAAiB,CACvH,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAClD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CACnC,CAAC;QACF,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAA,aAAK,EAAC,aAAa,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAoB;YAChC,IAAI,EAAE,aAAa;YACnB,UAAU;YACV,QAAQ,EAAE,uBAAkB,CAAC,WAAW;SACzC,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA7ND,sCA6NC;6HA3MuB,OAAY;IAChC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAmB;QAC9B,EAAE;QACF,IAAI,EAAE,4BAAc,CAAC,GAAG;QACxB,OAAO;QACP,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC,GAAG,sBAAsB,CAAC;QACpC,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,6CAA+B,CAAC,UAAU;aACjD;YACD,UAAU,EAAE,IAAI;SACjB;KACF,CAAC;IAEF,kCAAkC;IAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,KAAK;IACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,KAAK,wCAAiB,WAAqB;IACzC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,sCACH,QAA2D;IAE3D,MAAM,mBAAmB,GAAG,MAAM,uBAAA,IAAI,+DAAgB,MAApB,IAAI,CAAkB,CAAC;IAEzD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oBAAoB;QACpB,MAAM,uBAAA,IAAI,+DAAgB,MAApB,IAAI,EAAiB,mBAAmB,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,oDAA6B,UAAkB;IAClD,OAAO,uBAAA,IAAI,6DAAc,MAAlB,IAAI,EAAe,KAAK,EAAE,kBAAkB,EAAE,EAAE;QACrD,sCAAsC;QACtC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAEhE,6BAA6B;QAC7B,MAAM,uBAAA,IAAI,+DAAgB,MAApB,IAAI,EAAiB,CAAC,GAAG,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC;QAEhE,0DAA0D;QAC1D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAEtD,+CAA+C;QAC/C,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CACrC,CAAC;QAEF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n EthAccountType,\n EthMethod,\n EthScope,\n type KeyringAccount,\n KeyringAccountEntropyTypeOption,\n} from '@metamask/keyring-api';\nimport {\n type CreateAccountOptions,\n type ExportAccountOptions,\n type ExportedAccount,\n type KeyringCapabilities,\n type Keyring,\n KeyringType,\n PrivateKeyEncoding,\n} from '@metamask/keyring-api/v2';\nimport { EthKeyringMethod, EthKeyringWrapper } from '@metamask/keyring-sdk';\nimport type { AccountId } from '@metamask/keyring-utils';\nimport { add0x, type Hex } from '@metamask/utils';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport type LegacySimpleKeyring from '../simple-keyring';\n\n/**\n * Methods supported by SimpleKeyring EOA accounts.\n * SimpleKeyring supports all standard signing methods plus encryption and app keys.\n */\nconst SIMPLE_KEYRING_METHODS = [\n EthMethod.SignTransaction,\n EthMethod.Sign,\n EthMethod.PersonalSign,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n EthKeyringMethod.Decrypt,\n EthKeyringMethod.GetEncryptionPublicKey,\n EthKeyringMethod.GetAppKeyAddress,\n EthKeyringMethod.SignEip7702Authorization,\n];\n\nconst simpleKeyringCapabilities: KeyringCapabilities = {\n scopes: [EthScope.Eoa],\n privateKey: {\n importFormats: [\n { encoding: PrivateKeyEncoding.Hexadecimal, type: EthAccountType.Eoa },\n ],\n exportFormats: [{ encoding: PrivateKeyEncoding.Hexadecimal }],\n },\n};\n\n/**\n * Concrete {@link Keyring} adapter for {@link SimpleKeyring}.\n *\n * This wrapper exposes the accounts and signing capabilities of the legacy\n * SimpleKeyring via the unified V2 interface.\n */\nexport type SimpleKeyringOptions = {\n legacyKeyring: LegacySimpleKeyring;\n};\n\nexport class SimpleKeyring\n extends EthKeyringWrapper<LegacySimpleKeyring>\n implements Keyring\n{\n constructor(options: SimpleKeyringOptions) {\n super({\n type: KeyringType.PrivateKey,\n inner: options.legacyKeyring,\n capabilities: simpleKeyringCapabilities,\n });\n }\n\n /**\n * Creates a KeyringAccount object for the given address and index.\n *\n * @param address - The account address.\n * @returns The created KeyringAccount.\n */\n #createKeyringAccount(address: Hex): KeyringAccount {\n const id = this.registry.register(address);\n\n const account: KeyringAccount = {\n id,\n type: EthAccountType.Eoa,\n address,\n scopes: [...this.capabilities.scopes],\n methods: [...SIMPLE_KEYRING_METHODS],\n options: {\n entropy: {\n type: KeyringAccountEntropyTypeOption.PrivateKey,\n },\n exportable: true,\n },\n };\n\n // Add the account to the registry\n this.registry.set(account);\n\n return account;\n }\n\n /**\n * Get all private keys from the inner SimpleKeyring.\n *\n * @returns An array of private keys in hexadecimal format.\n */\n async #getPrivateKeys(): Promise<string[]> {\n return await this.inner.serialize();\n }\n\n /**\n * Set private keys in the inner SimpleKeyring.\n *\n * @param privateKeys - An array of private keys in hexadecimal format.\n */\n async #setPrivateKeys(privateKeys: string[]): Promise<void> {\n await this.inner.deserialize(privateKeys);\n }\n\n /**\n * Executes a transactional update on the inner keyring state.\n * If the callback throws, the state is automatically rolled back.\n *\n * @param callback - A function that receives the current private keys and performs the update.\n * Should return the result on success, or throw to trigger rollback.\n * @returns The result of the callback.\n * @throws Error if the callback throws (after rollback).\n */\n async #withRollback<Result>(\n callback: (currentPrivateKeys: string[]) => Promise<Result>,\n ): Promise<Result> {\n const originalPrivateKeys = await this.#getPrivateKeys();\n\n try {\n return await callback(originalPrivateKeys);\n } catch (error) {\n // Rollback on error\n await this.#setPrivateKeys(originalPrivateKeys);\n throw error;\n }\n }\n\n /**\n * Import a private key and return the new address.\n * If the import fails (no new address added), rolls back to the original state.\n *\n * @param privateKey - The private key to import in hexadecimal format.\n * @returns The address of the newly imported account.\n * @throws Error if the import fails or no new address is added.\n */\n async #importPrivateKeyOrRollback(privateKey: string): Promise<Hex> {\n return this.#withRollback(async (currentPrivateKeys) => {\n // Get current addresses before import\n const addressesBefore = new Set(await this.inner.getAccounts());\n\n // Import the new private key\n await this.#setPrivateKeys([...currentPrivateKeys, privateKey]);\n\n // Get addresses after import and find the newly added one\n const addressesAfter = await this.inner.getAccounts();\n\n // Find the new address by diffing the two sets\n const newAddresses = addressesAfter.filter(\n (addr) => !addressesBefore.has(addr),\n );\n\n if (newAddresses.length !== 1 || !newAddresses[0]) {\n throw new Error('Failed to import private key');\n }\n\n return newAddresses[0];\n });\n }\n\n async getAccounts(): Promise<KeyringAccount[]> {\n const addresses = await this.inner.getAccounts();\n\n return addresses.map((address) => {\n // Check if we already have this account in the registry\n const existingId = this.registry.getAccountId(address);\n if (existingId) {\n const cached = this.registry.get(existingId);\n if (cached) {\n return cached;\n }\n }\n\n // Create and register the account if not already cached\n return this.#createKeyringAccount(address);\n });\n }\n\n async createAccounts(\n options: CreateAccountOptions,\n ): Promise<KeyringAccount[]> {\n return this.withLock(async () => {\n // For SimpleKeyring, we only support private key import\n if (options.type !== 'private-key:import') {\n throw new Error(\n `Unsupported account creation type for SimpleKeyring: ${options.type}`,\n );\n }\n\n // Validate account type\n if (options.accountType !== EthAccountType.Eoa) {\n throw new Error(\n `Unsupported account type for SimpleKeyring: ${options.accountType}. Only '${EthAccountType.Eoa}' is supported.`,\n );\n }\n\n const { encoding, privateKey } = options;\n\n // Validate encoding\n if (encoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${encoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n // Import the private key (with automatic rollback on failure)\n const newAddress = await this.#importPrivateKeyOrRollback(privateKey);\n\n // Create and return the new KeyringAccount\n const newAccount = this.#createKeyringAccount(newAddress);\n return [newAccount];\n });\n }\n\n /**\n * Delete an account from the keyring.\n *\n * @param accountId - The account ID to delete.\n */\n async deleteAccount(accountId: AccountId): Promise<void> {\n await this.withLock(async () => {\n const account = await this.getAccount(accountId);\n\n // Remove from the legacy keyring\n this.inner.removeAccount(account.address);\n\n // Remove from the registry\n this.registry.delete(accountId);\n });\n }\n\n /**\n * Export the private key for an account in hexadecimal format.\n *\n * @param accountId - The ID of the account to export.\n * @param options - Export options (only hexadecimal encoding is supported).\n * @returns The exported account with private key.\n */\n async exportAccount(\n accountId: AccountId,\n options?: ExportAccountOptions,\n ): Promise<ExportedAccount> {\n const account = await this.getAccount(accountId);\n\n const requestedEncoding =\n options?.encoding ?? PrivateKeyEncoding.Hexadecimal;\n\n if (requestedEncoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${requestedEncoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n const privateKeyHex = await this.inner.exportAccount(\n this.toHexAddress(account.address),\n );\n // Sanitize private key format\n const privateKey = add0x(privateKeyHex);\n\n const exported: ExportedAccount = {\n type: 'private-key',\n privateKey,\n encoding: PrivateKeyEncoding.Hexadecimal,\n };\n\n return exported;\n }\n}\n"]}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type KeyringAccount } from "@metamask/keyring-api";
|
|
2
|
+
import { type CreateAccountOptions, type ExportAccountOptions, type ExportedAccount, type Keyring } from "@metamask/keyring-api/v2";
|
|
2
3
|
import { EthKeyringWrapper } from "@metamask/keyring-sdk";
|
|
3
4
|
import type { AccountId } from "@metamask/keyring-utils";
|
|
4
|
-
import type
|
|
5
|
+
import type LegacySimpleKeyring from "../simple-keyring.cjs";
|
|
5
6
|
/**
|
|
6
|
-
* Concrete {@link
|
|
7
|
+
* Concrete {@link Keyring} adapter for {@link SimpleKeyring}.
|
|
7
8
|
*
|
|
8
9
|
* This wrapper exposes the accounts and signing capabilities of the legacy
|
|
9
10
|
* SimpleKeyring via the unified V2 interface.
|
|
10
11
|
*/
|
|
11
|
-
export type
|
|
12
|
-
legacyKeyring:
|
|
12
|
+
export type SimpleKeyringOptions = {
|
|
13
|
+
legacyKeyring: LegacySimpleKeyring;
|
|
13
14
|
};
|
|
14
|
-
export declare class
|
|
15
|
+
export declare class SimpleKeyring extends EthKeyringWrapper<LegacySimpleKeyring> implements Keyring {
|
|
15
16
|
#private;
|
|
16
|
-
constructor(options:
|
|
17
|
+
constructor(options: SimpleKeyringOptions);
|
|
17
18
|
getAccounts(): Promise<KeyringAccount[]>;
|
|
18
19
|
createAccounts(options: CreateAccountOptions): Promise<KeyringAccount[]>;
|
|
19
20
|
/**
|
|
@@ -31,4 +32,4 @@ export declare class SimpleKeyringV2 extends EthKeyringWrapper<SimpleKeyring> im
|
|
|
31
32
|
*/
|
|
32
33
|
exportAccount(accountId: AccountId, options?: ExportAccountOptions): Promise<ExportedAccount>;
|
|
33
34
|
}
|
|
34
|
-
//# sourceMappingURL=simple-keyring
|
|
35
|
+
//# sourceMappingURL=simple-keyring.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-keyring.d.cts","sourceRoot":"","sources":["../../src/v2/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EAEpB,8BAA8B;AAC/B,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAEpB,KAAK,OAAO,EAGb,iCAAiC;AAClC,OAAO,EAAoB,iBAAiB,EAAE,8BAA8B;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,gCAAgC;AAIzD,OAAO,KAAK,mBAAmB,8BAA0B;AA6BzD;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAEF,qBAAa,aACX,SAAQ,iBAAiB,CAAC,mBAAmB,CAC7C,YAAW,OAAO;;gBAEN,OAAO,EAAE,oBAAoB;IA8GnC,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAkBxC,cAAc,CAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,EAAE,CAAC;IAkC5B;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;;;OAMG;IACG,aAAa,CACjB,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;CA0B5B"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type KeyringAccount } from "@metamask/keyring-api";
|
|
2
|
+
import { type CreateAccountOptions, type ExportAccountOptions, type ExportedAccount, type Keyring } from "@metamask/keyring-api/v2";
|
|
2
3
|
import { EthKeyringWrapper } from "@metamask/keyring-sdk";
|
|
3
4
|
import type { AccountId } from "@metamask/keyring-utils";
|
|
4
|
-
import type
|
|
5
|
+
import type LegacySimpleKeyring from "../simple-keyring.mjs";
|
|
5
6
|
/**
|
|
6
|
-
* Concrete {@link
|
|
7
|
+
* Concrete {@link Keyring} adapter for {@link SimpleKeyring}.
|
|
7
8
|
*
|
|
8
9
|
* This wrapper exposes the accounts and signing capabilities of the legacy
|
|
9
10
|
* SimpleKeyring via the unified V2 interface.
|
|
10
11
|
*/
|
|
11
|
-
export type
|
|
12
|
-
legacyKeyring:
|
|
12
|
+
export type SimpleKeyringOptions = {
|
|
13
|
+
legacyKeyring: LegacySimpleKeyring;
|
|
13
14
|
};
|
|
14
|
-
export declare class
|
|
15
|
+
export declare class SimpleKeyring extends EthKeyringWrapper<LegacySimpleKeyring> implements Keyring {
|
|
15
16
|
#private;
|
|
16
|
-
constructor(options:
|
|
17
|
+
constructor(options: SimpleKeyringOptions);
|
|
17
18
|
getAccounts(): Promise<KeyringAccount[]>;
|
|
18
19
|
createAccounts(options: CreateAccountOptions): Promise<KeyringAccount[]>;
|
|
19
20
|
/**
|
|
@@ -31,4 +32,4 @@ export declare class SimpleKeyringV2 extends EthKeyringWrapper<SimpleKeyring> im
|
|
|
31
32
|
*/
|
|
32
33
|
exportAccount(accountId: AccountId, options?: ExportAccountOptions): Promise<ExportedAccount>;
|
|
33
34
|
}
|
|
34
|
-
//# sourceMappingURL=simple-keyring
|
|
35
|
+
//# sourceMappingURL=simple-keyring.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-keyring.d.mts","sourceRoot":"","sources":["../../src/v2/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EAEpB,8BAA8B;AAC/B,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAEpB,KAAK,OAAO,EAGb,iCAAiC;AAClC,OAAO,EAAoB,iBAAiB,EAAE,8BAA8B;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,gCAAgC;AAIzD,OAAO,KAAK,mBAAmB,8BAA0B;AA6BzD;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAEF,qBAAa,aACX,SAAQ,iBAAiB,CAAC,mBAAmB,CAC7C,YAAW,OAAO;;gBAEN,OAAO,EAAE,oBAAoB;IA8GnC,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAkBxC,cAAc,CAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,EAAE,CAAC;IAkC5B;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;;;OAMG;IACG,aAAa,CACjB,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;CA0B5B"}
|
|
@@ -3,8 +3,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
3
3
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
5
|
};
|
|
6
|
-
var
|
|
7
|
-
import { EthAccountType, EthMethod, EthScope, KeyringAccountEntropyTypeOption
|
|
6
|
+
var _SimpleKeyring_instances, _SimpleKeyring_createKeyringAccount, _SimpleKeyring_getPrivateKeys, _SimpleKeyring_setPrivateKeys, _SimpleKeyring_withRollback, _SimpleKeyring_importPrivateKeyOrRollback;
|
|
7
|
+
import { EthAccountType, EthMethod, EthScope, KeyringAccountEntropyTypeOption } from "@metamask/keyring-api";
|
|
8
|
+
import { KeyringType, PrivateKeyEncoding } from "@metamask/keyring-api/v2";
|
|
8
9
|
import { EthKeyringMethod, EthKeyringWrapper } from "@metamask/keyring-sdk";
|
|
9
10
|
import { add0x } from "@metamask/utils";
|
|
10
11
|
/**
|
|
@@ -23,7 +24,7 @@ const SIMPLE_KEYRING_METHODS = [
|
|
|
23
24
|
EthKeyringMethod.GetAppKeyAddress,
|
|
24
25
|
EthKeyringMethod.SignEip7702Authorization,
|
|
25
26
|
];
|
|
26
|
-
const
|
|
27
|
+
const simpleKeyringCapabilities = {
|
|
27
28
|
scopes: [EthScope.Eoa],
|
|
28
29
|
privateKey: {
|
|
29
30
|
importFormats: [
|
|
@@ -32,14 +33,14 @@ const simpleKeyringV2Capabilities = {
|
|
|
32
33
|
exportFormats: [{ encoding: PrivateKeyEncoding.Hexadecimal }],
|
|
33
34
|
},
|
|
34
35
|
};
|
|
35
|
-
export class
|
|
36
|
+
export class SimpleKeyring extends EthKeyringWrapper {
|
|
36
37
|
constructor(options) {
|
|
37
38
|
super({
|
|
38
39
|
type: KeyringType.PrivateKey,
|
|
39
40
|
inner: options.legacyKeyring,
|
|
40
|
-
capabilities:
|
|
41
|
+
capabilities: simpleKeyringCapabilities,
|
|
41
42
|
});
|
|
42
|
-
|
|
43
|
+
_SimpleKeyring_instances.add(this);
|
|
43
44
|
}
|
|
44
45
|
async getAccounts() {
|
|
45
46
|
const addresses = await this.inner.getAccounts();
|
|
@@ -53,7 +54,7 @@ export class SimpleKeyringV2 extends EthKeyringWrapper {
|
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
// Create and register the account if not already cached
|
|
56
|
-
return __classPrivateFieldGet(this,
|
|
57
|
+
return __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_createKeyringAccount).call(this, address);
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
async createAccounts(options) {
|
|
@@ -72,9 +73,9 @@ export class SimpleKeyringV2 extends EthKeyringWrapper {
|
|
|
72
73
|
throw new Error(`Unsupported encoding for SimpleKeyring: ${encoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`);
|
|
73
74
|
}
|
|
74
75
|
// Import the private key (with automatic rollback on failure)
|
|
75
|
-
const newAddress = await __classPrivateFieldGet(this,
|
|
76
|
+
const newAddress = await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_importPrivateKeyOrRollback).call(this, privateKey);
|
|
76
77
|
// Create and return the new KeyringAccount
|
|
77
|
-
const newAccount = __classPrivateFieldGet(this,
|
|
78
|
+
const newAccount = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_createKeyringAccount).call(this, newAddress);
|
|
78
79
|
return [newAccount];
|
|
79
80
|
});
|
|
80
81
|
}
|
|
@@ -116,7 +117,7 @@ export class SimpleKeyringV2 extends EthKeyringWrapper {
|
|
|
116
117
|
return exported;
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
|
-
|
|
120
|
+
_SimpleKeyring_instances = new WeakSet(), _SimpleKeyring_createKeyringAccount = function _SimpleKeyring_createKeyringAccount(address) {
|
|
120
121
|
const id = this.registry.register(address);
|
|
121
122
|
const account = {
|
|
122
123
|
id,
|
|
@@ -134,23 +135,23 @@ _SimpleKeyringV2_instances = new WeakSet(), _SimpleKeyringV2_createKeyringAccoun
|
|
|
134
135
|
// Add the account to the registry
|
|
135
136
|
this.registry.set(account);
|
|
136
137
|
return account;
|
|
137
|
-
},
|
|
138
|
+
}, _SimpleKeyring_getPrivateKeys =
|
|
138
139
|
/**
|
|
139
140
|
* Get all private keys from the inner SimpleKeyring.
|
|
140
141
|
*
|
|
141
142
|
* @returns An array of private keys in hexadecimal format.
|
|
142
143
|
*/
|
|
143
|
-
async function
|
|
144
|
+
async function _SimpleKeyring_getPrivateKeys() {
|
|
144
145
|
return await this.inner.serialize();
|
|
145
|
-
},
|
|
146
|
+
}, _SimpleKeyring_setPrivateKeys =
|
|
146
147
|
/**
|
|
147
148
|
* Set private keys in the inner SimpleKeyring.
|
|
148
149
|
*
|
|
149
150
|
* @param privateKeys - An array of private keys in hexadecimal format.
|
|
150
151
|
*/
|
|
151
|
-
async function
|
|
152
|
+
async function _SimpleKeyring_setPrivateKeys(privateKeys) {
|
|
152
153
|
await this.inner.deserialize(privateKeys);
|
|
153
|
-
},
|
|
154
|
+
}, _SimpleKeyring_withRollback =
|
|
154
155
|
/**
|
|
155
156
|
* Executes a transactional update on the inner keyring state.
|
|
156
157
|
* If the callback throws, the state is automatically rolled back.
|
|
@@ -160,17 +161,17 @@ async function _SimpleKeyringV2_setPrivateKeys(privateKeys) {
|
|
|
160
161
|
* @returns The result of the callback.
|
|
161
162
|
* @throws Error if the callback throws (after rollback).
|
|
162
163
|
*/
|
|
163
|
-
async function
|
|
164
|
-
const originalPrivateKeys = await __classPrivateFieldGet(this,
|
|
164
|
+
async function _SimpleKeyring_withRollback(callback) {
|
|
165
|
+
const originalPrivateKeys = await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeys).call(this);
|
|
165
166
|
try {
|
|
166
167
|
return await callback(originalPrivateKeys);
|
|
167
168
|
}
|
|
168
169
|
catch (error) {
|
|
169
170
|
// Rollback on error
|
|
170
|
-
await __classPrivateFieldGet(this,
|
|
171
|
+
await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_setPrivateKeys).call(this, originalPrivateKeys);
|
|
171
172
|
throw error;
|
|
172
173
|
}
|
|
173
|
-
},
|
|
174
|
+
}, _SimpleKeyring_importPrivateKeyOrRollback =
|
|
174
175
|
/**
|
|
175
176
|
* Import a private key and return the new address.
|
|
176
177
|
* If the import fails (no new address added), rolls back to the original state.
|
|
@@ -179,12 +180,12 @@ async function _SimpleKeyringV2_withRollback(callback) {
|
|
|
179
180
|
* @returns The address of the newly imported account.
|
|
180
181
|
* @throws Error if the import fails or no new address is added.
|
|
181
182
|
*/
|
|
182
|
-
async function
|
|
183
|
-
return __classPrivateFieldGet(this,
|
|
183
|
+
async function _SimpleKeyring_importPrivateKeyOrRollback(privateKey) {
|
|
184
|
+
return __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_withRollback).call(this, async (currentPrivateKeys) => {
|
|
184
185
|
// Get current addresses before import
|
|
185
186
|
const addressesBefore = new Set(await this.inner.getAccounts());
|
|
186
187
|
// Import the new private key
|
|
187
|
-
await __classPrivateFieldGet(this,
|
|
188
|
+
await __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_setPrivateKeys).call(this, [...currentPrivateKeys, privateKey]);
|
|
188
189
|
// Get addresses after import and find the newly added one
|
|
189
190
|
const addressesAfter = await this.inner.getAccounts();
|
|
190
191
|
// Find the new address by diffing the two sets
|
|
@@ -195,4 +196,4 @@ async function _SimpleKeyringV2_importPrivateKeyOrRollback(privateKey) {
|
|
|
195
196
|
return newAddresses[0];
|
|
196
197
|
});
|
|
197
198
|
};
|
|
198
|
-
//# sourceMappingURL=simple-keyring
|
|
199
|
+
//# sourceMappingURL=simple-keyring.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-keyring.mjs","sourceRoot":"","sources":["../../src/v2/simple-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EthAccountType,\n EthMethod,\n EthScope,\n type KeyringAccount,\n KeyringAccountEntropyTypeOption,\n} from '@metamask/keyring-api';\nimport {\n type CreateAccountOptions,\n type ExportAccountOptions,\n type ExportedAccount,\n type KeyringCapabilities,\n type Keyring,\n KeyringType,\n PrivateKeyEncoding,\n} from '@metamask/keyring-api/v2';\nimport { EthKeyringMethod, EthKeyringWrapper } from '@metamask/keyring-sdk';\nimport type { AccountId } from '@metamask/keyring-utils';\nimport { add0x, type Hex } from '@metamask/utils';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport type LegacySimpleKeyring from '../simple-keyring';\n\n/**\n * Methods supported by SimpleKeyring EOA accounts.\n * SimpleKeyring supports all standard signing methods plus encryption and app keys.\n */\nconst SIMPLE_KEYRING_METHODS = [\n EthMethod.SignTransaction,\n EthMethod.Sign,\n EthMethod.PersonalSign,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n EthKeyringMethod.Decrypt,\n EthKeyringMethod.GetEncryptionPublicKey,\n EthKeyringMethod.GetAppKeyAddress,\n EthKeyringMethod.SignEip7702Authorization,\n];\n\nconst simpleKeyringCapabilities: KeyringCapabilities = {\n scopes: [EthScope.Eoa],\n privateKey: {\n importFormats: [\n { encoding: PrivateKeyEncoding.Hexadecimal, type: EthAccountType.Eoa },\n ],\n exportFormats: [{ encoding: PrivateKeyEncoding.Hexadecimal }],\n },\n};\n\n/**\n * Concrete {@link Keyring} adapter for {@link SimpleKeyring}.\n *\n * This wrapper exposes the accounts and signing capabilities of the legacy\n * SimpleKeyring via the unified V2 interface.\n */\nexport type SimpleKeyringOptions = {\n legacyKeyring: LegacySimpleKeyring;\n};\n\nexport class SimpleKeyring\n extends EthKeyringWrapper<LegacySimpleKeyring>\n implements Keyring\n{\n constructor(options: SimpleKeyringOptions) {\n super({\n type: KeyringType.PrivateKey,\n inner: options.legacyKeyring,\n capabilities: simpleKeyringCapabilities,\n });\n }\n\n /**\n * Creates a KeyringAccount object for the given address and index.\n *\n * @param address - The account address.\n * @returns The created KeyringAccount.\n */\n #createKeyringAccount(address: Hex): KeyringAccount {\n const id = this.registry.register(address);\n\n const account: KeyringAccount = {\n id,\n type: EthAccountType.Eoa,\n address,\n scopes: [...this.capabilities.scopes],\n methods: [...SIMPLE_KEYRING_METHODS],\n options: {\n entropy: {\n type: KeyringAccountEntropyTypeOption.PrivateKey,\n },\n exportable: true,\n },\n };\n\n // Add the account to the registry\n this.registry.set(account);\n\n return account;\n }\n\n /**\n * Get all private keys from the inner SimpleKeyring.\n *\n * @returns An array of private keys in hexadecimal format.\n */\n async #getPrivateKeys(): Promise<string[]> {\n return await this.inner.serialize();\n }\n\n /**\n * Set private keys in the inner SimpleKeyring.\n *\n * @param privateKeys - An array of private keys in hexadecimal format.\n */\n async #setPrivateKeys(privateKeys: string[]): Promise<void> {\n await this.inner.deserialize(privateKeys);\n }\n\n /**\n * Executes a transactional update on the inner keyring state.\n * If the callback throws, the state is automatically rolled back.\n *\n * @param callback - A function that receives the current private keys and performs the update.\n * Should return the result on success, or throw to trigger rollback.\n * @returns The result of the callback.\n * @throws Error if the callback throws (after rollback).\n */\n async #withRollback<Result>(\n callback: (currentPrivateKeys: string[]) => Promise<Result>,\n ): Promise<Result> {\n const originalPrivateKeys = await this.#getPrivateKeys();\n\n try {\n return await callback(originalPrivateKeys);\n } catch (error) {\n // Rollback on error\n await this.#setPrivateKeys(originalPrivateKeys);\n throw error;\n }\n }\n\n /**\n * Import a private key and return the new address.\n * If the import fails (no new address added), rolls back to the original state.\n *\n * @param privateKey - The private key to import in hexadecimal format.\n * @returns The address of the newly imported account.\n * @throws Error if the import fails or no new address is added.\n */\n async #importPrivateKeyOrRollback(privateKey: string): Promise<Hex> {\n return this.#withRollback(async (currentPrivateKeys) => {\n // Get current addresses before import\n const addressesBefore = new Set(await this.inner.getAccounts());\n\n // Import the new private key\n await this.#setPrivateKeys([...currentPrivateKeys, privateKey]);\n\n // Get addresses after import and find the newly added one\n const addressesAfter = await this.inner.getAccounts();\n\n // Find the new address by diffing the two sets\n const newAddresses = addressesAfter.filter(\n (addr) => !addressesBefore.has(addr),\n );\n\n if (newAddresses.length !== 1 || !newAddresses[0]) {\n throw new Error('Failed to import private key');\n }\n\n return newAddresses[0];\n });\n }\n\n async getAccounts(): Promise<KeyringAccount[]> {\n const addresses = await this.inner.getAccounts();\n\n return addresses.map((address) => {\n // Check if we already have this account in the registry\n const existingId = this.registry.getAccountId(address);\n if (existingId) {\n const cached = this.registry.get(existingId);\n if (cached) {\n return cached;\n }\n }\n\n // Create and register the account if not already cached\n return this.#createKeyringAccount(address);\n });\n }\n\n async createAccounts(\n options: CreateAccountOptions,\n ): Promise<KeyringAccount[]> {\n return this.withLock(async () => {\n // For SimpleKeyring, we only support private key import\n if (options.type !== 'private-key:import') {\n throw new Error(\n `Unsupported account creation type for SimpleKeyring: ${options.type}`,\n );\n }\n\n // Validate account type\n if (options.accountType !== EthAccountType.Eoa) {\n throw new Error(\n `Unsupported account type for SimpleKeyring: ${options.accountType}. Only '${EthAccountType.Eoa}' is supported.`,\n );\n }\n\n const { encoding, privateKey } = options;\n\n // Validate encoding\n if (encoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${encoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n // Import the private key (with automatic rollback on failure)\n const newAddress = await this.#importPrivateKeyOrRollback(privateKey);\n\n // Create and return the new KeyringAccount\n const newAccount = this.#createKeyringAccount(newAddress);\n return [newAccount];\n });\n }\n\n /**\n * Delete an account from the keyring.\n *\n * @param accountId - The account ID to delete.\n */\n async deleteAccount(accountId: AccountId): Promise<void> {\n await this.withLock(async () => {\n const account = await this.getAccount(accountId);\n\n // Remove from the legacy keyring\n this.inner.removeAccount(account.address);\n\n // Remove from the registry\n this.registry.delete(accountId);\n });\n }\n\n /**\n * Export the private key for an account in hexadecimal format.\n *\n * @param accountId - The ID of the account to export.\n * @param options - Export options (only hexadecimal encoding is supported).\n * @returns The exported account with private key.\n */\n async exportAccount(\n accountId: AccountId,\n options?: ExportAccountOptions,\n ): Promise<ExportedAccount> {\n const account = await this.getAccount(accountId);\n\n const requestedEncoding =\n options?.encoding ?? PrivateKeyEncoding.Hexadecimal;\n\n if (requestedEncoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${requestedEncoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n const privateKeyHex = await this.inner.exportAccount(\n this.toHexAddress(account.address),\n );\n // Sanitize private key format\n const privateKey = add0x(privateKeyHex);\n\n const exported: ExportedAccount = {\n type: 'private-key',\n privateKey,\n encoding: PrivateKeyEncoding.Hexadecimal,\n };\n\n return exported;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/eth-simple-keyring",
|
|
3
|
-
"version": "11.1.2-
|
|
3
|
+
"version": "11.1.2-ea8175e",
|
|
4
4
|
"description": "A simple standard interface for a series of Ethereum private keys.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ethereum",
|
|
@@ -24,6 +24,16 @@
|
|
|
24
24
|
"types": "./dist/index.d.cts",
|
|
25
25
|
"default": "./dist/index.cjs"
|
|
26
26
|
}
|
|
27
|
+
},
|
|
28
|
+
"./v2": {
|
|
29
|
+
"import": {
|
|
30
|
+
"types": "./dist/v2/index.d.mts",
|
|
31
|
+
"default": "./dist/v2/index.mjs"
|
|
32
|
+
},
|
|
33
|
+
"require": {
|
|
34
|
+
"types": "./dist/v2/index.d.cts",
|
|
35
|
+
"default": "./dist/v2/index.cjs"
|
|
36
|
+
}
|
|
27
37
|
}
|
|
28
38
|
},
|
|
29
39
|
"main": "./dist/index.cjs",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-keyring-v2.cjs","sourceRoot":"","sources":["../src/simple-keyring-v2.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type CreateAccountOptions,\n EthAccountType,\n EthMethod,\n EthScope,\n type ExportAccountOptions,\n type ExportedAccount,\n type KeyringAccount,\n KeyringAccountEntropyTypeOption,\n type KeyringCapabilities,\n type KeyringV2,\n KeyringType,\n PrivateKeyEncoding,\n} from '@metamask/keyring-api';\nimport { EthKeyringMethod, EthKeyringWrapper } from '@metamask/keyring-sdk';\nimport type { AccountId } from '@metamask/keyring-utils';\nimport { add0x, type Hex } from '@metamask/utils';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport type SimpleKeyring from './simple-keyring';\n\n/**\n * Methods supported by SimpleKeyring EOA accounts.\n * SimpleKeyring supports all standard signing methods plus encryption and app keys.\n */\nconst SIMPLE_KEYRING_METHODS = [\n EthMethod.SignTransaction,\n EthMethod.Sign,\n EthMethod.PersonalSign,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n EthKeyringMethod.Decrypt,\n EthKeyringMethod.GetEncryptionPublicKey,\n EthKeyringMethod.GetAppKeyAddress,\n EthKeyringMethod.SignEip7702Authorization,\n];\n\nconst simpleKeyringV2Capabilities: KeyringCapabilities = {\n scopes: [EthScope.Eoa],\n privateKey: {\n importFormats: [\n { encoding: PrivateKeyEncoding.Hexadecimal, type: EthAccountType.Eoa },\n ],\n exportFormats: [{ encoding: PrivateKeyEncoding.Hexadecimal }],\n },\n};\n\n/**\n * Concrete {@link KeyringV2} adapter for {@link SimpleKeyring}.\n *\n * This wrapper exposes the accounts and signing capabilities of the legacy\n * SimpleKeyring via the unified V2 interface.\n */\nexport type SimpleKeyringV2Options = {\n legacyKeyring: SimpleKeyring;\n};\n\nexport class SimpleKeyringV2\n extends EthKeyringWrapper<SimpleKeyring>\n implements KeyringV2\n{\n constructor(options: SimpleKeyringV2Options) {\n super({\n type: KeyringType.PrivateKey,\n inner: options.legacyKeyring,\n capabilities: simpleKeyringV2Capabilities,\n });\n }\n\n /**\n * Creates a KeyringAccount object for the given address and index.\n *\n * @param address - The account address.\n * @returns The created KeyringAccount.\n */\n #createKeyringAccount(address: Hex): KeyringAccount {\n const id = this.registry.register(address);\n\n const account: KeyringAccount = {\n id,\n type: EthAccountType.Eoa,\n address,\n scopes: [...this.capabilities.scopes],\n methods: [...SIMPLE_KEYRING_METHODS],\n options: {\n entropy: {\n type: KeyringAccountEntropyTypeOption.PrivateKey,\n },\n exportable: true,\n },\n };\n\n // Add the account to the registry\n this.registry.set(account);\n\n return account;\n }\n\n /**\n * Get all private keys from the inner SimpleKeyring.\n *\n * @returns An array of private keys in hexadecimal format.\n */\n async #getPrivateKeys(): Promise<string[]> {\n return await this.inner.serialize();\n }\n\n /**\n * Set private keys in the inner SimpleKeyring.\n *\n * @param privateKeys - An array of private keys in hexadecimal format.\n */\n async #setPrivateKeys(privateKeys: string[]): Promise<void> {\n await this.inner.deserialize(privateKeys);\n }\n\n /**\n * Executes a transactional update on the inner keyring state.\n * If the callback throws, the state is automatically rolled back.\n *\n * @param callback - A function that receives the current private keys and performs the update.\n * Should return the result on success, or throw to trigger rollback.\n * @returns The result of the callback.\n * @throws Error if the callback throws (after rollback).\n */\n async #withRollback<Result>(\n callback: (currentPrivateKeys: string[]) => Promise<Result>,\n ): Promise<Result> {\n const originalPrivateKeys = await this.#getPrivateKeys();\n\n try {\n return await callback(originalPrivateKeys);\n } catch (error) {\n // Rollback on error\n await this.#setPrivateKeys(originalPrivateKeys);\n throw error;\n }\n }\n\n /**\n * Import a private key and return the new address.\n * If the import fails (no new address added), rolls back to the original state.\n *\n * @param privateKey - The private key to import in hexadecimal format.\n * @returns The address of the newly imported account.\n * @throws Error if the import fails or no new address is added.\n */\n async #importPrivateKeyOrRollback(privateKey: string): Promise<Hex> {\n return this.#withRollback(async (currentPrivateKeys) => {\n // Get current addresses before import\n const addressesBefore = new Set(await this.inner.getAccounts());\n\n // Import the new private key\n await this.#setPrivateKeys([...currentPrivateKeys, privateKey]);\n\n // Get addresses after import and find the newly added one\n const addressesAfter = await this.inner.getAccounts();\n\n // Find the new address by diffing the two sets\n const newAddresses = addressesAfter.filter(\n (addr) => !addressesBefore.has(addr),\n );\n\n if (newAddresses.length !== 1 || !newAddresses[0]) {\n throw new Error('Failed to import private key');\n }\n\n return newAddresses[0];\n });\n }\n\n async getAccounts(): Promise<KeyringAccount[]> {\n const addresses = await this.inner.getAccounts();\n\n return addresses.map((address) => {\n // Check if we already have this account in the registry\n const existingId = this.registry.getAccountId(address);\n if (existingId) {\n const cached = this.registry.get(existingId);\n if (cached) {\n return cached;\n }\n }\n\n // Create and register the account if not already cached\n return this.#createKeyringAccount(address);\n });\n }\n\n async createAccounts(\n options: CreateAccountOptions,\n ): Promise<KeyringAccount[]> {\n return this.withLock(async () => {\n // For SimpleKeyring, we only support private key import\n if (options.type !== 'private-key:import') {\n throw new Error(\n `Unsupported account creation type for SimpleKeyring: ${options.type}`,\n );\n }\n\n // Validate account type\n if (options.accountType !== EthAccountType.Eoa) {\n throw new Error(\n `Unsupported account type for SimpleKeyring: ${options.accountType}. Only '${EthAccountType.Eoa}' is supported.`,\n );\n }\n\n const { encoding, privateKey } = options;\n\n // Validate encoding\n if (encoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${encoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n // Import the private key (with automatic rollback on failure)\n const newAddress = await this.#importPrivateKeyOrRollback(privateKey);\n\n // Create and return the new KeyringAccount\n const newAccount = this.#createKeyringAccount(newAddress);\n return [newAccount];\n });\n }\n\n /**\n * Delete an account from the keyring.\n *\n * @param accountId - The account ID to delete.\n */\n async deleteAccount(accountId: AccountId): Promise<void> {\n await this.withLock(async () => {\n const account = await this.getAccount(accountId);\n\n // Remove from the legacy keyring\n this.inner.removeAccount(account.address);\n\n // Remove from the registry\n this.registry.delete(accountId);\n });\n }\n\n /**\n * Export the private key for an account in hexadecimal format.\n *\n * @param accountId - The ID of the account to export.\n * @param options - Export options (only hexadecimal encoding is supported).\n * @returns The exported account with private key.\n */\n async exportAccount(\n accountId: AccountId,\n options?: ExportAccountOptions,\n ): Promise<ExportedAccount> {\n const account = await this.getAccount(accountId);\n\n const requestedEncoding =\n options?.encoding ?? PrivateKeyEncoding.Hexadecimal;\n\n if (requestedEncoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${requestedEncoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n const privateKeyHex = await this.inner.exportAccount(\n this.toHexAddress(account.address),\n );\n // Sanitize private key format\n const privateKey = add0x(privateKeyHex);\n\n const exported: ExportedAccount = {\n type: 'private-key',\n privateKey,\n encoding: PrivateKeyEncoding.Hexadecimal,\n };\n\n return exported;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-keyring-v2.d.cts","sourceRoot":"","sources":["../src/simple-keyring-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,EAIzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,cAAc,EAGnB,KAAK,SAAS,EAGf,8BAA8B;AAC/B,OAAO,EAAoB,iBAAiB,EAAE,8BAA8B;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,gCAAgC;AAIzD,OAAO,KAAK,aAAa,6BAAyB;AA6BlD;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,qBAAa,eACX,SAAQ,iBAAiB,CAAC,aAAa,CACvC,YAAW,SAAS;;gBAER,OAAO,EAAE,sBAAsB;IA8GrC,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAkBxC,cAAc,CAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,EAAE,CAAC;IAkC5B;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;;;OAMG;IACG,aAAa,CACjB,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;CA0B5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-keyring-v2.d.mts","sourceRoot":"","sources":["../src/simple-keyring-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,EAIzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,cAAc,EAGnB,KAAK,SAAS,EAGf,8BAA8B;AAC/B,OAAO,EAAoB,iBAAiB,EAAE,8BAA8B;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,gCAAgC;AAIzD,OAAO,KAAK,aAAa,6BAAyB;AA6BlD;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,qBAAa,eACX,SAAQ,iBAAiB,CAAC,aAAa,CACvC,YAAW,SAAS;;gBAER,OAAO,EAAE,sBAAsB;IA8GrC,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAkBxC,cAAc,CAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,EAAE,CAAC;IAkC5B;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;;;OAMG;IACG,aAAa,CACjB,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;CA0B5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-keyring-v2.mjs","sourceRoot":"","sources":["../src/simple-keyring-v2.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type CreateAccountOptions,\n EthAccountType,\n EthMethod,\n EthScope,\n type ExportAccountOptions,\n type ExportedAccount,\n type KeyringAccount,\n KeyringAccountEntropyTypeOption,\n type KeyringCapabilities,\n type KeyringV2,\n KeyringType,\n PrivateKeyEncoding,\n} from '@metamask/keyring-api';\nimport { EthKeyringMethod, EthKeyringWrapper } from '@metamask/keyring-sdk';\nimport type { AccountId } from '@metamask/keyring-utils';\nimport { add0x, type Hex } from '@metamask/utils';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport type SimpleKeyring from './simple-keyring';\n\n/**\n * Methods supported by SimpleKeyring EOA accounts.\n * SimpleKeyring supports all standard signing methods plus encryption and app keys.\n */\nconst SIMPLE_KEYRING_METHODS = [\n EthMethod.SignTransaction,\n EthMethod.Sign,\n EthMethod.PersonalSign,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n EthKeyringMethod.Decrypt,\n EthKeyringMethod.GetEncryptionPublicKey,\n EthKeyringMethod.GetAppKeyAddress,\n EthKeyringMethod.SignEip7702Authorization,\n];\n\nconst simpleKeyringV2Capabilities: KeyringCapabilities = {\n scopes: [EthScope.Eoa],\n privateKey: {\n importFormats: [\n { encoding: PrivateKeyEncoding.Hexadecimal, type: EthAccountType.Eoa },\n ],\n exportFormats: [{ encoding: PrivateKeyEncoding.Hexadecimal }],\n },\n};\n\n/**\n * Concrete {@link KeyringV2} adapter for {@link SimpleKeyring}.\n *\n * This wrapper exposes the accounts and signing capabilities of the legacy\n * SimpleKeyring via the unified V2 interface.\n */\nexport type SimpleKeyringV2Options = {\n legacyKeyring: SimpleKeyring;\n};\n\nexport class SimpleKeyringV2\n extends EthKeyringWrapper<SimpleKeyring>\n implements KeyringV2\n{\n constructor(options: SimpleKeyringV2Options) {\n super({\n type: KeyringType.PrivateKey,\n inner: options.legacyKeyring,\n capabilities: simpleKeyringV2Capabilities,\n });\n }\n\n /**\n * Creates a KeyringAccount object for the given address and index.\n *\n * @param address - The account address.\n * @returns The created KeyringAccount.\n */\n #createKeyringAccount(address: Hex): KeyringAccount {\n const id = this.registry.register(address);\n\n const account: KeyringAccount = {\n id,\n type: EthAccountType.Eoa,\n address,\n scopes: [...this.capabilities.scopes],\n methods: [...SIMPLE_KEYRING_METHODS],\n options: {\n entropy: {\n type: KeyringAccountEntropyTypeOption.PrivateKey,\n },\n exportable: true,\n },\n };\n\n // Add the account to the registry\n this.registry.set(account);\n\n return account;\n }\n\n /**\n * Get all private keys from the inner SimpleKeyring.\n *\n * @returns An array of private keys in hexadecimal format.\n */\n async #getPrivateKeys(): Promise<string[]> {\n return await this.inner.serialize();\n }\n\n /**\n * Set private keys in the inner SimpleKeyring.\n *\n * @param privateKeys - An array of private keys in hexadecimal format.\n */\n async #setPrivateKeys(privateKeys: string[]): Promise<void> {\n await this.inner.deserialize(privateKeys);\n }\n\n /**\n * Executes a transactional update on the inner keyring state.\n * If the callback throws, the state is automatically rolled back.\n *\n * @param callback - A function that receives the current private keys and performs the update.\n * Should return the result on success, or throw to trigger rollback.\n * @returns The result of the callback.\n * @throws Error if the callback throws (after rollback).\n */\n async #withRollback<Result>(\n callback: (currentPrivateKeys: string[]) => Promise<Result>,\n ): Promise<Result> {\n const originalPrivateKeys = await this.#getPrivateKeys();\n\n try {\n return await callback(originalPrivateKeys);\n } catch (error) {\n // Rollback on error\n await this.#setPrivateKeys(originalPrivateKeys);\n throw error;\n }\n }\n\n /**\n * Import a private key and return the new address.\n * If the import fails (no new address added), rolls back to the original state.\n *\n * @param privateKey - The private key to import in hexadecimal format.\n * @returns The address of the newly imported account.\n * @throws Error if the import fails or no new address is added.\n */\n async #importPrivateKeyOrRollback(privateKey: string): Promise<Hex> {\n return this.#withRollback(async (currentPrivateKeys) => {\n // Get current addresses before import\n const addressesBefore = new Set(await this.inner.getAccounts());\n\n // Import the new private key\n await this.#setPrivateKeys([...currentPrivateKeys, privateKey]);\n\n // Get addresses after import and find the newly added one\n const addressesAfter = await this.inner.getAccounts();\n\n // Find the new address by diffing the two sets\n const newAddresses = addressesAfter.filter(\n (addr) => !addressesBefore.has(addr),\n );\n\n if (newAddresses.length !== 1 || !newAddresses[0]) {\n throw new Error('Failed to import private key');\n }\n\n return newAddresses[0];\n });\n }\n\n async getAccounts(): Promise<KeyringAccount[]> {\n const addresses = await this.inner.getAccounts();\n\n return addresses.map((address) => {\n // Check if we already have this account in the registry\n const existingId = this.registry.getAccountId(address);\n if (existingId) {\n const cached = this.registry.get(existingId);\n if (cached) {\n return cached;\n }\n }\n\n // Create and register the account if not already cached\n return this.#createKeyringAccount(address);\n });\n }\n\n async createAccounts(\n options: CreateAccountOptions,\n ): Promise<KeyringAccount[]> {\n return this.withLock(async () => {\n // For SimpleKeyring, we only support private key import\n if (options.type !== 'private-key:import') {\n throw new Error(\n `Unsupported account creation type for SimpleKeyring: ${options.type}`,\n );\n }\n\n // Validate account type\n if (options.accountType !== EthAccountType.Eoa) {\n throw new Error(\n `Unsupported account type for SimpleKeyring: ${options.accountType}. Only '${EthAccountType.Eoa}' is supported.`,\n );\n }\n\n const { encoding, privateKey } = options;\n\n // Validate encoding\n if (encoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${encoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n // Import the private key (with automatic rollback on failure)\n const newAddress = await this.#importPrivateKeyOrRollback(privateKey);\n\n // Create and return the new KeyringAccount\n const newAccount = this.#createKeyringAccount(newAddress);\n return [newAccount];\n });\n }\n\n /**\n * Delete an account from the keyring.\n *\n * @param accountId - The account ID to delete.\n */\n async deleteAccount(accountId: AccountId): Promise<void> {\n await this.withLock(async () => {\n const account = await this.getAccount(accountId);\n\n // Remove from the legacy keyring\n this.inner.removeAccount(account.address);\n\n // Remove from the registry\n this.registry.delete(accountId);\n });\n }\n\n /**\n * Export the private key for an account in hexadecimal format.\n *\n * @param accountId - The ID of the account to export.\n * @param options - Export options (only hexadecimal encoding is supported).\n * @returns The exported account with private key.\n */\n async exportAccount(\n accountId: AccountId,\n options?: ExportAccountOptions,\n ): Promise<ExportedAccount> {\n const account = await this.getAccount(accountId);\n\n const requestedEncoding =\n options?.encoding ?? PrivateKeyEncoding.Hexadecimal;\n\n if (requestedEncoding !== PrivateKeyEncoding.Hexadecimal) {\n throw new Error(\n `Unsupported encoding for SimpleKeyring: ${requestedEncoding}. Only '${PrivateKeyEncoding.Hexadecimal}' is supported.`,\n );\n }\n\n const privateKeyHex = await this.inner.exportAccount(\n this.toHexAddress(account.address),\n );\n // Sanitize private key format\n const privateKey = add0x(privateKeyHex);\n\n const exported: ExportedAccount = {\n type: 'private-key',\n privateKey,\n encoding: PrivateKeyEncoding.Hexadecimal,\n };\n\n return exported;\n }\n}\n"]}
|