@seams/wallet 0.10.2 → 0.11.0

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.
Files changed (173) hide show
  1. package/README.md +3 -3
  2. package/THIRD_PARTY_NOTICES.md +33 -1812
  3. package/dist/.build-inputs.sha256 +1 -1
  4. package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryCodeBackup.js +100 -0
  5. package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.js +127 -71
  6. package/dist/esm/core/signingEngine/uiConfirm/ui/preact/RecoveryCodeBackupSurface.js +558 -0
  7. package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountRecoveryCodeBackupSurface.js +82 -0
  8. package/dist/esm/core/types/sdkSentEvents.js +9 -0
  9. package/dist/esm/react/components/AccountMenuButton/AccountMenuButtonMock.js +189 -0
  10. package/dist/esm/react/components/AccountMenuButton/AccountMenuButtonView.js +137 -0
  11. package/dist/esm/react/components/AccountMenuButton/AccountMenuDeviceDetails.js +39 -0
  12. package/dist/esm/react/components/AccountMenuButton/AccountMenuDialog.js +39 -13
  13. package/dist/esm/react/components/AccountMenuButton/AccountMenuMockScreens.js +247 -0
  14. package/dist/esm/react/components/AccountMenuButton/AccountMenuScreen.js +41 -0
  15. package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodRow.js +79 -0
  16. package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodsModal.js +168 -174
  17. package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodsView.js +19 -0
  18. package/dist/esm/react/components/AccountMenuButton/ExportKeysScreen.js +30 -0
  19. package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.css +148 -87
  20. package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.js +26 -5
  21. package/dist/esm/react/components/AccountMenuButton/MenuItem.js +28 -13
  22. package/dist/esm/react/components/AccountMenuButton/ProfileDropdown.css +73 -69
  23. package/dist/esm/react/components/AccountMenuButton/ProfileDropdown.js +56 -68
  24. package/dist/esm/react/components/AccountMenuButton/RecoveryCodeAcknowledgement.js +27 -0
  25. package/dist/esm/react/components/AccountMenuButton/RecoveryCodeActions.js +53 -0
  26. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.css +3 -1
  27. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js +2 -8
  28. package/dist/esm/react/components/AccountMenuButton/UserAccountButton.css +1 -1
  29. package/dist/esm/react/components/AccountMenuButton/UserAccountButton.js +6 -3
  30. package/dist/esm/react/components/AccountMenuButton/WalletRegionSection.js +4 -4
  31. package/dist/esm/react/components/AccountMenuButton/Web3AuthProfileButton.css +443 -12
  32. package/dist/esm/react/components/AccountMenuButton/hooks/useProfileState.js +1 -1
  33. package/dist/esm/react/components/AccountMenuButton/icons/LayersIcon.js +8 -0
  34. package/dist/esm/react/components/AccountMenuButton/icons/LockKeyholeIcon.js +22 -0
  35. package/dist/esm/react/components/AccountMenuButton/icons/PlusIcon.js +8 -0
  36. package/dist/esm/react/components/AccountMenuButton/icons/SunIcon.js +2 -2
  37. package/dist/esm/react/components/AccountMenuButton/icons/TouchIcon.css +0 -8
  38. package/dist/esm/react/components/AccountMenuButton/index.js +135 -115
  39. package/dist/esm/react/components/QRCodeScanner.js +64 -40
  40. package/dist/esm/react/components/QRCodeScannerCamera.js +16 -0
  41. package/dist/esm/react/components/ShowQRCode.js +2 -2
  42. package/dist/esm/react/externalEvm.js +2 -2
  43. package/dist/esm/react/index.js +2 -1
  44. package/dist/esm/react/styles/styles.css +520 -91
  45. package/dist/esm/react/transactionReview/TransactionReviewHost.js +3 -3
  46. package/dist/esm/sdk/{adapters-DYPu0nK9.js → adapters-CGvNLOfZ.js} +1 -1
  47. package/dist/{public/sdk/display-DjoWrSgE.js → esm/sdk/display-DTbGoX4e.js} +1 -1
  48. package/dist/{public/sdk/exportKeypairOperation-DYCzCbqL.js → esm/sdk/exportKeypairOperation-BHXMSA3v.js} +1 -1
  49. package/dist/{public/sdk/host-D5b19B_h.js → esm/sdk/host-Bqmmy8Ts.js} +1 -1
  50. package/dist/esm/sdk/{localOnly-KvZeKkH5.js → localOnly-CUVRoMy2.js} +1 -1
  51. package/dist/esm/sdk/{mountRecoveryCodeBackupSurface-BA2ttbTM.js → mountRecoveryCodeBackupSurface-D1G-iCPI.js} +2 -2
  52. package/dist/esm/sdk/{pendingWalletRecoveryCodeBackup-BkIrbd6Q.js → pendingWalletRecoveryCodeBackup-CMCOUuA-.js} +1 -1
  53. package/dist/esm/sdk/{recovery-entrypoint-DoXswV9I.js → recovery-entrypoint-QxTiyx-o.js} +1 -1
  54. package/dist/esm/sdk/{registration-BFHEYmgh.js → registration-Drtkzrlc.js} +1 -1
  55. package/dist/esm/sdk/registration-eyzHqLHi.js +1 -0
  56. package/dist/esm/sdk/{requireStepUpAuth-C67sluoC.js → requireStepUpAuth-FqZSU021.js} +1 -1
  57. package/dist/esm/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
  58. package/dist/esm/sdk/runtime-auth-CbveTM2_.js +1 -0
  59. package/dist/esm/sdk/{runtime-device-link-pf-a_-3u.js → runtime-device-link-CHsqrEQ9.js} +1 -1
  60. package/dist/esm/sdk/{runtime-ecdsa-tempo-Ddnuti6f.js → runtime-ecdsa-tempo-MgmnU9g-.js} +1 -1
  61. package/dist/esm/sdk/{runtime-email-otp-BAG8ZC1J.js → runtime-email-otp-Cj96n102.js} +1 -1
  62. package/dist/esm/sdk/{runtime-export-DxL99xfn.js → runtime-export-mcwZRxKk.js} +1 -1
  63. package/dist/esm/sdk/{runtime-near-BrWP4IxC.js → runtime-near-BMdTtu7D.js} +1 -1
  64. package/dist/esm/sdk/{runtime-preferences-BjVdHYL0.js → runtime-preferences-CBlhE8bX.js} +1 -1
  65. package/dist/esm/sdk/{runtime-recovery-codes-Dn-NccpU.js → runtime-recovery-codes-B1gixZsp.js} +1 -1
  66. package/dist/esm/sdk/{runtime-recovery-BNd_GX5q.js → runtime-recovery-mJp3MLeG.js} +1 -1
  67. package/dist/esm/sdk/sdkSentEvents-Dl8fOL50.js +1 -0
  68. package/dist/esm/sdk/shared-8Qe7Nxgg.js +6 -0
  69. package/dist/{public/sdk/signEvmFamily-DjD3tn8e.js → esm/sdk/signEvmFamily-M0trbeZe.js} +1 -1
  70. package/dist/esm/sdk/{signEvmFamilyWithUiConfirmForTempo-CwRFbaLM.js → signEvmFamilyWithUiConfirmForTempo-Bo25SwuV.js} +1 -1
  71. package/dist/esm/sdk/{signEvmWithUiConfirm-BHG0dwVG.js → signEvmWithUiConfirm-CFcqJRj3.js} +1 -1
  72. package/dist/{public/sdk/signNear-D0tlQXb9.js → esm/sdk/signNear-DGUQZ44s.js} +1 -1
  73. package/dist/esm/sdk/{signingFlow-Mym5j6aw.js → signingFlow-DZvV4AgG.js} +1 -1
  74. package/dist/esm/sdk/{transaction-activity-Cb2JyYKv.js → transaction-activity-xfeHKJoq.js} +1 -1
  75. package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
  76. package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
  77. package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
  78. package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
  79. package/dist/esm/sdk/wallet-ui.css +1 -1
  80. package/dist/{public/sdk/walletCustodyEcdsaContinuity-B8aO2NFb.js → esm/sdk/walletCustodyEcdsaContinuity-_IKoCUBO.js} +1 -1
  81. package/dist/{public/sdk/walletRecoveryCommit-C3EgMjo-.js → esm/sdk/walletRecoveryCommit-DDPa1rAJ.js} +1 -1
  82. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  83. package/dist/esm/wasm/router_ab_ecdsa_client/pkg/router_ab_ecdsa_client_bg.wasm +0 -0
  84. package/dist/esm/wasm/router_ab_ed25519_yao_client/pkg/router_ab_ed25519_yao_client_bg.wasm +0 -0
  85. package/dist/public/headers.manifest.json +1 -1
  86. package/dist/public/sdk/{adapters-DYPu0nK9.js → adapters-CGvNLOfZ.js} +1 -1
  87. package/dist/{esm/sdk/display-DjoWrSgE.js → public/sdk/display-DTbGoX4e.js} +1 -1
  88. package/dist/{esm/sdk/exportKeypairOperation-DYCzCbqL.js → public/sdk/exportKeypairOperation-BHXMSA3v.js} +1 -1
  89. package/dist/{esm/sdk/host-D5b19B_h.js → public/sdk/host-Bqmmy8Ts.js} +1 -1
  90. package/dist/public/sdk/{localOnly-KvZeKkH5.js → localOnly-CUVRoMy2.js} +1 -1
  91. package/dist/public/sdk/{mountRecoveryCodeBackupSurface-BA2ttbTM.js → mountRecoveryCodeBackupSurface-D1G-iCPI.js} +2 -2
  92. package/dist/public/sdk/{pendingWalletRecoveryCodeBackup-BkIrbd6Q.js → pendingWalletRecoveryCodeBackup-CMCOUuA-.js} +1 -1
  93. package/dist/public/sdk/{recovery-entrypoint-DoXswV9I.js → recovery-entrypoint-QxTiyx-o.js} +1 -1
  94. package/dist/public/sdk/{registration-BFHEYmgh.js → registration-Drtkzrlc.js} +1 -1
  95. package/dist/public/sdk/registration-eyzHqLHi.js +1 -0
  96. package/dist/public/sdk/{requireStepUpAuth-C67sluoC.js → requireStepUpAuth-FqZSU021.js} +1 -1
  97. package/dist/public/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
  98. package/dist/public/sdk/runtime-auth-CbveTM2_.js +1 -0
  99. package/dist/public/sdk/{runtime-device-link-pf-a_-3u.js → runtime-device-link-CHsqrEQ9.js} +1 -1
  100. package/dist/public/sdk/{runtime-ecdsa-tempo-Ddnuti6f.js → runtime-ecdsa-tempo-MgmnU9g-.js} +1 -1
  101. package/dist/public/sdk/{runtime-email-otp-BAG8ZC1J.js → runtime-email-otp-Cj96n102.js} +1 -1
  102. package/dist/public/sdk/{runtime-export-DxL99xfn.js → runtime-export-mcwZRxKk.js} +1 -1
  103. package/dist/public/sdk/{runtime-near-BrWP4IxC.js → runtime-near-BMdTtu7D.js} +1 -1
  104. package/dist/public/sdk/{runtime-preferences-BjVdHYL0.js → runtime-preferences-CBlhE8bX.js} +1 -1
  105. package/dist/public/sdk/{runtime-recovery-codes-Dn-NccpU.js → runtime-recovery-codes-B1gixZsp.js} +1 -1
  106. package/dist/public/sdk/{runtime-recovery-BNd_GX5q.js → runtime-recovery-mJp3MLeG.js} +1 -1
  107. package/dist/public/sdk/sdkSentEvents-Dl8fOL50.js +1 -0
  108. package/dist/public/sdk/shared-8Qe7Nxgg.js +6 -0
  109. package/dist/{esm/sdk/signEvmFamily-DjD3tn8e.js → public/sdk/signEvmFamily-M0trbeZe.js} +1 -1
  110. package/dist/public/sdk/{signEvmFamilyWithUiConfirmForTempo-CwRFbaLM.js → signEvmFamilyWithUiConfirmForTempo-Bo25SwuV.js} +1 -1
  111. package/dist/public/sdk/{signEvmWithUiConfirm-BHG0dwVG.js → signEvmWithUiConfirm-CFcqJRj3.js} +1 -1
  112. package/dist/{esm/sdk/signNear-D0tlQXb9.js → public/sdk/signNear-DGUQZ44s.js} +1 -1
  113. package/dist/public/sdk/{signingFlow-Mym5j6aw.js → signingFlow-DZvV4AgG.js} +1 -1
  114. package/dist/public/sdk/{transaction-activity-Cb2JyYKv.js → transaction-activity-xfeHKJoq.js} +1 -1
  115. package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
  116. package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
  117. package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
  118. package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
  119. package/dist/public/sdk/wallet-ui.css +1 -1
  120. package/dist/{esm/sdk/walletCustodyEcdsaContinuity-B8aO2NFb.js → public/sdk/walletCustodyEcdsaContinuity-_IKoCUBO.js} +1 -1
  121. package/dist/{esm/sdk/walletRecoveryCommit-C3EgMjo-.js → public/sdk/walletRecoveryCommit-DDPa1rAJ.js} +1 -1
  122. package/dist/public/sdk/workers/email_otp_runtime_bg.wasm +0 -0
  123. package/dist/public/sdk/workers/evm_crypto_bg.wasm +0 -0
  124. package/dist/public/sdk/workers/router_ab_ecdsa_client_bg.wasm +0 -0
  125. package/dist/public/sdk/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
  126. package/dist/public/sdk/workers/shamir3pass_runtime_bg.wasm +0 -0
  127. package/dist/public/sdk/workers/tempo_signer_bg.wasm +0 -0
  128. package/dist/public/sdk/workers/wallet_custody_ceremony_bg.wasm +0 -0
  129. package/dist/public/sdk/workers/wasm_signer_worker_bg.wasm +0 -0
  130. package/dist/public/wallet-assets.manifest.json +62 -62
  131. package/dist/public/wallet-service/index.html +4 -4
  132. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/domain.d.ts +4 -0
  133. package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/session.d.ts +4 -2
  134. package/dist/types/wallet/src/core/types/sdkSentEvents.d.ts +4 -0
  135. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuButtonMock.d.ts +17 -0
  136. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuButtonView.d.ts +17 -0
  137. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuDeviceDetails.d.ts +13 -0
  138. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuDialog.d.ts +1 -1
  139. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuMockScreens.d.ts +43 -0
  140. package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuScreen.d.ts +9 -0
  141. package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodRow.d.ts +14 -0
  142. package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodsModal.d.ts +1 -1
  143. package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodsView.d.ts +8 -0
  144. package/dist/types/wallet/src/react/components/AccountMenuButton/ExportKeysScreen.d.ts +7 -0
  145. package/dist/types/wallet/src/react/components/AccountMenuButton/LinkedDevicesModal.d.ts +1 -1
  146. package/dist/types/wallet/src/react/components/AccountMenuButton/ProfileDropdown.d.ts +2 -14
  147. package/dist/types/wallet/src/react/components/AccountMenuButton/RecoveryCodeAcknowledgement.d.ts +5 -0
  148. package/dist/types/wallet/src/react/components/AccountMenuButton/RecoveryCodeActions.d.ts +5 -0
  149. package/dist/types/wallet/src/react/components/AccountMenuButton/icons/LayersIcon.d.ts +2 -0
  150. package/dist/types/wallet/src/react/components/AccountMenuButton/icons/LockKeyholeIcon.d.ts +2 -0
  151. package/dist/types/wallet/src/react/components/AccountMenuButton/icons/PlusIcon.d.ts +2 -0
  152. package/dist/types/wallet/src/react/components/AccountMenuButton/index.d.ts +2 -0
  153. package/dist/types/wallet/src/react/components/AccountMenuButton/types.d.ts +1 -14
  154. package/dist/types/wallet/src/react/components/QRCodeScanner.d.ts +1 -0
  155. package/dist/types/wallet/src/react/components/QRCodeScannerCamera.d.ts +5 -0
  156. package/dist/types/wallet/src/react/index.d.ts +2 -1
  157. package/dist/workers/email_otp_runtime_bg.wasm +0 -0
  158. package/dist/workers/evm_crypto_bg.wasm +0 -0
  159. package/dist/workers/router_ab_ecdsa_client_bg.wasm +0 -0
  160. package/dist/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
  161. package/dist/workers/shamir3pass_runtime_bg.wasm +0 -0
  162. package/dist/workers/tempo_signer_bg.wasm +0 -0
  163. package/dist/workers/wallet_custody_ceremony_bg.wasm +0 -0
  164. package/dist/workers/wasm_signer_worker_bg.wasm +0 -0
  165. package/package.json +1 -1
  166. package/dist/esm/sdk/registration-Cx_f58rb.js +0 -1
  167. package/dist/esm/sdk/runtime-auth-CKUleRYA.js +0 -1
  168. package/dist/esm/sdk/sdkSentEvents-DiQ3YVlj.js +0 -1
  169. package/dist/esm/sdk/shared-CSfgTVcf.js +0 -6
  170. package/dist/public/sdk/registration-Cx_f58rb.js +0 -1
  171. package/dist/public/sdk/runtime-auth-CKUleRYA.js +0 -1
  172. package/dist/public/sdk/sdkSentEvents-DiQ3YVlj.js +0 -1
  173. package/dist/public/sdk/shared-CSfgTVcf.js +0 -6
