@zerodev/wallet-core 0.0.3 → 0.0.5
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/_cjs/actions/auth/getAuthenticators.js.map +1 -1
- package/dist/_cjs/actions/auth/index.js +3 -1
- package/dist/_cjs/actions/auth/index.js.map +1 -1
- package/dist/_cjs/actions/auth/logout.js +23 -0
- package/dist/_cjs/actions/auth/logout.js.map +1 -0
- package/dist/_cjs/actions/index.js +2 -1
- package/dist/_cjs/actions/index.js.map +1 -1
- package/dist/_cjs/actions/wallet/getUserWallet.js +1 -1
- package/dist/_cjs/actions/wallet/getUserWallet.js.map +1 -1
- package/dist/_cjs/actions/wallet/signingUtils.js +23 -3
- package/dist/_cjs/actions/wallet/signingUtils.js.map +1 -1
- package/dist/_cjs/adapters/viem.js +26 -9
- package/dist/_cjs/adapters/viem.js.map +1 -1
- package/dist/_cjs/client/decorators/client.js +1 -0
- package/dist/_cjs/client/decorators/client.js.map +1 -1
- package/dist/_cjs/client/transports/rest.js.map +1 -1
- package/dist/_cjs/core/createZeroDevWalletCore.js +297 -168
- package/dist/_cjs/core/createZeroDevWalletCore.js.map +1 -1
- package/dist/_cjs/index.js +2 -1
- package/dist/_cjs/index.js.map +1 -1
- package/dist/_cjs/index.native.js +2 -1
- package/dist/_cjs/index.native.js.map +1 -1
- package/dist/_cjs/native/stampers/secureStore.js +94 -17
- package/dist/_cjs/native/stampers/secureStore.js.map +1 -1
- package/dist/_cjs/stampers/indexedDbStamper.js +34 -0
- package/dist/_cjs/stampers/indexedDbStamper.js.map +1 -1
- package/dist/_cjs/storage/manager.js +144 -17
- package/dist/_cjs/storage/manager.js.map +1 -1
- package/dist/_cjs/utils/buildClientSignature.js +4 -1
- package/dist/_cjs/utils/buildClientSignature.js.map +1 -1
- package/dist/_cjs/utils/derToRawSignature.js +12 -0
- package/dist/_cjs/utils/derToRawSignature.js.map +1 -1
- package/dist/_cjs/utils/exportPrivateKey.js +1 -1
- package/dist/_cjs/utils/exportPrivateKey.js.map +1 -1
- package/dist/_cjs/utils/utils.js +27 -6
- package/dist/_cjs/utils/utils.js.map +1 -1
- package/dist/_esm/actions/auth/getAuthenticators.js +3 -2
- package/dist/_esm/actions/auth/getAuthenticators.js.map +1 -1
- package/dist/_esm/actions/auth/index.js +1 -0
- package/dist/_esm/actions/auth/index.js.map +1 -1
- package/dist/_esm/actions/auth/logout.js +21 -0
- package/dist/_esm/actions/auth/logout.js.map +1 -0
- package/dist/_esm/actions/index.js +1 -1
- package/dist/_esm/actions/index.js.map +1 -1
- package/dist/_esm/actions/wallet/getUserWallet.js +3 -1
- package/dist/_esm/actions/wallet/getUserWallet.js.map +1 -1
- package/dist/_esm/actions/wallet/signingUtils.js +24 -4
- package/dist/_esm/actions/wallet/signingUtils.js.map +1 -1
- package/dist/_esm/adapters/viem.js +27 -10
- package/dist/_esm/adapters/viem.js.map +1 -1
- package/dist/_esm/client/decorators/client.js +2 -1
- package/dist/_esm/client/decorators/client.js.map +1 -1
- package/dist/_esm/client/transports/rest.js.map +1 -1
- package/dist/_esm/core/createZeroDevWalletCore.js +320 -186
- package/dist/_esm/core/createZeroDevWalletCore.js.map +1 -1
- package/dist/_esm/index.js +1 -1
- package/dist/_esm/index.js.map +1 -1
- package/dist/_esm/index.native.js +1 -1
- package/dist/_esm/index.native.js.map +1 -1
- package/dist/_esm/native/stampers/secureStore.js +111 -18
- package/dist/_esm/native/stampers/secureStore.js.map +1 -1
- package/dist/_esm/stampers/indexedDbStamper.js +36 -0
- package/dist/_esm/stampers/indexedDbStamper.js.map +1 -1
- package/dist/_esm/storage/manager.js +150 -22
- package/dist/_esm/storage/manager.js.map +1 -1
- package/dist/_esm/utils/buildClientSignature.js +4 -1
- package/dist/_esm/utils/buildClientSignature.js.map +1 -1
- package/dist/_esm/utils/derToRawSignature.js +12 -0
- package/dist/_esm/utils/derToRawSignature.js.map +1 -1
- package/dist/_esm/utils/exportPrivateKey.js +1 -1
- package/dist/_esm/utils/exportPrivateKey.js.map +1 -1
- package/dist/_esm/utils/utils.js +27 -6
- package/dist/_esm/utils/utils.js.map +1 -1
- package/dist/_types/actions/auth/getAuthenticators.d.ts +19 -2
- package/dist/_types/actions/auth/getAuthenticators.d.ts.map +1 -1
- package/dist/_types/actions/auth/index.d.ts +2 -1
- package/dist/_types/actions/auth/index.d.ts.map +1 -1
- package/dist/_types/actions/auth/logout.d.ts +11 -0
- package/dist/_types/actions/auth/logout.d.ts.map +1 -0
- package/dist/_types/actions/index.d.ts +1 -1
- package/dist/_types/actions/index.d.ts.map +1 -1
- package/dist/_types/actions/wallet/getUserWallet.d.ts.map +1 -1
- package/dist/_types/actions/wallet/signingUtils.d.ts.map +1 -1
- package/dist/_types/adapters/viem.d.ts.map +1 -1
- package/dist/_types/client/decorators/client.d.ts +3 -1
- package/dist/_types/client/decorators/client.d.ts.map +1 -1
- package/dist/_types/client/transports/rest.d.ts +3 -3
- package/dist/_types/client/transports/rest.d.ts.map +1 -1
- package/dist/_types/core/createZeroDevWalletCore.d.ts +8 -1
- package/dist/_types/core/createZeroDevWalletCore.d.ts.map +1 -1
- package/dist/_types/index.d.ts +2 -2
- package/dist/_types/index.d.ts.map +1 -1
- package/dist/_types/index.native.d.ts +2 -2
- package/dist/_types/index.native.d.ts.map +1 -1
- package/dist/_types/native/stampers/secureStore.d.ts.map +1 -1
- package/dist/_types/stampers/indexedDbStamper.d.ts.map +1 -1
- package/dist/_types/stampers/types.d.ts +6 -0
- package/dist/_types/stampers/types.d.ts.map +1 -1
- package/dist/_types/storage/manager.d.ts +3 -0
- package/dist/_types/storage/manager.d.ts.map +1 -1
- package/dist/_types/types/session.d.ts +2 -0
- package/dist/_types/types/session.d.ts.map +1 -1
- package/dist/_types/utils/buildClientSignature.d.ts +1 -1
- package/dist/_types/utils/buildClientSignature.d.ts.map +1 -1
- package/dist/_types/utils/derToRawSignature.d.ts.map +1 -1
- package/dist/_types/utils/utils.d.ts +1 -1
- package/dist/_types/utils/utils.d.ts.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/actions/auth/getAuthenticators.ts +20 -2
- package/src/actions/auth/index.ts +6 -0
- package/src/actions/auth/logout.ts +35 -0
- package/src/actions/index.ts +4 -0
- package/src/actions/wallet/getUserWallet.ts +3 -1
- package/src/actions/wallet/signingUtils.ts +43 -4
- package/src/adapters/viem.ts +40 -12
- package/src/client/decorators/client.ts +7 -0
- package/src/client/transports/rest.ts +4 -4
- package/src/core/createZeroDevWalletCore.ts +393 -205
- package/src/index.native.ts +4 -0
- package/src/index.ts +4 -0
- package/src/native/stampers/secureStore.ts +119 -24
- package/src/stampers/indexedDbStamper.ts +47 -0
- package/src/stampers/types.ts +6 -0
- package/src/storage/manager.ts +205 -25
- package/src/types/session.ts +2 -0
- package/src/utils/buildClientSignature.ts +4 -2
- package/src/utils/derToRawSignature.ts +16 -2
- package/src/utils/exportPrivateKey.ts +1 -1
- package/src/utils/utils.ts +30 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.native.js","sourceRoot":"","sources":["../../src/index.native.ts"],"names":[],"mappings":";;;AAAA,qDAAmD;AAEnD,IAAI,CAAC,IAAA,2BAAa,GAAE,EAAE,CAAC;IAErB,OAAO,CAAC,IAAI,CACV,+LAA+L,CAChM,CAAA;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"index.native.js","sourceRoot":"","sources":["../../src/index.native.ts"],"names":[],"mappings":";;;AAAA,qDAAmD;AAEnD,IAAI,CAAC,IAAA,2BAAa,GAAE,EAAE,CAAC;IAErB,OAAO,CAAC,IAAI,CACV,+LAA+L,CAChM,CAAA;AACH,CAAC;AAyCD,+CAc2B;AAbzB,iHAAA,qBAAqB,OAAA;AACrB,iHAAA,qBAAqB,OAAA;AACrB,6GAAA,iBAAiB,OAAA;AACjB,yGAAA,aAAa,OAAA;AACb,qGAAA,SAAS,OAAA;AACT,wGAAA,YAAY,OAAA;AACZ,kGAAA,MAAM,OAAA;AACN,2GAAA,eAAe,OAAA;AACf,iHAAA,qBAAqB,OAAA;AACrB,uGAAA,WAAW,OAAA;AACX,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AACf,6GAAA,iBAAiB,OAAA;AAGnB,8CAAkD;AAAzC,wGAAA,aAAa,OAAA;AAEtB,2DAAoE;AAA3D,iHAAA,oBAAoB,OAAA;AAO7B,8CAK0B;AAJxB,4GAAA,gBAAgB,OAAA;AAChB,wGAAA,YAAY,OAAA;AAEZ,kHAAA,sBAAsB,OAAA;AAExB,+CAA+C;AAAtC,8GAAA,cAAc,OAAA;AASvB,0EAGwC;AAFtC,6HAAA,mBAAmB,OAAA;AAcrB,mEAA8D;AAArD,uHAAA,gBAAgB,OAAA;AACzB,2DAAsD;AAA7C,+GAAA,YAAY,OAAA;AACrB,6CAAqD;AAA5C,8GAAA,kBAAkB,OAAA"}
|
|
@@ -4,8 +4,27 @@ exports.createSecureStoreStamper = createSecureStoreStamper;
|
|
|
4
4
|
const api_key_stamper_1 = require("@turnkey/api-key-stamper");
|
|
5
5
|
const crypto_1 = require("@turnkey/crypto");
|
|
6
6
|
const SecureStore = require("expo-secure-store");
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const KEY_PAIR = 'zerodev.keyPair';
|
|
8
|
+
const LEGACY_PUBLIC_KEY = 'zerodev.publicKey';
|
|
9
|
+
const LEGACY_PRIVATE_KEY = 'zerodev.privateKey';
|
|
10
|
+
const KEY_PAIR_CHECK = 'ZeroDev Wallet key-pair ownership check';
|
|
11
|
+
function parseKeyPair(value) {
|
|
12
|
+
if (!value)
|
|
13
|
+
return null;
|
|
14
|
+
try {
|
|
15
|
+
const pair = JSON.parse(value);
|
|
16
|
+
if (typeof pair.publicKey !== 'string' ||
|
|
17
|
+
!pair.publicKey ||
|
|
18
|
+
typeof pair.privateKey !== 'string' ||
|
|
19
|
+
!pair.privateKey) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return pair;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
9
28
|
class SecureStoreStamperInner {
|
|
10
29
|
constructor() {
|
|
11
30
|
Object.defineProperty(this, "publicKeyHex", {
|
|
@@ -16,36 +35,71 @@ class SecureStoreStamperInner {
|
|
|
16
35
|
});
|
|
17
36
|
}
|
|
18
37
|
async init() {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
const storedPair = parseKeyPair(await SecureStore.getItemAsync(KEY_PAIR));
|
|
39
|
+
if (storedPair && (await this.isUsable(storedPair))) {
|
|
40
|
+
this.publicKeyHex = storedPair.publicKey;
|
|
41
|
+
return;
|
|
23
42
|
}
|
|
24
|
-
|
|
25
|
-
|
|
43
|
+
const publicKey = await SecureStore.getItemAsync(LEGACY_PUBLIC_KEY);
|
|
44
|
+
const privateKey = await SecureStore.getItemAsync(LEGACY_PRIVATE_KEY);
|
|
45
|
+
if (publicKey &&
|
|
46
|
+
privateKey &&
|
|
47
|
+
(await this.isUsable({ publicKey, privateKey }))) {
|
|
48
|
+
await this.persistKeyPair({ publicKey, privateKey });
|
|
49
|
+
await Promise.all([
|
|
50
|
+
SecureStore.deleteItemAsync(LEGACY_PUBLIC_KEY),
|
|
51
|
+
SecureStore.deleteItemAsync(LEGACY_PRIVATE_KEY),
|
|
52
|
+
]);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
await this.resetKeyPair();
|
|
56
|
+
}
|
|
57
|
+
async isUsable(pair) {
|
|
58
|
+
try {
|
|
59
|
+
await this.validateKeyPair(pair);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
26
64
|
}
|
|
27
65
|
}
|
|
28
66
|
async getPublicKey() {
|
|
29
67
|
return this.publicKeyHex;
|
|
30
68
|
}
|
|
31
69
|
async resetKeyPair(externalKeyPair) {
|
|
32
|
-
await this.clear();
|
|
33
70
|
const pair = externalKeyPair ?? (0, crypto_1.generateP256KeyPair)();
|
|
34
|
-
await
|
|
35
|
-
|
|
71
|
+
await this.persistKeyPair(pair);
|
|
72
|
+
}
|
|
73
|
+
async persistKeyPair(pair) {
|
|
74
|
+
await this.validateKeyPair(pair);
|
|
75
|
+
await SecureStore.setItemAsync(KEY_PAIR, JSON.stringify(pair));
|
|
36
76
|
this.publicKeyHex = pair.publicKey;
|
|
37
77
|
}
|
|
78
|
+
async validateKeyPair(pair) {
|
|
79
|
+
try {
|
|
80
|
+
const signature = await new api_key_stamper_1.ApiKeyStamper({
|
|
81
|
+
apiPublicKey: pair.publicKey,
|
|
82
|
+
apiPrivateKey: pair.privateKey,
|
|
83
|
+
}).sign(KEY_PAIR_CHECK, api_key_stamper_1.SignatureFormat.Der);
|
|
84
|
+
if (await (0, crypto_1.verifyStampSignature)(pair.publicKey, signature, KEY_PAIR_CHECK)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
}
|
|
90
|
+
throw new Error('Stored public and private keys do not match.');
|
|
91
|
+
}
|
|
38
92
|
async getTurnkeyApiKeyStamper() {
|
|
39
93
|
if (!this.publicKeyHex) {
|
|
40
94
|
throw new Error('Key not initialized. Call init() or resetKeyPair() first.');
|
|
41
95
|
}
|
|
42
|
-
const
|
|
43
|
-
if (!
|
|
44
|
-
throw new Error('No
|
|
96
|
+
const pair = parseKeyPair(await SecureStore.getItemAsync(KEY_PAIR));
|
|
97
|
+
if (!pair || pair.publicKey !== this.publicKeyHex) {
|
|
98
|
+
throw new Error('No matching key pair found in secure store.');
|
|
45
99
|
}
|
|
46
100
|
return new api_key_stamper_1.ApiKeyStamper({
|
|
47
101
|
apiPublicKey: this.publicKeyHex,
|
|
48
|
-
apiPrivateKey: privateKey,
|
|
102
|
+
apiPrivateKey: pair.privateKey,
|
|
49
103
|
});
|
|
50
104
|
}
|
|
51
105
|
async stamp(payload) {
|
|
@@ -58,8 +112,11 @@ class SecureStoreStamperInner {
|
|
|
58
112
|
return stamper.sign(payload, api_key_stamper_1.SignatureFormat.Der);
|
|
59
113
|
}
|
|
60
114
|
async clear() {
|
|
61
|
-
await
|
|
62
|
-
|
|
115
|
+
await Promise.all([
|
|
116
|
+
SecureStore.deleteItemAsync(LEGACY_PUBLIC_KEY),
|
|
117
|
+
SecureStore.deleteItemAsync(LEGACY_PRIVATE_KEY),
|
|
118
|
+
]);
|
|
119
|
+
await SecureStore.deleteItemAsync(KEY_PAIR);
|
|
63
120
|
this.publicKeyHex = null;
|
|
64
121
|
}
|
|
65
122
|
}
|
|
@@ -89,6 +146,7 @@ async function createSecureStoreStamper() {
|
|
|
89
146
|
return inner.sign(payload);
|
|
90
147
|
},
|
|
91
148
|
async clear() {
|
|
149
|
+
pendingKeyPair = null;
|
|
92
150
|
await inner.clear();
|
|
93
151
|
},
|
|
94
152
|
async resetKeyPair() {
|
|
@@ -100,6 +158,22 @@ async function createSecureStoreStamper() {
|
|
|
100
158
|
pendingKeyPair = keyPair;
|
|
101
159
|
return keyPair.publicKey;
|
|
102
160
|
},
|
|
161
|
+
async stampPending(payload) {
|
|
162
|
+
if (!pendingKeyPair)
|
|
163
|
+
throw new Error('No pending key rotation');
|
|
164
|
+
return new api_key_stamper_1.ApiKeyStamper({
|
|
165
|
+
apiPublicKey: pendingKeyPair.publicKey,
|
|
166
|
+
apiPrivateKey: pendingKeyPair.privateKey,
|
|
167
|
+
}).stamp(payload);
|
|
168
|
+
},
|
|
169
|
+
async signPending(payload) {
|
|
170
|
+
if (!pendingKeyPair)
|
|
171
|
+
throw new Error('No pending key rotation');
|
|
172
|
+
return new api_key_stamper_1.ApiKeyStamper({
|
|
173
|
+
apiPublicKey: pendingKeyPair.publicKey,
|
|
174
|
+
apiPrivateKey: pendingKeyPair.privateKey,
|
|
175
|
+
}).sign(payload, api_key_stamper_1.SignatureFormat.Der);
|
|
176
|
+
},
|
|
103
177
|
async commitKeyRotation() {
|
|
104
178
|
if (!pendingKeyPair) {
|
|
105
179
|
throw new Error('No pending key rotation to commit');
|
|
@@ -107,6 +181,9 @@ async function createSecureStoreStamper() {
|
|
|
107
181
|
await inner.resetKeyPair(pendingKeyPair);
|
|
108
182
|
pendingKeyPair = null;
|
|
109
183
|
},
|
|
184
|
+
async discardKeyRotation() {
|
|
185
|
+
pendingKeyPair = null;
|
|
186
|
+
},
|
|
110
187
|
};
|
|
111
188
|
}
|
|
112
189
|
//# sourceMappingURL=secureStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secureStore.js","sourceRoot":"","sources":["../../../../src/native/stampers/secureStore.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"secureStore.js","sourceRoot":"","sources":["../../../../src/native/stampers/secureStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createIndexedDbStamper = createIndexedDbStamper;
|
|
4
|
+
const nist_js_1 = require("@noble/curves/nist.js");
|
|
4
5
|
const indexed_db_stamper_1 = require("@turnkey/indexed-db-stamper");
|
|
5
6
|
const utils_js_1 = require("../utils/utils.js");
|
|
7
|
+
async function signWithKeyPair(keyPair, payload) {
|
|
8
|
+
const rawSignature = new Uint8Array(await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, keyPair.privateKey, new TextEncoder().encode(payload)));
|
|
9
|
+
return nist_js_1.p256.Signature.fromBytes(rawSignature, 'compact').toHex('der');
|
|
10
|
+
}
|
|
11
|
+
function encodeStamp(publicKey, signature) {
|
|
12
|
+
const json = JSON.stringify({
|
|
13
|
+
publicKey,
|
|
14
|
+
scheme: 'SIGNATURE_SCHEME_TK_API_P256',
|
|
15
|
+
signature,
|
|
16
|
+
});
|
|
17
|
+
return btoa(json).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
18
|
+
}
|
|
6
19
|
async function createIndexedDbStamper() {
|
|
7
20
|
const inner = new indexed_db_stamper_1.IndexedDbStamper();
|
|
8
21
|
await inner.init();
|
|
9
22
|
let pendingKeyPair = null;
|
|
23
|
+
const requirePending = () => {
|
|
24
|
+
if (!pendingKeyPair)
|
|
25
|
+
throw new Error('No pending key rotation');
|
|
26
|
+
return pendingKeyPair;
|
|
27
|
+
};
|
|
10
28
|
return {
|
|
11
29
|
async getPublicKey() {
|
|
12
30
|
return await inner.getPublicKey();
|
|
@@ -18,6 +36,7 @@ async function createIndexedDbStamper() {
|
|
|
18
36
|
return await inner.sign(payload);
|
|
19
37
|
},
|
|
20
38
|
async clear() {
|
|
39
|
+
pendingKeyPair = null;
|
|
21
40
|
await inner.clear();
|
|
22
41
|
},
|
|
23
42
|
async resetKeyPair() {
|
|
@@ -29,6 +48,18 @@ async function createIndexedDbStamper() {
|
|
|
29
48
|
pendingKeyPair = keyPair;
|
|
30
49
|
return await (0, utils_js_1.generateCompressedPublicKeyFromKeyPair)(keyPair);
|
|
31
50
|
},
|
|
51
|
+
async stampPending(payload) {
|
|
52
|
+
const keyPair = requirePending();
|
|
53
|
+
const publicKey = await (0, utils_js_1.generateCompressedPublicKeyFromKeyPair)(keyPair);
|
|
54
|
+
const signature = await signWithKeyPair(keyPair, payload);
|
|
55
|
+
return {
|
|
56
|
+
stampHeaderName: 'X-Stamp',
|
|
57
|
+
stampHeaderValue: encodeStamp(publicKey, signature),
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
async signPending(payload) {
|
|
61
|
+
return signWithKeyPair(requirePending(), payload);
|
|
62
|
+
},
|
|
32
63
|
async commitKeyRotation() {
|
|
33
64
|
if (!pendingKeyPair) {
|
|
34
65
|
throw new Error('No pending key rotation to commit');
|
|
@@ -36,6 +67,9 @@ async function createIndexedDbStamper() {
|
|
|
36
67
|
await inner.resetKeyPair(pendingKeyPair);
|
|
37
68
|
pendingKeyPair = null;
|
|
38
69
|
},
|
|
70
|
+
async discardKeyRotation() {
|
|
71
|
+
pendingKeyPair = null;
|
|
72
|
+
},
|
|
39
73
|
};
|
|
40
74
|
}
|
|
41
75
|
//# sourceMappingURL=indexedDbStamper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexedDbStamper.js","sourceRoot":"","sources":["../../../src/stampers/indexedDbStamper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"indexedDbStamper.js","sourceRoot":"","sources":["../../../src/stampers/indexedDbStamper.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,19 +2,78 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createStorageManager = createStorageManager;
|
|
4
4
|
const utils_js_1 = require("../utils/utils.js");
|
|
5
|
+
let mutationTail = Promise.resolve();
|
|
6
|
+
function isStoredSession(value) {
|
|
7
|
+
if (!value || typeof value !== 'object')
|
|
8
|
+
return false;
|
|
9
|
+
const session = value;
|
|
10
|
+
return (typeof session.id === 'string' &&
|
|
11
|
+
typeof session.userId === 'string' &&
|
|
12
|
+
typeof session.organizationId === 'string' &&
|
|
13
|
+
(session.stamperType === 'apiKey' || session.stamperType === 'passkey') &&
|
|
14
|
+
typeof session.token === 'string' &&
|
|
15
|
+
session.token.length > 0 &&
|
|
16
|
+
typeof session.expiry === 'number' &&
|
|
17
|
+
Number.isFinite(session.expiry) &&
|
|
18
|
+
session.expiry > 0 &&
|
|
19
|
+
typeof session.createdAt === 'number' &&
|
|
20
|
+
Number.isFinite(session.createdAt));
|
|
21
|
+
}
|
|
5
22
|
function createStorageManager(adapter) {
|
|
6
23
|
const ACTIVE_SESSION_KEY = '@zerodev/active_session';
|
|
7
24
|
const ALL_SESSIONS_KEY = '@zerodev/sessions';
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
25
|
+
const SESSION_TRANSITION_KEY = '@zerodev/session_transition';
|
|
26
|
+
const withMutation = async (mutation) => {
|
|
27
|
+
const result = mutationTail.then(mutation);
|
|
28
|
+
mutationTail = result.then(() => undefined, () => undefined);
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
const parseSessionKeys = (value) => {
|
|
32
|
+
if (!value)
|
|
33
|
+
return [];
|
|
34
|
+
try {
|
|
35
|
+
const parsed = JSON.parse(value);
|
|
36
|
+
if (!Array.isArray(parsed) ||
|
|
37
|
+
!parsed.every((key) => typeof key === 'string')) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const restoreItem = async (key, value) => {
|
|
47
|
+
if (value === null)
|
|
48
|
+
await adapter.removeItem(key);
|
|
49
|
+
else
|
|
50
|
+
await adapter.setItem(key, value);
|
|
51
|
+
};
|
|
52
|
+
const storeSessionUnlocked = async (sessionData, sessionKey) => {
|
|
53
|
+
const recordKey = sessionKey;
|
|
54
|
+
const [previousRecord, previousIndex, previousActive] = await Promise.all([
|
|
55
|
+
adapter.getItem(recordKey),
|
|
56
|
+
adapter.getItem(ALL_SESSIONS_KEY),
|
|
57
|
+
adapter.getItem(ACTIVE_SESSION_KEY),
|
|
58
|
+
]);
|
|
59
|
+
try {
|
|
60
|
+
await adapter.setItem(recordKey, JSON.stringify(sessionData));
|
|
61
|
+
const sessions = parseSessionKeys(previousIndex) ?? [];
|
|
62
|
+
if (!sessions.includes(sessionKey))
|
|
63
|
+
sessions.push(sessionKey);
|
|
14
64
|
await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(sessions));
|
|
65
|
+
await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
await Promise.allSettled([
|
|
69
|
+
restoreItem(recordKey, previousRecord),
|
|
70
|
+
restoreItem(ALL_SESSIONS_KEY, previousIndex),
|
|
71
|
+
restoreItem(ACTIVE_SESSION_KEY, previousActive),
|
|
72
|
+
]);
|
|
73
|
+
throw error;
|
|
15
74
|
}
|
|
16
|
-
await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
|
|
17
75
|
};
|
|
76
|
+
const storeSession = async (sessionData, sessionKey) => withMutation(() => storeSessionUnlocked(sessionData, sessionKey));
|
|
18
77
|
const getActiveSession = async () => {
|
|
19
78
|
const activeKey = await adapter.getItem(ACTIVE_SESSION_KEY);
|
|
20
79
|
if (!activeKey)
|
|
@@ -31,7 +90,11 @@ function createStorageManager(adapter) {
|
|
|
31
90
|
return undefined;
|
|
32
91
|
try {
|
|
33
92
|
const session = JSON.parse(sessionStr);
|
|
34
|
-
if (
|
|
93
|
+
if (!isStoredSession(session)) {
|
|
94
|
+
await clearSession(sessionKey);
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
if ((0, utils_js_1.normalizeTimestamp)(session.expiry) < Date.now()) {
|
|
35
98
|
await clearSession(sessionKey);
|
|
36
99
|
return undefined;
|
|
37
100
|
}
|
|
@@ -42,21 +105,26 @@ function createStorageManager(adapter) {
|
|
|
42
105
|
return undefined;
|
|
43
106
|
}
|
|
44
107
|
};
|
|
45
|
-
const
|
|
108
|
+
const listSessionKeysUnlocked = async () => {
|
|
46
109
|
const sessionsStr = await adapter.getItem(ALL_SESSIONS_KEY);
|
|
47
|
-
const
|
|
110
|
+
const parsedKeys = parseSessionKeys(sessionsStr);
|
|
111
|
+
if (!parsedKeys) {
|
|
112
|
+
await adapter.removeItem(ALL_SESSIONS_KEY);
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
48
115
|
const validKeys = [];
|
|
49
|
-
for (const key of
|
|
116
|
+
for (const key of parsedKeys) {
|
|
50
117
|
const exists = await adapter.getItem(key);
|
|
51
118
|
if (exists) {
|
|
52
119
|
validKeys.push(key);
|
|
53
120
|
}
|
|
54
121
|
}
|
|
55
|
-
if (validKeys.length !==
|
|
122
|
+
if (validKeys.length !== parsedKeys.length) {
|
|
56
123
|
await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(validKeys));
|
|
57
124
|
}
|
|
58
125
|
return validKeys;
|
|
59
126
|
};
|
|
127
|
+
const listSessionKeys = async () => withMutation(listSessionKeysUnlocked);
|
|
60
128
|
const listSessions = async () => {
|
|
61
129
|
const sessionKeys = await listSessionKeys();
|
|
62
130
|
const sessions = [];
|
|
@@ -73,11 +141,13 @@ function createStorageManager(adapter) {
|
|
|
73
141
|
if (!session) {
|
|
74
142
|
throw new Error(`Session not found: ${sessionKey}`);
|
|
75
143
|
}
|
|
76
|
-
await
|
|
144
|
+
await withMutation(async () => {
|
|
145
|
+
await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
|
|
146
|
+
});
|
|
77
147
|
};
|
|
78
|
-
const
|
|
148
|
+
const clearSessionUnlocked = async (sessionKey) => {
|
|
79
149
|
await adapter.removeItem(sessionKey);
|
|
80
|
-
const sessions = await
|
|
150
|
+
const sessions = await listSessionKeysUnlocked();
|
|
81
151
|
const updated = sessions.filter((k) => k !== sessionKey);
|
|
82
152
|
await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(updated));
|
|
83
153
|
const activeKey = await adapter.getItem(ACTIVE_SESSION_KEY);
|
|
@@ -85,13 +155,67 @@ function createStorageManager(adapter) {
|
|
|
85
155
|
await adapter.removeItem(ACTIVE_SESSION_KEY);
|
|
86
156
|
}
|
|
87
157
|
};
|
|
88
|
-
const
|
|
89
|
-
|
|
158
|
+
const clearSession = async (sessionKey) => withMutation(() => clearSessionUnlocked(sessionKey));
|
|
159
|
+
const clearAllSessions = async () => withMutation(async () => {
|
|
160
|
+
await clearAllSessionsUnlocked();
|
|
161
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
162
|
+
});
|
|
163
|
+
async function clearAllSessionsUnlocked() {
|
|
164
|
+
const sessions = await listSessionKeysUnlocked();
|
|
90
165
|
for (const key of sessions) {
|
|
91
166
|
await adapter.removeItem(key);
|
|
92
167
|
}
|
|
93
168
|
await adapter.removeItem(ALL_SESSIONS_KEY);
|
|
94
169
|
await adapter.removeItem(ACTIVE_SESSION_KEY);
|
|
170
|
+
}
|
|
171
|
+
const parseTransition = (value) => {
|
|
172
|
+
if (!value)
|
|
173
|
+
return null;
|
|
174
|
+
try {
|
|
175
|
+
const parsed = JSON.parse(value);
|
|
176
|
+
if (!isStoredSession(parsed.sessionData) ||
|
|
177
|
+
typeof parsed.publicKey !== 'string' ||
|
|
178
|
+
!parsed.publicKey) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
return parsed;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const stageSessionTransition = async (sessionData, publicKey) => withMutation(async () => {
|
|
188
|
+
await adapter.setItem(SESSION_TRANSITION_KEY, JSON.stringify({ sessionData, publicKey }));
|
|
189
|
+
});
|
|
190
|
+
const commitSessionTransition = async () => withMutation(async () => {
|
|
191
|
+
const transition = parseTransition(await adapter.getItem(SESSION_TRANSITION_KEY));
|
|
192
|
+
if (!transition) {
|
|
193
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
await clearAllSessionsUnlocked();
|
|
197
|
+
await storeSessionUnlocked(transition.sessionData, transition.sessionData.id);
|
|
198
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
199
|
+
return transition.sessionData;
|
|
200
|
+
});
|
|
201
|
+
const normalizeKey = (key) => key.replace(/^0x/, '').toLowerCase();
|
|
202
|
+
const recoverSessionTransition = async (activePublicKey) => {
|
|
203
|
+
const transition = parseTransition(await adapter.getItem(SESSION_TRANSITION_KEY));
|
|
204
|
+
if (!transition) {
|
|
205
|
+
if (await adapter.getItem(SESSION_TRANSITION_KEY)) {
|
|
206
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (!activePublicKey) {
|
|
211
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
if (normalizeKey(activePublicKey) !== normalizeKey(transition.publicKey)) {
|
|
215
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
return commitSessionTransition();
|
|
95
219
|
};
|
|
96
220
|
return {
|
|
97
221
|
storeSession,
|
|
@@ -103,6 +227,9 @@ function createStorageManager(adapter) {
|
|
|
103
227
|
setActiveSession,
|
|
104
228
|
clearSession,
|
|
105
229
|
clearAllSessions,
|
|
230
|
+
stageSessionTransition,
|
|
231
|
+
commitSessionTransition,
|
|
232
|
+
recoverSessionTransition,
|
|
106
233
|
};
|
|
107
234
|
}
|
|
108
235
|
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/manager.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,10 @@ function extractTokenIdFromJwt(jwt) {
|
|
|
22
22
|
if (parts.length !== 3) {
|
|
23
23
|
throw new Error('Invalid JWT format');
|
|
24
24
|
}
|
|
25
|
-
const
|
|
25
|
+
const encodedPayload = parts[1];
|
|
26
|
+
if (!encodedPayload)
|
|
27
|
+
throw new Error('Invalid JWT format');
|
|
28
|
+
const payload = JSON.parse(base64UrlDecode(encodedPayload));
|
|
26
29
|
if (!payload.id) {
|
|
27
30
|
throw new Error('JWT payload missing id field');
|
|
28
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildClientSignature.js","sourceRoot":"","sources":["../../../src/utils/buildClientSignature.ts"],"names":[],"mappings":";;AA0BA,oDA6BC;AAtDD,iEAA0D;AAyBnD,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IAElC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAGxD,MAAM,OAAO,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAA;IAGxD,MAAM,gBAAgB,GAAG;QACvB,KAAK,EAAE,EAAE,SAAS,EAAE;QACpB,OAAO;QACP,IAAI,EAAE,kBAAkB;KACzB,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAGhD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAI1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACrE,MAAM,eAAe,GAAW,SAAS,CAAC,SAAS,CAAA;IAGnD,MAAM,YAAY,GAAG,IAAA,wCAAiB,EAAC,eAAe,CAAC,CAAA;IAGvD,OAAO,YAAY,CAAA;AACrB,CAAC;AAKD,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,
|
|
1
|
+
{"version":3,"file":"buildClientSignature.js","sourceRoot":"","sources":["../../../src/utils/buildClientSignature.ts"],"names":[],"mappings":";;AA0BA,oDA6BC;AAtDD,iEAA0D;AAyBnD,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IAElC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAGxD,MAAM,OAAO,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAA;IAGxD,MAAM,gBAAgB,GAAG;QACvB,KAAK,EAAE,EAAE,SAAS,EAAE;QACpB,OAAO;QACP,IAAI,EAAE,kBAAkB;KACzB,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAGhD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAI1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACrE,MAAM,eAAe,GAAW,SAAS,CAAC,SAAS,CAAA;IAGnD,MAAM,YAAY,GAAG,IAAA,wCAAiB,EAAC,eAAe,CAAC,CAAA;IAGvD,OAAO,YAAY,CAAA;AACrB,CAAC;AAKD,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;IAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,OAAO,OAAO,CAAC,EAAE,CAAA;AACnB,CAAC;AAKD,SAAS,eAAe,CAAC,GAAW;IAElC,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC"}
|
|
@@ -12,7 +12,13 @@ function derToRawSignature(derHex) {
|
|
|
12
12
|
}
|
|
13
13
|
offset++;
|
|
14
14
|
const rLength = der[offset];
|
|
15
|
+
if (rLength === undefined) {
|
|
16
|
+
throw new Error('Invalid DER signature: missing r length');
|
|
17
|
+
}
|
|
15
18
|
offset++;
|
|
19
|
+
if (offset + rLength > der.length) {
|
|
20
|
+
throw new Error('Invalid DER signature: truncated r value');
|
|
21
|
+
}
|
|
16
22
|
const rBytes = der.slice(offset, offset + rLength);
|
|
17
23
|
offset += rLength;
|
|
18
24
|
if (der[offset] !== 0x02) {
|
|
@@ -20,7 +26,13 @@ function derToRawSignature(derHex) {
|
|
|
20
26
|
}
|
|
21
27
|
offset++;
|
|
22
28
|
const sLength = der[offset];
|
|
29
|
+
if (sLength === undefined) {
|
|
30
|
+
throw new Error('Invalid DER signature: missing s length');
|
|
31
|
+
}
|
|
23
32
|
offset++;
|
|
33
|
+
if (offset + sLength > der.length) {
|
|
34
|
+
throw new Error('Invalid DER signature: truncated s value');
|
|
35
|
+
}
|
|
24
36
|
const sBytes = der.slice(offset, offset + sLength);
|
|
25
37
|
const r = padTo32Bytes(stripLeadingZeros(rBytes));
|
|
26
38
|
const s = padTo32Bytes(stripLeadingZeros(sBytes));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derToRawSignature.js","sourceRoot":"","sources":["../../../src/utils/derToRawSignature.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"derToRawSignature.js","sourceRoot":"","sources":["../../../src/utils/derToRawSignature.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,6 @@ async function exportPrivateKey(params) {
|
|
|
50
50
|
if (!exportBundle) {
|
|
51
51
|
throw new Error(`Export bundle not found in response: ${JSON.stringify(exportData)}`);
|
|
52
52
|
}
|
|
53
|
-
return { exportBundle, address
|
|
53
|
+
return { exportBundle, address, organizationId };
|
|
54
54
|
}
|
|
55
55
|
//# sourceMappingURL=exportPrivateKey.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportPrivateKey.js","sourceRoot":"","sources":["../../../src/utils/exportPrivateKey.ts"],"names":[],"mappings":";;AA0CA,4CAuEC;AAvEM,KAAK,UAAU,gBAAgB,CACpC,MAAkC;IAElC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAEjE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;IAGlC,IAAI,OAAO,GAAG,YAAY,CAAA;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;QACxC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE;YACV,OAAO,EAAE,OAAO;YAChB,eAAe;SAChB;KACF,CAAC,CAAA;IAEF,MAAM,UAAU,GACd,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAA;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,8BAA8B,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,gEAAgE,EAChE;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,gBAAgB;SAC5D;KACF,CACF,CAAA;IACD,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,IAAI,KAAK,CACb,oCAAoC,cAAc,CAAC,MAAM,IAAI,SAAS,EAAE,CACzE,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;IAE9C,MAAM,YAAY,GAChB,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAA;IAEvE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CACrE,CAAA;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"exportPrivateKey.js","sourceRoot":"","sources":["../../../src/utils/exportPrivateKey.ts"],"names":[],"mappings":";;AA0CA,4CAuEC;AAvEM,KAAK,UAAU,gBAAgB,CACpC,MAAkC;IAElC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAEjE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;IAGlC,IAAI,OAAO,GAAG,YAAY,CAAA;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;QACxC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE;YACV,OAAO,EAAE,OAAO;YAChB,eAAe;SAChB;KACF,CAAC,CAAA;IAEF,MAAM,UAAU,GACd,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAA;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,8BAA8B,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,gEAAgE,EAChE;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,gBAAgB;SAC5D;KACF,CACF,CAAA;IACD,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,IAAI,KAAK,CACb,oCAAoC,cAAc,CAAC,MAAM,IAAI,SAAS,EAAE,CACzE,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;IAE9C,MAAM,YAAY,GAChB,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAA;IAEvE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CACrE,CAAA;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,CAAA;AAClD,CAAC"}
|