@asseteragmbh/wallet-connector 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -68,6 +68,27 @@ function isSecurityMessage(value) {
68
68
  const data = value.data;
69
69
  return isRecord(data) && typeof data.protection === "string" && WALLET_PROTECTIONS.includes(data.protection) && isCount(data.passkeys) && isCount(data.authenticatorApps);
70
70
  }
71
+ var MAX_ACCOUNT_NAMES = 50;
72
+ function hasControlCharacter(value) {
73
+ for (const character of value) {
74
+ const code = character.codePointAt(0) ?? 0;
75
+ if (code <= 31 || code >= 127 && code <= 159) return true;
76
+ }
77
+ return false;
78
+ }
79
+ function isAccountName(value) {
80
+ if (typeof value !== "string") return false;
81
+ if (hasControlCharacter(value)) return false;
82
+ const trimmed = value.trim();
83
+ return trimmed.length >= 1 && trimmed.length <= 64;
84
+ }
85
+ function isAccountsMessage(value) {
86
+ if (!hasType(value, "accounts")) return false;
87
+ const data = value.data;
88
+ return Array.isArray(data) && data.length <= MAX_ACCOUNT_NAMES && data.every(
89
+ (entry) => isRecord(entry) && typeof entry.address === "string" && EVM_ADDRESS_RE.test(entry.address) && isAccountName(entry.name)
90
+ );
91
+ }
71
92
  function isRequestMessage(value) {
72
93
  return hasType(value, "request") && typeof value.id === "string" && typeof value.method === "string";
73
94
  }
@@ -154,9 +175,11 @@ function createAsseteraWalletProvider(options) {
154
175
  let chainIdHex = null;
155
176
  let walletDisconnected = false;
156
177
  let lastSecurity;
178
+ let lastAccountNameList;
157
179
  const pending = /* @__PURE__ */ new Map();
158
180
  const listeners = /* @__PURE__ */ new Map();
159
181
  let closeTimer = null;
182
+ let requestsSent = 0;
160
183
  function currentChainId() {
161
184
  return chainIdHex ?? toHexChainId(defaultChainId);
162
185
  }
@@ -287,6 +310,13 @@ function createAsseteraWalletProvider(options) {
287
310
  };
288
311
  emit("assetera_security", lastSecurity);
289
312
  }
313
+ function copyAccountNames2(accounts2) {
314
+ return accounts2.map((account) => ({ address: account.address, name: account.name }));
315
+ }
316
+ function handleAccountsMessage(message) {
317
+ lastAccountNameList = copyAccountNames2(message.data);
318
+ emit("assetera_accounts", copyAccountNames2(lastAccountNameList));
319
+ }
290
320
  function onWindowMessage(event) {
291
321
  if (event.origin !== walletOrigin) return;
292
322
  if (popup === null || event.source !== popup) return;
@@ -303,6 +333,10 @@ function createAsseteraWalletProvider(options) {
303
333
  handleSecurityMessage(data);
304
334
  return;
305
335
  }
336
+ if (isAccountsMessage(data)) {
337
+ handleAccountsMessage(data);
338
+ return;
339
+ }
306
340
  if (isEventMessage(data)) handleEventMessage(data);
307
341
  }
308
342
  if (typeof window !== "undefined") window.addEventListener("message", onWindowMessage);
@@ -326,6 +360,7 @@ function createAsseteraWalletProvider(options) {
326
360
  if (method === "eth_accounts") return Promise.resolve([...accounts]);
327
361
  if (method === "eth_chainId") return Promise.resolve(currentChainId());
328
362
  if (method === "eth_requestAccounts") {
363
+ requestsSent += 1;
329
364
  const active2 = openPopup();
330
365
  if (!active2) return Promise.reject(blockedError());
331
366
  return ready.promise.then(() => sendRequest("eth_requestAccounts", params)).then((result) => {
@@ -343,6 +378,7 @@ function createAsseteraWalletProvider(options) {
343
378
  )
344
379
  );
345
380
  }
381
+ requestsSent += 1;
346
382
  const active = openPopup();
347
383
  if (!active) return Promise.reject(blockedError());
348
384
  if (SIGNING_METHODS.has(method)) active.focus();
@@ -369,6 +405,25 @@ function createAsseteraWalletProvider(options) {
369
405
  walletDisconnected = false;
370
406
  emit("disconnect", disconnectedError("Disconnected from the Assetera Wallet."));
371
407
  }
408
+ function prepareSigning() {
409
+ const existed = popup !== null && !popup.closed;
410
+ const active = typeof window === "undefined" ? null : openPopup();
411
+ if (!active) return { opened: false, release: () => {
412
+ } };
413
+ const sentAtPrepare = requestsSent;
414
+ let released = false;
415
+ return {
416
+ opened: true,
417
+ release() {
418
+ if (released) return;
419
+ released = true;
420
+ if (existed || popup !== active || active.closed) return;
421
+ if (requestsSent !== sentAtPrepare || pending.size > 0) return;
422
+ active.close();
423
+ handlePopupClosed();
424
+ }
425
+ };
426
+ }
372
427
  function on(event, listener) {
373
428
  addListener(event, listener);
374
429
  }
@@ -378,7 +433,18 @@ function createAsseteraWalletProvider(options) {
378
433
  function lastSecurityStatus() {
379
434
  return lastSecurity;
380
435
  }
381
- return { request, on, removeListener, disconnect, lastSecurityStatus };
436
+ function lastAccountNames() {
437
+ return lastAccountNameList === void 0 ? void 0 : copyAccountNames2(lastAccountNameList);
438
+ }
439
+ return {
440
+ request,
441
+ on,
442
+ removeListener,
443
+ disconnect,
444
+ lastSecurityStatus,
445
+ lastAccountNames,
446
+ prepareSigning
447
+ };
382
448
  }
383
449
 
384
450
  // src/popup.ts
@@ -435,6 +501,9 @@ function cancelMessage(reason) {
435
501
  if (reason === "refused") return "The Assetera Wallet refused the onboarding.";
436
502
  return "The Assetera Wallet onboarding failed.";
437
503
  }
504
+ function copyAccountNames(accounts) {
505
+ return accounts.map((account) => ({ address: account.address, name: account.name }));
506
+ }
438
507
  function showOverlay(win, labels, handlers) {
439
508
  const doc = win.document;
440
509
  const root = doc.createElement("div");
@@ -603,6 +672,7 @@ function openAsseteraOnboarding(options) {
603
672
  });
604
673
  }
605
674
  let address;
675
+ let lastAccountNameList;
606
676
  function onMessage(event) {
607
677
  if (event.origin !== walletOrigin) return;
608
678
  if (event.source !== activePopup) return;
@@ -616,7 +686,8 @@ function openAsseteraOnboarding(options) {
616
686
  chain: data.chain,
617
687
  created: data.created ?? true,
618
688
  signMessage,
619
- close
689
+ close,
690
+ lastAccounts: () => lastAccountNameList === void 0 ? void 0 : copyAccountNames(lastAccountNameList)
620
691
  });
621
692
  return;
622
693
  }