@@ -0,0 +1,558 @@
1
+ import { Component, createRef } from "preact";
2
+ import { Fragment as Fragment$1, jsx, jsxs } from "preact/jsx-runtime";
3
+ //#region src/core/signingEngine/uiConfirm/ui/preact/RecoveryCodeBackupSurface.tsx
4
+ /** @jsxImportSource preact */
5
+ const COPIED_FLASH_MS = 1800;
6
+ function assertNever(value) {
7
+ throw new Error(`Unhandled recovery-code state: ${String(value)}`);
8
+ }
9
+ function errorMessage(error, fallback) {
10
+ return error instanceof Error && error.message.trim() ? error.message : fallback;
11
+ }
12
+ function initialViewState(experience) {
13
+ switch (experience.kind) {
14
+ case "direct_backup": return {
15
+ kind: "recovery_codes",
16
+ request: experience.request
17
+ };
18
+ case "account_menu": return {
19
+ kind: "summary",
20
+ walletId: experience.walletId,
21
+ loadState: { kind: "loading" },
22
+ actionError: null
23
+ };
24
+ default: return assertNever(experience);
25
+ }
26
+ }
27
+ function initialState(experience) {
28
+ return {
29
+ viewState: initialViewState(experience),
30
+ acknowledged: false,
31
+ statusMessage: "",
32
+ copied: false
33
+ };
34
+ }
35
+ function stageForState(state) {
36
+ switch (state.kind) {
37
+ case "summary":
38
+ case "opening":
39
+ case "recovery_codes": return state.kind;
40
+ default: return assertNever(state);
41
+ }
42
+ }
43
+ function statusLabel(status) {
44
+ switch (status.kind) {
45
+ case "ready": return status.pendingLocalBackup || status.backupOutstanding ? "Backup needed" : "Backed up";
46
+ case "no_recovery_set": return "No recovery set";
47
+ case "unauthorized": return "Authorization required";
48
+ case "transport_failed": return "Could not load";
49
+ default: return assertNever(status);
50
+ }
51
+ }
52
+ function canViewPendingRecoveryCodes(loadState) {
53
+ if (loadState.kind !== "loaded") return true;
54
+ switch (loadState.status.kind) {
55
+ case "ready": return loadState.status.pendingLocalBackup;
56
+ case "unauthorized":
57
+ case "transport_failed": return true;
58
+ case "no_recovery_set": return false;
59
+ default: return assertNever(loadState.status);
60
+ }
61
+ }
62
+ function recoveryStatusFailureMessage(loadState) {
63
+ if (loadState.kind === "error") return loadState.message;
64
+ if (loadState.kind !== "loaded") return null;
65
+ switch (loadState.status.kind) {
66
+ case "unauthorized":
67
+ case "transport_failed": return loadState.status.message;
68
+ case "ready":
69
+ case "no_recovery_set": return null;
70
+ default: return assertNever(loadState.status);
71
+ }
72
+ }
73
+ function statusValue(loadState) {
74
+ switch (loadState.kind) {
75
+ case "loading": return "Loading";
76
+ case "error": return "Could not load";
77
+ case "loaded": return statusLabel(loadState.status);
78
+ default: return assertNever(loadState);
79
+ }
80
+ }
81
+ function activeCodesDetail(loadState) {
82
+ switch (loadState.kind) {
83
+ case "loading": return "Checking your codes…";
84
+ case "error": return "Status unavailable";
85
+ case "loaded": return loadState.status.kind === "ready" ? `${loadState.status.activeCodeCount} of ${loadState.status.totalCodeCount} codes left` : "Status unavailable";
86
+ default: return assertNever(loadState);
87
+ }
88
+ }
89
+ function safeWalletId(value) {
90
+ return value.trim().replace(/[^A-Za-z0-9_.-]/g, "_") || "wallet";
91
+ }
92
+ function backupText(walletId, recoveryCodes) {
93
+ const lines = [
94
+ "Seams wallet recovery codes",
95
+ "",
96
+ `Wallet: ${walletId}`,
97
+ "",
98
+ "Save these codes somewhere private. Each code can be used once.",
99
+ ""
100
+ ];
101
+ for (const [index, code] of recoveryCodes.entries()) lines.push(`${String(index + 1).padStart(2, "0")} ${code}`);
102
+ return `${lines.join("\n")}\n`;
103
+ }
104
+ function recoveryCloseLabel(request, acknowledged) {
105
+ if (acknowledged) return "Finish backup";
106
+ if (request.continuation === "registration_may_defer") return "Back up later";
107
+ return "Close";
108
+ }
109
+ function renderRecoveryCodeItem(code, index) {
110
+ return /* @__PURE__ */ jsxs("li", {
111
+ class: "recovery-code-item",
112
+ children: [/* @__PURE__ */ jsx("span", {
113
+ class: "recovery-code-index",
114
+ children: index + 1
115
+ }), /* @__PURE__ */ jsx("span", {
116
+ class: "recovery-code-value",
117
+ children: code
118
+ })]
119
+ }, `${index}-${code}`);
120
+ }
121
+ var RecoveryCodeBackupSurface = class extends Component {
122
+ constructor(..._args) {
123
+ super(..._args);
124
+ this.state = initialState(this.props.experience);
125
+ this.root = createRef();
126
+ this.active = false;
127
+ this.loadGeneration = 0;
128
+ this.copiedResetTimer = null;
129
+ this.focusFrame = null;
130
+ this.retryStatus = () => {
131
+ const experience = this.props.experience;
132
+ if (experience.kind !== "account_menu") return;
133
+ const current = this.state.viewState;
134
+ if (current.kind !== "summary") return;
135
+ const generation = ++this.loadGeneration;
136
+ this.setState({ viewState: {
137
+ ...current,
138
+ loadState: { kind: "loading" },
139
+ actionError: null
140
+ } });
141
+ this.loadSummaryStatus(experience, generation);
142
+ };
143
+ this.openRecoveryCodes = async () => {
144
+ const experience = this.props.experience;
145
+ const current = this.state.viewState;
146
+ if (experience.kind !== "account_menu" || current.kind !== "summary") return;
147
+ const generation = this.loadGeneration;
148
+ this.setState({ viewState: {
149
+ ...current,
150
+ kind: "opening",
151
+ actionError: null
152
+ } });
153
+ try {
154
+ const request = await experience.loadPendingBackup();
155
+ if (!this.active || generation !== this.loadGeneration) return;
156
+ if (!request) {
157
+ this.setState({ viewState: {
158
+ ...current,
159
+ actionError: "Recovery codes are no longer available on this device."
160
+ } });
161
+ return;
162
+ }
163
+ this.setState({ viewState: {
164
+ kind: "recovery_codes",
165
+ request
166
+ } });
167
+ } catch (error) {
168
+ if (!this.active || generation !== this.loadGeneration) return;
169
+ this.setState({ viewState: {
170
+ ...current,
171
+ actionError: errorMessage(error, "Could not open recovery codes")
172
+ } });
173
+ }
174
+ };
175
+ this.closeSummary = () => {
176
+ this.props.onClose({ kind: "dismissed" });
177
+ };
178
+ this.closeRecoveryCodes = () => {
179
+ this.props.onClose({
180
+ kind: "recovery_codes",
181
+ acknowledged: this.state.acknowledged
182
+ });
183
+ };
184
+ this.onAcknowledgementChange = (event) => {
185
+ if (!(event.currentTarget instanceof HTMLInputElement)) return;
186
+ this.setState({ acknowledged: event.currentTarget.checked });
187
+ };
188
+ this.download = () => {
189
+ const viewState = this.state.viewState;
190
+ if (viewState.kind !== "recovery_codes") return;
191
+ const view = this.root.current?.ownerDocument.defaultView;
192
+ if (!view) return;
193
+ const { walletId, recoveryCodes } = viewState.request;
194
+ try {
195
+ const url = view.URL.createObjectURL(new view.Blob([backupText(walletId, recoveryCodes)], { type: "text/plain;charset=utf-8" }));
196
+ const anchor = view.document.createElement("a");
197
+ anchor.href = url;
198
+ anchor.download = `seams-wallet-recovery-codes-${safeWalletId(walletId)}.txt`;
199
+ try {
200
+ anchor.click();
201
+ } finally {
202
+ view.setTimeout(() => view.URL.revokeObjectURL(url), 0);
203
+ }
204
+ this.setState({ statusMessage: "Recovery codes downloaded." });
205
+ } catch {
206
+ this.setState({ statusMessage: "Unable to download the codes. Copy them or try again." });
207
+ }
208
+ };
209
+ this.copy = async () => {
210
+ const viewState = this.state.viewState;
211
+ if (viewState.kind !== "recovery_codes" || !this.active) return;
212
+ const { walletId, recoveryCodes } = viewState.request;
213
+ const generation = this.loadGeneration;
214
+ try {
215
+ await navigator.clipboard.writeText(backupText(walletId, recoveryCodes));
216
+ if (!this.active || generation !== this.loadGeneration) return;
217
+ this.setState({ statusMessage: "Recovery codes copied." });
218
+ this.flashCopied();
219
+ } catch {
220
+ if (!this.active || generation !== this.loadGeneration) return;
221
+ this.setState({ statusMessage: "Unable to copy the codes. Download them or try again." });
222
+ }
223
+ };
224
+ }
225
+ componentDidMount() {
226
+ this.active = true;
227
+ this.loadGeneration += 1;
228
+ this.notifyStage();
229
+ this.beginAccountStatus(this.props.experience, this.loadGeneration);
230
+ }
231
+ componentWillReceiveProps(nextProps) {
232
+ if (nextProps.experience === this.props.experience) return;
233
+ this.loadGeneration += 1;
234
+ this.clearFocusFrame();
235
+ this.clearCopiedFlash();
236
+ this.setState(initialState(nextProps.experience));
237
+ this.beginAccountStatus(nextProps.experience, this.loadGeneration);
238
+ }
239
+ componentDidUpdate(_previousProps, previous) {
240
+ if (stageForState(previous.viewState) !== stageForState(this.state.viewState)) this.notifyStage();
241
+ if (previous.viewState.kind !== "recovery_codes" && this.state.viewState.kind === "recovery_codes") this.focusTitleAfterRender();
242
+ }
243
+ componentWillUnmount() {
244
+ this.active = false;
245
+ this.loadGeneration += 1;
246
+ this.clearFocusFrame();
247
+ this.clearCopiedFlash();
248
+ }
249
+ render() {
250
+ const viewState = this.state.viewState;
251
+ const stage = stageForState(viewState);
252
+ const content = viewState.kind === "recovery_codes" ? this.renderRecoveryCodes(viewState.request) : this.renderSummary(viewState);
253
+ return /* @__PURE__ */ jsx("div", {
254
+ ref: this.root,
255
+ class: "seams-recovery-code-backup-viewer",
256
+ "data-seams-recovery-entry": this.props.experience.kind,
257
+ "data-seams-recovery-stage": stage,
258
+ children: content
259
+ });
260
+ }
261
+ notifyStage() {
262
+ this.props.onStageChange(stageForState(this.state.viewState));
263
+ }
264
+ beginAccountStatus(experience, generation) {
265
+ if (experience.kind !== "account_menu") return;
266
+ this.loadSummaryStatus(experience, generation);
267
+ }
268
+ async loadSummaryStatus(experience, generation) {
269
+ try {
270
+ const status = await experience.loadStatus();
271
+ this.updateSummaryLoadState(generation, {
272
+ kind: "loaded",
273
+ status
274
+ });
275
+ } catch (error) {
276
+ this.updateSummaryLoadState(generation, {
277
+ kind: "error",
278
+ message: errorMessage(error, "Could not load recovery-code status")
279
+ });
280
+ }
281
+ }
282
+ updateSummaryLoadState(generation, loadState) {
283
+ if (!this.active || generation !== this.loadGeneration) return;
284
+ const current = this.state.viewState;
285
+ if (current.kind !== "summary" && current.kind !== "opening") return;
286
+ this.setState({ viewState: {
287
+ ...current,
288
+ loadState
289
+ } });
290
+ }
291
+ flashCopied() {
292
+ const view = this.root.current?.ownerDocument.defaultView;
293
+ if (!view) return;
294
+ if (this.copiedResetTimer !== null) view.clearTimeout(this.copiedResetTimer);
295
+ this.setState({ copied: true });
296
+ this.copiedResetTimer = view.setTimeout(() => {
297
+ this.copiedResetTimer = null;
298
+ if (this.active) this.setState({ copied: false });
299
+ }, COPIED_FLASH_MS);
300
+ }
301
+ clearCopiedFlash() {
302
+ const view = this.root.current?.ownerDocument.defaultView;
303
+ if (view && this.copiedResetTimer !== null) view.clearTimeout(this.copiedResetTimer);
304
+ this.copiedResetTimer = null;
305
+ }
306
+ clearFocusFrame() {
307
+ const view = this.root.current?.ownerDocument.defaultView;
308
+ if (view && this.focusFrame !== null) view.cancelAnimationFrame(this.focusFrame);
309
+ this.focusFrame = null;
310
+ }
311
+ focusTitleAfterRender() {
312
+ const view = this.root.current?.ownerDocument.defaultView;
313
+ if (!view) return;
314
+ this.clearFocusFrame();
315
+ this.focusFrame = view.requestAnimationFrame(() => {
316
+ this.focusFrame = null;
317
+ if (this.active) this.root.current?.querySelector(".recovery-backup-title")?.focus();
318
+ });
319
+ }
320
+ renderSummary(state) {
321
+ const statusFailure = recoveryStatusFailureMessage(state.loadState);
322
+ const showViewCodesButton = canViewPendingRecoveryCodes(state.loadState);
323
+ const opening = state.kind === "opening";
324
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
325
+ /* @__PURE__ */ jsx("button", {
326
+ type: "button",
327
+ class: "recovery-summary-close",
328
+ "aria-label": "Close recovery codes",
329
+ onClick: this.closeSummary,
330
+ children: /* @__PURE__ */ jsx("svg", {
331
+ "aria-hidden": "true",
332
+ viewBox: "0 0 24 24",
333
+ fill: "none",
334
+ stroke: "currentColor",
335
+ children: /* @__PURE__ */ jsx("path", { d: "M6 6l12 12M18 6 6 18" })
336
+ })
337
+ }),
338
+ /* @__PURE__ */ jsx("h1", {
339
+ id: "seams-wallet-recovery-title",
340
+ class: "recovery-backup-title",
341
+ tabIndex: -1,
342
+ children: "Wallet recovery codes"
343
+ }),
344
+ /* @__PURE__ */ jsx("p", {
345
+ id: "seams-wallet-recovery-description",
346
+ class: "recovery-backup-description",
347
+ children: "View and save the recovery codes retained by this wallet after registration."
348
+ }),
349
+ /* @__PURE__ */ jsxs("div", {
350
+ class: "recovery-summary-body",
351
+ children: [
352
+ /* @__PURE__ */ jsx("h2", {
353
+ class: "recovery-summary-section-label",
354
+ children: "Security"
355
+ }),
356
+ /* @__PURE__ */ jsxs("div", {
357
+ class: "recovery-summary-item",
358
+ children: [
359
+ /* @__PURE__ */ jsx("span", {
360
+ class: "recovery-summary-item-icon",
361
+ "aria-hidden": "true",
362
+ children: /* @__PURE__ */ jsx(ShieldCheckIcon, {})
363
+ }),
364
+ /* @__PURE__ */ jsxs("span", {
365
+ class: "recovery-summary-item-text",
366
+ children: [/* @__PURE__ */ jsx("span", {
367
+ class: "recovery-summary-item-title",
368
+ children: "Recovery codes"
369
+ }), /* @__PURE__ */ jsx("span", {
370
+ class: "recovery-summary-item-detail",
371
+ children: activeCodesDetail(state.loadState)
372
+ })]
373
+ }),
374
+ /* @__PURE__ */ jsx("span", {
375
+ class: "recovery-summary-badge",
376
+ children: statusValue(state.loadState)
377
+ })
378
+ ]
379
+ }),
380
+ /* @__PURE__ */ jsxs("div", {
381
+ class: "recovery-summary-item",
382
+ children: [/* @__PURE__ */ jsx("span", {
383
+ class: "recovery-summary-item-icon",
384
+ "aria-hidden": "true",
385
+ children: /* @__PURE__ */ jsx(WalletIcon, {})
386
+ }), /* @__PURE__ */ jsxs("span", {
387
+ class: "recovery-summary-item-text",
388
+ children: [/* @__PURE__ */ jsx("span", {
389
+ class: "recovery-summary-item-title",
390
+ children: "Wallet"
391
+ }), /* @__PURE__ */ jsx("span", {
392
+ class: "recovery-summary-item-detail",
393
+ children: state.walletId
394
+ })]
395
+ })]
396
+ }),
397
+ showViewCodesButton && /* @__PURE__ */ jsx("button", {
398
+ type: "button",
399
+ class: "recovery-backup-button secondary recovery-summary-open",
400
+ disabled: opening,
401
+ onClick: this.openRecoveryCodes,
402
+ children: opening ? /* @__PURE__ */ jsxs(Fragment$1, { children: ["Opening recovery codes", /* @__PURE__ */ jsxs("span", {
403
+ class: "recovery-summary-ellipsis",
404
+ "aria-hidden": "true",
405
+ children: [
406
+ /* @__PURE__ */ jsx("span", { children: "." }),
407
+ /* @__PURE__ */ jsx("span", { children: "." }),
408
+ /* @__PURE__ */ jsx("span", { children: "." })
409
+ ]
410
+ })] }) : "View recovery codes"
411
+ }),
412
+ /* @__PURE__ */ jsx("p", {
413
+ class: "recovery-summary-live-status",
414
+ role: "status",
415
+ "aria-live": "polite",
416
+ children: state.loadState.kind === "loading" ? "Loading recovery-code status…" : ""
417
+ }),
418
+ statusFailure && /* @__PURE__ */ jsx("p", {
419
+ class: "recovery-summary-error",
420
+ role: "alert",
421
+ children: statusFailure
422
+ }),
423
+ state.actionError && /* @__PURE__ */ jsx("p", {
424
+ class: "recovery-summary-error",
425
+ role: "alert",
426
+ children: state.actionError
427
+ }),
428
+ state.loadState.kind === "error" && /* @__PURE__ */ jsx("button", {
429
+ type: "button",
430
+ class: "recovery-backup-button secondary",
431
+ onClick: this.retryStatus,
432
+ children: "Retry status"
433
+ })
434
+ ]
435
+ })
436
+ ] });
437
+ }
438
+ renderRecoveryCodes(request) {
439
+ const description = request.continuation === "registration_may_defer" ? "Each code can recover your wallet once. Save them now, or back them up later from Recovery Codes." : "Each code can recover your wallet once. Keep them somewhere private.";
440
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
441
+ /* @__PURE__ */ jsx("h1", {
442
+ id: "seams-wallet-recovery-title",
443
+ class: "recovery-backup-title",
444
+ tabIndex: -1,
445
+ children: "Save your recovery codes"
446
+ }),
447
+ /* @__PURE__ */ jsx("p", {
448
+ id: "seams-wallet-recovery-description",
449
+ class: "recovery-backup-description",
450
+ children: description
451
+ }),
452
+ /* @__PURE__ */ jsxs("div", {
453
+ class: "recovery-code-sheet",
454
+ children: [/* @__PURE__ */ jsxs("div", {
455
+ class: "recovery-code-sheet-heading",
456
+ children: [/* @__PURE__ */ jsx("span", { children: "Recovery codes" }), /* @__PURE__ */ jsxs("span", { children: [request.recoveryCodes.length, " single-use codes"] })]
457
+ }), /* @__PURE__ */ jsx("ol", {
458
+ class: "recovery-code-list",
459
+ children: request.recoveryCodes.map(renderRecoveryCodeItem)
460
+ })]
461
+ }),
462
+ /* @__PURE__ */ jsxs("div", {
463
+ class: "recovery-backup-actions",
464
+ children: [/* @__PURE__ */ jsx("button", {
465
+ type: "button",
466
+ class: "recovery-backup-button primary",
467
+ onClick: this.download,
468
+ children: "Download codes"
469
+ }), /* @__PURE__ */ jsxs("button", {
470
+ type: "button",
471
+ class: `recovery-backup-button secondary recovery-backup-copy${this.state.copied ? " copied" : ""}`,
472
+ onClick: this.copy,
473
+ children: [/* @__PURE__ */ jsx(CopyIcon, {}), "Copy codes"]
474
+ })]
475
+ }),
476
+ /* @__PURE__ */ jsxs("div", {
477
+ class: "recovery-backup-footer",
478
+ children: [/* @__PURE__ */ jsxs("label", {
479
+ class: "recovery-backup-acknowledgement",
480
+ children: [/* @__PURE__ */ jsx("input", {
481
+ type: "checkbox",
482
+ "data-seams-wallet-recovery-backup-acknowledgement": true,
483
+ checked: this.state.acknowledged,
484
+ onChange: this.onAcknowledgementChange
485
+ }), /* @__PURE__ */ jsxs("span", { children: ["I saved these recovery codes somewhere safe.", /* @__PURE__ */ jsx("small", { children: "They won’t be shown again after you finish." })] })]
486
+ }), /* @__PURE__ */ jsx("button", {
487
+ type: "button",
488
+ class: `recovery-backup-button ${this.state.acknowledged ? "primary" : "secondary"}`,
489
+ "data-seams-wallet-recovery-backup-close": true,
490
+ onClick: this.closeRecoveryCodes,
491
+ children: recoveryCloseLabel(request, this.state.acknowledged)
492
+ })]
493
+ }),
494
+ /* @__PURE__ */ jsx("p", {
495
+ class: "recovery-backup-status",
496
+ role: "status",
497
+ children: this.state.statusMessage
498
+ })
499
+ ] });
500
+ }
501
+ };
502
+ function ShieldCheckIcon() {
503
+ return /* @__PURE__ */ jsxs("svg", {
504
+ width: "20",
505
+ height: "20",
506
+ viewBox: "0 0 24 24",
507
+ fill: "none",
508
+ stroke: "currentColor",
509
+ children: [/* @__PURE__ */ jsx("path", { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" }), /* @__PURE__ */ jsx("path", { d: "m9 12 2 2 4-4" })]
510
+ });
511
+ }
512
+ function WalletIcon() {
513
+ return /* @__PURE__ */ jsxs("svg", {
514
+ width: "20",
515
+ height: "20",
516
+ viewBox: "0 0 24 24",
517
+ fill: "none",
518
+ stroke: "currentColor",
519
+ children: [/* @__PURE__ */ jsx("path", { d: "M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1" }), /* @__PURE__ */ jsx("path", { d: "M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4" })]
520
+ });
521
+ }
522
+ function CopyIcon() {
523
+ return /* @__PURE__ */ jsxs("span", {
524
+ class: "copy-icon",
525
+ "aria-hidden": "true",
526
+ children: [/* @__PURE__ */ jsx("span", {
527
+ class: "copy-icon-check",
528
+ children: /* @__PURE__ */ jsx("svg", {
529
+ width: "16",
530
+ height: "16",
531
+ viewBox: "0 0 24 24",
532
+ fill: "none",
533
+ stroke: "currentColor",
534
+ children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" })
535
+ })
536
+ }), /* @__PURE__ */ jsx("span", {
537
+ class: "copy-icon-copy",
538
+ children: /* @__PURE__ */ jsxs("svg", {
539
+ width: "16",
540
+ height: "16",
541
+ viewBox: "0 0 24 24",
542
+ fill: "none",
543
+ stroke: "currentColor",
544
+ children: [/* @__PURE__ */ jsx("rect", {
545
+ width: "14",
546
+ height: "14",
547
+ x: "8",
548
+ y: "8",
549
+ rx: "2"
550
+ }), /* @__PURE__ */ jsx("path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" })]
551
+ })
552
+ })]
553
+ });
554
+ }
555
+ //#endregion
556
+ export { RecoveryCodeBackupSurface };
557
+
558
+ //# sourceMappingURL=RecoveryCodeBackupSurface.js.map
@@ -0,0 +1,82 @@
1
+ import { appearanceTokenCssRule } from "../appearance-token-vars.js";
2
+ import { confirmationDocumentStyles } from "./confirmation-styles.js";
3
+ import { RecoveryCodeBackupSurface } from "./RecoveryCodeBackupSurface.js";
4
+ import { render } from "preact";
5
+ import { jsx } from "preact/jsx-runtime";
6
+ //#region src/core/signingEngine/uiConfirm/ui/preact/mountRecoveryCodeBackupSurface.tsx
7
+ /** @jsxImportSource preact */
8
+ let nextRecoverySurfaceId = 0;
9
+ var MountedRecoveryCodeBackupSurface = class {
10
+ constructor(input) {
11
+ this.state = "mounted";
12
+ this.handleCancel = (event) => {
13
+ event.preventDefault();
14
+ this.input.onCancel();
15
+ };
16
+ this.handleStageChange = (stage) => {
17
+ if (this.state === "disposed") return;
18
+ this.dialog.dataset.seamsRecoveryStage = stage;
19
+ };
20
+ this.input = input;
21
+ this.document = input.parent.ownerDocument;
22
+ this.element = this.document.createElement("div");
23
+ this.element.id = `seams-recovery-surface-${++nextRecoverySurfaceId}`;
24
+ this.element.className = "seams-wallet-ui seams-recovery-code-backup-host";
25
+ this.element.dataset.seamsRecoverySurface = input.surface;
26
+ if (input.appearance) {
27
+ this.element.dataset.theme = input.appearance.theme.mode;
28
+ confirmationDocumentStyles(this.document).setDynamicRule(this.element.id, appearanceTokenCssRule(this.element.id, input.appearance));
29
+ }
30
+ this.dialog = this.document.createElement("dialog");
31
+ this.dialog.className = "seams-host-themed-dialog";
32
+ this.dialog.tabIndex = -1;
33
+ this.dialog.setAttribute("data-seams-wallet-recovery-backup-dialog", "");
34
+ this.dialog.dataset.seamsRecoverySurface = input.surface;
35
+ this.dialog.setAttribute("aria-labelledby", "seams-wallet-recovery-title");
36
+ this.dialog.setAttribute("aria-describedby", "seams-wallet-recovery-description");
37
+ this.dialog.addEventListener("cancel", this.handleCancel);
38
+ this.element.appendChild(this.dialog);
39
+ input.parent.appendChild(this.element);
40
+ try {
41
+ this.render(input.experience);
42
+ this.dialog.showModal();
43
+ this.focusTitle();
44
+ input.onShown(this.dialog);
45
+ } catch (error) {
46
+ this.dispose();
47
+ throw error;
48
+ }
49
+ }
50
+ update(experience) {
51
+ if (this.state === "disposed") return;
52
+ this.render(experience);
53
+ }
54
+ dispose() {
55
+ if (this.state === "disposed") return;
56
+ this.state = "disposed";
57
+ this.dialog.removeEventListener("cancel", this.handleCancel);
58
+ render(null, this.dialog);
59
+ if (this.dialog.open) this.dialog.close();
60
+ confirmationDocumentStyles(this.document).deleteDynamicRule(this.element.id);
61
+ this.element.remove();
62
+ }
63
+ render(experience) {
64
+ if (this.state === "disposed") return;
65
+ this.element.dataset.seamsRecoveryEntry = experience.kind;
66
+ render(/* @__PURE__ */ jsx(RecoveryCodeBackupSurface, {
67
+ experience,
68
+ onClose: this.input.onClose,
69
+ onStageChange: this.handleStageChange
70
+ }), this.dialog);
71
+ }
72
+ focusTitle() {
73
+ this.dialog.querySelector(".recovery-backup-title")?.focus();
74
+ }
75
+ };
76
+ function mountRecoveryCodeBackupSurface(input) {
77
+ return new MountedRecoveryCodeBackupSurface(input);
78
+ }
79
+ //#endregion
80
+ export { mountRecoveryCodeBackupSurface };
81
+
82
+ //# sourceMappingURL=mountRecoveryCodeBackupSurface.js.map
@@ -134,8 +134,12 @@ let RegistrationEventPhase = /* @__PURE__ */ function(RegistrationEventPhase) {
134
134
  RegistrationEventPhase["STEP_05_ED25519_SIGNER_PROVISION_STARTED"] = "registration.signer.ed25519.provision.started";
135
135
  RegistrationEventPhase["STEP_05_ED25519_SIGNER_PROVISION_SUCCEEDED"] = "registration.signer.ed25519.provision.succeeded";
136
136
  RegistrationEventPhase["STEP_05_ED25519_SIGNER_PROVISION_SKIPPED"] = "registration.signer.ed25519.provision.skipped";
137
+ /** The custody execution has not answered after a few seconds; the request continues. */
138
+ RegistrationEventPhase["STEP_05_ED25519_SIGNER_PROVISION_DELAYED"] = "registration.signer.ed25519.provision.delayed";
137
139
  RegistrationEventPhase["STEP_06_RELAY_BOOTSTRAP_STARTED"] = "registration.relay.bootstrap.started";
138
140
  RegistrationEventPhase["STEP_06_RELAY_BOOTSTRAP_SUCCEEDED"] = "registration.relay.bootstrap.succeeded";
141
+ /** Wallet account creation has not answered after a few seconds; the request continues. */
142
+ RegistrationEventPhase["STEP_06_RELAY_BOOTSTRAP_DELAYED"] = "registration.relay.bootstrap.delayed";
139
143
  RegistrationEventPhase["STEP_07_ACCOUNT_VERIFY_STARTED"] = "registration.account.verify.started";
140
144
  RegistrationEventPhase["STEP_07_ACCOUNT_VERIFY_SUCCEEDED"] = "registration.account.verify.succeeded";
141
145
  RegistrationEventPhase["STEP_08_STORAGE_PERSIST_STARTED"] = "registration.storage.persist.started";
@@ -286,8 +290,10 @@ const WALLET_FLOW_EVENT_STEPS = {
286
290
  [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_STARTED]: 5,
287
291
  [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_SUCCEEDED]: 5,
288
292
  [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_SKIPPED]: 5,
293
+ [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_DELAYED]: 5,
289
294
  [RegistrationEventPhase.STEP_06_RELAY_BOOTSTRAP_STARTED]: 6,
290
295
  [RegistrationEventPhase.STEP_06_RELAY_BOOTSTRAP_SUCCEEDED]: 6,
296
+ [RegistrationEventPhase.STEP_06_RELAY_BOOTSTRAP_DELAYED]: 6,
291
297
  [RegistrationEventPhase.STEP_07_ACCOUNT_VERIFY_STARTED]: 7,
292
298
  [RegistrationEventPhase.STEP_07_ACCOUNT_VERIFY_SUCCEEDED]: 7,
293
299
  [RegistrationEventPhase.STEP_08_STORAGE_PERSIST_STARTED]: 8,
@@ -393,6 +399,7 @@ const WALLET_FLOW_EVENT_STEPS = {
393
399
  [KeyExportEventPhase.FAILED]: 0,
394
400
  [KeyExportEventPhase.CANCELLED]: 0
395
401
  };
402
+ const REGISTRATION_DELAYED_MESSAGE = "Taking longer than usual... waiting on the network…";
396
403
  const WALLET_FLOW_EVENT_MESSAGES = {
397
404
  [RegistrationEventPhase.STEP_01_STARTED]: "Starting registration",
398
405
  [RegistrationEventPhase.STEP_02_ACCOUNT_PREFLIGHT_STARTED]: "Checking account details",
@@ -411,8 +418,10 @@ const WALLET_FLOW_EVENT_MESSAGES = {
411
418
  [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_STARTED]: "Preparing NEAR signer",
412
419
  [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_SUCCEEDED]: "NEAR signer ready",
413
420
  [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_SKIPPED]: "NEAR signer setup skipped",
421
+ [RegistrationEventPhase.STEP_05_ED25519_SIGNER_PROVISION_DELAYED]: REGISTRATION_DELAYED_MESSAGE,
414
422
  [RegistrationEventPhase.STEP_06_RELAY_BOOTSTRAP_STARTED]: "Creating wallet account",
415
423
  [RegistrationEventPhase.STEP_06_RELAY_BOOTSTRAP_SUCCEEDED]: "Wallet account created",
424
+ [RegistrationEventPhase.STEP_06_RELAY_BOOTSTRAP_DELAYED]: REGISTRATION_DELAYED_MESSAGE,
416
425
  [RegistrationEventPhase.STEP_07_ACCOUNT_VERIFY_STARTED]: "Verifying wallet account",
417
426
  [RegistrationEventPhase.STEP_07_ACCOUNT_VERIFY_SUCCEEDED]: "Wallet account verified",
418
427
  [RegistrationEventPhase.STEP_08_STORAGE_PERSIST_STARTED]: "Saving wallet metadata",