@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,335 @@
|
|
|
1
|
+
import algosdk from "algosdk";
|
|
2
|
+
//#region src/logger.ts
|
|
3
|
+
let LogLevel = /* @__PURE__ */ function(LogLevel) {
|
|
4
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
5
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
6
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
7
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
8
|
+
return LogLevel;
|
|
9
|
+
}({});
|
|
10
|
+
var Logger = class Logger {
|
|
11
|
+
static instance = null;
|
|
12
|
+
level;
|
|
13
|
+
isClient;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.level = LogLevel.WARN;
|
|
16
|
+
this.isClient = typeof window !== "undefined";
|
|
17
|
+
}
|
|
18
|
+
static getInstance() {
|
|
19
|
+
if (!Logger.instance) Logger.instance = new Logger();
|
|
20
|
+
return Logger.instance;
|
|
21
|
+
}
|
|
22
|
+
static setLevel(level) {
|
|
23
|
+
Logger.getInstance().level = level;
|
|
24
|
+
}
|
|
25
|
+
log(level, scope, message, ...args) {
|
|
26
|
+
if (level >= this.level && this.isClient) {
|
|
27
|
+
const formattedMessage = scope ? `[${scope}] ${message}` : message;
|
|
28
|
+
switch (level) {
|
|
29
|
+
case LogLevel.DEBUG:
|
|
30
|
+
case LogLevel.INFO:
|
|
31
|
+
console.info(formattedMessage, ...args);
|
|
32
|
+
break;
|
|
33
|
+
case LogLevel.WARN:
|
|
34
|
+
console.warn(formattedMessage, ...args);
|
|
35
|
+
break;
|
|
36
|
+
case LogLevel.ERROR:
|
|
37
|
+
console.error(formattedMessage, ...args);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
createScopedLogger(scope) {
|
|
43
|
+
return {
|
|
44
|
+
debug: (message, ...args) => this.log(LogLevel.DEBUG, scope, message, ...args),
|
|
45
|
+
info: (message, ...args) => this.log(LogLevel.INFO, scope, message, ...args),
|
|
46
|
+
warn: (message, ...args) => this.log(LogLevel.WARN, scope, message, ...args),
|
|
47
|
+
error: (message, ...args) => this.log(LogLevel.ERROR, scope, message, ...args)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
debug(message, ...args) {
|
|
51
|
+
this.log(LogLevel.DEBUG, void 0, message, ...args);
|
|
52
|
+
}
|
|
53
|
+
info(message, ...args) {
|
|
54
|
+
this.log(LogLevel.INFO, void 0, message, ...args);
|
|
55
|
+
}
|
|
56
|
+
warn(message, ...args) {
|
|
57
|
+
this.log(LogLevel.WARN, void 0, message, ...args);
|
|
58
|
+
}
|
|
59
|
+
error(message, ...args) {
|
|
60
|
+
this.log(LogLevel.ERROR, void 0, message, ...args);
|
|
61
|
+
}
|
|
62
|
+
setIsClient(isClient) {
|
|
63
|
+
this.isClient = isClient;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const logger = Logger.getInstance();
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/network.ts
|
|
69
|
+
const DEFAULT_NETWORK_CONFIG = {
|
|
70
|
+
mainnet: {
|
|
71
|
+
algod: {
|
|
72
|
+
token: "",
|
|
73
|
+
baseServer: "https://mainnet-api.4160.nodely.dev",
|
|
74
|
+
headers: {}
|
|
75
|
+
},
|
|
76
|
+
isTestnet: false,
|
|
77
|
+
genesisHash: "wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=",
|
|
78
|
+
genesisId: "mainnet-v1.0",
|
|
79
|
+
caipChainId: "algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73k"
|
|
80
|
+
},
|
|
81
|
+
testnet: {
|
|
82
|
+
algod: {
|
|
83
|
+
token: "",
|
|
84
|
+
baseServer: "https://testnet-api.4160.nodely.dev",
|
|
85
|
+
headers: {}
|
|
86
|
+
},
|
|
87
|
+
isTestnet: true,
|
|
88
|
+
genesisHash: "SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=",
|
|
89
|
+
genesisId: "testnet-v1.0",
|
|
90
|
+
caipChainId: "algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe"
|
|
91
|
+
},
|
|
92
|
+
betanet: {
|
|
93
|
+
algod: {
|
|
94
|
+
token: "",
|
|
95
|
+
baseServer: "https://betanet-api.4160.nodely.dev",
|
|
96
|
+
headers: {}
|
|
97
|
+
},
|
|
98
|
+
isTestnet: true,
|
|
99
|
+
genesisHash: "mFgazF-2uRS1tMiL9dsj01hJGySEmPN2OvOTQHJ6iQg=",
|
|
100
|
+
genesisId: "betanet-v1.0",
|
|
101
|
+
caipChainId: "algorand:mFgazF-2uRS1tMiL9dsj01hJGySEmPN2"
|
|
102
|
+
},
|
|
103
|
+
fnet: {
|
|
104
|
+
algod: {
|
|
105
|
+
token: "",
|
|
106
|
+
baseServer: "https://fnet-api.4160.nodely.dev",
|
|
107
|
+
headers: {}
|
|
108
|
+
},
|
|
109
|
+
isTestnet: true,
|
|
110
|
+
genesisHash: "kUt08LxeVAAGHnh4JoAoAMM9ql_hBwSoRrQQKWSVgxk=",
|
|
111
|
+
genesisId: "fnet-v1",
|
|
112
|
+
caipChainId: "algorand:kUt08LxeVAAGHnh4JoAoAMM9ql_hBwSo"
|
|
113
|
+
},
|
|
114
|
+
localnet: {
|
|
115
|
+
algod: {
|
|
116
|
+
token: "a".repeat(64),
|
|
117
|
+
baseServer: "http://localhost",
|
|
118
|
+
port: 4001,
|
|
119
|
+
headers: {}
|
|
120
|
+
},
|
|
121
|
+
isTestnet: true
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var NetworkConfigBuilder = class {
|
|
125
|
+
networks;
|
|
126
|
+
constructor() {
|
|
127
|
+
this.networks = new Map(Object.entries(DEFAULT_NETWORK_CONFIG));
|
|
128
|
+
}
|
|
129
|
+
mainnet(config) {
|
|
130
|
+
this.networks.set("mainnet", {
|
|
131
|
+
...DEFAULT_NETWORK_CONFIG.mainnet,
|
|
132
|
+
...config,
|
|
133
|
+
genesisHash: DEFAULT_NETWORK_CONFIG.mainnet.genesisHash,
|
|
134
|
+
genesisId: DEFAULT_NETWORK_CONFIG.mainnet.genesisId,
|
|
135
|
+
caipChainId: DEFAULT_NETWORK_CONFIG.mainnet.caipChainId,
|
|
136
|
+
algod: {
|
|
137
|
+
...DEFAULT_NETWORK_CONFIG.mainnet.algod,
|
|
138
|
+
...config.algod || {}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
testnet(config) {
|
|
144
|
+
this.networks.set("testnet", {
|
|
145
|
+
...DEFAULT_NETWORK_CONFIG.testnet,
|
|
146
|
+
...config,
|
|
147
|
+
genesisHash: DEFAULT_NETWORK_CONFIG.testnet.genesisHash,
|
|
148
|
+
genesisId: DEFAULT_NETWORK_CONFIG.testnet.genesisId,
|
|
149
|
+
caipChainId: DEFAULT_NETWORK_CONFIG.testnet.caipChainId,
|
|
150
|
+
algod: {
|
|
151
|
+
...DEFAULT_NETWORK_CONFIG.testnet.algod,
|
|
152
|
+
...config.algod || {}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
return this;
|
|
156
|
+
}
|
|
157
|
+
betanet(config) {
|
|
158
|
+
this.networks.set("betanet", {
|
|
159
|
+
...DEFAULT_NETWORK_CONFIG.betanet,
|
|
160
|
+
...config,
|
|
161
|
+
genesisHash: DEFAULT_NETWORK_CONFIG.betanet.genesisHash,
|
|
162
|
+
genesisId: DEFAULT_NETWORK_CONFIG.betanet.genesisId,
|
|
163
|
+
caipChainId: DEFAULT_NETWORK_CONFIG.betanet.caipChainId,
|
|
164
|
+
algod: {
|
|
165
|
+
...DEFAULT_NETWORK_CONFIG.betanet.algod,
|
|
166
|
+
...config.algod || {}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return this;
|
|
170
|
+
}
|
|
171
|
+
fnet(config) {
|
|
172
|
+
this.networks.set("fnet", {
|
|
173
|
+
...DEFAULT_NETWORK_CONFIG.fnet,
|
|
174
|
+
...config,
|
|
175
|
+
genesisHash: DEFAULT_NETWORK_CONFIG.fnet.genesisHash,
|
|
176
|
+
genesisId: DEFAULT_NETWORK_CONFIG.fnet.genesisId,
|
|
177
|
+
caipChainId: DEFAULT_NETWORK_CONFIG.fnet.caipChainId,
|
|
178
|
+
algod: {
|
|
179
|
+
...DEFAULT_NETWORK_CONFIG.fnet.algod,
|
|
180
|
+
...config.algod || {}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
localnet(config) {
|
|
186
|
+
this.networks.set("localnet", {
|
|
187
|
+
...DEFAULT_NETWORK_CONFIG.localnet,
|
|
188
|
+
...config,
|
|
189
|
+
algod: {
|
|
190
|
+
...DEFAULT_NETWORK_CONFIG.localnet.algod,
|
|
191
|
+
...config.algod || {}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
return this;
|
|
195
|
+
}
|
|
196
|
+
addNetwork(id, config) {
|
|
197
|
+
if (DEFAULT_NETWORK_CONFIG[id]) throw new Error(`Cannot add network with reserved id "${id}". Use the ${id}() method instead.`);
|
|
198
|
+
this.networks.set(id, config);
|
|
199
|
+
return this;
|
|
200
|
+
}
|
|
201
|
+
build() {
|
|
202
|
+
return Object.fromEntries(this.networks);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
const createNetworkConfig = () => new NetworkConfigBuilder().build();
|
|
206
|
+
function isValidToken(token) {
|
|
207
|
+
if (typeof token === "string") return true;
|
|
208
|
+
if (typeof token !== "object" || token === null) return false;
|
|
209
|
+
if ("X-Algo-API-Token" in token && typeof token["X-Algo-API-Token"] === "string") return true;
|
|
210
|
+
if ("get" in token && "post" in token && "delete" in token) return true;
|
|
211
|
+
return Object.values(token).every((value) => typeof value === "string");
|
|
212
|
+
}
|
|
213
|
+
function isNetworkConfig(config) {
|
|
214
|
+
if (typeof config !== "object" || config === null) return false;
|
|
215
|
+
const { algod, isTestnet, genesisHash, genesisId, caipChainId } = config;
|
|
216
|
+
return typeof algod === "object" && algod !== null && isValidToken(algod.token) && typeof algod.baseServer === "string" && (isTestnet === void 0 || typeof isTestnet === "boolean") && (genesisHash === void 0 || typeof genesisHash === "string") && (genesisId === void 0 || typeof genesisId === "string") && (caipChainId === void 0 || typeof caipChainId === "string");
|
|
217
|
+
}
|
|
218
|
+
let NetworkId = /* @__PURE__ */ function(NetworkId) {
|
|
219
|
+
NetworkId["MAINNET"] = "mainnet";
|
|
220
|
+
NetworkId["TESTNET"] = "testnet";
|
|
221
|
+
NetworkId["BETANET"] = "betanet";
|
|
222
|
+
NetworkId["FNET"] = "fnet";
|
|
223
|
+
NetworkId["LOCALNET"] = "localnet";
|
|
224
|
+
return NetworkId;
|
|
225
|
+
}({});
|
|
226
|
+
//#endregion
|
|
227
|
+
//#region src/store.ts
|
|
228
|
+
const DEFAULT_STATE = {
|
|
229
|
+
wallets: {},
|
|
230
|
+
activeWallet: null,
|
|
231
|
+
activeNetwork: "testnet",
|
|
232
|
+
algodClient: new algosdk.Algodv2("", "https://testnet-api.4160.nodely.dev/"),
|
|
233
|
+
managerStatus: "initializing",
|
|
234
|
+
networkConfig: DEFAULT_NETWORK_CONFIG,
|
|
235
|
+
customNetworkConfigs: {}
|
|
236
|
+
};
|
|
237
|
+
const LOCAL_STORAGE_KEY = "@txnlab/use-wallet:v5";
|
|
238
|
+
function addWallet(store, { walletId, wallet }) {
|
|
239
|
+
store.setState((state) => {
|
|
240
|
+
const updatedWallets = {
|
|
241
|
+
...state.wallets,
|
|
242
|
+
[walletId]: {
|
|
243
|
+
accounts: wallet.accounts.map((account) => ({ ...account })),
|
|
244
|
+
activeAccount: wallet.activeAccount ? { ...wallet.activeAccount } : null
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
return {
|
|
248
|
+
...state,
|
|
249
|
+
wallets: updatedWallets,
|
|
250
|
+
activeWallet: walletId
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function removeWallet(store, { walletId }) {
|
|
255
|
+
store.setState((state) => {
|
|
256
|
+
const updatedWallets = { ...state.wallets };
|
|
257
|
+
delete updatedWallets[walletId];
|
|
258
|
+
return {
|
|
259
|
+
...state,
|
|
260
|
+
wallets: updatedWallets,
|
|
261
|
+
activeWallet: state.activeWallet === walletId ? null : state.activeWallet
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
function setActiveWallet(store, { walletId }) {
|
|
266
|
+
store.setState((state) => ({
|
|
267
|
+
...state,
|
|
268
|
+
activeWallet: walletId
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
function setActiveAccount(store, { walletId, address }) {
|
|
272
|
+
store.setState((state) => {
|
|
273
|
+
const wallet = state.wallets[walletId];
|
|
274
|
+
if (!wallet) {
|
|
275
|
+
logger.warn(`Wallet with id "${walletId}" not found`);
|
|
276
|
+
return state;
|
|
277
|
+
}
|
|
278
|
+
const newActiveAccount = wallet.accounts.find((a) => a.address === address);
|
|
279
|
+
if (!newActiveAccount) {
|
|
280
|
+
logger.warn(`Account with address ${address} not found in wallet "${walletId}"`);
|
|
281
|
+
return state;
|
|
282
|
+
}
|
|
283
|
+
const updatedWallet = {
|
|
284
|
+
...wallet,
|
|
285
|
+
accounts: wallet.accounts.map((account) => ({ ...account })),
|
|
286
|
+
activeAccount: { ...newActiveAccount }
|
|
287
|
+
};
|
|
288
|
+
const updatedWallets = {
|
|
289
|
+
...state.wallets,
|
|
290
|
+
[walletId]: updatedWallet
|
|
291
|
+
};
|
|
292
|
+
return {
|
|
293
|
+
...state,
|
|
294
|
+
wallets: updatedWallets
|
|
295
|
+
};
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
function setAccounts(store, { walletId, accounts }) {
|
|
299
|
+
store.setState((state) => {
|
|
300
|
+
const wallet = state.wallets[walletId];
|
|
301
|
+
if (!wallet) {
|
|
302
|
+
logger.warn(`Wallet with id "${walletId}" not found`);
|
|
303
|
+
return state;
|
|
304
|
+
}
|
|
305
|
+
const newAccounts = accounts.map((account) => ({ ...account }));
|
|
306
|
+
const newActiveAccount = newAccounts.some((account) => account.address === wallet.activeAccount?.address) ? { ...wallet.activeAccount } : newAccounts[0] || null;
|
|
307
|
+
const updatedWallet = {
|
|
308
|
+
...wallet,
|
|
309
|
+
accounts: newAccounts,
|
|
310
|
+
activeAccount: newActiveAccount
|
|
311
|
+
};
|
|
312
|
+
const updatedWallets = {
|
|
313
|
+
...state.wallets,
|
|
314
|
+
[walletId]: updatedWallet
|
|
315
|
+
};
|
|
316
|
+
return {
|
|
317
|
+
...state,
|
|
318
|
+
wallets: updatedWallets
|
|
319
|
+
};
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
function setActiveNetwork(store, { networkId, algodClient }) {
|
|
323
|
+
store.setState((state) => ({
|
|
324
|
+
...state,
|
|
325
|
+
activeNetwork: networkId,
|
|
326
|
+
algodClient
|
|
327
|
+
}));
|
|
328
|
+
}
|
|
329
|
+
function isValidPersistedState(state) {
|
|
330
|
+
return typeof state === "object" && state !== null && "wallets" in state && "activeWallet" in state && "activeNetwork" in state && (!("customNetworkConfigs" in state) || typeof state.customNetworkConfigs === "object" && state.customNetworkConfigs !== null);
|
|
331
|
+
}
|
|
332
|
+
//#endregion
|
|
333
|
+
export { logger as _, removeWallet as a, setActiveNetwork as c, NetworkConfigBuilder as d, NetworkId as f, Logger as g, LogLevel as h, isValidPersistedState as i, setActiveWallet as l, isNetworkConfig as m, LOCAL_STORAGE_KEY as n, setAccounts as o, createNetworkConfig as p, addWallet as r, setActiveAccount as s, DEFAULT_STATE as t, DEFAULT_NETWORK_CONFIG as u };
|
|
334
|
+
|
|
335
|
+
//# sourceMappingURL=store-CM2Y4xMP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-CM2Y4xMP.js","names":[],"sources":["../src/logger.ts","../src/network.ts","../src/store.ts"],"sourcesContent":["export enum LogLevel {\n DEBUG,\n INFO,\n WARN,\n ERROR\n}\n\nexport class Logger {\n private static instance: Logger | null = null\n private level: LogLevel\n private isClient: boolean\n\n private constructor() {\n this.level = LogLevel.WARN\n this.isClient = typeof window !== 'undefined'\n }\n\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger()\n }\n return Logger.instance\n }\n\n public static setLevel(level: LogLevel): void {\n Logger.getInstance().level = level\n }\n\n private log(level: LogLevel, scope: string | undefined, message: string, ...args: any[]): void {\n if (level >= this.level && this.isClient) {\n const formattedMessage = scope ? `[${scope}] ${message}` : message\n switch (level) {\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n console.info(formattedMessage, ...args)\n break\n case LogLevel.WARN:\n console.warn(formattedMessage, ...args)\n break\n case LogLevel.ERROR:\n console.error(formattedMessage, ...args)\n break\n }\n }\n }\n\n public createScopedLogger(scope: string) {\n return {\n debug: (message: string, ...args: any[]) => this.log(LogLevel.DEBUG, scope, message, ...args),\n info: (message: string, ...args: any[]) => this.log(LogLevel.INFO, scope, message, ...args),\n warn: (message: string, ...args: any[]) => this.log(LogLevel.WARN, scope, message, ...args),\n error: (message: string, ...args: any[]) => this.log(LogLevel.ERROR, scope, message, ...args)\n }\n }\n\n public debug(message: string, ...args: any[]): void {\n this.log(LogLevel.DEBUG, undefined, message, ...args)\n }\n\n public info(message: string, ...args: any[]): void {\n this.log(LogLevel.INFO, undefined, message, ...args)\n }\n\n public warn(message: string, ...args: any[]): void {\n this.log(LogLevel.WARN, undefined, message, ...args)\n }\n\n public error(message: string, ...args: any[]): void {\n this.log(LogLevel.ERROR, undefined, message, ...args)\n }\n\n // For testing purposes\n public setIsClient(isClient: boolean): void {\n this.isClient = isClient\n }\n}\n\nexport const logger = Logger.getInstance()\n","import algosdk from 'algosdk'\n\nexport interface AlgodConfig {\n token: string | algosdk.AlgodTokenHeader | algosdk.CustomTokenHeader | algosdk.BaseHTTPClient\n baseServer: string\n port?: string | number\n headers?: Record<string, string>\n}\n\nexport interface NetworkConfig {\n algod: AlgodConfig\n genesisHash?: string\n genesisId?: string\n isTestnet?: boolean\n caipChainId?: string\n}\n\n// Default configurations\nexport const DEFAULT_NETWORK_CONFIG: Record<string, NetworkConfig> = {\n mainnet: {\n algod: {\n token: '',\n baseServer: 'https://mainnet-api.4160.nodely.dev',\n headers: {}\n },\n isTestnet: false,\n genesisHash: 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=',\n genesisId: 'mainnet-v1.0',\n caipChainId: 'algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73k'\n },\n testnet: {\n algod: {\n token: '',\n baseServer: 'https://testnet-api.4160.nodely.dev',\n headers: {}\n },\n isTestnet: true,\n genesisHash: 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=',\n genesisId: 'testnet-v1.0',\n caipChainId: 'algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe'\n },\n betanet: {\n algod: {\n token: '',\n baseServer: 'https://betanet-api.4160.nodely.dev',\n headers: {}\n },\n isTestnet: true,\n genesisHash: 'mFgazF-2uRS1tMiL9dsj01hJGySEmPN2OvOTQHJ6iQg=',\n genesisId: 'betanet-v1.0',\n caipChainId: 'algorand:mFgazF-2uRS1tMiL9dsj01hJGySEmPN2'\n },\n fnet: {\n algod: {\n token: '',\n baseServer: 'https://fnet-api.4160.nodely.dev',\n headers: {}\n },\n isTestnet: true,\n genesisHash: 'kUt08LxeVAAGHnh4JoAoAMM9ql_hBwSoRrQQKWSVgxk=',\n genesisId: 'fnet-v1',\n caipChainId: 'algorand:kUt08LxeVAAGHnh4JoAoAMM9ql_hBwSo'\n },\n localnet: {\n algod: {\n token: 'a'.repeat(64),\n baseServer: 'http://localhost',\n port: 4001,\n headers: {}\n },\n isTestnet: true\n }\n}\n\n// Type for configuring default networks, excluding immutable identifiers\nexport type DefaultNetworkConfig = Omit<\n Partial<NetworkConfig>,\n 'genesisHash' | 'genesisId' | 'caipChainId'\n>\n\nexport class NetworkConfigBuilder {\n private networks: Map<string, NetworkConfig>\n\n constructor() {\n this.networks = new Map(Object.entries(DEFAULT_NETWORK_CONFIG))\n }\n\n // Methods to customize default networks\n mainnet(config: DefaultNetworkConfig) {\n this.networks.set('mainnet', {\n ...DEFAULT_NETWORK_CONFIG.mainnet,\n ...config,\n genesisHash: DEFAULT_NETWORK_CONFIG.mainnet.genesisHash!,\n genesisId: DEFAULT_NETWORK_CONFIG.mainnet.genesisId!,\n caipChainId: DEFAULT_NETWORK_CONFIG.mainnet.caipChainId!,\n algod: {\n ...DEFAULT_NETWORK_CONFIG.mainnet.algod,\n ...(config.algod || {})\n }\n })\n return this\n }\n\n testnet(config: DefaultNetworkConfig) {\n this.networks.set('testnet', {\n ...DEFAULT_NETWORK_CONFIG.testnet,\n ...config,\n genesisHash: DEFAULT_NETWORK_CONFIG.testnet.genesisHash!,\n genesisId: DEFAULT_NETWORK_CONFIG.testnet.genesisId!,\n caipChainId: DEFAULT_NETWORK_CONFIG.testnet.caipChainId!,\n algod: {\n ...DEFAULT_NETWORK_CONFIG.testnet.algod,\n ...(config.algod || {})\n }\n })\n return this\n }\n\n betanet(config: DefaultNetworkConfig) {\n this.networks.set('betanet', {\n ...DEFAULT_NETWORK_CONFIG.betanet,\n ...config,\n genesisHash: DEFAULT_NETWORK_CONFIG.betanet.genesisHash!,\n genesisId: DEFAULT_NETWORK_CONFIG.betanet.genesisId!,\n caipChainId: DEFAULT_NETWORK_CONFIG.betanet.caipChainId!,\n algod: {\n ...DEFAULT_NETWORK_CONFIG.betanet.algod,\n ...(config.algod || {})\n }\n })\n return this\n }\n\n fnet(config: DefaultNetworkConfig) {\n this.networks.set('fnet', {\n ...DEFAULT_NETWORK_CONFIG.fnet,\n ...config,\n genesisHash: DEFAULT_NETWORK_CONFIG.fnet.genesisHash!,\n genesisId: DEFAULT_NETWORK_CONFIG.fnet.genesisId!,\n caipChainId: DEFAULT_NETWORK_CONFIG.fnet.caipChainId!,\n algod: {\n ...DEFAULT_NETWORK_CONFIG.fnet.algod,\n ...(config.algod || {})\n }\n })\n return this\n }\n\n localnet(config: Partial<NetworkConfig>) {\n this.networks.set('localnet', {\n ...DEFAULT_NETWORK_CONFIG.localnet,\n ...config,\n algod: {\n ...DEFAULT_NETWORK_CONFIG.localnet.algod,\n ...(config.algod || {})\n }\n })\n return this\n }\n\n // Method to add custom networks (still needs full NetworkConfig)\n addNetwork(id: string, config: NetworkConfig) {\n if (DEFAULT_NETWORK_CONFIG[id]) {\n throw new Error(\n `Cannot add network with reserved id \"${id}\". Use the ${id}() method instead.`\n )\n }\n this.networks.set(id, config)\n return this\n }\n\n build() {\n return Object.fromEntries(this.networks)\n }\n}\n\n// Create a default builder with common presets\nexport const createNetworkConfig = () => new NetworkConfigBuilder().build()\n\n// Check if the algod token is valid\nfunction isValidToken(\n token: unknown\n): token is string | algosdk.AlgodTokenHeader | algosdk.CustomTokenHeader | algosdk.BaseHTTPClient {\n if (typeof token === 'string') return true\n if (typeof token !== 'object' || token === null) return false\n\n // Check if it's an AlgodTokenHeader\n if ('X-Algo-API-Token' in token && typeof token['X-Algo-API-Token'] === 'string') return true\n\n // Check if it's a BaseHTTPClient\n if ('get' in token && 'post' in token && 'delete' in token) return true\n\n // Check if it's a CustomTokenHeader (object with string values)\n return Object.values(token).every((value) => typeof value === 'string')\n}\n\n// Type guard for runtime validation\nexport function isNetworkConfig(config: unknown): config is NetworkConfig {\n if (typeof config !== 'object' || config === null) return false\n\n const { algod, isTestnet, genesisHash, genesisId, caipChainId } = config as NetworkConfig\n\n const isValidAlgod =\n typeof algod === 'object' &&\n algod !== null &&\n isValidToken(algod.token) &&\n typeof algod.baseServer === 'string'\n\n return (\n isValidAlgod &&\n (isTestnet === undefined || typeof isTestnet === 'boolean') &&\n (genesisHash === undefined || typeof genesisHash === 'string') &&\n (genesisId === undefined || typeof genesisId === 'string') &&\n (caipChainId === undefined || typeof caipChainId === 'string')\n )\n}\n\nexport enum NetworkId {\n MAINNET = 'mainnet',\n TESTNET = 'testnet',\n BETANET = 'betanet',\n FNET = 'fnet',\n LOCALNET = 'localnet'\n}\n","import algosdk from 'algosdk'\nimport { logger } from 'src/logger'\nimport { DEFAULT_NETWORK_CONFIG, NetworkConfig, NetworkId } from 'src/network'\nimport type { WalletAccount, WalletKey, WalletState } from 'src/wallets/types'\nimport type { Store } from '@tanstack/store'\n\nexport type { WalletState }\n\nexport type WalletStateMap = Partial<Record<WalletKey, WalletState>>\n\nexport type ManagerStatus = 'initializing' | 'ready'\n\nexport interface State {\n wallets: WalletStateMap\n activeWallet: WalletKey | null\n activeNetwork: string\n algodClient: algosdk.Algodv2\n managerStatus: ManagerStatus\n networkConfig: Record<string, NetworkConfig>\n customNetworkConfigs: Record<string, Partial<NetworkConfig>>\n}\n\nexport const DEFAULT_STATE: State = {\n wallets: {},\n activeWallet: null,\n activeNetwork: 'testnet',\n algodClient: new algosdk.Algodv2('', 'https://testnet-api.4160.nodely.dev/'),\n managerStatus: 'initializing',\n networkConfig: DEFAULT_NETWORK_CONFIG,\n customNetworkConfigs: {}\n}\n\nexport type PersistedState = Omit<State, 'algodClient' | 'managerStatus' | 'networkConfig'>\n\nexport const LOCAL_STORAGE_KEY = '@txnlab/use-wallet:v5'\n\n// State mutations\n\nexport function addWallet(\n store: Store<State>,\n { walletId, wallet }: { walletId: WalletKey; wallet: WalletState }\n) {\n store.setState((state) => {\n const updatedWallets = {\n ...state.wallets,\n [walletId]: {\n accounts: wallet.accounts.map((account) => ({ ...account })),\n activeAccount: wallet.activeAccount ? { ...wallet.activeAccount } : null\n }\n }\n\n return {\n ...state,\n wallets: updatedWallets,\n activeWallet: walletId\n }\n })\n}\n\nexport function removeWallet(store: Store<State>, { walletId }: { walletId: WalletKey }) {\n store.setState((state) => {\n const updatedWallets = { ...state.wallets }\n delete updatedWallets[walletId]\n\n return {\n ...state,\n wallets: updatedWallets,\n activeWallet: state.activeWallet === walletId ? null : state.activeWallet\n }\n })\n}\n\nexport function setActiveWallet(store: Store<State>, { walletId }: { walletId: WalletKey | null }) {\n store.setState((state) => ({\n ...state,\n activeWallet: walletId\n }))\n}\n\nexport function setActiveAccount(\n store: Store<State>,\n { walletId, address }: { walletId: WalletKey; address: string }\n) {\n store.setState((state) => {\n const wallet = state.wallets[walletId]\n if (!wallet) {\n logger.warn(`Wallet with id \"${walletId}\" not found`)\n return state\n }\n\n const newActiveAccount = wallet.accounts.find((a) => a.address === address)\n if (!newActiveAccount) {\n logger.warn(`Account with address ${address} not found in wallet \"${walletId}\"`)\n return state\n }\n\n const updatedWallet = {\n ...wallet,\n accounts: wallet.accounts.map((account) => ({ ...account })),\n activeAccount: { ...newActiveAccount }\n }\n\n const updatedWallets = {\n ...state.wallets,\n [walletId]: updatedWallet\n }\n\n return {\n ...state,\n wallets: updatedWallets\n }\n })\n}\n\nexport function setAccounts(\n store: Store<State>,\n { walletId, accounts }: { walletId: WalletKey; accounts: WalletAccount[] }\n) {\n store.setState((state) => {\n const wallet = state.wallets[walletId]\n if (!wallet) {\n logger.warn(`Wallet with id \"${walletId}\" not found`)\n return state\n }\n\n const newAccounts = accounts.map((account) => ({ ...account }))\n\n const isActiveAccountConnected = newAccounts.some(\n (account) => account.address === wallet.activeAccount?.address\n )\n\n const newActiveAccount = isActiveAccountConnected\n ? { ...wallet.activeAccount! }\n : newAccounts[0] || null\n\n const updatedWallet = {\n ...wallet,\n accounts: newAccounts,\n activeAccount: newActiveAccount\n }\n\n const updatedWallets = {\n ...state.wallets,\n [walletId]: updatedWallet\n }\n\n return {\n ...state,\n wallets: updatedWallets\n }\n })\n}\n\nexport function setActiveNetwork(\n store: Store<State>,\n { networkId, algodClient }: { networkId: NetworkId | string; algodClient: algosdk.Algodv2 }\n) {\n store.setState((state) => ({\n ...state,\n activeNetwork: networkId,\n algodClient\n }))\n}\n\n// Type guards\n\nexport function isValidWalletAccount(account: any): account is WalletAccount {\n return (\n typeof account === 'object' &&\n account !== null &&\n typeof account.name === 'string' &&\n typeof account.address === 'string'\n )\n}\n\nexport function isValidWalletState(wallet: any): wallet is WalletState {\n return (\n typeof wallet === 'object' &&\n wallet !== null &&\n Array.isArray(wallet.accounts) &&\n wallet.accounts.every(isValidWalletAccount) &&\n (wallet.activeAccount === null || isValidWalletAccount(wallet.activeAccount))\n )\n}\n\nexport function isValidPersistedState(state: unknown): state is PersistedState {\n return (\n typeof state === 'object' &&\n state !== null &&\n 'wallets' in state &&\n 'activeWallet' in state &&\n 'activeNetwork' in state &&\n (!('customNetworkConfigs' in state) ||\n (typeof state.customNetworkConfigs === 'object' && state.customNetworkConfigs !== null))\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { T as WalletState, i as State, s as AdapterStoreAccessor, y as WalletAccount } from "./base-BKrq-rUH.js";
|
|
2
|
+
import { Store, Store as Store$1 } from "@tanstack/store";
|
|
3
|
+
import algosdk from "algosdk";
|
|
4
|
+
|
|
5
|
+
//#region src/testing.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Create a test store with optional state overrides.
|
|
8
|
+
*/
|
|
9
|
+
declare function createTestStore(overrides?: Partial<State>): Store$1<State>;
|
|
10
|
+
/**
|
|
11
|
+
* Create a mock Algodv2 client for testing.
|
|
12
|
+
*/
|
|
13
|
+
declare function createMockAlgodClient(): algosdk.Algodv2;
|
|
14
|
+
/**
|
|
15
|
+
* Create a mock AdapterStoreAccessor bound to a wallet key.
|
|
16
|
+
* Optionally override individual methods.
|
|
17
|
+
*/
|
|
18
|
+
declare function createMockStoreAccessor(walletKey: string, overrides?: Partial<AdapterStoreAccessor>): AdapterStoreAccessor;
|
|
19
|
+
/**
|
|
20
|
+
* Test harness for wallet adapter tests.
|
|
21
|
+
* Returns both the store accessor and the underlying store,
|
|
22
|
+
* allowing tests to pre-populate state and verify mutations.
|
|
23
|
+
*/
|
|
24
|
+
declare function createTestHarness(walletKey: string, stateOverrides?: Partial<State>): {
|
|
25
|
+
store: Store$1<State>;
|
|
26
|
+
accessor: AdapterStoreAccessor;
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { type AdapterStoreAccessor, type State, type Store, type WalletAccount, type WalletState, createMockAlgodClient, createMockStoreAccessor, createTestHarness, createTestStore };
|
|
30
|
+
//# sourceMappingURL=testing.d.ts.map
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { a as removeWallet, l as setActiveWallet, o as setAccounts, r as addWallet, s as setActiveAccount, t as DEFAULT_STATE } from "./store-CM2Y4xMP.js";
|
|
2
|
+
import { Store } from "@tanstack/store";
|
|
3
|
+
import algosdk from "algosdk";
|
|
4
|
+
//#region src/testing.ts
|
|
5
|
+
/**
|
|
6
|
+
* @txnlab/use-wallet/testing
|
|
7
|
+
*
|
|
8
|
+
* Test helpers for wallet adapter test suites. Reduces boilerplate
|
|
9
|
+
* for both internal and external adapter maintainers.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Create a test store with optional state overrides.
|
|
13
|
+
*/
|
|
14
|
+
function createTestStore(overrides) {
|
|
15
|
+
return new Store({
|
|
16
|
+
...DEFAULT_STATE,
|
|
17
|
+
...overrides
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a mock Algodv2 client for testing.
|
|
22
|
+
*/
|
|
23
|
+
function createMockAlgodClient() {
|
|
24
|
+
return new algosdk.Algodv2("", "https://testnet-api.4160.nodely.dev/");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a mock AdapterStoreAccessor bound to a wallet key.
|
|
28
|
+
* Optionally override individual methods.
|
|
29
|
+
*/
|
|
30
|
+
function createMockStoreAccessor(walletKey, overrides) {
|
|
31
|
+
const store = createTestStore();
|
|
32
|
+
return {
|
|
33
|
+
getWalletState: () => store.state.wallets[walletKey],
|
|
34
|
+
getActiveWallet: () => store.state.activeWallet,
|
|
35
|
+
getActiveNetwork: () => store.state.activeNetwork,
|
|
36
|
+
getState: () => store.state,
|
|
37
|
+
addWallet: (wallet) => addWallet(store, {
|
|
38
|
+
walletId: walletKey,
|
|
39
|
+
wallet
|
|
40
|
+
}),
|
|
41
|
+
removeWallet: () => removeWallet(store, { walletId: walletKey }),
|
|
42
|
+
setAccounts: (accounts) => setAccounts(store, {
|
|
43
|
+
walletId: walletKey,
|
|
44
|
+
accounts
|
|
45
|
+
}),
|
|
46
|
+
setActiveAccount: (address) => setActiveAccount(store, {
|
|
47
|
+
walletId: walletKey,
|
|
48
|
+
address
|
|
49
|
+
}),
|
|
50
|
+
setActive: () => setActiveWallet(store, { walletId: walletKey }),
|
|
51
|
+
...overrides
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Test harness for wallet adapter tests.
|
|
56
|
+
* Returns both the store accessor and the underlying store,
|
|
57
|
+
* allowing tests to pre-populate state and verify mutations.
|
|
58
|
+
*/
|
|
59
|
+
function createTestHarness(walletKey, stateOverrides) {
|
|
60
|
+
const store = createTestStore(stateOverrides);
|
|
61
|
+
return {
|
|
62
|
+
store,
|
|
63
|
+
accessor: {
|
|
64
|
+
getWalletState: () => store.state.wallets[walletKey],
|
|
65
|
+
getActiveWallet: () => store.state.activeWallet,
|
|
66
|
+
getActiveNetwork: () => store.state.activeNetwork,
|
|
67
|
+
getState: () => store.state,
|
|
68
|
+
addWallet: (wallet) => addWallet(store, {
|
|
69
|
+
walletId: walletKey,
|
|
70
|
+
wallet
|
|
71
|
+
}),
|
|
72
|
+
removeWallet: () => removeWallet(store, { walletId: walletKey }),
|
|
73
|
+
setAccounts: (accounts) => setAccounts(store, {
|
|
74
|
+
walletId: walletKey,
|
|
75
|
+
accounts
|
|
76
|
+
}),
|
|
77
|
+
setActiveAccount: (address) => setActiveAccount(store, {
|
|
78
|
+
walletId: walletKey,
|
|
79
|
+
address
|
|
80
|
+
}),
|
|
81
|
+
setActive: () => setActiveWallet(store, { walletId: walletKey })
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
export { createMockAlgodClient, createMockStoreAccessor, createTestHarness, createTestStore };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","names":[],"sources":["../src/testing.ts"],"sourcesContent":["/**\n * @txnlab/use-wallet/testing\n *\n * Test helpers for wallet adapter test suites. Reduces boilerplate\n * for both internal and external adapter maintainers.\n */\n\nimport { Store } from '@tanstack/store'\nimport algosdk from 'algosdk'\nimport {\n addWallet,\n removeWallet,\n setAccounts,\n setActiveAccount,\n setActiveWallet,\n DEFAULT_STATE,\n type State\n} from './store'\nimport type { AdapterStoreAccessor, WalletState } from './wallets/types'\n\n/**\n * Create a test store with optional state overrides.\n */\nexport function createTestStore(overrides?: Partial<State>): Store<State> {\n return new Store<State>({\n ...DEFAULT_STATE,\n ...overrides\n })\n}\n\n/**\n * Create a mock Algodv2 client for testing.\n */\nexport function createMockAlgodClient(): algosdk.Algodv2 {\n return new algosdk.Algodv2('', 'https://testnet-api.4160.nodely.dev/')\n}\n\n/**\n * Create a mock AdapterStoreAccessor bound to a wallet key.\n * Optionally override individual methods.\n */\nexport function createMockStoreAccessor(\n walletKey: string,\n overrides?: Partial<AdapterStoreAccessor>\n): AdapterStoreAccessor {\n const store = createTestStore()\n\n const defaultAccessor: AdapterStoreAccessor = {\n getWalletState: () => store.state.wallets[walletKey],\n getActiveWallet: () => store.state.activeWallet,\n getActiveNetwork: () => store.state.activeNetwork,\n getState: () => store.state,\n addWallet: (wallet: WalletState) => addWallet(store, { walletId: walletKey, wallet }),\n removeWallet: () => removeWallet(store, { walletId: walletKey }),\n setAccounts: (accounts) => setAccounts(store, { walletId: walletKey, accounts }),\n setActiveAccount: (address) => setActiveAccount(store, { walletId: walletKey, address }),\n setActive: () => setActiveWallet(store, { walletId: walletKey })\n }\n\n return { ...defaultAccessor, ...overrides }\n}\n\n/**\n * Test harness for wallet adapter tests.\n * Returns both the store accessor and the underlying store,\n * allowing tests to pre-populate state and verify mutations.\n */\nexport function createTestHarness(\n walletKey: string,\n stateOverrides?: Partial<State>\n): { store: Store<State>; accessor: AdapterStoreAccessor } {\n const store = createTestStore(stateOverrides)\n\n const accessor: AdapterStoreAccessor = {\n getWalletState: () => store.state.wallets[walletKey],\n getActiveWallet: () => store.state.activeWallet,\n getActiveNetwork: () => store.state.activeNetwork,\n getState: () => store.state,\n addWallet: (wallet: WalletState) => addWallet(store, { walletId: walletKey, wallet }),\n removeWallet: () => removeWallet(store, { walletId: walletKey }),\n setAccounts: (accounts) => setAccounts(store, { walletId: walletKey, accounts }),\n setActiveAccount: (address) => setActiveAccount(store, { walletId: walletKey, address }),\n setActive: () => setActiveWallet(store, { walletId: walletKey })\n }\n\n return { store, accessor }\n}\n\n// Re-export commonly needed test types\nexport type { State } from './store'\nexport type { AdapterStoreAccessor, WalletState, WalletAccount } from './wallets/types'\n\n// Re-export Store type so adapter tests don't need a direct @tanstack/store dependency\nexport type { Store } from '@tanstack/store'\n"],"mappings":";;;;;;;;;;;;;AAuBA,SAAgB,gBAAgB,WAA0C;AACxE,QAAO,IAAI,MAAa;EACtB,GAAG;EACH,GAAG;EACJ,CAAC;;;;;AAMJ,SAAgB,wBAAyC;AACvD,QAAO,IAAI,QAAQ,QAAQ,IAAI,uCAAuC;;;;;;AAOxE,SAAgB,wBACd,WACA,WACsB;CACtB,MAAM,QAAQ,iBAAiB;AAc/B,QAAO;EAXL,sBAAsB,MAAM,MAAM,QAAQ;EAC1C,uBAAuB,MAAM,MAAM;EACnC,wBAAwB,MAAM,MAAM;EACpC,gBAAgB,MAAM;EACtB,YAAY,WAAwB,UAAU,OAAO;GAAE,UAAU;GAAW;GAAQ,CAAC;EACrF,oBAAoB,aAAa,OAAO,EAAE,UAAU,WAAW,CAAC;EAChE,cAAc,aAAa,YAAY,OAAO;GAAE,UAAU;GAAW;GAAU,CAAC;EAChF,mBAAmB,YAAY,iBAAiB,OAAO;GAAE,UAAU;GAAW;GAAS,CAAC;EACxF,iBAAiB,gBAAgB,OAAO,EAAE,UAAU,WAAW,CAAC;EAGrC,GAAG;EAAW;;;;;;;AAQ7C,SAAgB,kBACd,WACA,gBACyD;CACzD,MAAM,QAAQ,gBAAgB,eAAe;AAc7C,QAAO;EAAE;EAAO,UAZuB;GACrC,sBAAsB,MAAM,MAAM,QAAQ;GAC1C,uBAAuB,MAAM,MAAM;GACnC,wBAAwB,MAAM,MAAM;GACpC,gBAAgB,MAAM;GACtB,YAAY,WAAwB,UAAU,OAAO;IAAE,UAAU;IAAW;IAAQ,CAAC;GACrF,oBAAoB,aAAa,OAAO,EAAE,UAAU,WAAW,CAAC;GAChE,cAAc,aAAa,YAAY,OAAO;IAAE,UAAU;IAAW;IAAU,CAAC;GAChF,mBAAmB,YAAY,iBAAiB,OAAO;IAAE,UAAU;IAAW;IAAS,CAAC;GACxF,iBAAiB,gBAAgB,OAAO,EAAE,UAAU,WAAW,CAAC;GACjE;EAEyB"}
|