@tatchi-xyz/sdk 0.18.0 → 0.19.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.
- package/dist/cjs/core/TatchiPasskey/emailRecovery.js +12 -28
- package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/index.js +23 -0
- package/dist/cjs/core/WebAuthnManager/index.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +12 -28
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js +23 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/emailRecovery.js +12 -28
- package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/index.js +23 -0
- package/dist/esm/core/WebAuthnManager/index.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +12 -28
- package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js +23 -0
- package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
- package/dist/esm/sdk/{createAdapters-qVGD6i0g.js → createAdapters-DIRR8_Z9.js} +1 -1
- package/dist/esm/sdk/{createAdapters-BumKM2ft.js → createAdapters-Yga6W0en.js} +2 -2
- package/dist/esm/sdk/{createAdapters-BumKM2ft.js.map → createAdapters-Yga6W0en.js.map} +1 -1
- package/dist/esm/sdk/{localOnly-pXMTqh1m.js → localOnly-BHScJasw.js} +2 -2
- package/dist/esm/sdk/{localOnly-Byi3AK7A.js → localOnly-VevCI7H0.js} +3 -3
- package/dist/esm/sdk/{localOnly-Byi3AK7A.js.map → localOnly-VevCI7H0.js.map} +1 -1
- package/dist/esm/sdk/offline-export-app.js +29 -6
- package/dist/esm/sdk/offline-export-app.js.map +1 -1
- package/dist/esm/sdk/{registration-CBiS4Ua_.js → registration-bKEg9Zr2.js} +2 -2
- package/dist/esm/sdk/{registration-CBiS4Ua_.js.map → registration-bKEg9Zr2.js.map} +1 -1
- package/dist/esm/sdk/{registration-DLPLsGCz.js → registration-lDD60Ytt.js} +1 -1
- package/dist/esm/sdk/{transactions-Bk-VavcV.js → transactions-BalIhtJ9.js} +1 -1
- package/dist/esm/sdk/{transactions-BIqKZeR0.js → transactions-bqaAwL4k.js} +2 -2
- package/dist/esm/sdk/{transactions-BIqKZeR0.js.map → transactions-bqaAwL4k.js.map} +1 -1
- package/dist/esm/sdk/wallet-iframe-host.js +41 -34
- package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +4 -1
- package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/index.d.ts +7 -0
- package/dist/types/src/core/WebAuthnManager/index.d.ts.map +1 -1
- package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
- package/package.json +1 -1
|
@@ -12,7 +12,7 @@ import { ensureDefined } from "./ensure-defined-CHInSx7l.js";
|
|
|
12
12
|
import { errorMessage, init_errors } from "./errors-D9ar28Dr.js";
|
|
13
13
|
import "./WebAuthnFallbacks-Bl4BTsNt.js";
|
|
14
14
|
import { ERROR_MESSAGES, SecureConfirmationType, createRandomVRFChallenge, getIntentDigest, getNearAccountId, init_vrf_worker, isUserCancelledSecureConfirm } from "./requestHelpers-Dh1hEYL9.js";
|
|
15
|
-
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-
|
|
15
|
+
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-DIRR8_Z9.js";
|
|
16
16
|
|
|
17
17
|
//#region src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.ts
|
|
18
18
|
init_vrf_worker();
|
|
@@ -83,7 +83,7 @@ async function handleLocalOnlyFlow(ctx, request, worker, opts) {
|
|
|
83
83
|
requestId: request.requestId,
|
|
84
84
|
intentDigest: getIntentDigest(request),
|
|
85
85
|
confirmed: false,
|
|
86
|
-
error: cancelled ? ERROR_MESSAGES.cancelled : ERROR_MESSAGES.collectCredentialsFailed
|
|
86
|
+
error: cancelled ? ERROR_MESSAGES.cancelled : errorMessage(err) || ERROR_MESSAGES.collectCredentialsFailed
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
89
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ERROR_MESSAGES, SecureConfirmationType, createRandomVRFChallenge, errorMessage, getIntentDigest, getNearAccountId, isUserCancelledSecureConfirm } from "./requestHelpers-aUKhXiEl.js";
|
|
2
2
|
import "./validation-DhPPUba7.js";
|
|
3
|
-
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-
|
|
3
|
+
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-Yga6W0en.js";
|
|
4
4
|
import { W3A_EXPORT_VIEWER_IFRAME_ID, W3A_TX_BUTTON_HOST_ID, W3A_TX_BUTTON_ID } from "./css-loader-BrMMlG4X.js";
|
|
5
5
|
import { addLitCancelListener } from "./lit-events-BKobq01K.js";
|
|
6
6
|
import "./tx-tree-themes-i3It4IYY.js";
|
|
@@ -91,7 +91,7 @@ async function handleLocalOnlyFlow(ctx, request, worker, opts) {
|
|
|
91
91
|
requestId: request.requestId,
|
|
92
92
|
intentDigest: getIntentDigest(request),
|
|
93
93
|
confirmed: false,
|
|
94
|
-
error: cancelled ? ERROR_MESSAGES.cancelled : ERROR_MESSAGES.collectCredentialsFailed
|
|
94
|
+
error: cancelled ? ERROR_MESSAGES.cancelled : errorMessage(err) || ERROR_MESSAGES.collectCredentialsFailed
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
}
|
|
@@ -99,4 +99,4 @@ async function handleLocalOnlyFlow(ctx, request, worker, opts) {
|
|
|
99
99
|
|
|
100
100
|
//#endregion
|
|
101
101
|
export { handleLocalOnlyFlow };
|
|
102
|
-
//# sourceMappingURL=localOnly-
|
|
102
|
+
//# sourceMappingURL=localOnly-VevCI7H0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localOnly-
|
|
1
|
+
{"version":3,"file":"localOnly-VevCI7H0.js","names":["TAG_LOADERS: Record<string, () => Promise<unknown>>","removeCancelListener: (() => void) | undefined","err: unknown"],"sources":["../../../src/core/WebAuthnManager/LitComponents/ensure-defined.ts","../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.ts"],"sourcesContent":["/**\n * Small utility that guarantees a custom element definition exists in the\n * current runtime before creating/using it. If the tag is not yet defined,\n * it runs the provided dynamic import loader to execute the module that calls\n * customElements.define().\n */\nexport async function ensureDefined(tag: string, loader: () => Promise<unknown>): Promise<void> {\n try {\n if (!customElements.get(tag)) {\n await loader();\n }\n } catch {\n // Best-effort; downstream calls will still throw useful errors if missing\n }\n}\n\n// Consolidated loaders for known W3A custom elements that may be used across runtimes.\n// This allows dev tooling to auto-ensure definitions for common elements when possible.\nimport { W3A_EXPORT_VIEWER_IFRAME_ID, W3A_TX_BUTTON_ID, W3A_TX_BUTTON_HOST_ID } from './tags';\n\nexport const TAG_LOADERS: Record<string, () => Promise<unknown>> = {\n [W3A_EXPORT_VIEWER_IFRAME_ID]: () => import('./ExportPrivateKey/iframe-host'),\n [W3A_TX_BUTTON_ID]: () => import('./IframeButtonWithTooltipConfirmer/iframe-host'),\n [W3A_TX_BUTTON_HOST_ID]: () => import('./IframeButtonWithTooltipConfirmer/iframe-host'),\n};\n\n/** Attempt to ensure a known W3A element by tag; returns true if a loader ran. */\nexport async function ensureKnownW3aElement(tag: string): Promise<boolean> {\n try {\n const t = (tag || '').toLowerCase();\n const loader = TAG_LOADERS[t];\n if (!loader) return false;\n await ensureDefined(t, loader);\n return true;\n } catch {\n return false;\n }\n}\n\n","import type { VrfWorkerManagerContext } from '../../';\nimport type { ConfirmationConfig } from '../../../../types/signer-worker';\nimport {\n SecureConfirmationType,\n TransactionSummary,\n LocalOnlySecureConfirmRequest,\n type ShowSecurePrivateKeyUiPayload,\n} from '../types';\nimport { VRFChallenge } from '../../../../types';\nimport { createRandomVRFChallenge } from '../../../../types/vrf-worker';\nimport { addLitCancelListener } from '../../../LitComponents/lit-events';\nimport { ensureDefined } from '../../../LitComponents/ensure-defined';\nimport { W3A_EXPORT_VIEWER_IFRAME_ID } from '../../../LitComponents/tags';\nimport type { ExportViewerIframeElement } from '../../../LitComponents/ExportPrivateKey/iframe-host';\nimport {\n getNearAccountId,\n getIntentDigest,\n isUserCancelledSecureConfirm,\n ERROR_MESSAGES,\n} from './index';\nimport { errorMessage } from '../../../../../utils/errors';\nimport { createConfirmSession } from '../adapters/session';\nimport { createConfirmTxFlowAdapters } from '../adapters/createAdapters';\n\nasync function mountExportViewer(\n payload: ShowSecurePrivateKeyUiPayload,\n confirmationConfig: ConfirmationConfig,\n): Promise<void> {\n await ensureDefined(W3A_EXPORT_VIEWER_IFRAME_ID, () => import('../../../LitComponents/ExportPrivateKey/iframe-host'));\n const host = document.createElement(W3A_EXPORT_VIEWER_IFRAME_ID) as ExportViewerIframeElement;\n host.theme = payload.theme || confirmationConfig.theme || 'dark';\n host.variant = payload.variant || ((confirmationConfig.uiMode === 'drawer') ? 'drawer' : 'modal');\n host.accountId = payload.nearAccountId;\n host.publicKey = payload.publicKey;\n host.privateKey = payload.privateKey;\n host.loading = false;\n\n window.parent?.postMessage({ type: 'WALLET_UI_OPENED' }, '*');\n document.body.appendChild(host);\n\n let removeCancelListener: (() => void) | undefined;\n removeCancelListener = addLitCancelListener(host, () => {\n window.parent?.postMessage({ type: 'WALLET_UI_CLOSED' }, '*');\n removeCancelListener?.();\n host.remove();\n }, { once: true });\n}\n\nexport async function handleLocalOnlyFlow(\n ctx: VrfWorkerManagerContext,\n request: LocalOnlySecureConfirmRequest,\n worker: Worker,\n opts: { confirmationConfig: ConfirmationConfig; transactionSummary: TransactionSummary },\n): Promise<void> {\n\n const { confirmationConfig, transactionSummary } = opts;\n const adapters = createConfirmTxFlowAdapters(ctx);\n const session = createConfirmSession({\n adapters,\n worker,\n request,\n confirmationConfig,\n transactionSummary,\n });\n const nearAccountId = getNearAccountId(request);\n\n // SHOW_SECURE_PRIVATE_KEY_UI: purely visual; keep UI open and return confirmed immediately\n if (request.type === SecureConfirmationType.SHOW_SECURE_PRIVATE_KEY_UI) {\n try {\n await mountExportViewer(request.payload as ShowSecurePrivateKeyUiPayload, confirmationConfig);\n // Keep viewer open; do not close here.\n session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: true,\n });\n return;\n } catch (err: unknown) {\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: errorMessage(err) || 'Failed to render export UI',\n });\n }\n }\n\n // DECRYPT_PRIVATE_KEY_WITH_PRF: collect an authentication credential (with PRF extension results)\n // and return it to the VRF worker; VRF worker extracts PRF outputs internally.\n if (request.type === SecureConfirmationType.DECRYPT_PRIVATE_KEY_WITH_PRF) {\n const vrfChallenge = createRandomVRFChallenge() as VRFChallenge;\n try {\n const credential = await adapters.webauthn.collectAuthenticationCredentialWithPRF({\n nearAccountId,\n vrfChallenge,\n // Offline export / local decrypt needs both PRF outputs so the VRF worker can\n // recover/derive key material without requiring a pre-existing VRF session.\n includeSecondPrfOutput: true,\n });\n // No modal to keep open; export viewer will be shown by a subsequent request.\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: true,\n credential,\n });\n\n } catch (err: unknown) {\n const cancelled = isUserCancelledSecureConfirm(err);\n if (cancelled) {\n window.parent?.postMessage({ type: 'WALLET_UI_CLOSED' }, '*');\n }\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: cancelled ? ERROR_MESSAGES.cancelled : (errorMessage(err) || ERROR_MESSAGES.collectCredentialsFailed),\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAMA,eAAsB,cAAc,KAAa,QAA+C;AAC9F,KAAI;AACF,MAAI,CAAC,eAAe,IAAI,KACtB,OAAM;SAEF;;AASV,MAAaA,cAAsD;EAChE,oCAAoC,OAAO;EAC3C,yBAAyB,OAAO;EAChC,8BAA8B,OAAO;;;;;ACCxC,eAAe,kBACb,SACA,oBACe;AACf,OAAM,cAAc,mCAAmC,OAAO;CAC9D,MAAM,OAAO,SAAS,cAAc;AACpC,MAAK,QAAQ,QAAQ,SAAS,mBAAmB,SAAS;AAC1D,MAAK,UAAU,QAAQ,YAAa,mBAAmB,WAAW,WAAY,WAAW;AACzF,MAAK,YAAY,QAAQ;AACzB,MAAK,YAAY,QAAQ;AACzB,MAAK,aAAa,QAAQ;AAC1B,MAAK,UAAU;AAEf,QAAO,QAAQ,YAAY,EAAE,MAAM,sBAAsB;AACzD,UAAS,KAAK,YAAY;CAE1B,IAAIC;AACJ,wBAAuB,qBAAqB,YAAY;AACtD,SAAO,QAAQ,YAAY,EAAE,MAAM,sBAAsB;AACzD;AACA,OAAK;IACJ,EAAE,MAAM;;AAGb,eAAsB,oBACpB,KACA,SACA,QACA,MACe;CAEf,MAAM,EAAE,oBAAoB,uBAAuB;CACnD,MAAM,WAAW,4BAA4B;CAC7C,MAAM,UAAU,qBAAqB;EACnC;EACA;EACA;EACA;EACA;;CAEF,MAAM,gBAAgB,iBAAiB;AAGvC,KAAI,QAAQ,SAAS,uBAAuB,2BAC1C,KAAI;AACF,QAAM,kBAAkB,QAAQ,SAA0C;AAE1E,UAAQ,qBAAqB;GAC3B,WAAW,QAAQ;GACnB,cAAc,gBAAgB;GAC9B,WAAW;;AAEb;UACOC,KAAc;AACrB,SAAO,QAAQ,qBAAqB;GAClC,WAAW,QAAQ;GACnB,cAAc,gBAAgB;GAC9B,WAAW;GACX,OAAO,aAAa,QAAQ;;;AAOlC,KAAI,QAAQ,SAAS,uBAAuB,8BAA8B;EACxE,MAAM,eAAe;AACrB,MAAI;GACF,MAAM,aAAa,MAAM,SAAS,SAAS,uCAAuC;IAChF;IACA;IAGA,wBAAwB;;AAG1B,UAAO,QAAQ,qBAAqB;IAClC,WAAW,QAAQ;IACnB,cAAc,gBAAgB;IAC9B,WAAW;IACX;;WAGKA,KAAc;GACrB,MAAM,YAAY,6BAA6B;AAC/C,OAAI,UACF,QAAO,QAAQ,YAAY,EAAE,MAAM,sBAAsB;AAE3D,UAAO,QAAQ,qBAAqB;IAClC,WAAW,QAAQ;IACnB,cAAc,gBAAgB;IAC9B,WAAW;IACX,OAAO,YAAY,eAAe,YAAa,aAAa,QAAQ,eAAe"}
|
|
@@ -3258,42 +3258,42 @@ async function importFlow(label, loader) {
|
|
|
3258
3258
|
}
|
|
3259
3259
|
const HANDLERS = {
|
|
3260
3260
|
[SecureConfirmationType.DECRYPT_PRIVATE_KEY_WITH_PRF]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3261
|
-
const { handleLocalOnlyFlow } = await importFlow("localOnly", () => import("./localOnly-
|
|
3261
|
+
const { handleLocalOnlyFlow } = await importFlow("localOnly", () => import("./localOnly-VevCI7H0.js"));
|
|
3262
3262
|
await handleLocalOnlyFlow(ctx, request, worker, {
|
|
3263
3263
|
confirmationConfig,
|
|
3264
3264
|
transactionSummary
|
|
3265
3265
|
});
|
|
3266
3266
|
},
|
|
3267
3267
|
[SecureConfirmationType.SHOW_SECURE_PRIVATE_KEY_UI]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3268
|
-
const { handleLocalOnlyFlow } = await importFlow("localOnly", () => import("./localOnly-
|
|
3268
|
+
const { handleLocalOnlyFlow } = await importFlow("localOnly", () => import("./localOnly-VevCI7H0.js"));
|
|
3269
3269
|
await handleLocalOnlyFlow(ctx, request, worker, {
|
|
3270
3270
|
confirmationConfig,
|
|
3271
3271
|
transactionSummary
|
|
3272
3272
|
});
|
|
3273
3273
|
},
|
|
3274
3274
|
[SecureConfirmationType.REGISTER_ACCOUNT]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3275
|
-
const { handleRegistrationFlow } = await importFlow("registration", () => import("./registration-
|
|
3275
|
+
const { handleRegistrationFlow } = await importFlow("registration", () => import("./registration-bKEg9Zr2.js"));
|
|
3276
3276
|
await handleRegistrationFlow(ctx, request, worker, {
|
|
3277
3277
|
confirmationConfig,
|
|
3278
3278
|
transactionSummary
|
|
3279
3279
|
});
|
|
3280
3280
|
},
|
|
3281
3281
|
[SecureConfirmationType.LINK_DEVICE]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3282
|
-
const { handleRegistrationFlow } = await importFlow("registration", () => import("./registration-
|
|
3282
|
+
const { handleRegistrationFlow } = await importFlow("registration", () => import("./registration-bKEg9Zr2.js"));
|
|
3283
3283
|
await handleRegistrationFlow(ctx, request, worker, {
|
|
3284
3284
|
confirmationConfig,
|
|
3285
3285
|
transactionSummary
|
|
3286
3286
|
});
|
|
3287
3287
|
},
|
|
3288
3288
|
[SecureConfirmationType.SIGN_TRANSACTION]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3289
|
-
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-
|
|
3289
|
+
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-bqaAwL4k.js"));
|
|
3290
3290
|
await handleTransactionSigningFlow(ctx, request, worker, {
|
|
3291
3291
|
confirmationConfig,
|
|
3292
3292
|
transactionSummary
|
|
3293
3293
|
});
|
|
3294
3294
|
},
|
|
3295
3295
|
[SecureConfirmationType.SIGN_NEP413_MESSAGE]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3296
|
-
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-
|
|
3296
|
+
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-bqaAwL4k.js"));
|
|
3297
3297
|
await handleTransactionSigningFlow(ctx, request, worker, {
|
|
3298
3298
|
confirmationConfig,
|
|
3299
3299
|
transactionSummary
|
|
@@ -6348,6 +6348,29 @@ var WebAuthnManager = class {
|
|
|
6348
6348
|
async extractCosePublicKey(attestationObjectBase64url) {
|
|
6349
6349
|
return await this.signerWorkerManager.extractCosePublicKey(attestationObjectBase64url);
|
|
6350
6350
|
}
|
|
6351
|
+
/**
|
|
6352
|
+
* Helper to ensure the local `lastUser` pointer is consistent with the latest DB updates.
|
|
6353
|
+
* This fixes issues where a recovery or registration might have updated the user record
|
|
6354
|
+
* but failed to update the `lastUser` pointer (e.g. due to previous bugs or interruptions),
|
|
6355
|
+
* preventing the strict `ensureCurrentPasskey` check from passing.
|
|
6356
|
+
*/
|
|
6357
|
+
async autoHealLastUserPointer(nearAccountId) {
|
|
6358
|
+
try {
|
|
6359
|
+
const lastUser = await this.getLastUser();
|
|
6360
|
+
if (lastUser && lastUser.nearAccountId === nearAccountId) {
|
|
6361
|
+
const freshest = await IndexedDBManager.clientDB.getLastDBUpdatedUser(nearAccountId);
|
|
6362
|
+
if (freshest && freshest.deviceNumber !== lastUser.deviceNumber) {
|
|
6363
|
+
console.log(`[WebAuthnManager] Auto-healing lastUser pointer from device ${lastUser.deviceNumber} to ${freshest.deviceNumber}`);
|
|
6364
|
+
await this.setLastUser(nearAccountId, freshest.deviceNumber);
|
|
6365
|
+
}
|
|
6366
|
+
} else {
|
|
6367
|
+
const freshest = await IndexedDBManager.clientDB.getLastDBUpdatedUser(nearAccountId);
|
|
6368
|
+
if (freshest) await this.setLastUser(nearAccountId, freshest.deviceNumber);
|
|
6369
|
+
}
|
|
6370
|
+
} catch (e) {
|
|
6371
|
+
console.warn("[WebAuthnManager] Auto-heal pointer failed (non-fatal):", e);
|
|
6372
|
+
}
|
|
6373
|
+
}
|
|
6351
6374
|
/** Worker-driven export: two-phase V2 (collect PRF → decrypt → show UI) */
|
|
6352
6375
|
async exportNearKeypairWithUIWorkerDriven(nearAccountId, options) {
|
|
6353
6376
|
await this.withSigningSession({
|