@@ -625,6 +696,11 @@ function openAsseteraOnboarding(options) {
625
696
  }
626
697
  return;
627
698
  }
699
+ if (isAccountsMessage(data)) {
700
+ lastAccountNameList = copyAccountNames(data.data);
701
+ options.onAccounts?.(copyAccountNames(lastAccountNameList));
702
+ return;
703
+ }
628
704
  if (isResponseMessage(data)) {
629
705
  const entry = pending.get(data.id);
630
706
  if (!entry) return;
@@ -703,6 +779,7 @@ function openAsseteraWalletManager(options) {
703
779
  const activePopup = popup;
704
780
  let finished = false;
705
781
  let lastSecurity;
782
+ let lastAccounts;
706
783
  let closeTimer = null;
707
784
  let resolveClosed;
708
785
  const closed = new Promise((resolve) => {
@@ -722,18 +799,27 @@ function openAsseteraWalletManager(options) {
722
799
  cleanup();
723
800
  if (!activePopup.closed) activePopup.close();
724
801
  }
802
+ function copyAccountNames2(accounts) {
803
+ return accounts.map((account) => ({ address: account.address, name: account.name }));
804
+ }
725
805
  function onMessage(event) {
726
806
  if (event.origin !== walletOrigin) return;
727
807
  if (event.source !== activePopup) return;
728
808
  const data = event.data;
729
- if (!isSecurityMessage(data)) return;
730
- const status = {
731
- protection: data.data.protection,
732
- passkeys: data.data.passkeys,
733
- authenticatorApps: data.data.authenticatorApps
734
- };
735
- lastSecurity = status;
736
- options.onSecurity?.(status);
809
+ if (isSecurityMessage(data)) {
810
+ const status = {
811
+ protection: data.data.protection,
812
+ passkeys: data.data.passkeys,
813
+ authenticatorApps: data.data.authenticatorApps
814
+ };
815
+ lastSecurity = status;
816
+ options.onSecurity?.(status);
817
+ return;
818
+ }
819
+ if (isAccountsMessage(data)) {
820
+ lastAccounts = copyAccountNames2(data.data);
821
+ options.onAccounts?.(copyAccountNames2(lastAccounts));
822
+ }
737
823
  }
738
824
  targetWindow.addEventListener("message", onMessage);
739
825
  closeTimer = setInterval(() => {
@@ -742,7 +828,8 @@ function openAsseteraWalletManager(options) {
742
828
  return {
743
829
  close,
744
830
  closed,
745
- lastSecurity: () => lastSecurity
831
+ lastSecurity: () => lastSecurity,
832
+ lastAccounts: () => lastAccounts === void 0 ? void 0 : copyAccountNames2(lastAccounts)
746
833
  };
747
834
  }
748
835
 
@@ -759,6 +846,7 @@ exports.SIGN_IN_HINTS = SIGN_IN_HINTS;
759
846
  exports.SUPPORTED_METHODS = SUPPORTED_METHODS;
760
847
  exports.connectUrl = connectUrl;
761
848
  exports.createAsseteraWalletProvider = createAsseteraWalletProvider;
849
+ exports.isAccountsMessage = isAccountsMessage;
762
850
  exports.isCaip2EvmChain = isCaip2EvmChain;
763
851
  exports.isDisconnectMessage = isDisconnectMessage;
764
852
  exports.isEventMessage = isEventMessage;