@txnlab/use-wallet 4.6.0 → 5.0.0-rc.1
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/adapter.d.ts +18 -0
- package/dist/adapter.js +3 -0
- package/dist/base-BKrq-rUH.d.ts +365 -0
- package/dist/custom-BXQKth41.d.ts +107 -0
- package/dist/index.d.ts +107 -1274
- package/dist/index.js +401 -9996
- package/dist/index.js.map +1 -1
- package/dist/store-CM2Y4xMP.js +335 -0
- package/dist/store-CM2Y4xMP.js.map +1 -0
- package/dist/testing.d.ts +30 -0
- package/dist/testing.js +88 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-BduS9cZw.js +442 -0
- package/dist/types-BduS9cZw.js.map +1 -0
- package/package.json +30 -78
- package/dist/index.cjs +0 -10045
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -1283
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { _ as logger } from "./store-CM2Y4xMP.js";
|
|
2
|
+
import algosdk from "algosdk";
|
|
3
|
+
//#region src/secure-key.ts
|
|
4
|
+
/**
|
|
5
|
+
* Secure key handling utilities for managing sensitive cryptographic material.
|
|
6
|
+
*
|
|
7
|
+
* These utilities provide defense-in-depth for private key handling:
|
|
8
|
+
* 1. Memory zeroing - Overwrites key material before releasing references
|
|
9
|
+
* 2. Scoped key access - Keys are only available within controlled callbacks
|
|
10
|
+
* 3. Automatic cleanup - Keys are cleared after use via try/finally patterns
|
|
11
|
+
* 4. No persistence - Keys are never stored to disk/localStorage
|
|
12
|
+
*/
|
|
13
|
+
const secureLogger = logger.createScopedLogger("SecureKey");
|
|
14
|
+
/**
|
|
15
|
+
* Securely zeros out a Uint8Array by overwriting all bytes with zeros.
|
|
16
|
+
* This helps prevent key material from lingering in memory.
|
|
17
|
+
*
|
|
18
|
+
* Note: JavaScript doesn't guarantee immediate memory clearing due to GC,
|
|
19
|
+
* but this provides defense-in-depth by:
|
|
20
|
+
* 1. Overwriting the buffer contents immediately
|
|
21
|
+
* 2. Reducing the window where key material is accessible
|
|
22
|
+
* 3. Preventing accidental key leakage through references
|
|
23
|
+
*/
|
|
24
|
+
function zeroMemory(buffer) {
|
|
25
|
+
if (!buffer || buffer.length === 0) return;
|
|
26
|
+
try {
|
|
27
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) crypto.getRandomValues(buffer);
|
|
28
|
+
buffer.fill(0);
|
|
29
|
+
} catch {
|
|
30
|
+
for (let i = 0; i < buffer.length; i++) buffer[i] = 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Securely zeros out a string by creating a mutable copy and clearing it.
|
|
35
|
+
* Returns an empty string. The original string in memory may still exist
|
|
36
|
+
* due to string immutability in JS, but this clears any mutable references.
|
|
37
|
+
*/
|
|
38
|
+
function zeroString(str) {
|
|
39
|
+
if (!str) return "";
|
|
40
|
+
const arr = new Uint8Array(str.length);
|
|
41
|
+
for (let i = 0; i < str.length; i++) arr[i] = str.charCodeAt(i);
|
|
42
|
+
zeroMemory(arr);
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A secure container for holding private key material.
|
|
47
|
+
* Provides controlled access and automatic cleanup.
|
|
48
|
+
*/
|
|
49
|
+
var SecureKeyContainer = class {
|
|
50
|
+
_secretKey = null;
|
|
51
|
+
_isCleared = false;
|
|
52
|
+
constructor(secretKey) {
|
|
53
|
+
this._secretKey = new Uint8Array(secretKey);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if the key has been cleared
|
|
57
|
+
*/
|
|
58
|
+
get isCleared() {
|
|
59
|
+
return this._isCleared;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Execute a callback with access to the secret key.
|
|
63
|
+
* The key is automatically cleared if an error occurs.
|
|
64
|
+
*/
|
|
65
|
+
async useKey(callback) {
|
|
66
|
+
if (this._isCleared || !this._secretKey) throw new Error("SecureKeyContainer: Key has been cleared");
|
|
67
|
+
try {
|
|
68
|
+
return await callback(this._secretKey);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
this.clear();
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Execute a synchronous callback with access to the secret key.
|
|
76
|
+
*/
|
|
77
|
+
useKeySync(callback) {
|
|
78
|
+
if (this._isCleared || !this._secretKey) throw new Error("SecureKeyContainer: Key has been cleared");
|
|
79
|
+
try {
|
|
80
|
+
return callback(this._secretKey);
|
|
81
|
+
} catch (error) {
|
|
82
|
+
this.clear();
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Securely clear the key from memory.
|
|
88
|
+
* This should be called when the key is no longer needed.
|
|
89
|
+
*/
|
|
90
|
+
clear() {
|
|
91
|
+
if (this._secretKey && !this._isCleared) {
|
|
92
|
+
zeroMemory(this._secretKey);
|
|
93
|
+
this._secretKey = null;
|
|
94
|
+
this._isCleared = true;
|
|
95
|
+
secureLogger.debug("Key material cleared from memory");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Execute a function with a temporary secret key that is automatically
|
|
101
|
+
* cleared after the function completes (success or error).
|
|
102
|
+
*
|
|
103
|
+
* This is the preferred pattern for one-time key operations.
|
|
104
|
+
*/
|
|
105
|
+
async function withSecureKey(secretKey, callback) {
|
|
106
|
+
const container = new SecureKeyContainer(secretKey);
|
|
107
|
+
try {
|
|
108
|
+
return await callback(container);
|
|
109
|
+
} finally {
|
|
110
|
+
container.clear();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Synchronous version of withSecureKey for non-async operations.
|
|
115
|
+
*/
|
|
116
|
+
function withSecureKeySync(secretKey, callback) {
|
|
117
|
+
const container = new SecureKeyContainer(secretKey);
|
|
118
|
+
try {
|
|
119
|
+
return callback(container);
|
|
120
|
+
} finally {
|
|
121
|
+
container.clear();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Derive an Algorand account from an ed25519 private key seed.
|
|
126
|
+
* The input key should be 32 bytes (seed).
|
|
127
|
+
*
|
|
128
|
+
* SECURITY: The returned account contains a secret key reference.
|
|
129
|
+
* The caller is responsible for zeroing account.sk after use.
|
|
130
|
+
*/
|
|
131
|
+
async function deriveAlgorandAccountFromEd25519(ed25519Seed) {
|
|
132
|
+
if (ed25519Seed.length !== 32) throw new Error(`Invalid ed25519 seed length: expected 32 bytes, got ${ed25519Seed.length}`);
|
|
133
|
+
const nacl = await import("tweetnacl");
|
|
134
|
+
const algosdk = await import("algosdk");
|
|
135
|
+
const keyPair = nacl.sign.keyPair.fromSeed(ed25519Seed);
|
|
136
|
+
return {
|
|
137
|
+
addr: algosdk.encodeAddress(keyPair.publicKey),
|
|
138
|
+
sk: keyPair.secretKey
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region src/wallets/base.ts
|
|
143
|
+
var BaseWallet = class {
|
|
144
|
+
id;
|
|
145
|
+
walletKey;
|
|
146
|
+
metadata;
|
|
147
|
+
options;
|
|
148
|
+
store;
|
|
149
|
+
getAlgodClient;
|
|
150
|
+
subscribe;
|
|
151
|
+
logger;
|
|
152
|
+
constructor({ id, metadata, store, subscribe, getAlgodClient, options }) {
|
|
153
|
+
this.id = id;
|
|
154
|
+
this.walletKey = id;
|
|
155
|
+
this.metadata = { ...metadata };
|
|
156
|
+
this.options = options ?? {};
|
|
157
|
+
this.store = store;
|
|
158
|
+
this.subscribe = subscribe;
|
|
159
|
+
this.getAlgodClient = getAlgodClient;
|
|
160
|
+
this.logger = logger.createScopedLogger(`Wallet:${this.walletKey.toUpperCase()}`);
|
|
161
|
+
}
|
|
162
|
+
static defaultMetadata = {
|
|
163
|
+
name: "Base Wallet",
|
|
164
|
+
icon: ""
|
|
165
|
+
};
|
|
166
|
+
setActive = () => {
|
|
167
|
+
this.logger.info(`Set active wallet: ${this.walletKey}`);
|
|
168
|
+
this.store.setActive();
|
|
169
|
+
};
|
|
170
|
+
setActiveAccount = (account) => {
|
|
171
|
+
this.logger.info(`Set active account: ${account}`);
|
|
172
|
+
this.store.setActiveAccount(account);
|
|
173
|
+
};
|
|
174
|
+
transactionSigner = async (txnGroup, indexesToSign) => {
|
|
175
|
+
return (await this.signTransactions(txnGroup, indexesToSign)).reduce((acc, value) => {
|
|
176
|
+
if (value !== null) acc.push(value);
|
|
177
|
+
return acc;
|
|
178
|
+
}, []);
|
|
179
|
+
};
|
|
180
|
+
canSignData = false;
|
|
181
|
+
signData = async (_data, _metadata) => {
|
|
182
|
+
this.logger.error("Method not supported: signData");
|
|
183
|
+
throw new Error("Method not supported: signData");
|
|
184
|
+
};
|
|
185
|
+
canUsePrivateKey = false;
|
|
186
|
+
withPrivateKey = async (_callback) => {
|
|
187
|
+
this.logger.error("Method not supported: withPrivateKey");
|
|
188
|
+
throw new Error("Method not supported: withPrivateKey");
|
|
189
|
+
};
|
|
190
|
+
get name() {
|
|
191
|
+
return this.id.toUpperCase();
|
|
192
|
+
}
|
|
193
|
+
get accounts() {
|
|
194
|
+
const walletState = this.store.getWalletState();
|
|
195
|
+
return walletState ? walletState.accounts : [];
|
|
196
|
+
}
|
|
197
|
+
get addresses() {
|
|
198
|
+
return this.accounts.map((account) => account.address);
|
|
199
|
+
}
|
|
200
|
+
get activeAccount() {
|
|
201
|
+
const walletState = this.store.getWalletState();
|
|
202
|
+
return walletState ? walletState.activeAccount : null;
|
|
203
|
+
}
|
|
204
|
+
get activeAddress() {
|
|
205
|
+
return this.activeAccount?.address ?? null;
|
|
206
|
+
}
|
|
207
|
+
get activeNetwork() {
|
|
208
|
+
return this.store.getActiveNetwork();
|
|
209
|
+
}
|
|
210
|
+
get isConnected() {
|
|
211
|
+
const walletState = this.store.getWalletState();
|
|
212
|
+
return walletState ? walletState.accounts.length > 0 : false;
|
|
213
|
+
}
|
|
214
|
+
get isActive() {
|
|
215
|
+
return this.store.getActiveWallet() === this.walletKey;
|
|
216
|
+
}
|
|
217
|
+
get activeNetworkConfig() {
|
|
218
|
+
const state = this.store.getState();
|
|
219
|
+
return state.networkConfig[state.activeNetwork];
|
|
220
|
+
}
|
|
221
|
+
onDisconnect = () => {
|
|
222
|
+
this.logger.debug(`Removing wallet from store...`);
|
|
223
|
+
this.store.removeWallet();
|
|
224
|
+
};
|
|
225
|
+
updateMetadata(updates) {
|
|
226
|
+
this.metadata = {
|
|
227
|
+
...this.metadata,
|
|
228
|
+
...updates
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
//#endregion
|
|
233
|
+
//#region src/utils.ts
|
|
234
|
+
function compareAccounts(accounts, compareTo) {
|
|
235
|
+
const addresses = new Set(accounts.map((account) => account.address));
|
|
236
|
+
const compareAddresses = new Set(compareTo.map((account) => account.address));
|
|
237
|
+
if (addresses.size !== compareAddresses.size) return false;
|
|
238
|
+
for (const address of addresses) if (!compareAddresses.has(address)) return false;
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
function base64ToByteArray(blob) {
|
|
242
|
+
return stringToByteArray(atob(blob));
|
|
243
|
+
}
|
|
244
|
+
function byteArrayToBase64(array) {
|
|
245
|
+
return btoa(byteArrayToString(array));
|
|
246
|
+
}
|
|
247
|
+
function stringToByteArray(str) {
|
|
248
|
+
const array = new Uint8Array(str.length);
|
|
249
|
+
for (let i = 0; i < str.length; i++) array[i] = str.charCodeAt(i);
|
|
250
|
+
return array;
|
|
251
|
+
}
|
|
252
|
+
function byteArrayToString(array) {
|
|
253
|
+
let result = "";
|
|
254
|
+
for (let i = 0; i < array.length; i++) result += String.fromCharCode(array[i]);
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
function isSignedTxn(txnObj) {
|
|
258
|
+
if (!txnObj || typeof txnObj !== "object") return false;
|
|
259
|
+
if (!("sig" in txnObj && "txn" in txnObj)) return false;
|
|
260
|
+
if (!(txnObj.sig instanceof Uint8Array)) return false;
|
|
261
|
+
const txn = txnObj.txn;
|
|
262
|
+
if (!txn || typeof txn !== "object") return false;
|
|
263
|
+
return "type" in txn && "snd" in txn;
|
|
264
|
+
}
|
|
265
|
+
function isTransaction(item) {
|
|
266
|
+
return item && typeof item === "object" && "sender" in item && (item.sender instanceof algosdk.Address || typeof item.sender === "string");
|
|
267
|
+
}
|
|
268
|
+
function isTransactionArray(txnGroup) {
|
|
269
|
+
if (!Array.isArray(txnGroup) || txnGroup.length === 0) return false;
|
|
270
|
+
if (isTransaction(txnGroup[0])) return true;
|
|
271
|
+
if (Array.isArray(txnGroup[0]) && txnGroup[0].length > 0 && isTransaction(txnGroup[0][0])) return true;
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
function flattenTxnGroup(txnGroup) {
|
|
275
|
+
if (!Array.isArray(txnGroup[0])) return txnGroup;
|
|
276
|
+
return txnGroup.flat();
|
|
277
|
+
}
|
|
278
|
+
function getPayloadId() {
|
|
279
|
+
return Date.now() * Math.pow(10, 3) + Math.floor(Math.random() * Math.pow(10, 3));
|
|
280
|
+
}
|
|
281
|
+
function formatJsonRpcRequest(method, params) {
|
|
282
|
+
return {
|
|
283
|
+
id: getPayloadId(),
|
|
284
|
+
jsonrpc: "2.0",
|
|
285
|
+
method,
|
|
286
|
+
params
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
//#endregion
|
|
290
|
+
//#region src/wallets/custom.ts
|
|
291
|
+
const ICON = `data:image/svg+xml;base64,${btoa(`
|
|
292
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
293
|
+
<rect width="24" height="24" fill="#525252" />
|
|
294
|
+
</svg>
|
|
295
|
+
`)}`;
|
|
296
|
+
const CUSTOM_WALLET_ID = "custom";
|
|
297
|
+
var CustomWallet = class extends BaseWallet {
|
|
298
|
+
provider;
|
|
299
|
+
constructor(params) {
|
|
300
|
+
super(params);
|
|
301
|
+
if (!params.options?.provider) {
|
|
302
|
+
this.logger.error("Missing required option: provider");
|
|
303
|
+
throw new Error("Missing required option: provider");
|
|
304
|
+
}
|
|
305
|
+
this.provider = params.options.provider;
|
|
306
|
+
this.canSignData = typeof this.provider.signData === "function";
|
|
307
|
+
}
|
|
308
|
+
static defaultMetadata = {
|
|
309
|
+
name: "Custom",
|
|
310
|
+
icon: ICON
|
|
311
|
+
};
|
|
312
|
+
connect = async (args) => {
|
|
313
|
+
this.logger.info("Connecting...");
|
|
314
|
+
try {
|
|
315
|
+
if (!this.provider.connect) {
|
|
316
|
+
this.logger.error("Method not supported: connect");
|
|
317
|
+
throw new Error("Method not supported: connect");
|
|
318
|
+
}
|
|
319
|
+
const walletAccounts = await this.provider.connect(args);
|
|
320
|
+
if (walletAccounts.length === 0) {
|
|
321
|
+
this.logger.error("No accounts found!");
|
|
322
|
+
throw new Error("No accounts found!");
|
|
323
|
+
}
|
|
324
|
+
const walletState = {
|
|
325
|
+
accounts: walletAccounts,
|
|
326
|
+
activeAccount: walletAccounts[0]
|
|
327
|
+
};
|
|
328
|
+
this.store.addWallet(walletState);
|
|
329
|
+
this.logger.info("Connected successfully", walletState);
|
|
330
|
+
return walletAccounts;
|
|
331
|
+
} catch (error) {
|
|
332
|
+
this.logger.error("Error connecting:", error.message || error);
|
|
333
|
+
throw error;
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
disconnect = async () => {
|
|
337
|
+
this.logger.info("Disconnecting...");
|
|
338
|
+
this.onDisconnect();
|
|
339
|
+
await this.provider.disconnect?.();
|
|
340
|
+
};
|
|
341
|
+
resumeSession = async () => {
|
|
342
|
+
try {
|
|
343
|
+
const walletState = this.store.getWalletState();
|
|
344
|
+
if (!walletState) {
|
|
345
|
+
this.logger.info("No session to resume");
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
this.logger.info("Resuming session...");
|
|
349
|
+
const result = await this.provider.resumeSession?.();
|
|
350
|
+
if (Array.isArray(result)) {
|
|
351
|
+
const walletAccounts = result;
|
|
352
|
+
if (walletAccounts.length === 0) {
|
|
353
|
+
this.logger.error("No accounts found!");
|
|
354
|
+
throw new Error("No accounts found!");
|
|
355
|
+
}
|
|
356
|
+
if (!compareAccounts(walletAccounts, walletState.accounts)) {
|
|
357
|
+
this.logger.warn("Session accounts mismatch, updating accounts", {
|
|
358
|
+
prev: walletState.accounts,
|
|
359
|
+
current: walletAccounts
|
|
360
|
+
});
|
|
361
|
+
this.store.setAccounts(walletAccounts);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
this.logger.info("Session resumed successfully");
|
|
365
|
+
} catch (error) {
|
|
366
|
+
this.logger.error("Error resuming session:", error.message);
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
signTransactions = async (txnGroup, indexesToSign) => {
|
|
371
|
+
if (!this.provider.signTransactions) {
|
|
372
|
+
this.logger.error("Method not supported: signTransactions");
|
|
373
|
+
throw new Error("Method not supported: signTransactions");
|
|
374
|
+
}
|
|
375
|
+
this.logger.debug("Signing transactions...", {
|
|
376
|
+
txnGroup,
|
|
377
|
+
indexesToSign
|
|
378
|
+
});
|
|
379
|
+
return await this.provider.signTransactions(txnGroup, indexesToSign);
|
|
380
|
+
};
|
|
381
|
+
transactionSigner = async (txnGroup, indexesToSign) => {
|
|
382
|
+
if (!this.provider.transactionSigner) {
|
|
383
|
+
this.logger.error("Method not supported: transactionSigner");
|
|
384
|
+
throw new Error("Method not supported: transactionSigner");
|
|
385
|
+
}
|
|
386
|
+
this.logger.debug("Transaction signer called...", {
|
|
387
|
+
txnGroup,
|
|
388
|
+
indexesToSign
|
|
389
|
+
});
|
|
390
|
+
return await this.provider.transactionSigner(txnGroup, indexesToSign);
|
|
391
|
+
};
|
|
392
|
+
signData = async (data, metadata) => {
|
|
393
|
+
if (!this.provider.signData) {
|
|
394
|
+
this.logger.error("Method not supported: signData");
|
|
395
|
+
throw new Error("Method not supported: signData");
|
|
396
|
+
}
|
|
397
|
+
this.logger.debug("Signing data...", {
|
|
398
|
+
data,
|
|
399
|
+
metadata
|
|
400
|
+
});
|
|
401
|
+
return await this.provider.signData(data, metadata);
|
|
402
|
+
};
|
|
403
|
+
};
|
|
404
|
+
function custom(options) {
|
|
405
|
+
return {
|
|
406
|
+
id: CUSTOM_WALLET_ID,
|
|
407
|
+
metadata: CustomWallet.defaultMetadata,
|
|
408
|
+
Adapter: CustomWallet,
|
|
409
|
+
options
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
//#endregion
|
|
413
|
+
//#region src/wallets/types.ts
|
|
414
|
+
var SignTxnsError = class extends Error {
|
|
415
|
+
code;
|
|
416
|
+
data;
|
|
417
|
+
constructor(message, code, data) {
|
|
418
|
+
super(message);
|
|
419
|
+
this.name = "SignTxnsError";
|
|
420
|
+
this.code = code;
|
|
421
|
+
this.data = data;
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
var SignDataError = class extends Error {
|
|
425
|
+
code;
|
|
426
|
+
data;
|
|
427
|
+
constructor(message, code, data) {
|
|
428
|
+
super(message);
|
|
429
|
+
this.name = "SignDataError";
|
|
430
|
+
this.code = code;
|
|
431
|
+
this.data = data;
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
let ScopeType = /* @__PURE__ */ function(ScopeType) {
|
|
435
|
+
ScopeType[ScopeType["UNKNOWN"] = -1] = "UNKNOWN";
|
|
436
|
+
ScopeType[ScopeType["AUTH"] = 1] = "AUTH";
|
|
437
|
+
return ScopeType;
|
|
438
|
+
}({});
|
|
439
|
+
//#endregion
|
|
440
|
+
export { zeroString as S, SecureKeyContainer as _, custom as a, withSecureKeySync as b, byteArrayToString as c, formatJsonRpcRequest as d, isSignedTxn as f, BaseWallet as g, stringToByteArray as h, CustomWallet as i, compareAccounts as l, isTransactionArray as m, SignDataError as n, base64ToByteArray as o, isTransaction as p, SignTxnsError as r, byteArrayToBase64 as s, ScopeType as t, flattenTxnGroup as u, deriveAlgorandAccountFromEd25519 as v, zeroMemory as x, withSecureKey as y };
|
|
441
|
+
|
|
442
|
+
//# sourceMappingURL=types-BduS9cZw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-BduS9cZw.js","names":[],"sources":["../src/secure-key.ts","../src/wallets/base.ts","../src/utils.ts","../src/wallets/custom.ts","../src/wallets/types.ts"],"sourcesContent":["/**\n * Secure key handling utilities for managing sensitive cryptographic material.\n *\n * These utilities provide defense-in-depth for private key handling:\n * 1. Memory zeroing - Overwrites key material before releasing references\n * 2. Scoped key access - Keys are only available within controlled callbacks\n * 3. Automatic cleanup - Keys are cleared after use via try/finally patterns\n * 4. No persistence - Keys are never stored to disk/localStorage\n */\n\nimport { logger } from 'src/logger'\n\nconst secureLogger = logger.createScopedLogger('SecureKey')\n\n/**\n * Securely zeros out a Uint8Array by overwriting all bytes with zeros.\n * This helps prevent key material from lingering in memory.\n *\n * Note: JavaScript doesn't guarantee immediate memory clearing due to GC,\n * but this provides defense-in-depth by:\n * 1. Overwriting the buffer contents immediately\n * 2. Reducing the window where key material is accessible\n * 3. Preventing accidental key leakage through references\n */\nexport function zeroMemory(buffer: Uint8Array): void {\n if (!buffer || buffer.length === 0) return\n\n try {\n // Use crypto.getRandomValues first to prevent compiler optimizations\n // from removing the zeroing operation\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(buffer)\n }\n // Then zero out the buffer\n buffer.fill(0)\n } catch {\n // Fallback: manual zeroing if crypto is unavailable\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = 0\n }\n }\n}\n\n/**\n * Securely zeros out a string by creating a mutable copy and clearing it.\n * Returns an empty string. The original string in memory may still exist\n * due to string immutability in JS, but this clears any mutable references.\n */\nexport function zeroString(str: string): string {\n if (!str) return ''\n\n // Convert to array, zero it, and discard\n const arr = new Uint8Array(str.length)\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i)\n }\n zeroMemory(arr)\n\n return ''\n}\n\n/**\n * A secure container for holding private key material.\n * Provides controlled access and automatic cleanup.\n */\nexport class SecureKeyContainer {\n private _secretKey: Uint8Array | null = null\n private _isCleared: boolean = false\n\n constructor(secretKey: Uint8Array) {\n // Create a copy to ensure we own the memory\n this._secretKey = new Uint8Array(secretKey)\n // Immediately zero the source if caller passes ownership\n // (caller should still zero their copy)\n }\n\n /**\n * Check if the key has been cleared\n */\n get isCleared(): boolean {\n return this._isCleared\n }\n\n /**\n * Execute a callback with access to the secret key.\n * The key is automatically cleared if an error occurs.\n */\n async useKey<T>(callback: (secretKey: Uint8Array) => Promise<T>): Promise<T> {\n if (this._isCleared || !this._secretKey) {\n throw new Error('SecureKeyContainer: Key has been cleared')\n }\n\n try {\n return await callback(this._secretKey)\n } catch (error) {\n // On error, clear immediately to prevent leakage\n this.clear()\n throw error\n }\n }\n\n /**\n * Execute a synchronous callback with access to the secret key.\n */\n useKeySync<T>(callback: (secretKey: Uint8Array) => T): T {\n if (this._isCleared || !this._secretKey) {\n throw new Error('SecureKeyContainer: Key has been cleared')\n }\n\n try {\n return callback(this._secretKey)\n } catch (error) {\n this.clear()\n throw error\n }\n }\n\n /**\n * Securely clear the key from memory.\n * This should be called when the key is no longer needed.\n */\n clear(): void {\n if (this._secretKey && !this._isCleared) {\n zeroMemory(this._secretKey)\n this._secretKey = null\n this._isCleared = true\n secureLogger.debug('Key material cleared from memory')\n }\n }\n}\n\n/**\n * Execute a function with a temporary secret key that is automatically\n * cleared after the function completes (success or error).\n *\n * This is the preferred pattern for one-time key operations.\n */\nexport async function withSecureKey<T>(\n secretKey: Uint8Array,\n callback: (container: SecureKeyContainer) => Promise<T>\n): Promise<T> {\n const container = new SecureKeyContainer(secretKey)\n\n try {\n return await callback(container)\n } finally {\n container.clear()\n }\n}\n\n/**\n * Synchronous version of withSecureKey for non-async operations.\n */\nexport function withSecureKeySync<T>(\n secretKey: Uint8Array,\n callback: (container: SecureKeyContainer) => T\n): T {\n const container = new SecureKeyContainer(secretKey)\n\n try {\n return callback(container)\n } finally {\n container.clear()\n }\n}\n\n/**\n * Derive an Algorand account from an ed25519 private key seed.\n * The input key should be 32 bytes (seed).\n *\n * SECURITY: The returned account contains a secret key reference.\n * The caller is responsible for zeroing account.sk after use.\n */\nexport async function deriveAlgorandAccountFromEd25519(\n ed25519Seed: Uint8Array\n): Promise<{ addr: string; sk: Uint8Array }> {\n // Web3Auth returns a 32-byte ed25519 seed (private key)\n // We need to derive the full 64-byte secret key and the Algorand address\n\n if (ed25519Seed.length !== 32) {\n throw new Error(`Invalid ed25519 seed length: expected 32 bytes, got ${ed25519Seed.length}`)\n }\n\n // Use tweetnacl directly for ed25519 key derivation\n // This is the same library algosdk uses internally but this approach avoids the seed to 25-word mnemonic conversion\n // and then mnemonic to secret key. Because strings in JS are immutable, this avoids a dangerous security issue of\n // not being able to securely erase the mnemonics.\n const nacl = await import('tweetnacl')\n const algosdk = await import('algosdk')\n\n // Create a nacl keypair from the seed\n // tweetnacl's sign.keyPair.fromSeed returns: { publicKey, secretKey }\n // where secretKey is 64 bytes: seed (32) + publicKey (32)\n const keyPair = nacl.sign.keyPair.fromSeed(ed25519Seed)\n\n // Derive the Algorand address from the public key\n const address = algosdk.encodeAddress(keyPair.publicKey)\n\n return {\n addr: address,\n sk: keyPair.secretKey\n }\n}\n","import { logger } from 'src/logger'\nimport { NetworkConfig } from 'src/network'\nimport type { State } from 'src/store'\nimport type algosdk from 'algosdk'\nimport type {\n AdapterConstructorParams,\n AdapterStoreAccessor,\n SignDataResponse,\n SignMetadata,\n WalletAccount,\n WalletMetadata\n} from 'src/wallets/types'\n\nexport abstract class BaseWallet<TOptions = Record<string, unknown>> {\n public readonly id: string\n public readonly walletKey: string\n public metadata: WalletMetadata\n\n protected options: TOptions\n protected store: AdapterStoreAccessor\n protected getAlgodClient: () => algosdk.Algodv2\n\n public subscribe: (callback: (state: State) => void) => () => void\n\n protected logger: ReturnType<typeof logger.createScopedLogger>\n\n protected constructor({\n id,\n metadata,\n store,\n subscribe,\n getAlgodClient,\n options\n }: AdapterConstructorParams<TOptions>) {\n this.id = id\n this.walletKey = id\n this.metadata = { ...metadata }\n this.options = options ?? ({} as TOptions)\n this.store = store\n this.subscribe = subscribe\n this.getAlgodClient = getAlgodClient\n\n // Initialize logger with a scope based on the wallet key\n this.logger = logger.createScopedLogger(`Wallet:${this.walletKey.toUpperCase()}`)\n }\n\n static defaultMetadata: WalletMetadata = { name: 'Base Wallet', icon: '' }\n\n // ---------- Public Methods ---------------------------------------- //\n\n public abstract connect(args?: Record<string, any>): Promise<WalletAccount[]>\n public abstract disconnect(): Promise<void>\n public abstract resumeSession(): Promise<void>\n\n public setActive = (): void => {\n this.logger.info(`Set active wallet: ${this.walletKey}`)\n this.store.setActive()\n }\n\n public setActiveAccount = (account: string): void => {\n this.logger.info(`Set active account: ${account}`)\n this.store.setActiveAccount(account)\n }\n\n public abstract signTransactions<T extends algosdk.Transaction[] | Uint8Array[]>(\n txnGroup: T | T[],\n indexesToSign?: number[]\n ): Promise<(Uint8Array | null)[]>\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n const signTxnsResult = await this.signTransactions(txnGroup, indexesToSign)\n\n const signedTxns = signTxnsResult.reduce<Uint8Array[]>((acc, value) => {\n if (value !== null) {\n acc.push(value)\n }\n return acc\n }, [])\n\n return signedTxns\n }\n\n public canSignData = false\n\n public signData = async (_data: string, _metadata: SignMetadata): Promise<SignDataResponse> => {\n this.logger.error('Method not supported: signData')\n throw new Error('Method not supported: signData')\n }\n\n public canUsePrivateKey = false\n\n public withPrivateKey = async <T>(\n _callback: (secretKey: Uint8Array) => Promise<T>\n ): Promise<T> => {\n this.logger.error('Method not supported: withPrivateKey')\n throw new Error('Method not supported: withPrivateKey')\n }\n\n // ---------- Derived Properties ------------------------------------ //\n\n public get name(): string {\n return this.id.toUpperCase()\n }\n\n public get accounts(): WalletAccount[] {\n const walletState = this.store.getWalletState()\n return walletState ? walletState.accounts : []\n }\n\n public get addresses(): string[] {\n return this.accounts.map((account) => account.address)\n }\n\n public get activeAccount(): WalletAccount | null {\n const walletState = this.store.getWalletState()\n return walletState ? walletState.activeAccount : null\n }\n\n public get activeAddress(): string | null {\n return this.activeAccount?.address ?? null\n }\n\n public get activeNetwork(): string {\n return this.store.getActiveNetwork()\n }\n\n public get isConnected(): boolean {\n const walletState = this.store.getWalletState()\n return walletState ? walletState.accounts.length > 0 : false\n }\n\n public get isActive(): boolean {\n return this.store.getActiveWallet() === this.walletKey\n }\n\n public get activeNetworkConfig(): NetworkConfig {\n const state = this.store.getState()\n return state.networkConfig[state.activeNetwork]\n }\n\n // ---------- Protected Methods ------------------------------------- //\n\n protected onDisconnect = (): void => {\n this.logger.debug(`Removing wallet from store...`)\n this.store.removeWallet()\n }\n\n protected updateMetadata(updates: Partial<WalletMetadata>): void {\n this.metadata = { ...this.metadata, ...updates }\n }\n}\n","import algosdk from 'algosdk'\nimport type { JsonRpcRequest, WalletAccount } from './wallets/types'\n\nexport function compareAccounts(accounts: WalletAccount[], compareTo: WalletAccount[]): boolean {\n const addresses = new Set(accounts.map((account) => account.address))\n const compareAddresses = new Set(compareTo.map((account) => account.address))\n\n if (addresses.size !== compareAddresses.size) {\n return false\n }\n\n // Check if every address in addresses is also in compareAddresses\n for (const address of addresses) {\n if (!compareAddresses.has(address)) {\n return false\n }\n }\n\n return true\n}\n\nexport function base64ToByteArray(blob: string): Uint8Array {\n return stringToByteArray(atob(blob))\n}\n\nexport function byteArrayToBase64(array: Uint8Array): string {\n return btoa(byteArrayToString(array))\n}\n\nexport function stringToByteArray(str: string): Uint8Array {\n const array = new Uint8Array(str.length)\n for (let i = 0; i < str.length; i++) {\n array[i] = str.charCodeAt(i)\n }\n return array\n}\n\nexport function byteArrayToString(array: Uint8Array): string {\n let result = ''\n for (let i = 0; i < array.length; i++) {\n result += String.fromCharCode(array[i])\n }\n return result\n}\n\nexport function isSignedTxn(txnObj: any): boolean {\n if (!txnObj || typeof txnObj !== 'object') return false\n if (!('sig' in txnObj && 'txn' in txnObj)) return false\n\n // Verify sig is a Uint8Array\n if (!(txnObj.sig instanceof Uint8Array)) return false\n\n // Verify txn is an object\n const txn = txnObj.txn\n if (!txn || typeof txn !== 'object') return false\n\n // Check for common transaction properties\n const hasRequiredProps = 'type' in txn && 'snd' in txn\n\n return hasRequiredProps\n}\n\nexport function isTransaction(item: any): item is algosdk.Transaction {\n return (\n item &&\n typeof item === 'object' &&\n 'sender' in item &&\n (item.sender instanceof algosdk.Address || typeof item.sender === 'string')\n )\n}\n\nexport function isTransactionArray(\n txnGroup: any\n): txnGroup is algosdk.Transaction[] | algosdk.Transaction[][] {\n if (!Array.isArray(txnGroup) || txnGroup.length === 0) {\n return false\n }\n\n if (isTransaction(txnGroup[0])) {\n return true\n }\n\n if (Array.isArray(txnGroup[0]) && txnGroup[0].length > 0 && isTransaction(txnGroup[0][0])) {\n return true\n }\n\n return false\n}\n\nexport function flattenTxnGroup<T>(txnGroup: T[]): T[] {\n if (!Array.isArray(txnGroup[0])) {\n return txnGroup\n }\n return (txnGroup as unknown as any[]).flat()\n}\n\nfunction getPayloadId(): number {\n const date = Date.now() * Math.pow(10, 3)\n const extra = Math.floor(Math.random() * Math.pow(10, 3))\n return date + extra\n}\n\nexport function formatJsonRpcRequest<T = any>(method: string, params: T): JsonRpcRequest<T> {\n return {\n id: getPayloadId(),\n jsonrpc: '2.0',\n method,\n params\n }\n}\n","import algosdk from 'algosdk'\nimport { BaseWallet } from './base'\nimport { compareAccounts } from '../utils'\nimport type {\n AdapterConstructorParams,\n SignDataResponse,\n SignMetadata,\n WalletAccount,\n WalletAdapterConfig,\n WalletMetadata,\n WalletState\n} from './types'\n\nexport type CustomProvider = {\n connect?(args?: Record<string, any>): Promise<WalletAccount[]>\n disconnect?(): Promise<void>\n resumeSession?(): Promise<WalletAccount[] | void>\n signTransactions?<T extends algosdk.Transaction[] | Uint8Array[]>(\n txnGroup: T | T[],\n indexesToSign?: number[]\n ): Promise<(Uint8Array | null)[]>\n transactionSigner?(\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]>\n signData?(data: string, metadata: SignMetadata): Promise<SignDataResponse>\n}\n\nexport interface CustomWalletOptions {\n provider: CustomProvider\n}\n\nconst ICON = `data:image/svg+xml;base64,${btoa(`\n<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"24\" height=\"24\" fill=\"#525252\" />\n</svg>\n`)}`\n\nconst CUSTOM_WALLET_ID = 'custom' as const\n\nexport class CustomWallet extends BaseWallet<CustomWalletOptions> {\n private provider: CustomProvider\n\n constructor(params: AdapterConstructorParams<CustomWalletOptions>) {\n super(params)\n\n if (!params.options?.provider) {\n this.logger.error('Missing required option: provider')\n throw new Error('Missing required option: provider')\n }\n\n this.provider = params.options.provider\n\n // Set canSignData based on whether the provider supports it\n this.canSignData = typeof this.provider.signData === 'function'\n }\n\n static defaultMetadata: WalletMetadata = {\n name: 'Custom',\n icon: ICON\n }\n\n // ---------- Public Methods ----------------------------------------- //\n\n public connect = async (args?: Record<string, any>): Promise<WalletAccount[]> => {\n this.logger.info('Connecting...')\n try {\n if (!this.provider.connect) {\n this.logger.error('Method not supported: connect')\n throw new Error('Method not supported: connect')\n }\n\n const walletAccounts = await this.provider.connect(args)\n\n if (walletAccounts.length === 0) {\n this.logger.error('No accounts found!')\n throw new Error('No accounts found!')\n }\n\n const activeAccount = walletAccounts[0]\n\n const walletState: WalletState = {\n accounts: walletAccounts,\n activeAccount\n }\n\n this.store.addWallet(walletState)\n\n this.logger.info('Connected successfully', walletState)\n return walletAccounts\n } catch (error: any) {\n this.logger.error('Error connecting:', error.message || error)\n throw error\n }\n }\n\n public disconnect = async (): Promise<void> => {\n this.logger.info('Disconnecting...')\n this.onDisconnect()\n await this.provider.disconnect?.()\n }\n\n public resumeSession = async (): Promise<void> => {\n try {\n const walletState = this.store.getWalletState()\n\n // No session to resume\n if (!walletState) {\n this.logger.info('No session to resume')\n return\n }\n\n this.logger.info('Resuming session...')\n\n const result = await this.provider.resumeSession?.()\n\n if (Array.isArray(result)) {\n const walletAccounts = result\n\n if (walletAccounts.length === 0) {\n this.logger.error('No accounts found!')\n throw new Error('No accounts found!')\n }\n\n const match = compareAccounts(walletAccounts, walletState.accounts)\n\n if (!match) {\n this.logger.warn('Session accounts mismatch, updating accounts', {\n prev: walletState.accounts,\n current: walletAccounts\n })\n this.store.setAccounts(walletAccounts)\n }\n }\n this.logger.info('Session resumed successfully')\n } catch (error: any) {\n this.logger.error('Error resuming session:', error.message)\n throw error\n }\n }\n\n // ---------- Transaction Signing ------------------------------------ //\n\n public signTransactions = async <T extends algosdk.Transaction[] | Uint8Array[]>(\n txnGroup: T | T[],\n indexesToSign?: number[]\n ): Promise<(Uint8Array | null)[]> => {\n if (!this.provider.signTransactions) {\n this.logger.error('Method not supported: signTransactions')\n throw new Error('Method not supported: signTransactions')\n }\n this.logger.debug('Signing transactions...', { txnGroup, indexesToSign })\n return await this.provider.signTransactions(txnGroup, indexesToSign)\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n if (!this.provider.transactionSigner) {\n this.logger.error('Method not supported: transactionSigner')\n throw new Error('Method not supported: transactionSigner')\n }\n this.logger.debug('Transaction signer called...', {\n txnGroup,\n indexesToSign\n })\n return await this.provider.transactionSigner(txnGroup, indexesToSign)\n }\n\n // ---------- Sign Data ---------------------------------------------- //\n\n public signData = async (data: string, metadata: SignMetadata): Promise<SignDataResponse> => {\n if (!this.provider.signData) {\n this.logger.error('Method not supported: signData')\n throw new Error('Method not supported: signData')\n }\n this.logger.debug('Signing data...', { data, metadata })\n return await this.provider.signData(data, metadata)\n }\n}\n\n// ---------- Factory Function ----------------------------------------- //\n\nexport function custom(options: CustomWalletOptions): WalletAdapterConfig {\n return {\n id: CUSTOM_WALLET_ID,\n metadata: CustomWallet.defaultMetadata,\n Adapter: CustomWallet as unknown as WalletAdapterConfig['Adapter'],\n options: options as unknown as Record<string, unknown>\n }\n}\n","import type algosdk from 'algosdk'\nimport type { State } from 'src/store'\nimport type { BaseWallet } from 'src/wallets/base'\n\n// ---------- Wallet Identity ---------------------------------------- //\n\n/**\n * Wallet identifier. In v5 this is an open string type — each adapter\n * package exports its own ID constant (e.g. `export const WALLET_ID = 'pera' as const`).\n */\nexport type WalletId = string\n\n/**\n * Unique key for a wallet instance in the store.\n * Usually equals the wallet ID, but can be a composite key for\n * skinned WalletConnect instances (e.g. 'walletconnect:biatec').\n */\nexport type WalletKey = string\n\n// ---------- Wallet Metadata & Account ------------------------------ //\n\nexport type WalletMetadata = {\n name: string\n icon: string\n}\n\nexport type WalletAccount = {\n name: string\n address: string\n metadata?: Record<string, unknown>\n}\n\n// ---------- Wallet Capabilities ----------------------------------- //\n\n/**\n * Declares which networks a wallet adapter supports.\n *\n * Design: Option 5 — `supportedNetworks` + `excludedNetworks`.\n *\n * Most wallets list the networks they work with via `supportedNetworks`.\n * Omitting both means \"all networks\". For wallets that work on all\n * networks *except* specific ones (e.g. Mnemonic excludes MainNet for\n * security), use `excludedNetworks`. Setting both is invalid.\n */\nexport interface WalletCapabilities {\n /** If set, the wallet is only available on these networks. */\n supportedNetworks?: string[]\n /** If set, the wallet is available on all networks EXCEPT these. */\n excludedNetworks?: string[]\n}\n\n// ---------- Adapter Interfaces ------------------------------------- //\n\n/**\n * Scoped store accessor provided to each adapter instance.\n * All mutations are pre-bound to the adapter's wallet key —\n * adapters cannot accidentally modify another wallet's state.\n */\nexport interface AdapterStoreAccessor {\n getWalletState(): WalletState | undefined\n getActiveWallet(): WalletKey | null\n getActiveNetwork(): string\n getState(): State\n addWallet(wallet: WalletState): void\n removeWallet(): void\n setAccounts(accounts: WalletAccount[]): void\n setActiveAccount(address: string): void\n setActive(): void\n}\n\n/**\n * Constructor parameters for adapter classes.\n * Generic over the options type so adapters receive typed options\n * without unsafe casts.\n */\nexport interface AdapterConstructorParams<TOptions = Record<string, unknown>> {\n id: string\n metadata: WalletMetadata\n store: AdapterStoreAccessor\n subscribe: (callback: (state: State) => void) => () => void\n getAlgodClient: () => algosdk.Algodv2\n options?: TOptions\n}\n\n/**\n * Return type of adapter factory functions.\n * Uses `Record<string, unknown>` for options (type erasure) because\n * the manager handles heterogeneous adapter configs in a single array.\n * Type safety lives in the factory function signature, not here.\n */\nexport interface WalletAdapterConfig {\n /** Unique identifier for this wallet adapter */\n id: string\n /** Display metadata (name, icon) */\n metadata: WalletMetadata\n /** The adapter class constructor */\n Adapter: new (params: AdapterConstructorParams) => BaseWallet\n /** Wallet-specific options, passed through to the adapter constructor */\n options?: Record<string, unknown>\n /** Network capabilities — which networks this wallet supports */\n capabilities?: WalletCapabilities\n}\n\n// ---------- Wallet Interface (public-facing) ----------------------- //\n\n/**\n * The public-facing wallet shape returned by framework hooks\n * (e.g. `useWallet()` in React). Defined in core so all framework\n * adapters share a single type.\n */\nexport interface Wallet {\n id: string\n walletKey: string\n metadata: WalletMetadata\n accounts: WalletAccount[]\n activeAccount: WalletAccount | null\n isConnected: boolean\n isActive: boolean\n canSignData: boolean\n canUsePrivateKey: boolean\n connect: (args?: Record<string, any>) => Promise<WalletAccount[]>\n disconnect: () => Promise<void>\n setActive: () => void\n setActiveAccount: (address: string) => void\n}\n\n// ---------- Wallet State ------------------------------------------- //\n\nexport type WalletState = {\n accounts: WalletAccount[]\n activeAccount: WalletAccount | null\n}\n\n// ---------- Transaction Types -------------------------------------- //\n\n/** @see https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0001.md#interface-multisigmetadata */\nexport interface MultisigMetadata {\n /**\n * Multisig version.\n */\n version: number\n\n /**\n * Multisig threshold value. Authorization requires a subset of signatures,\n * equal to or greater than the threshold value.\n */\n threshold: number\n\n /**\n * List of Algorand addresses of possible signers for this\n * multisig. Order is important.\n */\n addrs: string[]\n}\n\n/** @see https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0001.md#interface-wallettransaction */\nexport interface WalletTransaction {\n /**\n * Base64 encoding of the canonical msgpack encoding of a Transaction.\n */\n txn: string\n\n /**\n * Optional authorized address used to sign the transaction when the account\n * is rekeyed. Also called the signor/sgnr.\n */\n authAddr?: string\n\n /**\n * Multisig metadata used to sign the transaction\n */\n msig?: MultisigMetadata\n\n /**\n * Optional list of addresses that must sign the transactions\n */\n signers?: string[]\n\n /**\n * Optional base64 encoding of the canonical msgpack encoding of a\n * SignedTxn corresponding to txn, when signers=[]\n */\n stxn?: string\n\n /**\n * Optional message explaining the reason of the transaction\n */\n message?: string\n\n /**\n * Optional message explaining the reason of this group of transaction\n * Field only allowed in the first transaction of a group\n */\n groupMessage?: string\n}\n\n/** @see https://github.com/perawallet/connect/blob/1.3.4/src/util/model/peraWalletModels.ts */\nexport interface SignerTransaction {\n txn: algosdk.Transaction\n\n /**\n * Optional authorized address used to sign the transaction when\n * the account is rekeyed. Also called the signor/sgnr.\n */\n authAddr?: string\n\n /**\n * Optional list of addresses that must sign the transactions.\n * Wallet skips to sign this txn if signers is empty array.\n * If undefined, wallet tries to sign it.\n */\n signers?: string[]\n\n /**\n * Optional message explaining the reason of the transaction\n */\n message?: string\n}\n\nexport interface JsonRpcRequest<T = any> {\n id: number\n jsonrpc: string\n method: string\n params: T\n}\n\nexport class SignTxnsError extends Error {\n code: number\n data?: any\n\n constructor(message: string, code: number, data?: any) {\n super(message)\n this.name = 'SignTxnsError'\n this.code = code\n this.data = data\n }\n}\n\n// ---------- signData Types ----------------------------------------- //\n\nexport interface Siwa {\n domain: string\n account_address: string\n uri: string\n version: string\n statement?: string\n nonce?: string\n 'issued-at'?: string\n 'expiration-time'?: string\n 'not-before'?: string\n 'request-id'?: string\n chain_id: '283'\n resources?: string[]\n type: 'ed25519'\n}\n\nexport class SignDataError extends Error {\n code: number\n data?: any\n\n constructor(message: string, code: number, data?: any) {\n super(message)\n this.name = 'SignDataError'\n this.code = code\n this.data = data\n }\n}\n\nexport interface SignData {\n data: string\n signer: Uint8Array\n domain: string\n authenticatorData: Uint8Array\n requestId?: string\n hdPath?: string\n signature?: Uint8Array\n}\n\nexport interface SignDataResponse extends SignData {\n signature: Uint8Array\n}\n\nexport enum ScopeType {\n UNKNOWN = -1,\n AUTH = 1\n}\n\nexport interface SignMetadata {\n scope: ScopeType\n encoding: string\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,111 +1,63 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@txnlab/use-wallet",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-rc.1",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public",
|
|
6
|
+
"provenance": true
|
|
7
|
+
},
|
|
4
8
|
"description": "TypeScript library for integrating Algorand wallets into decentralized applications",
|
|
5
9
|
"author": "Doug Richar <drichar@gmail.com>",
|
|
6
10
|
"license": "MIT",
|
|
7
11
|
"repository": {
|
|
8
12
|
"type": "git",
|
|
9
|
-
"url": "https://github.com/txnlab/use-wallet.git",
|
|
10
|
-
"directory": "packages/
|
|
13
|
+
"url": "git+https://github.com/txnlab/use-wallet.git",
|
|
14
|
+
"directory": "packages/core"
|
|
11
15
|
},
|
|
12
16
|
"type": "module",
|
|
13
|
-
"main": "./dist/index.
|
|
14
|
-
"module": "./dist/index.js",
|
|
15
|
-
"exports": "./dist/index.js",
|
|
17
|
+
"main": "./dist/index.js",
|
|
16
18
|
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./adapter": {
|
|
25
|
+
"types": "./dist/adapter.d.ts",
|
|
26
|
+
"default": "./dist/adapter.js"
|
|
27
|
+
},
|
|
28
|
+
"./testing": {
|
|
29
|
+
"types": "./dist/testing.d.ts",
|
|
30
|
+
"default": "./dist/testing.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
17
33
|
"keywords": [
|
|
18
34
|
"algorand",
|
|
19
35
|
"wallet",
|
|
20
|
-
"walletconnect",
|
|
21
|
-
"pera",
|
|
22
|
-
"defly",
|
|
23
|
-
"exodus",
|
|
24
36
|
"algosdk",
|
|
25
|
-
"algokit"
|
|
26
|
-
"kmd",
|
|
27
|
-
"web3auth"
|
|
37
|
+
"algokit"
|
|
28
38
|
],
|
|
29
39
|
"files": [
|
|
30
40
|
"dist"
|
|
31
41
|
],
|
|
32
42
|
"dependencies": {
|
|
33
|
-
"@tanstack/store": "0.
|
|
43
|
+
"@tanstack/store": "0.9.1",
|
|
44
|
+
"tweetnacl": "1.0.3"
|
|
34
45
|
},
|
|
35
46
|
"devDependencies": {
|
|
36
|
-
"@agoralabs-sh/avm-web-provider": "1.7.0",
|
|
37
|
-
"@blockshake/defly-connect": "1.2.1",
|
|
38
|
-
"@magic-ext/algorand": "24.4.2",
|
|
39
|
-
"@magic-sdk/provider": "29.5.0",
|
|
40
|
-
"@perawallet/connect": "1.4.1",
|
|
41
47
|
"@types/node": "20.11.30",
|
|
42
|
-
"@walletconnect/modal": "2.7.0",
|
|
43
|
-
"@walletconnect/modal-core": "2.7.0",
|
|
44
|
-
"@walletconnect/sign-client": "2.23.4",
|
|
45
|
-
"@walletconnect/types": "2.23.4",
|
|
46
|
-
"@web3auth/base": "9.7.0",
|
|
47
|
-
"@web3auth/base-provider": "9.7.0",
|
|
48
|
-
"@web3auth/modal": "9.7.0",
|
|
49
|
-
"@web3auth/single-factor-auth": "9.5.0",
|
|
50
48
|
"algosdk": "3.5.2",
|
|
51
|
-
"
|
|
52
|
-
"lute-connect": "1.6.3",
|
|
53
|
-
"magic-sdk": "29.4.2",
|
|
54
|
-
"tsup": "8.5.1",
|
|
55
|
-
"tweetnacl": "1.0.3",
|
|
49
|
+
"tsdown": "0.21.0",
|
|
56
50
|
"typescript": "5.9.3"
|
|
57
51
|
},
|
|
58
52
|
"peerDependencies": {
|
|
59
|
-
"
|
|
60
|
-
"@blockshake/defly-connect": "^1.2.1",
|
|
61
|
-
"@perawallet/connect": "^1.4.1",
|
|
62
|
-
"@walletconnect/modal": "^2.7.0",
|
|
63
|
-
"@walletconnect/sign-client": "^2.23.4",
|
|
64
|
-
"@web3auth/base": "^9.0.0",
|
|
65
|
-
"@web3auth/base-provider": "^9.0.0",
|
|
66
|
-
"@web3auth/modal": "^9.0.0",
|
|
67
|
-
"@web3auth/single-factor-auth": "^9.0.0",
|
|
68
|
-
"algosdk": "^3.0.0",
|
|
69
|
-
"lute-connect": "^1.6.3"
|
|
70
|
-
},
|
|
71
|
-
"peerDependenciesMeta": {
|
|
72
|
-
"@agoralabs-sh/avm-web-provider": {
|
|
73
|
-
"optional": true
|
|
74
|
-
},
|
|
75
|
-
"@blockshake/defly-connect": {
|
|
76
|
-
"optional": true
|
|
77
|
-
},
|
|
78
|
-
"@perawallet/connect": {
|
|
79
|
-
"optional": true
|
|
80
|
-
},
|
|
81
|
-
"@walletconnect/modal": {
|
|
82
|
-
"optional": true
|
|
83
|
-
},
|
|
84
|
-
"@walletconnect/sign-client": {
|
|
85
|
-
"optional": true
|
|
86
|
-
},
|
|
87
|
-
"@web3auth/base": {
|
|
88
|
-
"optional": true
|
|
89
|
-
},
|
|
90
|
-
"@web3auth/base-provider": {
|
|
91
|
-
"optional": true
|
|
92
|
-
},
|
|
93
|
-
"@web3auth/modal": {
|
|
94
|
-
"optional": true
|
|
95
|
-
},
|
|
96
|
-
"@web3auth/single-factor-auth": {
|
|
97
|
-
"optional": true
|
|
98
|
-
},
|
|
99
|
-
"lute-connect": {
|
|
100
|
-
"optional": true
|
|
101
|
-
}
|
|
53
|
+
"algosdk": "^3.0.0"
|
|
102
54
|
},
|
|
103
55
|
"scripts": {
|
|
104
|
-
"build": "
|
|
105
|
-
"start": "
|
|
56
|
+
"build": "tsdown",
|
|
57
|
+
"start": "tsdown --watch",
|
|
106
58
|
"test": "vitest run",
|
|
107
59
|
"test:watch": "pnpm run test --watch",
|
|
108
|
-
"lint": "eslint
|
|
60
|
+
"lint": "eslint \"src/**/*.{js,ts}\"",
|
|
109
61
|
"typecheck": "tsc --noEmit"
|
|
110
62
|
}
|
|
111
63
|
}
|