@seams/wallet 0.6.0 → 0.6.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/.build-inputs.sha256 +1 -1
- package/dist/esm/SeamsWeb/SeamsWeb.js +1 -0
- package/dist/esm/SeamsWeb/operations/registration/registration.js +170 -33
- package/dist/esm/SeamsWeb/operations/registration/registrationTiming.js +33 -2
- package/dist/esm/SeamsWeb/signingSurface/BrowserSigningSurface.js +3 -0
- package/dist/esm/SeamsWeb/walletIframe/client/overlay/overlay-controller.js +63 -10
- package/dist/esm/core/rpcClients/relayer/walletRegistration.js +88 -4
- package/dist/esm/core/signingEngine/session/passkey/prfCache.js +24 -4
- package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.js +5 -3
- package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionManager.js +40 -3
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/TransactionReceipt.js +31 -35
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.js +64 -10
- package/dist/esm/core/signingEngine/walletCustody/ceremonyDriver.js +1 -1
- package/dist/esm/react/SeamsWeb/SeamsWeb.js +1 -0
- package/dist/esm/react/SeamsWeb/operations/registration/registration.js +170 -33
- package/dist/esm/react/SeamsWeb/operations/registration/registrationTiming.js +33 -2
- package/dist/esm/react/SeamsWeb/signingSurface/BrowserSigningSurface.js +3 -0
- package/dist/esm/react/SeamsWeb/walletIframe/client/overlay/overlay-controller.js +63 -10
- package/dist/esm/react/core/rpcClients/relayer/walletRegistration.js +88 -4
- package/dist/esm/react/core/signingEngine/session/passkey/prfCache.js +24 -4
- package/dist/esm/react/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.js +5 -3
- package/dist/esm/react/core/signingEngine/uiConfirm/PasskeyMpcSessionManager.js +40 -3
- package/dist/esm/react/core/signingEngine/uiConfirm/ui/preact/TransactionReceipt.js +31 -35
- package/dist/esm/react/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.js +64 -10
- package/dist/esm/react/core/signingEngine/walletCustody/ceremonyDriver.js +1 -1
- package/dist/esm/react/shared-ts/src/utils/routerAbEd25519Yao.js +13 -1
- package/dist/esm/sdk/{adapters-Dgy69gf0.js → adapters-LgE4nnos.js} +95 -45
- package/dist/esm/sdk/{defaultConfigs-DJCLCrg9.js → defaultConfigs-CyNOW4Sy.js} +1 -1
- package/dist/{public/sdk/ecdsaCapabilityManifest-DA_fklIs.js → esm/sdk/ecdsaCapabilityManifest-C8itxV9S.js} +1 -1
- package/dist/{public/sdk/ecdsaPresignLifecycle-D_KCktCj.js → esm/sdk/ecdsaPresignLifecycle-CnSnzoRJ.js} +13 -1
- package/dist/esm/sdk/{ed25519SeedMaterial-0VmS6K9P.js → ed25519SeedMaterial-Cghz8-XB.js} +2 -2
- package/dist/esm/sdk/{exactSessionState-C2aAv_ED.js → exactSessionState-Bt0HforB.js} +64 -11
- package/dist/esm/sdk/{export-viewer-host-NhjFdpm-.js → export-viewer-host-B3K81QGA.js} +1 -1
- package/dist/esm/sdk/{host-DACTruOj.js → host-Y_xmIzPO.js} +2 -2
- package/dist/esm/sdk/{localOnly-DTNq69fJ.js → localOnly-B5TYHJiq.js} +2 -2
- package/dist/{public/sdk/nearEd25519YaoMaterialActivation-4AuGG2DG.js → esm/sdk/nearEd25519YaoMaterialActivation-BLxVE6E5.js} +89 -5
- package/dist/esm/sdk/{nearEd25519YaoSigningPreparation-jiGcQylO.js → nearEd25519YaoSigningPreparation-DX6xG-IW.js} +1 -1
- package/dist/esm/sdk/{prfCache-Dwwauj4v.js → prfCache-CgAr-VEU.js} +24 -4
- package/dist/{public/sdk/recovery-entrypoint-CFTX6PFZ.js → esm/sdk/recovery-entrypoint-D39R1avB.js} +3 -3
- package/dist/{public/sdk/registration-CuP1WmQu.js → esm/sdk/registration-BtPLgKHk.js} +1 -1
- package/dist/esm/sdk/{registration-D8nYJKec.js → registration-D-istkMZ.js} +253 -38
- package/dist/esm/sdk/{registrationPreparationPreload-DDe0sbZi.js → registrationPreparationPreload-CvnlDCVn.js} +2 -2
- package/dist/{public/sdk/router-DeX_cJ2f.js → esm/sdk/router-CeFS9SgT.js} +3 -3
- package/dist/{public/sdk/routerAbNormalSigning-BGpRKRAj.js → esm/sdk/routerAbNormalSigning-DktZKnf1.js} +1 -1
- package/dist/{public/sdk/runtime-auth-Ch00YcH5.js → esm/sdk/runtime-auth-B7z1ANNp.js} +8 -8
- package/dist/esm/sdk/{runtime-device-link-CEhVZYAw.js → runtime-device-link-B8HGDakg.js} +4 -4
- package/dist/esm/sdk/{runtime-ecdsa-tempo-B-qMRrmx.js → runtime-ecdsa-tempo-DKdS5-us.js} +5 -5
- package/dist/{public/sdk/runtime-email-otp-giyMPib8.js → esm/sdk/runtime-email-otp-D5bxhdyG.js} +4 -4
- package/dist/{public/sdk/runtime-export-CV-6G1Oy.js → esm/sdk/runtime-export--hvNrx8l.js} +4 -4
- package/dist/{public/sdk/runtime-near-DoDcS88O.js → esm/sdk/runtime-near-CEexHoug.js} +4 -4
- package/dist/{public/sdk/runtime-preferences-Canyenle.js → esm/sdk/runtime-preferences-BiqPp1lV.js} +4 -4
- package/dist/esm/sdk/{runtime-recovery-lWyILD1g.js → runtime-recovery-BYu1gDq_.js} +4 -4
- package/dist/esm/sdk/{runtimeContext-BdTaYxJD.js → runtimeContext-CH97jPZ0.js} +80 -37
- package/dist/{public/sdk/runtimeLoader-Dxn8UA8B.js → esm/sdk/runtimeLoader-BFAmJAbu.js} +9 -9
- package/dist/esm/sdk/{secp256k1-CQFsI3qQ.js → secp256k1-Cr1jBW1n.js} +3 -3
- package/dist/esm/sdk/{signEvmFamily-CZLET02E.js → signEvmFamily-Dxk4sBPY.js} +7 -7
- package/dist/esm/sdk/{signNear-BeUWiWm_.js → signNear-B0OCVKoH.js} +6 -6
- package/dist/esm/sdk/{signerLoader-C_w8vuhm.js → signerLoader-D0WU1jq_.js} +1 -1
- package/dist/{public/sdk/transactionState-Dd13hMoY.js → esm/sdk/transactionState-Bpm4GamO.js} +2 -2
- package/dist/esm/sdk/tx-confirm-ui.js +134 -93
- package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/esm/sdk/wallet-ui.css +85 -31
- package/dist/{public/sdk/walletRecoveryCommit-DNvzgeIX.js → esm/sdk/walletRecoveryCommit-G6w6N5RV.js} +3 -3
- package/dist/esm/sdk/{warmSessionHydration-CCKeEIIy.js → warmSessionHydration-DDNYdTCz.js} +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +13 -1
- package/dist/public/headers.manifest.json +1 -1
- package/dist/public/sdk/{adapters-Dgy69gf0.js → adapters-LgE4nnos.js} +95 -45
- package/dist/public/sdk/{defaultConfigs-DJCLCrg9.js → defaultConfigs-CyNOW4Sy.js} +1 -1
- package/dist/{esm/sdk/ecdsaCapabilityManifest-DA_fklIs.js → public/sdk/ecdsaCapabilityManifest-C8itxV9S.js} +1 -1
- package/dist/{esm/sdk/ecdsaPresignLifecycle-D_KCktCj.js → public/sdk/ecdsaPresignLifecycle-CnSnzoRJ.js} +13 -1
- package/dist/public/sdk/{ed25519SeedMaterial-0VmS6K9P.js → ed25519SeedMaterial-Cghz8-XB.js} +2 -2
- package/dist/public/sdk/{exactSessionState-C2aAv_ED.js → exactSessionState-Bt0HforB.js} +64 -11
- package/dist/public/sdk/{export-viewer-host-NhjFdpm-.js → export-viewer-host-B3K81QGA.js} +1 -1
- package/dist/public/sdk/{host-DACTruOj.js → host-Y_xmIzPO.js} +2 -2
- package/dist/public/sdk/{localOnly-DTNq69fJ.js → localOnly-B5TYHJiq.js} +2 -2
- package/dist/{esm/sdk/nearEd25519YaoMaterialActivation-4AuGG2DG.js → public/sdk/nearEd25519YaoMaterialActivation-BLxVE6E5.js} +89 -5
- package/dist/public/sdk/{nearEd25519YaoSigningPreparation-jiGcQylO.js → nearEd25519YaoSigningPreparation-DX6xG-IW.js} +1 -1
- package/dist/public/sdk/{prfCache-Dwwauj4v.js → prfCache-CgAr-VEU.js} +24 -4
- package/dist/{esm/sdk/recovery-entrypoint-CFTX6PFZ.js → public/sdk/recovery-entrypoint-D39R1avB.js} +3 -3
- package/dist/{esm/sdk/registration-CuP1WmQu.js → public/sdk/registration-BtPLgKHk.js} +1 -1
- package/dist/public/sdk/{registration-D8nYJKec.js → registration-D-istkMZ.js} +253 -38
- package/dist/public/sdk/{registrationPreparationPreload-DDe0sbZi.js → registrationPreparationPreload-CvnlDCVn.js} +2 -2
- package/dist/{esm/sdk/router-DeX_cJ2f.js → public/sdk/router-CeFS9SgT.js} +3 -3
- package/dist/{esm/sdk/routerAbNormalSigning-BGpRKRAj.js → public/sdk/routerAbNormalSigning-DktZKnf1.js} +1 -1
- package/dist/{esm/sdk/runtime-auth-Ch00YcH5.js → public/sdk/runtime-auth-B7z1ANNp.js} +8 -8
- package/dist/public/sdk/{runtime-device-link-CEhVZYAw.js → runtime-device-link-B8HGDakg.js} +4 -4
- package/dist/public/sdk/{runtime-ecdsa-tempo-B-qMRrmx.js → runtime-ecdsa-tempo-DKdS5-us.js} +5 -5
- package/dist/{esm/sdk/runtime-email-otp-giyMPib8.js → public/sdk/runtime-email-otp-D5bxhdyG.js} +4 -4
- package/dist/{esm/sdk/runtime-export-CV-6G1Oy.js → public/sdk/runtime-export--hvNrx8l.js} +4 -4
- package/dist/{esm/sdk/runtime-near-DoDcS88O.js → public/sdk/runtime-near-CEexHoug.js} +4 -4
- package/dist/{esm/sdk/runtime-preferences-Canyenle.js → public/sdk/runtime-preferences-BiqPp1lV.js} +4 -4
- package/dist/public/sdk/{runtime-recovery-lWyILD1g.js → runtime-recovery-BYu1gDq_.js} +4 -4
- package/dist/public/sdk/{runtimeContext-BdTaYxJD.js → runtimeContext-CH97jPZ0.js} +80 -37
- package/dist/{esm/sdk/runtimeLoader-Dxn8UA8B.js → public/sdk/runtimeLoader-BFAmJAbu.js} +9 -9
- package/dist/public/sdk/{secp256k1-CQFsI3qQ.js → secp256k1-Cr1jBW1n.js} +3 -3
- package/dist/public/sdk/{signEvmFamily-CZLET02E.js → signEvmFamily-Dxk4sBPY.js} +7 -7
- package/dist/public/sdk/{signNear-BeUWiWm_.js → signNear-B0OCVKoH.js} +6 -6
- package/dist/public/sdk/{signerLoader-C_w8vuhm.js → signerLoader-D0WU1jq_.js} +1 -1
- package/dist/{esm/sdk/transactionState-Dd13hMoY.js → public/sdk/transactionState-Bpm4GamO.js} +2 -2
- package/dist/public/sdk/tx-confirm-ui.js +134 -93
- package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/public/sdk/wallet-ui.css +85 -31
- package/dist/{esm/sdk/walletRecoveryCommit-DNvzgeIX.js → public/sdk/walletRecoveryCommit-G6w6N5RV.js} +3 -3
- package/dist/public/sdk/{warmSessionHydration-CCKeEIIy.js → warmSessionHydration-DDNYdTCz.js} +1 -1
- package/dist/public/sdk/workers/passkey-mpc-session.worker.js +92 -8
- package/dist/public/wallet-assets.manifest.json +74 -74
- package/dist/public/wallet-service/index.html +4 -4
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registration.d.ts +15 -0
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registrationTiming.d.ts +11 -1
- package/dist/types/wallet/src/SeamsWeb/signingSurface/BrowserSigningSurface.d.ts +6 -0
- package/dist/types/wallet/src/SeamsWeb/signingSurface/ports.d.ts +8 -2
- package/dist/types/wallet/src/core/rpcClients/relayer/walletRegistration.d.ts +49 -10
- package/dist/types/wallet/src/core/signingEngine/session/passkey/prfCache.d.ts +7 -9
- package/dist/types/wallet/src/core/signingEngine/session/passkey/warmSessionHydration.d.ts +7 -8
- package/dist/types/wallet/src/core/signingEngine/session/passkey/warmSessionMaterialWriter.d.ts +9 -9
- package/dist/types/wallet/src/core/signingEngine/session/warmCapabilities/public.d.ts +7 -8
- package/dist/types/wallet/src/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.d.ts +3 -0
- package/dist/types/wallet/src/core/signingEngine/uiConfirm/uiConfirm.types.d.ts +6 -0
- package/dist/types/wallet/src/core/signingEngine/workerManager/workers/shamir3pass/clientSealPreparation.d.ts +2 -0
- package/dist/types/wallet/src/core/types/secure-confirm-worker.d.ts +15 -1
- package/dist/workers/passkey-mpc-session.worker.js +92 -8
- package/package.json +1 -1
|
@@ -29,6 +29,7 @@ const ROUTE_PAYLOAD_BREAKDOWN_MAX_DEPTH = 2;
|
|
|
29
29
|
const ROUTE_PAYLOAD_BREAKDOWN_MAX_FIELDS = 64;
|
|
30
30
|
const WALLET_REGISTRATION_SETUP_PATH = "/wallets/register/setup";
|
|
31
31
|
const WALLET_REGISTRATION_RESPOND_PATH = "/wallets/register/respond";
|
|
32
|
+
const WALLET_REGISTRATION_NEAR_ADMISSION_PATH = "/wallets/register/near-admission";
|
|
32
33
|
const WALLET_REGISTRATION_ACTIVATE_PATH = "/wallets/register/activate";
|
|
33
34
|
const WALLET_REGISTRATION_NEAR_PROVISIONING_PATH = "/wallets/register/near-provisioning";
|
|
34
35
|
/** Managed environment id header for Router API `api_credentials` auth. */
|
|
@@ -1731,6 +1732,47 @@ async function respondWalletRegistration(args) {
|
|
|
1731
1732
|
onServerTiming: args.onServerTiming
|
|
1732
1733
|
}));
|
|
1733
1734
|
}
|
|
1735
|
+
async function authorizeWalletRegistrationNearAdmission(args) {
|
|
1736
|
+
const body = {
|
|
1737
|
+
registrationCeremonyId: args.registrationCeremonyId,
|
|
1738
|
+
signedSetup: args.signedSetup
|
|
1739
|
+
};
|
|
1740
|
+
switch (args.kind) {
|
|
1741
|
+
case "passkey":
|
|
1742
|
+
body.webauthn_registration = args.webauthnRegistration;
|
|
1743
|
+
break;
|
|
1744
|
+
case "email_otp":
|
|
1745
|
+
body.emailOtpRegistrationProof = args.emailOtpRegistrationProof;
|
|
1746
|
+
break;
|
|
1747
|
+
}
|
|
1748
|
+
const response = await postJson({
|
|
1749
|
+
relayerUrl: args.relayerUrl,
|
|
1750
|
+
path: WALLET_REGISTRATION_NEAR_ADMISSION_PATH,
|
|
1751
|
+
headers: args.headers,
|
|
1752
|
+
body
|
|
1753
|
+
});
|
|
1754
|
+
const responseName = "Wallet registration NEAR admission";
|
|
1755
|
+
const record = requireWalletRegistrationResponseObject({
|
|
1756
|
+
responseName,
|
|
1757
|
+
field: "body",
|
|
1758
|
+
value: response
|
|
1759
|
+
});
|
|
1760
|
+
assertWalletRegistrationResponseKeys(record, [
|
|
1761
|
+
"ok",
|
|
1762
|
+
"registrationCeremonyId",
|
|
1763
|
+
"ed25519"
|
|
1764
|
+
], responseName);
|
|
1765
|
+
if (readWalletRegistrationResponseField(record, "ok", responseName) !== true) throw new Error(`${responseName} response is not successful`);
|
|
1766
|
+
return {
|
|
1767
|
+
ok: true,
|
|
1768
|
+
registrationCeremonyId: requireResponseString({
|
|
1769
|
+
responseName,
|
|
1770
|
+
field: "registrationCeremonyId",
|
|
1771
|
+
value: readWalletRegistrationResponseField(record, "registrationCeremonyId", responseName)
|
|
1772
|
+
}),
|
|
1773
|
+
ed25519: parseWalletRegistrationRespondEd25519DeferredWork(readWalletRegistrationResponseField(record, "ed25519", responseName))
|
|
1774
|
+
};
|
|
1775
|
+
}
|
|
1734
1776
|
function parseRegistrationEstablishedSessionResult(value, expectedWalletId) {
|
|
1735
1777
|
const responseName = "Wallet registration established session";
|
|
1736
1778
|
const parsed = parseRegistrationEstablishedSessionResultV2(value);
|
|
@@ -1938,6 +1980,31 @@ async function activateWalletRegistration(args) {
|
|
|
1938
1980
|
onServerTiming: args.onServerTiming
|
|
1939
1981
|
}));
|
|
1940
1982
|
}
|
|
1983
|
+
function parseWalletRegistrationSessionSealResponse(value) {
|
|
1984
|
+
const responseName = "Wallet registration session seal";
|
|
1985
|
+
const record = requireWalletRegistrationResponseObject({
|
|
1986
|
+
responseName,
|
|
1987
|
+
field: "body",
|
|
1988
|
+
value
|
|
1989
|
+
});
|
|
1990
|
+
assertWalletRegistrationResponseKeys(record, [
|
|
1991
|
+
"ciphertext",
|
|
1992
|
+
"keyVersion",
|
|
1993
|
+
"expiresAtMs",
|
|
1994
|
+
"remainingUses"
|
|
1995
|
+
], responseName);
|
|
1996
|
+
const ciphertext = readWalletRegistrationResponseField(record, "ciphertext", responseName);
|
|
1997
|
+
const keyVersion = readWalletRegistrationResponseField(record, "keyVersion", responseName);
|
|
1998
|
+
const expiresAtMs = readWalletRegistrationResponseField(record, "expiresAtMs", responseName);
|
|
1999
|
+
const remainingUses = readWalletRegistrationResponseField(record, "remainingUses", responseName);
|
|
2000
|
+
if (typeof ciphertext !== "string" || !ciphertext.trim() || typeof keyVersion !== "string" || !keyVersion.trim() || typeof expiresAtMs !== "number" || !Number.isSafeInteger(expiresAtMs) || expiresAtMs <= 0 || typeof remainingUses !== "number" || !Number.isSafeInteger(remainingUses) || remainingUses < 0) throw new Error(`${responseName} is invalid`);
|
|
2001
|
+
return {
|
|
2002
|
+
ciphertext,
|
|
2003
|
+
keyVersion,
|
|
2004
|
+
expiresAtMs,
|
|
2005
|
+
remainingUses
|
|
2006
|
+
};
|
|
2007
|
+
}
|
|
1941
2008
|
function parseWalletRegistrationNearProvisioningResponseV2(value) {
|
|
1942
2009
|
const responseName = "Wallet registration NEAR provisioning";
|
|
1943
2010
|
const record = requireWalletRegistrationResponseObject({
|
|
@@ -1994,7 +2061,8 @@ function parseWalletRegistrationNearProvisioningResponseV2(value) {
|
|
|
1994
2061
|
"ed25519",
|
|
1995
2062
|
"authorityScope",
|
|
1996
2063
|
"nearProvisioning",
|
|
1997
|
-
"registrationEstablishedSession"
|
|
2064
|
+
"registrationEstablishedSession",
|
|
2065
|
+
"sessionSeal"
|
|
1998
2066
|
], responseName);
|
|
1999
2067
|
const provisioning = requireWalletRegistrationResponseObject({
|
|
2000
2068
|
responseName,
|
|
@@ -2008,10 +2076,25 @@ function parseWalletRegistrationNearProvisioningResponseV2(value) {
|
|
|
2008
2076
|
expectedKind: "near_ed25519"
|
|
2009
2077
|
});
|
|
2010
2078
|
if (!finalized.ok || finalized.kind !== "near_ed25519") throw new Error(`${responseName} did not return a finalized Ed25519 wallet`);
|
|
2011
|
-
|
|
2079
|
+
const sessionSeal = readOptionalWalletRegistrationResponseField(record, "sessionSeal", responseName);
|
|
2080
|
+
const registrationEstablishedSession = parseRegistrationEstablishedSessionResult(readWalletRegistrationResponseField(record, "registrationEstablishedSession", responseName), finalized.walletId);
|
|
2081
|
+
if (isEmailOtpWalletRegistrationFinalizeResponse(finalized)) {
|
|
2082
|
+
if (sessionSeal !== void 0) throw new Error(`${responseName} returned a session seal for an Email OTP authority`);
|
|
2083
|
+
return {
|
|
2084
|
+
...finalized,
|
|
2085
|
+
nearProvisioning: { status: "near_ready" },
|
|
2086
|
+
registrationEstablishedSession
|
|
2087
|
+
};
|
|
2088
|
+
}
|
|
2089
|
+
const success = {
|
|
2012
2090
|
...finalized,
|
|
2013
2091
|
nearProvisioning: { status: "near_ready" },
|
|
2014
|
-
registrationEstablishedSession
|
|
2092
|
+
registrationEstablishedSession
|
|
2093
|
+
};
|
|
2094
|
+
if (sessionSeal === void 0) return success;
|
|
2095
|
+
return {
|
|
2096
|
+
...success,
|
|
2097
|
+
sessionSeal: parseWalletRegistrationSessionSealResponse(sessionSeal)
|
|
2015
2098
|
};
|
|
2016
2099
|
}
|
|
2017
2100
|
async function completeWalletRegistrationNearProvisioning(args) {
|
|
@@ -2023,6 +2106,7 @@ async function completeWalletRegistrationNearProvisioning(args) {
|
|
|
2023
2106
|
};
|
|
2024
2107
|
if (args.auth.kind === "email_otp") body.emailOtpEnrollment = args.auth.enrollment;
|
|
2025
2108
|
if (args.walletCustodyCommit) body.walletCustodyCommit = args.walletCustodyCommit;
|
|
2109
|
+
if (args.sessionSeal) body.sessionSeal = args.sessionSeal;
|
|
2026
2110
|
return parseWalletRegistrationNearProvisioningResponseV2(await postJson({
|
|
2027
2111
|
relayerUrl: args.relayerUrl,
|
|
2028
2112
|
path: WALLET_REGISTRATION_NEAR_PROVISIONING_PATH,
|
|
@@ -2278,6 +2362,6 @@ async function fetchWalletEcdsaKeyFactsInventoryWithWebAuthn(args) {
|
|
|
2278
2362
|
});
|
|
2279
2363
|
}
|
|
2280
2364
|
//#endregion
|
|
2281
|
-
export { activateWalletAddSignerEcdsa, activateWalletRegistration, completeWalletRegistrationNearProvisioning, createWalletAddAuthMethodIntent, createWalletAddSignerIntent, fetchWalletEcdsaKeyFactsInventoryWithOperationCredential, fetchWalletEcdsaKeyFactsInventoryWithWebAuthn, finalizeWalletAddAuthMethod, finalizeWalletAddSigner, fundImplicitNearAccountForTesting, isEmailOtpWalletRegistrationFinalizeResponse, parseWalletRegistrationEcdsaDerivationRespond, requestAddAuthMethodEmailOtpChallenge, respondWalletAddSignerEcdsa, respondWalletRegistration, revokeWalletAuthMethod, setupWalletRegistration, startWalletAddAuthMethod, startWalletAddSigner };
|
|
2365
|
+
export { activateWalletAddSignerEcdsa, activateWalletRegistration, authorizeWalletRegistrationNearAdmission, completeWalletRegistrationNearProvisioning, createWalletAddAuthMethodIntent, createWalletAddSignerIntent, fetchWalletEcdsaKeyFactsInventoryWithOperationCredential, fetchWalletEcdsaKeyFactsInventoryWithWebAuthn, finalizeWalletAddAuthMethod, finalizeWalletAddSigner, fundImplicitNearAccountForTesting, isEmailOtpWalletRegistrationFinalizeResponse, parseWalletRegistrationEcdsaDerivationRespond, requestAddAuthMethodEmailOtpChallenge, respondWalletAddSignerEcdsa, respondWalletRegistration, revokeWalletAuthMethod, setupWalletRegistration, startWalletAddAuthMethod, startWalletAddSigner };
|
|
2282
2366
|
|
|
2283
2367
|
//# sourceMappingURL=walletRegistration.js.map
|
|
@@ -15,23 +15,43 @@ function normalizeSigningSessionCacheEntry(args) {
|
|
|
15
15
|
if (!thresholdSessionId || !prfFirstB64u) throw new Error("Missing thresholdSessionId or prfFirstB64u for signing session hydration");
|
|
16
16
|
if (!Number.isFinite(expiresAtMsRaw) || expiresAtMsRaw <= 0) throw new Error("Invalid expiresAtMs for signing session hydration");
|
|
17
17
|
if (remainingUses == null) throw new Error("Invalid remainingUses for signing session hydration");
|
|
18
|
-
|
|
18
|
+
const normalized = {
|
|
19
19
|
thresholdSessionId,
|
|
20
20
|
prfFirstB64u,
|
|
21
21
|
expiresAtMs: Math.floor(expiresAtMsRaw),
|
|
22
22
|
remainingUses,
|
|
23
|
+
...args.diagnostics ? { diagnostics: args.diagnostics } : {}
|
|
24
|
+
};
|
|
25
|
+
if (args.preparedServerSeal) return {
|
|
26
|
+
...normalized,
|
|
27
|
+
transport: args.transport,
|
|
28
|
+
preparedServerSeal: args.preparedServerSeal
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
...normalized,
|
|
23
32
|
...args.transport ? { transport: args.transport } : {}
|
|
24
33
|
};
|
|
25
34
|
}
|
|
26
35
|
async function cacheCredentialBoundarySetupExportPrfFirst(writer, args) {
|
|
27
36
|
const normalized = normalizeSigningSessionCacheEntry(args);
|
|
28
|
-
|
|
37
|
+
const material = {
|
|
29
38
|
thresholdSessionId: normalized.thresholdSessionId,
|
|
30
39
|
prfFirstB64u: normalized.prfFirstB64u,
|
|
31
40
|
expiresAtMs: normalized.expiresAtMs,
|
|
32
41
|
remainingUses: normalized.remainingUses,
|
|
33
|
-
...
|
|
34
|
-
|
|
42
|
+
...normalized.diagnostics ? { diagnostics: normalized.diagnostics } : {}
|
|
43
|
+
};
|
|
44
|
+
if (normalized.preparedServerSeal) {
|
|
45
|
+
await writer.putWarmSessionMaterial({
|
|
46
|
+
...material,
|
|
47
|
+
transport: normalized.transport,
|
|
48
|
+
preparedServerSeal: normalized.preparedServerSeal
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await writer.putWarmSessionMaterial({
|
|
53
|
+
...material,
|
|
54
|
+
...normalized.transport ? { transport: normalized.transport } : {}
|
|
35
55
|
});
|
|
36
56
|
}
|
|
37
57
|
//#endregion
|
|
@@ -230,7 +230,8 @@ var PasskeyMpcSessionDurableState = class {
|
|
|
230
230
|
metadata,
|
|
231
231
|
purpose,
|
|
232
232
|
relayerUrl,
|
|
233
|
-
diagnostics: args.diagnostics
|
|
233
|
+
diagnostics: args.diagnostics,
|
|
234
|
+
completedSeal: args.completedSeal
|
|
234
235
|
});
|
|
235
236
|
else persistTask = this.persistExactRecord({
|
|
236
237
|
thresholdSessionId,
|
|
@@ -238,7 +239,8 @@ var PasskeyMpcSessionDurableState = class {
|
|
|
238
239
|
metadata,
|
|
239
240
|
purpose,
|
|
240
241
|
relayerUrl,
|
|
241
|
-
diagnostics: args.diagnostics
|
|
242
|
+
diagnostics: args.diagnostics,
|
|
243
|
+
completedSeal: args.completedSeal
|
|
242
244
|
});
|
|
243
245
|
const task = persistTask.finally(() => {
|
|
244
246
|
signingSessionSealPersistSingleFlight.delete(singleFlightKey);
|
|
@@ -379,7 +381,7 @@ var PasskeyMpcSessionDurableState = class {
|
|
|
379
381
|
};
|
|
380
382
|
const groupId = SIGNING_SESSION_SEAL_GROUP_ID;
|
|
381
383
|
const sealStartedAt = performance.now();
|
|
382
|
-
const sealed = await this.deps.sealAndPersistWarmSessionMaterial({
|
|
384
|
+
const sealed = args.completedSeal ?? await this.deps.sealAndPersistWarmSessionMaterial({
|
|
383
385
|
thresholdSessionId: args.thresholdSessionId,
|
|
384
386
|
transport: normalizedPasskeyTransport(args.transport, groupId)
|
|
385
387
|
});
|
|
@@ -237,7 +237,8 @@ var PasskeyMpcSessionManagerImpl = class {
|
|
|
237
237
|
this.boundHandleWorkerMessage = this.handleWorkerMessage.bind(this);
|
|
238
238
|
this.boundHandleWorkerError = this.handleWorkerError.bind(this);
|
|
239
239
|
this.putWarmSessionMaterial = async (args) => {
|
|
240
|
-
const { diagnostics, ...workerPayload } = args;
|
|
240
|
+
const { diagnostics, preparedServerSeal, ...workerPayload } = args;
|
|
241
|
+
if (preparedServerSeal && !args.transport) throw new Error("Prepared server seal requires exact persistence transport");
|
|
241
242
|
const workerReadyStartedAt = performance.now();
|
|
242
243
|
await this.ensureWorkerReady();
|
|
243
244
|
recordDiagnosticDuration({
|
|
@@ -260,11 +261,38 @@ var PasskeyMpcSessionManagerImpl = class {
|
|
|
260
261
|
bucket: "worker_put",
|
|
261
262
|
startedAt: workerPutStartedAt
|
|
262
263
|
});
|
|
264
|
+
let completedSeal;
|
|
265
|
+
if (preparedServerSeal && args.transport) {
|
|
266
|
+
const completed = await this.sendMessage({
|
|
267
|
+
type: "COMPLETE_SESSION_CLIENT_SEAL",
|
|
268
|
+
id: this.generateMessageId(),
|
|
269
|
+
payload: {
|
|
270
|
+
preparationId: preparedServerSeal.preparationId,
|
|
271
|
+
thresholdSessionId: args.thresholdSessionId,
|
|
272
|
+
transport: requirePasskeySealTransport(args.transport),
|
|
273
|
+
serverSeal: {
|
|
274
|
+
ok: true,
|
|
275
|
+
ciphertext: preparedServerSeal.ciphertext,
|
|
276
|
+
keyVersion: preparedServerSeal.keyVersion,
|
|
277
|
+
expiresAtMs: preparedServerSeal.expiresAtMs,
|
|
278
|
+
remainingUses: preparedServerSeal.remainingUses
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
const parsed = completed.success ? parseWarmSessionSealAndPersistResult(completed.data) : null;
|
|
283
|
+
if (!parsed) {
|
|
284
|
+
const message = completed.success ? "Prepared signing-session seal returned an invalid response" : completed.error || "Prepared signing-session seal failed";
|
|
285
|
+
throw new Error(message);
|
|
286
|
+
}
|
|
287
|
+
if (!parsed.ok) throw new Error(`Prepared signing-session seal failed (${parsed.code}): ${parsed.message}`);
|
|
288
|
+
completedSeal = parsed;
|
|
289
|
+
}
|
|
263
290
|
const persistStartedAt = performance.now();
|
|
264
|
-
const persisted = args.transport ? await this.persistSigningSessionSealForThresholdSession({
|
|
291
|
+
const persisted = args.transport ? await this.durableState.persistSigningSessionSealForThresholdSession({
|
|
265
292
|
thresholdSessionId: args.thresholdSessionId,
|
|
266
293
|
transport: requirePasskeySealTransport(args.transport),
|
|
267
|
-
...diagnostics ? { diagnostics } : {}
|
|
294
|
+
...diagnostics ? { diagnostics } : {},
|
|
295
|
+
...completedSeal ? { completedSeal } : {}
|
|
268
296
|
}) : null;
|
|
269
297
|
recordDiagnosticDuration({
|
|
270
298
|
diagnostics,
|
|
@@ -488,6 +516,15 @@ var PasskeyMpcSessionManagerImpl = class {
|
|
|
488
516
|
});
|
|
489
517
|
if (!response.success) throw new Error(response.error || "Client seal cleanup failed");
|
|
490
518
|
}
|
|
519
|
+
async readPreparedSigningSessionHydration(input) {
|
|
520
|
+
const response = await this.sendMessage({
|
|
521
|
+
type: "READ_SESSION_CLIENT_SEAL",
|
|
522
|
+
id: this.generateMessageId(),
|
|
523
|
+
payload: input
|
|
524
|
+
});
|
|
525
|
+
if (!response.success || !isObjectRecord(response.data) || response.data.ok !== true || typeof response.data.ciphertext !== "string" || !response.data.ciphertext.trim()) throw new Error(response.success ? "Prepared client seal is invalid" : response.error || "Client seal read failed");
|
|
526
|
+
return { ciphertext: response.data.ciphertext };
|
|
527
|
+
}
|
|
491
528
|
async restorePasskeyEcdsaRecord(args) {
|
|
492
529
|
const thresholdSessionId = args.purpose.thresholdSessionId;
|
|
493
530
|
const chainTarget = args.purpose.chainTarget;
|
|
@@ -30,12 +30,16 @@ var TransactionReceipt = class extends Component {
|
|
|
30
30
|
if (receipt.view === "toast") return /* @__PURE__ */ jsxs("div", {
|
|
31
31
|
class: "seams-transaction-toast",
|
|
32
32
|
"data-completed-stages": completedStages,
|
|
33
|
+
"data-stage": receipt.state.kind,
|
|
33
34
|
"data-pending": pending,
|
|
34
35
|
children: [
|
|
35
36
|
/* @__PURE__ */ jsx("div", {
|
|
36
37
|
class: "seams-toast-progress",
|
|
37
38
|
"aria-hidden": "true",
|
|
38
|
-
children: /* @__PURE__ */ jsx("span", {
|
|
39
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
40
|
+
class: "seams-toast-progress-fill",
|
|
41
|
+
children: pending && /* @__PURE__ */ jsx("span", { class: "seams-toast-progress-active" })
|
|
42
|
+
})
|
|
39
43
|
}),
|
|
40
44
|
/* @__PURE__ */ jsx("span", {
|
|
41
45
|
class: "seams-receipt-symbol",
|
|
@@ -62,17 +66,12 @@ var TransactionReceipt = class extends Component {
|
|
|
62
66
|
children: [
|
|
63
67
|
/* @__PURE__ */ jsxs("div", {
|
|
64
68
|
class: "seams-review-toolbar",
|
|
65
|
-
children: [/* @__PURE__ */ jsx("span", { children: "Transaction receipt" }), /* @__PURE__ */
|
|
69
|
+
children: [/* @__PURE__ */ jsx("span", { children: "Transaction receipt" }), /* @__PURE__ */ jsx("button", {
|
|
66
70
|
type: "button",
|
|
67
71
|
"aria-label": "Minimize transaction",
|
|
68
72
|
onClick: this.minimize,
|
|
69
73
|
children: /* @__PURE__ */ jsx(ReviewIcon, { kind: "minimize" })
|
|
70
|
-
})
|
|
71
|
-
type: "button",
|
|
72
|
-
"aria-label": receiptIsPending(receipt.state) ? "Minimize transaction" : "Close receipt",
|
|
73
|
-
onClick: this.close,
|
|
74
|
-
children: /* @__PURE__ */ jsx(ReviewIcon, { kind: "close" })
|
|
75
|
-
})] })]
|
|
74
|
+
})]
|
|
76
75
|
}),
|
|
77
76
|
/* @__PURE__ */ jsxs("div", {
|
|
78
77
|
class: "seams-receipt-heading",
|
|
@@ -132,33 +131,30 @@ var TransactionReceipt = class extends Component {
|
|
|
132
131
|
})
|
|
133
132
|
]
|
|
134
133
|
}),
|
|
135
|
-
/* @__PURE__ */ jsx(
|
|
136
|
-
|
|
137
|
-
children: /* @__PURE__ */
|
|
138
|
-
|
|
139
|
-
children:
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "Status" }), /* @__PURE__ */ jsx("dd", { children: heading })] })
|
|
160
|
-
]
|
|
161
|
-
})
|
|
134
|
+
/* @__PURE__ */ jsx(ReviewDisclosure, {
|
|
135
|
+
label: "Receipt details",
|
|
136
|
+
children: /* @__PURE__ */ jsxs("dl", {
|
|
137
|
+
class: "seams-review-fields",
|
|
138
|
+
children: [
|
|
139
|
+
data.model?.signerAccount && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "From" }), /* @__PURE__ */ jsx("dd", {
|
|
140
|
+
class: "seams-review-recipient",
|
|
141
|
+
children: /* @__PURE__ */ jsx(CopyReviewValue, {
|
|
142
|
+
value: data.model.signerAccount,
|
|
143
|
+
address: true,
|
|
144
|
+
label: `Copy signer address ${data.model.signerAccount}`
|
|
145
|
+
})
|
|
146
|
+
})] }),
|
|
147
|
+
recipient && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "To" }), /* @__PURE__ */ jsx("dd", {
|
|
148
|
+
class: "seams-review-recipient",
|
|
149
|
+
children: /* @__PURE__ */ jsx(CopyReviewValue, {
|
|
150
|
+
value: recipient,
|
|
151
|
+
address: true,
|
|
152
|
+
label: `Copy recipient address ${recipient}`
|
|
153
|
+
})
|
|
154
|
+
})] }),
|
|
155
|
+
receipt.state.hash && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "Transaction" }), /* @__PURE__ */ jsxs("dd", { children: [/* @__PURE__ */ jsx(ReviewAddress, { value: receipt.state.hash }), /* @__PURE__ */ jsx(CopyReviewValue, { value: receipt.state.hash })] })] }),
|
|
156
|
+
/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "Status" }), /* @__PURE__ */ jsx("dd", { children: heading })] })
|
|
157
|
+
]
|
|
162
158
|
})
|
|
163
159
|
}),
|
|
164
160
|
/* @__PURE__ */ jsx("button", {
|
|
@@ -11,6 +11,27 @@ import { render } from "preact";
|
|
|
11
11
|
import { Fragment as Fragment$1, jsx, jsxs } from "preact/jsx-runtime";
|
|
12
12
|
//#region src/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.tsx
|
|
13
13
|
/** @jsxImportSource preact */
|
|
14
|
+
const RECEIPT_MORPH_DURATION_MS = 360;
|
|
15
|
+
const RECEIPT_MORPH_EASING = "cubic-bezier(0.22, 1, 0.36, 1)";
|
|
16
|
+
const RECEIPT_ANCHORS = [
|
|
17
|
+
".seams-receipt-symbol",
|
|
18
|
+
"[role=\"status\"]",
|
|
19
|
+
".seams-review-amount"
|
|
20
|
+
];
|
|
21
|
+
function captureReceiptAnchors(surface) {
|
|
22
|
+
const anchors = [];
|
|
23
|
+
for (const selector of RECEIPT_ANCHORS) {
|
|
24
|
+
const element = surface.querySelector(selector);
|
|
25
|
+
if (!element) continue;
|
|
26
|
+
anchors.push({
|
|
27
|
+
selector,
|
|
28
|
+
text: element.textContent,
|
|
29
|
+
bounds: element.getBoundingClientRect(),
|
|
30
|
+
fontSize: getComputedStyle(element).fontSize
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return anchors;
|
|
34
|
+
}
|
|
14
35
|
let nextSurfaceId = 0;
|
|
15
36
|
var MountedConfirmationSurface = class {
|
|
16
37
|
constructor(input) {
|
|
@@ -22,6 +43,7 @@ var MountedConfirmationSurface = class {
|
|
|
22
43
|
this.receiptMotion = [];
|
|
23
44
|
this.receiptShell?.remove();
|
|
24
45
|
this.receiptShell = null;
|
|
46
|
+
this.element.removeAttribute("data-receipt-morphing");
|
|
25
47
|
};
|
|
26
48
|
this.dispose = () => {
|
|
27
49
|
if (this.state.kind === "disposed") return;
|
|
@@ -100,6 +122,7 @@ var MountedConfirmationSurface = class {
|
|
|
100
122
|
const viewChanged = this.receipt?.view !== model.view;
|
|
101
123
|
const previousShell = this.receiptShell ?? this.element.querySelector(".modal-container-root");
|
|
102
124
|
const previousBounds = previousShell?.getBoundingClientRect();
|
|
125
|
+
const anchors = viewChanged ? captureReceiptAnchors(this.element) : [];
|
|
103
126
|
const previousRadius = previousShell ? getComputedStyle(previousShell).borderRadius : "26px";
|
|
104
127
|
if (viewChanged) this.clearReceiptMotion();
|
|
105
128
|
this.receipt = model;
|
|
@@ -115,6 +138,7 @@ var MountedConfirmationSurface = class {
|
|
|
115
138
|
shell.setAttribute("aria-hidden", "true");
|
|
116
139
|
this.element.appendChild(shell);
|
|
117
140
|
this.receiptShell = shell;
|
|
141
|
+
this.element.setAttribute("data-receipt-morphing", "");
|
|
118
142
|
const morph = shell.animate([{
|
|
119
143
|
left: `${previousBounds.left}px`,
|
|
120
144
|
top: `${previousBounds.top}px`,
|
|
@@ -128,18 +152,48 @@ var MountedConfirmationSurface = class {
|
|
|
128
152
|
height: `${bounds.height}px`,
|
|
129
153
|
borderRadius: getComputedStyle(target).borderRadius
|
|
130
154
|
}], {
|
|
131
|
-
duration:
|
|
132
|
-
easing:
|
|
155
|
+
duration: RECEIPT_MORPH_DURATION_MS,
|
|
156
|
+
easing: RECEIPT_MORPH_EASING,
|
|
133
157
|
fill: "both"
|
|
134
158
|
});
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
159
|
+
this.receiptMotion = [morph];
|
|
160
|
+
const shared = /* @__PURE__ */ new Set();
|
|
161
|
+
for (const anchor of anchors) {
|
|
162
|
+
const element = target.querySelector(anchor.selector);
|
|
163
|
+
if (!element || element.textContent !== anchor.text) continue;
|
|
164
|
+
const destination = element.getBoundingClientRect();
|
|
165
|
+
shared.add(element);
|
|
166
|
+
const scale = parseFloat(anchor.fontSize) / parseFloat(getComputedStyle(element).fontSize);
|
|
167
|
+
this.receiptMotion.push(element.animate([{
|
|
168
|
+
transform: `translate(${anchor.bounds.left - destination.left}px, ${anchor.bounds.top - destination.top}px) scale(${scale})`,
|
|
169
|
+
transformOrigin: "top left"
|
|
170
|
+
}, {
|
|
171
|
+
transform: "translate(0, 0) scale(1)",
|
|
172
|
+
transformOrigin: "top left"
|
|
173
|
+
}], {
|
|
174
|
+
duration: RECEIPT_MORPH_DURATION_MS,
|
|
175
|
+
easing: RECEIPT_MORPH_EASING
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
const details = target.querySelectorAll(".seams-transaction-receipt > :not(.seams-receipt-heading), .seams-receipt-heading > .seams-receipt-symbol, .seams-receipt-heading h2, .seams-receipt-heading p, .seams-transaction-toast > :not(.seams-transaction-toast-text, .seams-toast-progress), .seams-transaction-toast-text > *");
|
|
179
|
+
let order = 0;
|
|
180
|
+
for (const detail of details) {
|
|
181
|
+
if (shared.has(detail)) continue;
|
|
182
|
+
this.receiptMotion.push(detail.animate([{
|
|
183
|
+
opacity: 0,
|
|
184
|
+
transform: "translateY(8px)"
|
|
185
|
+
}, {
|
|
186
|
+
opacity: 1,
|
|
187
|
+
transform: "translateY(0)"
|
|
188
|
+
}], {
|
|
189
|
+
duration: 120,
|
|
190
|
+
delay: model.view === "toast" ? 240 : 180 + Math.min(order, 4) * 15,
|
|
191
|
+
fill: "backwards",
|
|
192
|
+
easing: "ease-out"
|
|
193
|
+
}));
|
|
194
|
+
order += 1;
|
|
195
|
+
}
|
|
196
|
+
morph.onfinish = this.clearReceiptMotion;
|
|
143
197
|
}
|
|
144
198
|
}
|
|
145
199
|
remove() {
|
|
@@ -71,7 +71,7 @@ function isRegistrationBenchmarkDiagnosticsEnabled() {
|
|
|
71
71
|
function recordWalletCustodyTiming(ceremonyId, stage, startedAt) {
|
|
72
72
|
if (!isRegistrationBenchmarkDiagnosticsEnabled()) return;
|
|
73
73
|
try {
|
|
74
|
-
console.
|
|
74
|
+
console.info("[WalletCustody] timing " + JSON.stringify({
|
|
75
75
|
event: "wallet_custody_timing",
|
|
76
76
|
ceremonyId,
|
|
77
77
|
stage: `custody.${stage}`,
|
|
@@ -763,6 +763,7 @@ var SeamsWeb = class {
|
|
|
763
763
|
account: nearAccountBinding
|
|
764
764
|
} : { kind: "none" };
|
|
765
765
|
tasks.push(this.signingEngine.warmCriticalResources(accountContext));
|
|
766
|
+
tasks.push(this.signingEngine.prewarmEcdsaRegistrationCrypto());
|
|
766
767
|
}
|
|
767
768
|
if (tasks.length === 0) return;
|
|
768
769
|
let status = "succeeded";
|