@tatchi-xyz/sdk 0.31.0 → 0.31.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/cjs/core/IndexedDBManager/passkeyClientDB.js +2 -2
- package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
- package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/login.js +1 -1
- package/dist/cjs/core/TatchiPasskey/login.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/registration.js +67 -56
- package/dist/cjs/core/TatchiPasskey/registration.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/index.js +3 -3
- package/dist/cjs/core/WebAuthnManager/index.js.map +1 -1
- package/dist/cjs/core/defaultConfigs.js +3 -1
- package/dist/cjs/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/react/components/AccountMenuButton/TransactionSettingsSection.js +3 -3
- package/dist/cjs/react/components/AccountMenuButton/TransactionSettingsSection.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-CRlobBrN.css → PasskeyAuthMenu-D2eRb2-S.css} +3 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2eRb2-S.css.map +1 -0
- package/dist/cjs/react/components/PasskeyAuthMenu/preload.js +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/preload.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/shell.js +52 -13
- package/dist/cjs/react/components/PasskeyAuthMenu/shell.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js +4 -2
- package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +5 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/cjs/react/index.js +1 -1
- package/dist/cjs/react/src/core/IndexedDBManager/passkeyClientDB.js +2 -2
- package/dist/cjs/react/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/cjs/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
- package/dist/cjs/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/cjs/react/src/core/TatchiPasskey/login.js +1 -1
- package/dist/cjs/react/src/core/TatchiPasskey/login.js.map +1 -1
- package/dist/cjs/react/src/core/TatchiPasskey/registration.js +67 -56
- package/dist/cjs/react/src/core/TatchiPasskey/registration.js.map +1 -1
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
- package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
- package/dist/cjs/react/src/core/WebAuthnManager/index.js +3 -3
- package/dist/cjs/react/src/core/WebAuthnManager/index.js.map +1 -1
- package/dist/cjs/react/src/core/defaultConfigs.js +3 -1
- package/dist/cjs/react/src/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/server/core/AuthService.js +49 -6
- package/dist/cjs/server/core/AuthService.js.map +1 -1
- package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/esm/core/IndexedDBManager/passkeyClientDB.js +2 -2
- package/dist/esm/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
- package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/login.js +1 -1
- package/dist/esm/core/TatchiPasskey/login.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/registration.js +67 -56
- package/dist/esm/core/TatchiPasskey/registration.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/index.js +3 -3
- package/dist/esm/core/WebAuthnManager/index.js.map +1 -1
- package/dist/esm/core/defaultConfigs.js +3 -1
- package/dist/esm/core/defaultConfigs.js.map +1 -1
- package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js +3 -3
- package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-D2VHZ04W.css → PasskeyAuthMenu-qTHAv58Z.css} +3 -1
- package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-qTHAv58Z.css.map +1 -0
- package/dist/esm/react/components/PasskeyAuthMenu/preload.js +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/preload.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/shell.js +52 -13
- package/dist/esm/react/components/PasskeyAuthMenu/shell.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js +4 -2
- package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +5 -1
- package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/esm/react/index.js +1 -1
- package/dist/esm/react/src/core/IndexedDBManager/passkeyClientDB.js +2 -2
- package/dist/esm/react/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/esm/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
- package/dist/esm/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/esm/react/src/core/TatchiPasskey/login.js +1 -1
- package/dist/esm/react/src/core/TatchiPasskey/login.js.map +1 -1
- package/dist/esm/react/src/core/TatchiPasskey/registration.js +67 -56
- package/dist/esm/react/src/core/TatchiPasskey/registration.js.map +1 -1
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
- package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
- package/dist/esm/react/src/core/WebAuthnManager/index.js +3 -3
- package/dist/esm/react/src/core/WebAuthnManager/index.js.map +1 -1
- package/dist/esm/react/src/core/defaultConfigs.js +3 -1
- package/dist/esm/react/src/core/defaultConfigs.js.map +1 -1
- package/dist/esm/react/styles/styles.css +2 -0
- package/dist/esm/sdk/{EmailRecovery-Dl8b4ONg.js → EmailRecovery-Y7rurd4B.js} +3 -3
- package/dist/esm/sdk/{EmailRecovery-v9oNO2Tc.js → EmailRecovery-lsjLWApQ.js} +1 -1
- package/dist/esm/sdk/{IndexedDBManager-B1cUvdyY.js → IndexedDBManager-CmdN7smS.js} +3 -3
- package/dist/esm/sdk/{createAdapters-Dv7ZJPf1.js → createAdapters-4c8mBiD5.js} +2 -11
- package/dist/esm/sdk/{createAdapters-Dv7ZJPf1.js.map → createAdapters-4c8mBiD5.js.map} +1 -1
- package/dist/esm/sdk/{createAdapters-1Hmc1vVC.js → createAdapters-DF32SIZa.js} +1 -10
- package/dist/esm/sdk/{defaultConfigs-BmCU1_qI.js → defaultConfigs-BQqiXif-.js} +3 -1
- package/dist/esm/sdk/{emailRecovery-4J-g9tlY.js → emailRecovery-C0LSDleV.js} +5 -5
- package/dist/esm/sdk/{getDeviceNumber-f8bfPB9U.js → getDeviceNumber-WiNzKx1x.js} +4 -2
- package/dist/esm/sdk/{getDeviceNumber-f8bfPB9U.js.map → getDeviceNumber-WiNzKx1x.js.map} +1 -1
- package/dist/esm/sdk/{linkDevice-C98klpcE.js → linkDevice-Ds1GNIDk.js} +4 -4
- package/dist/esm/sdk/{localOnly-40zxrBMm.js → localOnly-COpDBMkm.js} +2 -2
- package/dist/esm/sdk/{localOnly-40zxrBMm.js.map → localOnly-COpDBMkm.js.map} +1 -1
- package/dist/esm/sdk/{localOnly-BZPBj14l.js → localOnly-DQQuqgjJ.js} +1 -1
- package/dist/esm/sdk/{login-DnROv3eA.js → login-BKhTuGcy.js} +3 -3
- package/dist/esm/sdk/offline-export-app.js +29 -19
- package/dist/esm/sdk/offline-export-app.js.map +1 -1
- package/dist/esm/sdk/{registration-BP9M3tE1.js → registration-BR2G9tz_.js} +59 -68
- package/dist/esm/sdk/{registration-MrAOC8Ub.js → registration-R70lvG_o.js} +60 -69
- package/dist/esm/sdk/registration-R70lvG_o.js.map +1 -0
- package/dist/esm/sdk/{router-BEGGuWaB.js → router-2aGn-CTp.js} +1 -1
- package/dist/esm/sdk/{rpcCalls-CMzj_Va_.js → rpcCalls-BPI0icZG.js} +2 -2
- package/dist/esm/sdk/{rpcCalls-B44MZora.js → rpcCalls-BW3M_q3-.js} +1 -1
- package/dist/esm/sdk/{scanDevice-Cp-r-Z2T.js → scanDevice-BBSehlMx.js} +4 -4
- package/dist/esm/sdk/{syncAccount-CqWCmBVb.js → syncAccount-DEZHBiRa.js} +4 -4
- package/dist/esm/sdk/{syncAccount-Dt5jJbEB.js → syncAccount-DHKtl-xh.js} +2 -2
- package/dist/esm/sdk/{transactions-DAZrPW-6.js → transactions-Cg1TIUyK.js} +76 -77
- package/dist/esm/sdk/{transactions-CrjP8yPD.js → transactions-CxsklyCK.js} +77 -78
- package/dist/esm/sdk/transactions-CxsklyCK.js.map +1 -0
- package/dist/esm/sdk/wallet-iframe-host.js +116 -94
- package/dist/esm/server/core/AuthService.js +49 -6
- package/dist/esm/server/core/AuthService.js.map +1 -1
- package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/types/src/__tests__/setup/bootstrap.d.ts.map +1 -1
- package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts +1 -1
- package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/faucets/createAccountRelayServer.d.ts +6 -6
- package/dist/types/src/core/TatchiPasskey/faucets/createAccountRelayServer.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/registration.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.d.ts +0 -5
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/index.d.ts +1 -1
- package/dist/types/src/core/WebAuthnManager/index.d.ts.map +1 -1
- package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/preload.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
- package/dist/types/src/server/core/AuthService.d.ts.map +1 -1
- package/dist/workers/offline-export-sw.js +156 -1
- package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/workers/web3authn-signer.worker.js +1360 -2
- package/dist/workers/web3authn-vrf.worker.js +2857 -2
- package/package.json +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-CRlobBrN.css.map +0 -1
- package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2VHZ04W.css.map +0 -1
- package/dist/esm/sdk/registration-MrAOC8Ub.js.map +0 -1
- package/dist/esm/sdk/transactions-CrjP8yPD.js.map +0 -1
|
@@ -13,7 +13,7 @@ import { toError } from "./errors-DevlT39D.js";
|
|
|
13
13
|
import { isSerializedRegistrationCredential, serializeRegistrationCredentialWithPRF } from "./safari-fallbacks-BcMFntiP.js";
|
|
14
14
|
import "./touchIdPrompt-JPhrOx8o.js";
|
|
15
15
|
import { ERROR_MESSAGES, getIntentDigest, getNearAccountId, getRegisterAccountPayload, isUserCancelledSecureConfirm } from "./collectAuthenticationCredentialForVrfChallenge-DqzPzwvU.js";
|
|
16
|
-
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-
|
|
16
|
+
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-DF32SIZa.js";
|
|
17
17
|
|
|
18
18
|
//#region src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.ts
|
|
19
19
|
async function handleRegistrationFlow(ctx, request, worker, opts) {
|
|
@@ -27,78 +27,70 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
|
|
|
27
27
|
transactionSummary
|
|
28
28
|
});
|
|
29
29
|
const nearAccountId = getNearAccountId(request);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const nearRpc = await adapters.near.fetchNearContext({
|
|
38
|
-
nearAccountId,
|
|
39
|
-
txCount: 1,
|
|
40
|
-
reserveNonces: true
|
|
41
|
-
});
|
|
42
|
-
if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
|
|
43
|
-
requestId: request.requestId,
|
|
44
|
-
intentDigest: getIntentDigest(request),
|
|
45
|
-
confirmed: false,
|
|
46
|
-
error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
|
|
47
|
-
});
|
|
48
|
-
const transactionContext = nearRpc.transactionContext;
|
|
49
|
-
session.setReservedNonces(nearRpc.reservedNonces);
|
|
50
|
-
const computeBoundIntentDigestB64u = async () => {
|
|
51
|
-
const uiIntentDigest = getIntentDigest(request);
|
|
52
|
-
if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
|
|
53
|
-
return sha256Base64UrlUtf8(uiIntentDigest);
|
|
54
|
-
};
|
|
55
|
-
const rpId = adapters.vrf.getRpId();
|
|
56
|
-
const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
|
|
57
|
-
const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
|
|
58
|
-
vrfInputData: {
|
|
59
|
-
userId: nearAccountId,
|
|
60
|
-
rpId,
|
|
61
|
-
blockHeight: transactionContext.txBlockHeight,
|
|
62
|
-
blockHash: transactionContext.txBlockHash,
|
|
63
|
-
intentDigest: boundIntentDigestB64u
|
|
64
|
-
},
|
|
65
|
-
saveInMemory: true,
|
|
66
|
-
sessionId: request.requestId
|
|
67
|
-
});
|
|
68
|
-
let uiVrfChallenge = bootstrap.vrfChallenge;
|
|
69
|
-
console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
|
|
70
|
-
const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
|
|
71
|
-
if (!confirmed) {
|
|
72
|
-
console.debug("[RegistrationFlow] user cancelled");
|
|
73
|
-
return session.confirmAndCloseModal({
|
|
30
|
+
try {
|
|
31
|
+
const nearRpc = await adapters.near.fetchNearContext({
|
|
32
|
+
nearAccountId,
|
|
33
|
+
txCount: 1,
|
|
34
|
+
reserveNonces: true
|
|
35
|
+
});
|
|
36
|
+
if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
|
|
74
37
|
requestId: request.requestId,
|
|
75
38
|
intentDigest: getIntentDigest(request),
|
|
76
39
|
confirmed: false,
|
|
77
|
-
error:
|
|
40
|
+
error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
|
|
78
41
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
42
|
+
const transactionContext = nearRpc.transactionContext;
|
|
43
|
+
session.setReservedNonces(nearRpc.reservedNonces);
|
|
44
|
+
const computeBoundIntentDigestB64u = async () => {
|
|
45
|
+
const uiIntentDigest = getIntentDigest(request);
|
|
46
|
+
if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
|
|
47
|
+
return sha256Base64UrlUtf8(uiIntentDigest);
|
|
48
|
+
};
|
|
49
|
+
const rpId = adapters.vrf.getRpId();
|
|
50
|
+
const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
|
|
51
|
+
const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
|
|
52
|
+
vrfInputData: {
|
|
53
|
+
userId: nearAccountId,
|
|
54
|
+
rpId,
|
|
55
|
+
blockHeight: transactionContext.txBlockHeight,
|
|
56
|
+
blockHash: transactionContext.txBlockHash,
|
|
57
|
+
intentDigest: boundIntentDigestB64u
|
|
58
|
+
},
|
|
59
|
+
saveInMemory: true,
|
|
60
|
+
sessionId: request.requestId
|
|
96
61
|
});
|
|
97
|
-
|
|
98
|
-
|
|
62
|
+
let uiVrfChallenge = bootstrap.vrfChallenge;
|
|
63
|
+
console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
|
|
64
|
+
const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
|
|
65
|
+
if (!confirmed) {
|
|
66
|
+
console.debug("[RegistrationFlow] user cancelled");
|
|
67
|
+
return session.confirmAndCloseModal({
|
|
68
|
+
requestId: request.requestId,
|
|
69
|
+
intentDigest: getIntentDigest(request),
|
|
70
|
+
confirmed: false,
|
|
71
|
+
error: uiError
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
|
|
76
|
+
uiVrfChallenge = refreshed.vrfChallenge;
|
|
77
|
+
session.updateUI({ vrfChallenge: uiVrfChallenge });
|
|
78
|
+
console.debug("[RegistrationFlow] VRF JIT refresh ok", { blockHeight: uiVrfChallenge.blockHeight });
|
|
79
|
+
} catch (e) {
|
|
80
|
+
console.debug("[RegistrationFlow] VRF JIT refresh skipped", e);
|
|
81
|
+
}
|
|
82
|
+
let credential;
|
|
83
|
+
let deviceNumber = request.payload?.deviceNumber ?? 1;
|
|
84
|
+
const tryCreate = async (dn) => {
|
|
85
|
+
console.debug("[RegistrationFlow] navigator.credentials.create start", { deviceNumber: dn });
|
|
86
|
+
return await adapters.webauthn.createRegistrationCredential({
|
|
87
|
+
nearAccountId,
|
|
88
|
+
challenge: uiVrfChallenge,
|
|
89
|
+
deviceNumber: dn
|
|
90
|
+
});
|
|
91
|
+
};
|
|
99
92
|
try {
|
|
100
93
|
credential = await tryCreate(deviceNumber);
|
|
101
|
-
console.debug("[RegistrationFlow] credentials.create ok");
|
|
102
94
|
} catch (e) {
|
|
103
95
|
const err = toError(e);
|
|
104
96
|
const name = String(err?.name || "");
|
|
@@ -149,14 +141,13 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
|
|
|
149
141
|
} catch (err) {
|
|
150
142
|
const cancelled = isUserCancelledSecureConfirm(err);
|
|
151
143
|
const msg = String(toError(err)?.message || err || "");
|
|
152
|
-
if (/Missing PRF result/i.test(msg) || /Missing PRF results/i.test(msg)) return session.cleanupAndRethrow(err);
|
|
153
144
|
if (cancelled) window.parent?.postMessage({ type: "WALLET_UI_CLOSED" }, "*");
|
|
154
145
|
const isPrfBrowserUnsupported = /WebAuthn PRF output is missing from navigator\.credentials\.create\(\)/i.test(msg) || /does not fully support the WebAuthn PRF extension during registration/i.test(msg) || /roaming hardware authenticators .* not supported in this flow/i.test(msg);
|
|
155
146
|
return session.confirmAndCloseModal({
|
|
156
147
|
requestId: request.requestId,
|
|
157
148
|
intentDigest: getIntentDigest(request),
|
|
158
149
|
confirmed: false,
|
|
159
|
-
error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : ERROR_MESSAGES.collectCredentialsFailed
|
|
150
|
+
error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : msg || ERROR_MESSAGES.collectCredentialsFailed
|
|
160
151
|
});
|
|
161
152
|
}
|
|
162
153
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "./validation-hUZgySTx.js";
|
|
2
2
|
import { ERROR_MESSAGES, getIntentDigest, getNearAccountId, getRegisterAccountPayload, isSerializedRegistrationCredential, isUserCancelledSecureConfirm, serializeRegistrationCredentialWithPRF, sha256Base64UrlUtf8, toError } from "./collectAuthenticationCredentialForVrfChallenge-C9p90e5Z.js";
|
|
3
|
-
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-
|
|
3
|
+
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-4c8mBiD5.js";
|
|
4
4
|
import "./css-loader-DWW-_Vli.js";
|
|
5
5
|
|
|
6
6
|
//#region src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.ts
|
|
@@ -15,78 +15,70 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
|
|
|
15
15
|
transactionSummary
|
|
16
16
|
});
|
|
17
17
|
const nearAccountId = getNearAccountId(request);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const nearRpc = await adapters.near.fetchNearContext({
|
|
26
|
-
nearAccountId,
|
|
27
|
-
txCount: 1,
|
|
28
|
-
reserveNonces: true
|
|
29
|
-
});
|
|
30
|
-
if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
|
|
31
|
-
requestId: request.requestId,
|
|
32
|
-
intentDigest: getIntentDigest(request),
|
|
33
|
-
confirmed: false,
|
|
34
|
-
error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
|
|
35
|
-
});
|
|
36
|
-
const transactionContext = nearRpc.transactionContext;
|
|
37
|
-
session.setReservedNonces(nearRpc.reservedNonces);
|
|
38
|
-
const computeBoundIntentDigestB64u = async () => {
|
|
39
|
-
const uiIntentDigest = getIntentDigest(request);
|
|
40
|
-
if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
|
|
41
|
-
return sha256Base64UrlUtf8(uiIntentDigest);
|
|
42
|
-
};
|
|
43
|
-
const rpId = adapters.vrf.getRpId();
|
|
44
|
-
const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
|
|
45
|
-
const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
|
|
46
|
-
vrfInputData: {
|
|
47
|
-
userId: nearAccountId,
|
|
48
|
-
rpId,
|
|
49
|
-
blockHeight: transactionContext.txBlockHeight,
|
|
50
|
-
blockHash: transactionContext.txBlockHash,
|
|
51
|
-
intentDigest: boundIntentDigestB64u
|
|
52
|
-
},
|
|
53
|
-
saveInMemory: true,
|
|
54
|
-
sessionId: request.requestId
|
|
55
|
-
});
|
|
56
|
-
let uiVrfChallenge = bootstrap.vrfChallenge;
|
|
57
|
-
console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
|
|
58
|
-
const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
|
|
59
|
-
if (!confirmed) {
|
|
60
|
-
console.debug("[RegistrationFlow] user cancelled");
|
|
61
|
-
return session.confirmAndCloseModal({
|
|
18
|
+
try {
|
|
19
|
+
const nearRpc = await adapters.near.fetchNearContext({
|
|
20
|
+
nearAccountId,
|
|
21
|
+
txCount: 1,
|
|
22
|
+
reserveNonces: true
|
|
23
|
+
});
|
|
24
|
+
if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
|
|
62
25
|
requestId: request.requestId,
|
|
63
26
|
intentDigest: getIntentDigest(request),
|
|
64
27
|
confirmed: false,
|
|
65
|
-
error:
|
|
28
|
+
error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
|
|
66
29
|
});
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
30
|
+
const transactionContext = nearRpc.transactionContext;
|
|
31
|
+
session.setReservedNonces(nearRpc.reservedNonces);
|
|
32
|
+
const computeBoundIntentDigestB64u = async () => {
|
|
33
|
+
const uiIntentDigest = getIntentDigest(request);
|
|
34
|
+
if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
|
|
35
|
+
return sha256Base64UrlUtf8(uiIntentDigest);
|
|
36
|
+
};
|
|
37
|
+
const rpId = adapters.vrf.getRpId();
|
|
38
|
+
const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
|
|
39
|
+
const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
|
|
40
|
+
vrfInputData: {
|
|
41
|
+
userId: nearAccountId,
|
|
42
|
+
rpId,
|
|
43
|
+
blockHeight: transactionContext.txBlockHeight,
|
|
44
|
+
blockHash: transactionContext.txBlockHash,
|
|
45
|
+
intentDigest: boundIntentDigestB64u
|
|
46
|
+
},
|
|
47
|
+
saveInMemory: true,
|
|
48
|
+
sessionId: request.requestId
|
|
84
49
|
});
|
|
85
|
-
|
|
86
|
-
|
|
50
|
+
let uiVrfChallenge = bootstrap.vrfChallenge;
|
|
51
|
+
console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
|
|
52
|
+
const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
|
|
53
|
+
if (!confirmed) {
|
|
54
|
+
console.debug("[RegistrationFlow] user cancelled");
|
|
55
|
+
return session.confirmAndCloseModal({
|
|
56
|
+
requestId: request.requestId,
|
|
57
|
+
intentDigest: getIntentDigest(request),
|
|
58
|
+
confirmed: false,
|
|
59
|
+
error: uiError
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
|
|
64
|
+
uiVrfChallenge = refreshed.vrfChallenge;
|
|
65
|
+
session.updateUI({ vrfChallenge: uiVrfChallenge });
|
|
66
|
+
console.debug("[RegistrationFlow] VRF JIT refresh ok", { blockHeight: uiVrfChallenge.blockHeight });
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.debug("[RegistrationFlow] VRF JIT refresh skipped", e);
|
|
69
|
+
}
|
|
70
|
+
let credential;
|
|
71
|
+
let deviceNumber = request.payload?.deviceNumber ?? 1;
|
|
72
|
+
const tryCreate = async (dn) => {
|
|
73
|
+
console.debug("[RegistrationFlow] navigator.credentials.create start", { deviceNumber: dn });
|
|
74
|
+
return await adapters.webauthn.createRegistrationCredential({
|
|
75
|
+
nearAccountId,
|
|
76
|
+
challenge: uiVrfChallenge,
|
|
77
|
+
deviceNumber: dn
|
|
78
|
+
});
|
|
79
|
+
};
|
|
87
80
|
try {
|
|
88
81
|
credential = await tryCreate(deviceNumber);
|
|
89
|
-
console.debug("[RegistrationFlow] credentials.create ok");
|
|
90
82
|
} catch (e) {
|
|
91
83
|
const err = toError(e);
|
|
92
84
|
const name = String(err?.name || "");
|
|
@@ -137,18 +129,17 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
|
|
|
137
129
|
} catch (err) {
|
|
138
130
|
const cancelled = isUserCancelledSecureConfirm(err);
|
|
139
131
|
const msg = String(toError(err)?.message || err || "");
|
|
140
|
-
if (/Missing PRF result/i.test(msg) || /Missing PRF results/i.test(msg)) return session.cleanupAndRethrow(err);
|
|
141
132
|
if (cancelled) window.parent?.postMessage({ type: "WALLET_UI_CLOSED" }, "*");
|
|
142
133
|
const isPrfBrowserUnsupported = /WebAuthn PRF output is missing from navigator\.credentials\.create\(\)/i.test(msg) || /does not fully support the WebAuthn PRF extension during registration/i.test(msg) || /roaming hardware authenticators .* not supported in this flow/i.test(msg);
|
|
143
134
|
return session.confirmAndCloseModal({
|
|
144
135
|
requestId: request.requestId,
|
|
145
136
|
intentDigest: getIntentDigest(request),
|
|
146
137
|
confirmed: false,
|
|
147
|
-
error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : ERROR_MESSAGES.collectCredentialsFailed
|
|
138
|
+
error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : msg || ERROR_MESSAGES.collectCredentialsFailed
|
|
148
139
|
});
|
|
149
140
|
}
|
|
150
141
|
}
|
|
151
142
|
|
|
152
143
|
//#endregion
|
|
153
144
|
export { handleRegistrationFlow };
|
|
154
|
-
//# sourceMappingURL=registration-
|
|
145
|
+
//# sourceMappingURL=registration-R70lvG_o.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-R70lvG_o.js","names":["uiVrfChallenge: VRFChallenge","credential: PublicKeyCredential | undefined","e: unknown","serialized: WebAuthnRegistrationCredential","err: unknown"],"sources":["../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.ts"],"sourcesContent":["import type { VrfWorkerManagerContext } from '../../';\nimport type { ConfirmationConfig } from '../../../../types/signer-worker';\nimport {\n TransactionSummary,\n RegistrationSecureConfirmRequest,\n} from '../types';\nimport { VRFChallenge, TransactionContext } from '../../../../types';\nimport type { WebAuthnRegistrationCredential } from '../../../../types/webauthn';\nimport { sha256Base64UrlUtf8 } from '../../../../digests/intentDigest';\nimport {\n getNearAccountId,\n getIntentDigest,\n isUserCancelledSecureConfirm,\n ERROR_MESSAGES,\n getRegisterAccountPayload,\n} from './index';\nimport { isSerializedRegistrationCredential, serializeRegistrationCredentialWithPRF } from '../../../credentialsHelpers';\nimport { toError } from '../../../../../utils/errors';\nimport { createConfirmSession } from '../adapters/session';\nimport { createConfirmTxFlowAdapters } from '../adapters/createAdapters';\n\nexport async function handleRegistrationFlow(\n ctx: VrfWorkerManagerContext,\n request: RegistrationSecureConfirmRequest,\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 try {\n // 1) NEAR context\n const nearRpc = await adapters.near.fetchNearContext({ nearAccountId, txCount: 1, reserveNonces: true });\n if (nearRpc.error && !nearRpc.transactionContext) {\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`,\n });\n }\n const transactionContext = nearRpc.transactionContext as TransactionContext;\n session.setReservedNonces(nearRpc.reservedNonces);\n\n const computeBoundIntentDigestB64u = async (): Promise<string> => {\n const uiIntentDigest = getIntentDigest(request);\n if (!uiIntentDigest) {\n throw new Error('Missing intentDigest for registration flow');\n }\n return sha256Base64UrlUtf8(uiIntentDigest);\n };\n\n // 2) Initial VRF challenge via bootstrap\n const rpId = adapters.vrf.getRpId();\n const boundIntentDigestB64u = await computeBoundIntentDigestB64u();\n const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({\n vrfInputData: {\n userId: nearAccountId,\n rpId,\n blockHeight: transactionContext.txBlockHeight,\n blockHash: transactionContext.txBlockHash,\n intentDigest: boundIntentDigestB64u,\n },\n saveInMemory: true,\n sessionId: request.requestId,\n });\n let uiVrfChallenge: VRFChallenge = bootstrap.vrfChallenge;\n console.debug('[RegistrationFlow] VRF bootstrap ok', { blockHeight: uiVrfChallenge.blockHeight });\n\n // 3) UI confirm\n const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });\n if (!confirmed) {\n console.debug('[RegistrationFlow] user cancelled');\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: uiError,\n });\n }\n\n // 4) JIT refresh VRF (best-effort)\n try {\n const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);\n uiVrfChallenge = refreshed.vrfChallenge;\n session.updateUI({ vrfChallenge: uiVrfChallenge });\n console.debug('[RegistrationFlow] VRF JIT refresh ok', { blockHeight: uiVrfChallenge.blockHeight });\n } catch (e) {\n console.debug('[RegistrationFlow] VRF JIT refresh skipped', e);\n }\n\n // 5) Collect registration credentials (with duplicate retry)\n let credential: PublicKeyCredential | undefined;\n let deviceNumber = request.payload?.deviceNumber ?? 1;\n\n const tryCreate = async (dn?: number): Promise<PublicKeyCredential> => {\n console.debug('[RegistrationFlow] navigator.credentials.create start', { deviceNumber: dn });\n return await adapters.webauthn.createRegistrationCredential({\n nearAccountId,\n challenge: uiVrfChallenge,\n deviceNumber: dn,\n });\n };\n\n try {\n credential = await tryCreate(deviceNumber);\n } catch (e: unknown) {\n\n const err = toError(e);\n const name = String(err?.name || '');\n const msg = String(err?.message || '');\n const isDuplicate = name === 'InvalidStateError' || /excluded|already\\s*registered/i.test(msg);\n\n if (isDuplicate) {\n const nextDeviceNumber = (deviceNumber !== undefined && Number.isFinite(deviceNumber)) ? (deviceNumber + 1) : 2;\n console.debug('[RegistrationFlow] duplicate credential, retry with next deviceNumber', { nextDeviceNumber });\n // Keep request payload and intentDigest in sync with the deviceNumber retry.\n deviceNumber = nextDeviceNumber;\n getRegisterAccountPayload(request).deviceNumber = nextDeviceNumber;\n request.intentDigest = request.type === 'registerAccount'\n ? `register:${nearAccountId}:${nextDeviceNumber}`\n : `device2-register:${nearAccountId}:${nextDeviceNumber}`;\n\n // Regenerate a VRF challenge bound to the updated intentDigest so the contract-side\n // VRF input derivation remains consistent end-to-end.\n const retryBoundIntentDigestB64u = await computeBoundIntentDigestB64u();\n const retryBootstrap = await adapters.vrf.generateVrfKeypairBootstrap({\n vrfInputData: {\n userId: nearAccountId,\n rpId,\n blockHeight: transactionContext.txBlockHeight,\n blockHash: transactionContext.txBlockHash,\n intentDigest: retryBoundIntentDigestB64u,\n },\n saveInMemory: true,\n sessionId: request.requestId,\n });\n uiVrfChallenge = retryBootstrap.vrfChallenge;\n session.updateUI({ vrfChallenge: uiVrfChallenge });\n\n credential = await tryCreate(nextDeviceNumber);\n } else {\n console.error('[RegistrationFlow] credentials.create failed (non-duplicate)', { name, msg });\n throw err;\n }\n }\n\n // We require registration credentials to include dual PRF outputs (first + second)\n // so VRF/NEAR key derivation can happen inside the workers without passing PRF outputs\n // as separate main-thread values.\n const serialized: WebAuthnRegistrationCredential = isSerializedRegistrationCredential(credential)\n ? (credential as unknown as WebAuthnRegistrationCredential)\n : serializeRegistrationCredentialWithPRF({\n credential: credential! as PublicKeyCredential,\n firstPrfOutput: true,\n secondPrfOutput: true,\n });\n\n // 6) Respond + close\n session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: true,\n credential: serialized,\n // PRF outputs are embedded in serialized credential; VRF worker extracts and sends via MessagePort\n vrfChallenge: uiVrfChallenge,\n transactionContext,\n });\n } catch (err: unknown) {\n\n const cancelled = isUserCancelledSecureConfirm(err);\n const msg = String((toError(err))?.message || err || '');\n if (cancelled) {\n window.parent?.postMessage({ type: 'WALLET_UI_CLOSED' }, '*');\n }\n\n const isPrfBrowserUnsupported =\n /WebAuthn PRF output is missing from navigator\\.credentials\\.create\\(\\)/i.test(msg)\n || /does not fully support the WebAuthn PRF extension during registration/i.test(msg)\n || /roaming hardware authenticators .* not supported in this flow/i.test(msg);\n\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: cancelled\n ? ERROR_MESSAGES.cancelled\n : (isPrfBrowserUnsupported ? msg : (msg || ERROR_MESSAGES.collectCredentialsFailed)),\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import "./base64-dqpWgddX.js";
|
|
|
5
5
|
import { ActionPhase, DeviceLinkingPhase, EmailRecoveryPhase, LoginPhase, RegistrationPhase, SyncAccountPhase } from "./sdkSentEvents-CzAZBFjP.js";
|
|
6
6
|
import { toError } from "./errors-DevlT39D.js";
|
|
7
7
|
import { SignedTransaction, openOfflineExportWindow } from "./overlay-Ci2FOQKE.js";
|
|
8
|
-
import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-
|
|
8
|
+
import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-BQqiXif-.js";
|
|
9
9
|
import { WebAuthnBridgeMessage, serializeAuthenticationCredentialWithPRF, serializeRegistrationCredentialWithPRF } from "./safari-fallbacks-BcMFntiP.js";
|
|
10
10
|
|
|
11
11
|
//#region src/core/WalletIframe/client/on-events-progress-bus.ts
|
|
@@ -6,7 +6,7 @@ import "./base64-dqpWgddX.js";
|
|
|
6
6
|
import "./vrf-worker-BzQsJ5BW.js";
|
|
7
7
|
import "./sdkSentEvents-CzAZBFjP.js";
|
|
8
8
|
import "./errors-DevlT39D.js";
|
|
9
|
-
import "./defaultConfigs-
|
|
10
|
-
import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getAuthenticatorsByUser, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getEmailRecoveryAttempt, getRecoveryEmailHashesContractCall, hasAccessKey, syncAuthenticatorsContractCall, thresholdEd25519Keygen, thresholdEd25519KeygenFromRegistrationTx, verifyAuthenticationResponse, waitForAccessKeyAbsent } from "./rpcCalls-
|
|
9
|
+
import "./defaultConfigs-BQqiXif-.js";
|
|
10
|
+
import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getAuthenticatorsByUser, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getEmailRecoveryAttempt, getRecoveryEmailHashesContractCall, hasAccessKey, syncAuthenticatorsContractCall, thresholdEd25519Keygen, thresholdEd25519KeygenFromRegistrationTx, verifyAuthenticationResponse, waitForAccessKeyAbsent } from "./rpcCalls-BW3M_q3-.js";
|
|
11
11
|
|
|
12
12
|
export { buildSetRecoveryEmailsActions, getRecoveryEmailHashesContractCall };
|
|
@@ -5,7 +5,7 @@ import { base64UrlDecode, base64UrlEncode } from "./base64-dqpWgddX.js";
|
|
|
5
5
|
import { createRandomVRFChallenge } from "./vrf-worker-BzQsJ5BW.js";
|
|
6
6
|
import { ActionPhase, DeviceLinkingPhase, DeviceLinkingStatus } from "./sdkSentEvents-CzAZBFjP.js";
|
|
7
7
|
import { errorMessage } from "./errors-DevlT39D.js";
|
|
8
|
-
import { DEFAULT_EMAIL_RECOVERY_CONTRACTS } from "./defaultConfigs-
|
|
8
|
+
import { DEFAULT_EMAIL_RECOVERY_CONTRACTS } from "./defaultConfigs-BQqiXif-.js";
|
|
9
9
|
|
|
10
10
|
//#region src/core/rpcCalls.ts
|
|
11
11
|
function normalizeByteArray(input) {
|
|
@@ -3,18 +3,18 @@ import "./actions-fHadejPs.js";
|
|
|
3
3
|
import "./rpc-Dq3ioE9T.js";
|
|
4
4
|
import "./signer-worker-DK847sXj.js";
|
|
5
5
|
import "./base64-dqpWgddX.js";
|
|
6
|
-
import { getLoginSession } from "./login-
|
|
6
|
+
import { getLoginSession } from "./login-BKhTuGcy.js";
|
|
7
7
|
import "./vrf-worker-BzQsJ5BW.js";
|
|
8
8
|
import { DeviceLinkingPhase, DeviceLinkingStatus } from "./sdkSentEvents-CzAZBFjP.js";
|
|
9
9
|
import { DEVICE_LINKING_CONFIG, DeviceLinkingError, DeviceLinkingErrorCode } from "./config-BbNXtVtu.js";
|
|
10
10
|
import "./accountIds-DVDhXwVA.js";
|
|
11
11
|
import "./intentDigest-yivVENNK.js";
|
|
12
12
|
import "./errors-DevlT39D.js";
|
|
13
|
-
import "./IndexedDBManager-
|
|
14
|
-
import "./defaultConfigs-
|
|
13
|
+
import "./IndexedDBManager-CmdN7smS.js";
|
|
14
|
+
import "./defaultConfigs-BQqiXif-.js";
|
|
15
15
|
import "./safari-fallbacks-BcMFntiP.js";
|
|
16
16
|
import "./touchIdPrompt-JPhrOx8o.js";
|
|
17
|
-
import { executeDeviceLinkingContractCalls } from "./rpcCalls-
|
|
17
|
+
import { executeDeviceLinkingContractCalls } from "./rpcCalls-BW3M_q3-.js";
|
|
18
18
|
import "./getDeviceNumber-y3mMtky6.js";
|
|
19
19
|
|
|
20
20
|
//#region src/core/TatchiPasskey/scanDevice.ts
|
|
@@ -7,10 +7,10 @@ import "./vrf-worker-BzQsJ5BW.js";
|
|
|
7
7
|
import "./sdkSentEvents-CzAZBFjP.js";
|
|
8
8
|
import "./accountIds-DVDhXwVA.js";
|
|
9
9
|
import "./errors-DevlT39D.js";
|
|
10
|
-
import "./IndexedDBManager-
|
|
11
|
-
import "./defaultConfigs-
|
|
12
|
-
import "./rpcCalls-
|
|
10
|
+
import "./IndexedDBManager-CmdN7smS.js";
|
|
11
|
+
import "./defaultConfigs-BQqiXif-.js";
|
|
12
|
+
import "./rpcCalls-BW3M_q3-.js";
|
|
13
13
|
import "./getDeviceNumber-y3mMtky6.js";
|
|
14
|
-
import { SyncAccountFlow, syncAccount } from "./syncAccount-
|
|
14
|
+
import { SyncAccountFlow, syncAccount } from "./syncAccount-DHKtl-xh.js";
|
|
15
15
|
|
|
16
16
|
export { SyncAccountFlow };
|
|
@@ -3,8 +3,8 @@ import { base64UrlDecode } from "./base64-dqpWgddX.js";
|
|
|
3
3
|
import { createRandomVRFChallenge } from "./vrf-worker-BzQsJ5BW.js";
|
|
4
4
|
import { SyncAccountPhase, SyncAccountStatus } from "./sdkSentEvents-CzAZBFjP.js";
|
|
5
5
|
import { toAccountId } from "./accountIds-DVDhXwVA.js";
|
|
6
|
-
import { IndexedDBManager, buildThresholdEd25519Participants2pV1 } from "./IndexedDBManager-
|
|
7
|
-
import { getCredentialIdsContractCall, hasAccessKey, syncAuthenticatorsContractCall } from "./rpcCalls-
|
|
6
|
+
import { IndexedDBManager, buildThresholdEd25519Participants2pV1 } from "./IndexedDBManager-CmdN7smS.js";
|
|
7
|
+
import { getCredentialIdsContractCall, hasAccessKey, syncAuthenticatorsContractCall } from "./rpcCalls-BW3M_q3-.js";
|
|
8
8
|
import { parseDeviceNumber } from "./getDeviceNumber-y3mMtky6.js";
|
|
9
9
|
|
|
10
10
|
//#region src/core/WebAuthnManager/userHandle.ts
|
|
@@ -11,12 +11,12 @@ import "./tags-ByzxP7Cc.js";
|
|
|
11
11
|
import "./lit-events-Bb4tAEO2.js";
|
|
12
12
|
import "./tx-confirmer-wrapper-DWKpXTUW.js";
|
|
13
13
|
import { toError } from "./errors-DevlT39D.js";
|
|
14
|
-
import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-
|
|
14
|
+
import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-BQqiXif-.js";
|
|
15
15
|
import "./safari-fallbacks-BcMFntiP.js";
|
|
16
16
|
import "./touchIdPrompt-JPhrOx8o.js";
|
|
17
17
|
import { getLastLoggedInDeviceNumber } from "./getDeviceNumber-y3mMtky6.js";
|
|
18
18
|
import { ERROR_MESSAGES, SecureConfirmationType, getIntentDigest, getNearAccountId, getSignTransactionPayload, getTxCount, isUserCancelledSecureConfirm } from "./collectAuthenticationCredentialForVrfChallenge-DqzPzwvU.js";
|
|
19
|
-
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-
|
|
19
|
+
import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-DF32SIZa.js";
|
|
20
20
|
|
|
21
21
|
//#region src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.ts
|
|
22
22
|
function getSigningAuthMode(request) {
|
|
@@ -35,91 +35,91 @@ async function handleTransactionSigningFlow(ctx, request, worker, opts) {
|
|
|
35
35
|
transactionSummary
|
|
36
36
|
});
|
|
37
37
|
const nearAccountId = getNearAccountId(request);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (!nearRpc.transactionContext) {
|
|
52
|
-
console.error("[SigningFlow] fetchNearContext failed", {
|
|
53
|
-
error: nearRpc.error,
|
|
54
|
-
details: nearRpc.details
|
|
55
|
-
});
|
|
56
|
-
return session.confirmAndCloseModal({
|
|
57
|
-
requestId: request.requestId,
|
|
58
|
-
intentDigest: getIntentDigest(request),
|
|
59
|
-
confirmed: false,
|
|
60
|
-
error: nearRpc.details ? `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}` : ERROR_MESSAGES.nearRpcFailed
|
|
38
|
+
try {
|
|
39
|
+
const signingAuthMode = getSigningAuthMode(request);
|
|
40
|
+
const usesNeeded = getTxCount(request);
|
|
41
|
+
const vrfIntentDigestB64u = request.type === SecureConfirmationType.SIGN_TRANSACTION ? getIntentDigest(request) : request.type === SecureConfirmationType.SIGN_NEP413_MESSAGE ? await computeUiIntentDigestFromNep413({
|
|
42
|
+
nearAccountId,
|
|
43
|
+
recipient: request.payload.recipient,
|
|
44
|
+
message: request.payload.message
|
|
45
|
+
}) : void 0;
|
|
46
|
+
const sessionPolicyDigest32 = request.payload.sessionPolicyDigest32;
|
|
47
|
+
const nearRpc = await adapters.near.fetchNearContext({
|
|
48
|
+
nearAccountId,
|
|
49
|
+
txCount: usesNeeded,
|
|
50
|
+
reserveNonces: true
|
|
61
51
|
});
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let uiVrfChallenge;
|
|
67
|
-
let uiVrfChallengeForUi = rpId ? {
|
|
68
|
-
userId: nearAccountId,
|
|
69
|
-
rpId,
|
|
70
|
-
blockHeight: transactionContext.txBlockHeight,
|
|
71
|
-
blockHash: transactionContext.txBlockHash
|
|
72
|
-
} : void 0;
|
|
73
|
-
if (signingAuthMode === "webauthn") {
|
|
74
|
-
uiVrfChallenge = await adapters.vrf.generateVrfChallengeForSession({
|
|
75
|
-
userId: nearAccountId,
|
|
76
|
-
rpId,
|
|
77
|
-
blockHeight: transactionContext.txBlockHeight,
|
|
78
|
-
blockHash: transactionContext.txBlockHash,
|
|
79
|
-
...vrfIntentDigestB64u ? { intentDigest: vrfIntentDigestB64u } : {},
|
|
80
|
-
...sessionPolicyDigest32 ? { sessionPolicyDigest32 } : {}
|
|
81
|
-
}, request.requestId);
|
|
82
|
-
uiVrfChallengeForUi = uiVrfChallenge;
|
|
83
|
-
}
|
|
84
|
-
const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallengeForUi });
|
|
85
|
-
if (!confirmed) return session.confirmAndCloseModal({
|
|
86
|
-
requestId: request.requestId,
|
|
87
|
-
intentDigest: getIntentDigest(request),
|
|
88
|
-
confirmed: false,
|
|
89
|
-
error: uiError
|
|
90
|
-
});
|
|
91
|
-
if (signingAuthMode === "warmSession") {
|
|
92
|
-
try {
|
|
93
|
-
await adapters.vrf.dispenseSessionKey({
|
|
94
|
-
sessionId: request.requestId,
|
|
95
|
-
uses: usesNeeded
|
|
52
|
+
if (!nearRpc.transactionContext) {
|
|
53
|
+
console.error("[SigningFlow] fetchNearContext failed", {
|
|
54
|
+
error: nearRpc.error,
|
|
55
|
+
details: nearRpc.details
|
|
96
56
|
});
|
|
97
|
-
} catch (err) {
|
|
98
|
-
const msg = String(toError(err)?.message || err || "");
|
|
99
57
|
return session.confirmAndCloseModal({
|
|
100
58
|
requestId: request.requestId,
|
|
101
59
|
intentDigest: getIntentDigest(request),
|
|
102
60
|
confirmed: false,
|
|
103
|
-
error:
|
|
61
|
+
error: nearRpc.details ? `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}` : ERROR_MESSAGES.nearRpcFailed
|
|
104
62
|
});
|
|
105
63
|
}
|
|
106
|
-
session.
|
|
64
|
+
session.setReservedNonces(nearRpc.reservedNonces);
|
|
65
|
+
let transactionContext = nearRpc.transactionContext;
|
|
66
|
+
const rpId = adapters.vrf.getRpId();
|
|
67
|
+
let uiVrfChallenge;
|
|
68
|
+
let uiVrfChallengeForUi = rpId ? {
|
|
69
|
+
userId: nearAccountId,
|
|
70
|
+
rpId,
|
|
71
|
+
blockHeight: transactionContext.txBlockHeight,
|
|
72
|
+
blockHash: transactionContext.txBlockHash
|
|
73
|
+
} : void 0;
|
|
74
|
+
if (signingAuthMode === "webauthn") {
|
|
75
|
+
uiVrfChallenge = await adapters.vrf.generateVrfChallengeForSession({
|
|
76
|
+
userId: nearAccountId,
|
|
77
|
+
rpId,
|
|
78
|
+
blockHeight: transactionContext.txBlockHeight,
|
|
79
|
+
blockHash: transactionContext.txBlockHash,
|
|
80
|
+
...vrfIntentDigestB64u ? { intentDigest: vrfIntentDigestB64u } : {},
|
|
81
|
+
...sessionPolicyDigest32 ? { sessionPolicyDigest32 } : {}
|
|
82
|
+
}, request.requestId);
|
|
83
|
+
uiVrfChallengeForUi = uiVrfChallenge;
|
|
84
|
+
}
|
|
85
|
+
const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallengeForUi });
|
|
86
|
+
if (!confirmed) return session.confirmAndCloseModal({
|
|
107
87
|
requestId: request.requestId,
|
|
108
88
|
intentDigest: getIntentDigest(request),
|
|
109
|
-
confirmed:
|
|
110
|
-
|
|
89
|
+
confirmed: false,
|
|
90
|
+
error: uiError
|
|
111
91
|
});
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
92
|
+
if (signingAuthMode === "warmSession") {
|
|
93
|
+
try {
|
|
94
|
+
await adapters.vrf.dispenseSessionKey({
|
|
95
|
+
sessionId: request.requestId,
|
|
96
|
+
uses: usesNeeded
|
|
97
|
+
});
|
|
98
|
+
} catch (err) {
|
|
99
|
+
const msg = String(toError(err)?.message || err || "");
|
|
100
|
+
return session.confirmAndCloseModal({
|
|
101
|
+
requestId: request.requestId,
|
|
102
|
+
intentDigest: getIntentDigest(request),
|
|
103
|
+
confirmed: false,
|
|
104
|
+
error: msg || "Failed to dispense warm session key"
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
session.confirmAndCloseModal({
|
|
108
|
+
requestId: request.requestId,
|
|
109
|
+
intentDigest: getIntentDigest(request),
|
|
110
|
+
confirmed: true,
|
|
111
|
+
transactionContext
|
|
112
|
+
});
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
|
|
117
|
+
uiVrfChallenge = refreshed.vrfChallenge;
|
|
118
|
+
transactionContext = refreshed.transactionContext;
|
|
119
|
+
session.updateUI({ vrfChallenge: uiVrfChallenge });
|
|
120
|
+
} catch (e) {
|
|
121
|
+
console.debug("[SigningFlow] VRF JIT refresh skipped", e);
|
|
122
|
+
}
|
|
123
123
|
if (!uiVrfChallenge) throw new Error("Missing vrfChallenge for WebAuthn signing flow");
|
|
124
124
|
const serializedCredential = await adapters.webauthn.collectAuthenticationCredentialWithPRF({
|
|
125
125
|
nearAccountId,
|
|
@@ -167,7 +167,6 @@ async function handleTransactionSigningFlow(ctx, request, worker, opts) {
|
|
|
167
167
|
} catch (err) {
|
|
168
168
|
const cancelled = isUserCancelledSecureConfirm(err);
|
|
169
169
|
const msg = String(toError(err)?.message || err || "");
|
|
170
|
-
if (/Missing PRF result/i.test(msg) || /Missing PRF results/i.test(msg)) return session.cleanupAndRethrow(err);
|
|
171
170
|
if (cancelled) window.parent?.postMessage({ type: "WALLET_UI_CLOSED" }, "*");
|
|
172
171
|
const isWrongPasskeyError = /multiple passkeys \(devicenumbers\) for account/i.test(msg);
|
|
173
172
|
return session.confirmAndCloseModal({
|