@tatchi-xyz/sdk 0.19.0 → 0.21.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/EmailRecovery/index.js +25 -0
- package/dist/cjs/core/EmailRecovery/index.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/emailRecovery.js +135 -77
- package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/index.js +2 -1
- package/dist/cjs/core/TatchiPasskey/index.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/linkDevice.js +2 -1
- package/dist/cjs/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/scanDevice.js +5 -3
- package/dist/cjs/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/cjs/core/WalletIframe/client/router.js +1 -1
- package/dist/cjs/core/WalletIframe/client/router.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +3 -4
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/cjs/core/defaultConfigs.js +3 -7
- package/dist/cjs/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/core/nearCrypto.js +29 -5
- package/dist/cjs/core/nearCrypto.js.map +1 -1
- package/dist/cjs/core/rpcCalls.js +56 -26
- package/dist/cjs/core/rpcCalls.js.map +1 -1
- package/dist/cjs/core/types/emailRecovery.js +33 -0
- package/dist/cjs/core/types/emailRecovery.js.map +1 -0
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{LinkedDevicesModal-CSSowiHP.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
- package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-CEPMZ1gY.css → ProfileDropdown-BG_6hcim.css} +1 -1
- package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css → TouchIcon-C-RcGfr5.css} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css.map → PasskeyAuthMenu-DKMiLeT9.css.map} +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/adapters/tatchi.js +1 -0
- package/dist/cjs/react/components/PasskeyAuthMenu/adapters/tatchi.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/client.js +30 -8
- package/dist/cjs/react/components/PasskeyAuthMenu/client.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/controller/useSDKEvents.js +22 -0
- package/dist/cjs/react/components/PasskeyAuthMenu/controller/useSDKEvents.js.map +1 -0
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +17 -4
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +354 -154
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/cjs/react/components/{ShowQRCode-CCN4h6Uv.css → ShowQRCode-CB0UCQ_h.css} +1 -1
- package/dist/cjs/react/components/{ShowQRCode-CCN4h6Uv.css.map → ShowQRCode-CB0UCQ_h.css.map} +1 -1
- package/dist/cjs/react/context/useSDKFlowRuntime.js +183 -0
- package/dist/cjs/react/context/useSDKFlowRuntime.js.map +1 -0
- package/dist/cjs/react/context/useTatchiContextValue.js +24 -15
- package/dist/cjs/react/context/useTatchiContextValue.js.map +1 -1
- package/dist/cjs/react/context/useTatchiWithSdkFlow.js +96 -0
- package/dist/cjs/react/context/useTatchiWithSdkFlow.js.map +1 -0
- package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js +26 -0
- package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +135 -77
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js +2 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js +5 -3
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js +1 -1
- package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +3 -4
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/defaultConfigs.js +3 -7
- package/dist/cjs/react/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/nearCrypto.js +29 -5
- package/dist/cjs/react/sdk/src/core/nearCrypto.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/rpcCalls.js +56 -26
- package/dist/cjs/react/sdk/src/core/rpcCalls.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/types/emailRecovery.js +33 -0
- package/dist/cjs/react/sdk/src/core/types/emailRecovery.js.map +1 -0
- package/dist/cjs/server/email-recovery/emailParsers.js +2 -1
- package/dist/cjs/server/email-recovery/emailParsers.js.map +1 -1
- package/dist/cjs/server/email-recovery/index.js +6 -6
- package/dist/cjs/server/email-recovery/index.js.map +1 -1
- package/dist/cjs/server/email-recovery/rpcCalls.js +22 -3
- package/dist/cjs/server/email-recovery/rpcCalls.js.map +1 -1
- package/dist/cjs/server/router/cloudflare.js +8 -3
- package/dist/cjs/server/router/cloudflare.js.map +1 -1
- package/dist/cjs/server/router/express.js.map +1 -1
- package/dist/cjs/server/sdk/src/core/defaultConfigs.js +2 -4
- package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/server/sdk/src/core/nearCrypto.js +26 -7
- package/dist/cjs/server/sdk/src/core/nearCrypto.js.map +1 -1
- package/dist/esm/core/EmailRecovery/index.js +25 -1
- package/dist/esm/core/EmailRecovery/index.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/emailRecovery.js +136 -78
- package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/index.js +2 -1
- package/dist/esm/core/TatchiPasskey/index.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/linkDevice.js +2 -1
- package/dist/esm/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/scanDevice.js +5 -3
- package/dist/esm/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/esm/core/WalletIframe/client/router.js +1 -1
- package/dist/esm/core/WalletIframe/client/router.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -3
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/esm/core/defaultConfigs.js +3 -7
- package/dist/esm/core/defaultConfigs.js.map +1 -1
- package/dist/esm/core/nearCrypto.js +24 -6
- package/dist/esm/core/nearCrypto.js.map +1 -1
- package/dist/esm/core/rpcCalls.js +56 -26
- package/dist/esm/core/rpcCalls.js.map +1 -1
- package/dist/esm/core/types/emailRecovery.js +26 -0
- package/dist/esm/core/types/emailRecovery.js.map +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/components/AccountMenuButton/{LinkedDevicesModal-CSSowiHP.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
- package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-CEPMZ1gY.css → ProfileDropdown-BG_6hcim.css} +1 -1
- package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css → TouchIcon-C-RcGfr5.css} +1 -1
- package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css.map → PasskeyAuthMenu-DKMiLeT9.css.map} +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/adapters/tatchi.js +1 -0
- package/dist/esm/react/components/PasskeyAuthMenu/adapters/tatchi.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/client.js +30 -8
- package/dist/esm/react/components/PasskeyAuthMenu/client.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/controller/useSDKEvents.js +20 -0
- package/dist/esm/react/components/PasskeyAuthMenu/controller/useSDKEvents.js.map +1 -0
- package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +17 -4
- package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +354 -154
- package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/esm/react/components/{ShowQRCode-CCN4h6Uv.css → ShowQRCode-CB0UCQ_h.css} +1 -1
- package/dist/esm/react/components/{ShowQRCode-CCN4h6Uv.css.map → ShowQRCode-CB0UCQ_h.css.map} +1 -1
- package/dist/esm/react/context/useSDKFlowRuntime.js +181 -0
- package/dist/esm/react/context/useSDKFlowRuntime.js.map +1 -0
- package/dist/esm/react/context/useTatchiContextValue.js +25 -16
- package/dist/esm/react/context/useTatchiContextValue.js.map +1 -1
- package/dist/esm/react/context/useTatchiWithSdkFlow.js +94 -0
- package/dist/esm/react/context/useTatchiWithSdkFlow.js.map +1 -0
- package/dist/esm/react/sdk/src/core/EmailRecovery/index.js +25 -1
- package/dist/esm/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +136 -78
- package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js +2 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js +5 -3
- package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js +1 -1
- package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -3
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/esm/react/sdk/src/core/defaultConfigs.js +3 -7
- package/dist/esm/react/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/esm/react/sdk/src/core/nearCrypto.js +24 -6
- package/dist/esm/react/sdk/src/core/nearCrypto.js.map +1 -1
- package/dist/esm/react/sdk/src/core/rpcCalls.js +56 -26
- package/dist/esm/react/sdk/src/core/rpcCalls.js.map +1 -1
- package/dist/esm/react/sdk/src/core/types/emailRecovery.js +26 -0
- package/dist/esm/react/sdk/src/core/types/emailRecovery.js.map +1 -0
- package/dist/esm/react/styles/styles.css +58 -3
- package/dist/esm/sdk/{defaultConfigs-DpslkAQd.js → defaultConfigs-CfQDV-ya.js} +3 -7
- package/dist/esm/sdk/{getDeviceNumber-fXizNGQl.js → getDeviceNumber-BpernPnM.js} +4 -8
- package/dist/esm/sdk/getDeviceNumber-BpernPnM.js.map +1 -0
- package/dist/esm/sdk/offline-export-app.js +23 -6
- package/dist/esm/sdk/offline-export-app.js.map +1 -1
- package/dist/esm/sdk/{router-DuGYOd3G.js → router-BWtacLJg.js} +1 -1
- package/dist/esm/sdk/{rpcCalls-BQrJMTdg.js → rpcCalls-CYGJSCgm.js} +3 -3
- package/dist/esm/sdk/{rpcCalls-YVeUVMk2.js → rpcCalls-DZZSa-sk.js} +57 -27
- package/dist/esm/sdk/{transactions-bqaAwL4k.js → transactions-Cn9xTWlK.js} +2 -2
- package/dist/esm/sdk/{transactions-bqaAwL4k.js.map → transactions-Cn9xTWlK.js.map} +1 -1
- package/dist/esm/sdk/{transactions-BalIhtJ9.js → transactions-DfdwDQCn.js} +1 -1
- package/dist/esm/sdk/wallet-iframe-host.js +660 -590
- package/dist/esm/server/email-recovery/emailParsers.js +3 -1
- package/dist/esm/server/email-recovery/emailParsers.js.map +1 -1
- package/dist/esm/server/email-recovery/index.js +6 -6
- package/dist/esm/server/email-recovery/index.js.map +1 -1
- package/dist/esm/server/email-recovery/rpcCalls.js +22 -3
- package/dist/esm/server/email-recovery/rpcCalls.js.map +1 -1
- package/dist/esm/server/router/cloudflare.js +8 -3
- package/dist/esm/server/router/cloudflare.js.map +1 -1
- package/dist/esm/server/router/express.js.map +1 -1
- package/dist/esm/server/sdk/src/core/defaultConfigs.js +2 -4
- package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/esm/server/sdk/src/core/nearCrypto.js +26 -8
- package/dist/esm/server/sdk/src/core/nearCrypto.js.map +1 -1
- package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/types/src/core/EmailRecovery/index.d.ts +8 -0
- package/dist/types/src/core/EmailRecovery/index.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +8 -5
- package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/index.d.ts +1 -1
- package/dist/types/src/core/TatchiPasskey/index.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/scanDevice.d.ts.map +1 -1
- package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts +1 -1
- package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts.map +1 -1
- package/dist/types/src/core/WalletIframe/client/router.d.ts +1 -1
- package/dist/types/src/core/WalletIframe/client/router.d.ts.map +1 -1
- package/dist/types/src/core/WalletIframe/shared/messages.d.ts +1 -1
- package/dist/types/src/core/WalletIframe/shared/messages.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.d.ts +2 -1
- package/dist/types/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.d.ts.map +1 -1
- package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
- package/dist/types/src/core/nearCrypto.d.ts +14 -0
- package/dist/types/src/core/nearCrypto.d.ts.map +1 -1
- package/dist/types/src/core/rpcCalls.d.ts +11 -8
- package/dist/types/src/core/rpcCalls.d.ts.map +1 -1
- package/dist/types/src/core/types/emailRecovery.d.ts +10 -0
- package/dist/types/src/core/types/emailRecovery.d.ts.map +1 -0
- package/dist/types/src/core/types/index.d.ts +1 -0
- package/dist/types/src/core/types/index.d.ts.map +1 -1
- package/dist/types/src/core/types/tatchi.d.ts +0 -4
- package/dist/types/src/core/types/tatchi.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/adapters/tatchi.d.ts +2 -0
- package/dist/types/src/react/components/PasskeyAuthMenu/adapters/tatchi.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/controller/useSDKEvents.d.ts +10 -0
- package/dist/types/src/react/components/PasskeyAuthMenu/controller/useSDKEvents.d.ts.map +1 -0
- package/dist/types/src/react/components/PasskeyAuthMenu/types.d.ts +8 -3
- package/dist/types/src/react/components/PasskeyAuthMenu/types.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts +2 -0
- package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
- package/dist/types/src/react/context/useSDKFlowRuntime.d.ts +10 -0
- package/dist/types/src/react/context/useSDKFlowRuntime.d.ts.map +1 -0
- package/dist/types/src/react/context/useTatchiContextValue.d.ts.map +1 -1
- package/dist/types/src/react/context/useTatchiWithSdkFlow.d.ts +9 -0
- package/dist/types/src/react/context/useTatchiWithSdkFlow.d.ts.map +1 -0
- package/dist/types/src/react/types.d.ts +31 -0
- package/dist/types/src/react/types.d.ts.map +1 -1
- package/dist/types/src/server/email-recovery/emailParsers.d.ts.map +1 -1
- package/dist/types/src/server/email-recovery/index.d.ts +5 -6
- package/dist/types/src/server/email-recovery/index.d.ts.map +1 -1
- package/dist/types/src/server/email-recovery/rpcCalls.d.ts +1 -0
- package/dist/types/src/server/email-recovery/rpcCalls.d.ts.map +1 -1
- package/dist/types/src/server/router/cloudflare-adaptor.d.ts.map +1 -1
- package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
- package/package.json +1 -1
- package/dist/esm/sdk/getDeviceNumber-fXizNGQl.js.map +0 -1
|
@@ -6,7 +6,7 @@ import "./asset-base-K63RlTrt.js";
|
|
|
6
6
|
import "./tx-tree-themes-BND0SU2h.js";
|
|
7
7
|
import { CONFIRM_UI_ELEMENT_SELECTORS, W3A_TX_BUTTON_HOST_ID, W3A_TX_BUTTON_ID, defineTag } from "./tags-C2Wlhqjd.js";
|
|
8
8
|
import { WalletIframeDomEvents, computeUiIntentDigestFromTxs, orderActionForDigest } from "./txDigest-CxjhSCgm.js";
|
|
9
|
-
import { base64UrlDecode } from "./base64-DBPGuXh4.js";
|
|
9
|
+
import { base64Decode, base64UrlDecode, init_base64 } from "./base64-DBPGuXh4.js";
|
|
10
10
|
import { ActionType, init_actions, toActionArgsWasm, validateActionArgsWasm } from "./actions-O1FD5Bq8.js";
|
|
11
11
|
import { ensureKnownW3aElement } from "./ensure-defined-CHInSx7l.js";
|
|
12
12
|
import { base58Encode, errorMessage, esm_default, getNearShortErrorMessage, getUserFriendlyErrorMessage, init_base58, init_encoders, init_errors, init_esm, isTouchIdCancellationError, toError } from "./errors-D9ar28Dr.js";
|
|
@@ -14,8 +14,8 @@ import { init_credentialsHelpers, init_utils, init_validation as init_validation
|
|
|
14
14
|
import { MinimalNearClient, SignedTransaction, isOffline, openOfflineExport } from "./overlay-ZGbucXIa.js";
|
|
15
15
|
import { AccountRecoveryPhase, AccountRecoveryStatus, ActionPhase, ActionStatus, DEFAULT_WAIT_STATUS, DeviceLinkingPhase, DeviceLinkingStatus, EmailRecoveryPhase, EmailRecoveryStatus, LoginPhase, LoginStatus, RegistrationPhase, RegistrationStatus, init_rpc, init_sdkSentEvents } from "./sdkSentEvents-_jrJLIhw.js";
|
|
16
16
|
import { SecureConfirmMessageType, SecureConfirmationType, TouchIdPrompt, authenticatorsToAllowCredentials, createRandomVRFChallenge, getIntentDigest, init_accountIds, init_touchIdPrompt, init_vrf_worker, parseTransactionSummary, sanitizeForPostMessage, sendConfirmResponse, toAccountId, validateVRFChallenge } from "./requestHelpers-Dh1hEYL9.js";
|
|
17
|
-
import { PASSKEY_MANAGER_DEFAULT_CONFIGS, buildConfigsFromEnv, init_defaultConfigs } from "./defaultConfigs-
|
|
18
|
-
import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getRecoveryEmailHashesContractCall, init_rpcCalls, syncAuthenticatorsContractCall, verifyAuthenticationResponse } from "./rpcCalls-
|
|
17
|
+
import { PASSKEY_MANAGER_DEFAULT_CONFIGS, buildConfigsFromEnv, init_defaultConfigs } from "./defaultConfigs-CfQDV-ya.js";
|
|
18
|
+
import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getEmailRecoveryAttempt, getRecoveryEmailHashesContractCall, init_rpcCalls, syncAuthenticatorsContractCall, verifyAuthenticationResponse } from "./rpcCalls-DZZSa-sk.js";
|
|
19
19
|
import { getLastLoggedInDeviceNumber, init_getDeviceNumber, parseDeviceNumber } from "./getDeviceNumber-zsOHT_Um.js";
|
|
20
20
|
|
|
21
21
|
//#region src/core/sdkPaths/workers.ts
|
|
@@ -2226,6 +2226,7 @@ init_utils();
|
|
|
2226
2226
|
init_encoders();
|
|
2227
2227
|
init_base58();
|
|
2228
2228
|
init_esm();
|
|
2229
|
+
init_base64();
|
|
2229
2230
|
/**
|
|
2230
2231
|
* Control messages exchanged between worker shims and the main thread.
|
|
2231
2232
|
*
|
|
@@ -2666,10 +2667,480 @@ async function signTransactionsWithActions$1({ ctx, transactions, rpcCall, onEve
|
|
|
2666
2667
|
}
|
|
2667
2668
|
}
|
|
2668
2669
|
|
|
2670
|
+
//#endregion
|
|
2671
|
+
//#region ../node_modules/.pnpm/@noble+ed25519@2.3.0/node_modules/@noble/ed25519/index.js
|
|
2672
|
+
var ed25519_CURVE, P, N, Gx, Gy, _a, _d, h, L, L2, err, isBig, isStr, isBytes, abytes, u8n, u8fr, padh, bytesToHex$1, C, _ch, hexToBytes, toU8, cr, subtle, concatBytes, randomBytes, big, arange, M, modN, invert, callHash, apoint, B256, Point, G, I, numTo32bLE, bytesToNumLE, pow2, pow_2_252_3, RM1, uvRatio, modL_LE, sha512a, sha512s, hash2extK, getExtendedPublicKeyAsync, getExtendedPublicKey, getPublicKeyAsync, etc, utils, W, scalarBits, pwindows, pwindowSize, precompute, Gpows, ctneg, wNAF;
|
|
2673
|
+
var init_ed25519 = __esm({ "../node_modules/.pnpm/@noble+ed25519@2.3.0/node_modules/@noble/ed25519/index.js": (() => {
|
|
2674
|
+
ed25519_CURVE = {
|
|
2675
|
+
p: 57896044618658097711785492504343953926634992332820282019728792003956564819949n,
|
|
2676
|
+
n: 7237005577332262213973186563042994240857116359379907606001950938285454250989n,
|
|
2677
|
+
h: 8n,
|
|
2678
|
+
a: 57896044618658097711785492504343953926634992332820282019728792003956564819948n,
|
|
2679
|
+
d: 37095705934669439343138083508754565189542113879843219016388785533085940283555n,
|
|
2680
|
+
Gx: 15112221349535400772501151409588531511454012693041857206046113283949847762202n,
|
|
2681
|
+
Gy: 46316835694926478169428394003475163141307993866256225615783033603165251855960n
|
|
2682
|
+
};
|
|
2683
|
+
({p: P, n: N, Gx, Gy, a: _a, d: _d} = ed25519_CURVE);
|
|
2684
|
+
h = 8n;
|
|
2685
|
+
L = 32;
|
|
2686
|
+
L2 = 64;
|
|
2687
|
+
err = (m = "") => {
|
|
2688
|
+
throw new Error(m);
|
|
2689
|
+
};
|
|
2690
|
+
isBig = (n) => typeof n === "bigint";
|
|
2691
|
+
isStr = (s) => typeof s === "string";
|
|
2692
|
+
isBytes = (a) => a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
|
|
2693
|
+
abytes = (a, l) => !isBytes(a) || typeof l === "number" && l > 0 && a.length !== l ? err("Uint8Array expected") : a;
|
|
2694
|
+
u8n = (len) => new Uint8Array(len);
|
|
2695
|
+
u8fr = (buf) => Uint8Array.from(buf);
|
|
2696
|
+
padh = (n, pad) => n.toString(16).padStart(pad, "0");
|
|
2697
|
+
bytesToHex$1 = (b) => Array.from(abytes(b)).map((e) => padh(e, 2)).join("");
|
|
2698
|
+
C = {
|
|
2699
|
+
_0: 48,
|
|
2700
|
+
_9: 57,
|
|
2701
|
+
A: 65,
|
|
2702
|
+
F: 70,
|
|
2703
|
+
a: 97,
|
|
2704
|
+
f: 102
|
|
2705
|
+
};
|
|
2706
|
+
_ch = (ch) => {
|
|
2707
|
+
if (ch >= C._0 && ch <= C._9) return ch - C._0;
|
|
2708
|
+
if (ch >= C.A && ch <= C.F) return ch - (C.A - 10);
|
|
2709
|
+
if (ch >= C.a && ch <= C.f) return ch - (C.a - 10);
|
|
2710
|
+
};
|
|
2711
|
+
hexToBytes = (hex) => {
|
|
2712
|
+
const e = "hex invalid";
|
|
2713
|
+
if (!isStr(hex)) return err(e);
|
|
2714
|
+
const hl = hex.length;
|
|
2715
|
+
const al = hl / 2;
|
|
2716
|
+
if (hl % 2) return err(e);
|
|
2717
|
+
const array = u8n(al);
|
|
2718
|
+
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
2719
|
+
const n1 = _ch(hex.charCodeAt(hi));
|
|
2720
|
+
const n2 = _ch(hex.charCodeAt(hi + 1));
|
|
2721
|
+
if (n1 === void 0 || n2 === void 0) return err(e);
|
|
2722
|
+
array[ai] = n1 * 16 + n2;
|
|
2723
|
+
}
|
|
2724
|
+
return array;
|
|
2725
|
+
};
|
|
2726
|
+
toU8 = (a, len) => abytes(isStr(a) ? hexToBytes(a) : u8fr(abytes(a)), len);
|
|
2727
|
+
cr = () => globalThis?.crypto;
|
|
2728
|
+
subtle = () => cr()?.subtle ?? err("crypto.subtle must be defined");
|
|
2729
|
+
concatBytes = (...arrs) => {
|
|
2730
|
+
const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0));
|
|
2731
|
+
let pad = 0;
|
|
2732
|
+
arrs.forEach((a) => {
|
|
2733
|
+
r.set(a, pad);
|
|
2734
|
+
pad += a.length;
|
|
2735
|
+
});
|
|
2736
|
+
return r;
|
|
2737
|
+
};
|
|
2738
|
+
randomBytes = (len = L) => {
|
|
2739
|
+
const c = cr();
|
|
2740
|
+
return c.getRandomValues(u8n(len));
|
|
2741
|
+
};
|
|
2742
|
+
big = BigInt;
|
|
2743
|
+
arange = (n, min, max, msg = "bad number: out of range") => isBig(n) && min <= n && n < max ? n : err(msg);
|
|
2744
|
+
M = (a, b = P) => {
|
|
2745
|
+
const r = a % b;
|
|
2746
|
+
return r >= 0n ? r : b + r;
|
|
2747
|
+
};
|
|
2748
|
+
modN = (a) => M(a, N);
|
|
2749
|
+
invert = (num, md) => {
|
|
2750
|
+
if (num === 0n || md <= 0n) err("no inverse n=" + num + " mod=" + md);
|
|
2751
|
+
let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;
|
|
2752
|
+
while (a !== 0n) {
|
|
2753
|
+
const q = b / a, r = b % a;
|
|
2754
|
+
const m = x - u * q, n = y - v * q;
|
|
2755
|
+
b = a, a = r, x = u, y = v, u = m, v = n;
|
|
2756
|
+
}
|
|
2757
|
+
return b === 1n ? M(x, md) : err("no inverse");
|
|
2758
|
+
};
|
|
2759
|
+
callHash = (name) => {
|
|
2760
|
+
const fn = etc[name];
|
|
2761
|
+
if (typeof fn !== "function") err("hashes." + name + " not set");
|
|
2762
|
+
return fn;
|
|
2763
|
+
};
|
|
2764
|
+
apoint = (p) => p instanceof Point ? p : err("Point expected");
|
|
2765
|
+
B256 = 2n ** 256n;
|
|
2766
|
+
Point = class Point {
|
|
2767
|
+
static BASE;
|
|
2768
|
+
static ZERO;
|
|
2769
|
+
ex;
|
|
2770
|
+
ey;
|
|
2771
|
+
ez;
|
|
2772
|
+
et;
|
|
2773
|
+
constructor(ex, ey, ez, et) {
|
|
2774
|
+
const max = B256;
|
|
2775
|
+
this.ex = arange(ex, 0n, max);
|
|
2776
|
+
this.ey = arange(ey, 0n, max);
|
|
2777
|
+
this.ez = arange(ez, 1n, max);
|
|
2778
|
+
this.et = arange(et, 0n, max);
|
|
2779
|
+
Object.freeze(this);
|
|
2780
|
+
}
|
|
2781
|
+
static fromAffine(p) {
|
|
2782
|
+
return new Point(p.x, p.y, 1n, M(p.x * p.y));
|
|
2783
|
+
}
|
|
2784
|
+
/** RFC8032 5.1.3: Uint8Array to Point. */
|
|
2785
|
+
static fromBytes(hex, zip215 = false) {
|
|
2786
|
+
const d = _d;
|
|
2787
|
+
const normed = u8fr(abytes(hex, L));
|
|
2788
|
+
const lastByte = hex[31];
|
|
2789
|
+
normed[31] = lastByte & -129;
|
|
2790
|
+
const y = bytesToNumLE(normed);
|
|
2791
|
+
const max = zip215 ? B256 : P;
|
|
2792
|
+
arange(y, 0n, max);
|
|
2793
|
+
const y2 = M(y * y);
|
|
2794
|
+
const u = M(y2 - 1n);
|
|
2795
|
+
const v = M(d * y2 + 1n);
|
|
2796
|
+
let { isValid, value: x } = uvRatio(u, v);
|
|
2797
|
+
if (!isValid) err("bad point: y not sqrt");
|
|
2798
|
+
const isXOdd = (x & 1n) === 1n;
|
|
2799
|
+
const isLastByteOdd = (lastByte & 128) !== 0;
|
|
2800
|
+
if (!zip215 && x === 0n && isLastByteOdd) err("bad point: x==0, isLastByteOdd");
|
|
2801
|
+
if (isLastByteOdd !== isXOdd) x = M(-x);
|
|
2802
|
+
return new Point(x, y, 1n, M(x * y));
|
|
2803
|
+
}
|
|
2804
|
+
/** Checks if the point is valid and on-curve. */
|
|
2805
|
+
assertValidity() {
|
|
2806
|
+
const a = _a;
|
|
2807
|
+
const d = _d;
|
|
2808
|
+
const p = this;
|
|
2809
|
+
if (p.is0()) throw new Error("bad point: ZERO");
|
|
2810
|
+
const { ex: X, ey: Y, ez: Z, et: T } = p;
|
|
2811
|
+
const X2 = M(X * X);
|
|
2812
|
+
const Y2 = M(Y * Y);
|
|
2813
|
+
const Z2 = M(Z * Z);
|
|
2814
|
+
const Z4 = M(Z2 * Z2);
|
|
2815
|
+
const aX2 = M(X2 * a);
|
|
2816
|
+
const left = M(Z2 * M(aX2 + Y2));
|
|
2817
|
+
const right = M(Z4 + M(d * M(X2 * Y2)));
|
|
2818
|
+
if (left !== right) throw new Error("bad point: equation left != right (1)");
|
|
2819
|
+
const XY = M(X * Y);
|
|
2820
|
+
const ZT = M(Z * T);
|
|
2821
|
+
if (XY !== ZT) throw new Error("bad point: equation left != right (2)");
|
|
2822
|
+
return this;
|
|
2823
|
+
}
|
|
2824
|
+
/** Equality check: compare points P&Q. */
|
|
2825
|
+
equals(other) {
|
|
2826
|
+
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
2827
|
+
const { ex: X2, ey: Y2, ez: Z2 } = apoint(other);
|
|
2828
|
+
const X1Z2 = M(X1 * Z2);
|
|
2829
|
+
const X2Z1 = M(X2 * Z1);
|
|
2830
|
+
const Y1Z2 = M(Y1 * Z2);
|
|
2831
|
+
const Y2Z1 = M(Y2 * Z1);
|
|
2832
|
+
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
2833
|
+
}
|
|
2834
|
+
is0() {
|
|
2835
|
+
return this.equals(I);
|
|
2836
|
+
}
|
|
2837
|
+
/** Flip point over y coordinate. */
|
|
2838
|
+
negate() {
|
|
2839
|
+
return new Point(M(-this.ex), this.ey, this.ez, M(-this.et));
|
|
2840
|
+
}
|
|
2841
|
+
/** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */
|
|
2842
|
+
double() {
|
|
2843
|
+
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
2844
|
+
const a = _a;
|
|
2845
|
+
const A = M(X1 * X1);
|
|
2846
|
+
const B = M(Y1 * Y1);
|
|
2847
|
+
const C$1 = M(2n * M(Z1 * Z1));
|
|
2848
|
+
const D = M(a * A);
|
|
2849
|
+
const x1y1 = X1 + Y1;
|
|
2850
|
+
const E = M(M(x1y1 * x1y1) - A - B);
|
|
2851
|
+
const G$1 = D + B;
|
|
2852
|
+
const F = G$1 - C$1;
|
|
2853
|
+
const H = D - B;
|
|
2854
|
+
const X3 = M(E * F);
|
|
2855
|
+
const Y3 = M(G$1 * H);
|
|
2856
|
+
const T3 = M(E * H);
|
|
2857
|
+
const Z3 = M(F * G$1);
|
|
2858
|
+
return new Point(X3, Y3, Z3, T3);
|
|
2859
|
+
}
|
|
2860
|
+
/** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */
|
|
2861
|
+
add(other) {
|
|
2862
|
+
const { ex: X1, ey: Y1, ez: Z1, et: T1 } = this;
|
|
2863
|
+
const { ex: X2, ey: Y2, ez: Z2, et: T2 } = apoint(other);
|
|
2864
|
+
const a = _a;
|
|
2865
|
+
const d = _d;
|
|
2866
|
+
const A = M(X1 * X2);
|
|
2867
|
+
const B = M(Y1 * Y2);
|
|
2868
|
+
const C$1 = M(T1 * d * T2);
|
|
2869
|
+
const D = M(Z1 * Z2);
|
|
2870
|
+
const E = M((X1 + Y1) * (X2 + Y2) - A - B);
|
|
2871
|
+
const F = M(D - C$1);
|
|
2872
|
+
const G$1 = M(D + C$1);
|
|
2873
|
+
const H = M(B - a * A);
|
|
2874
|
+
const X3 = M(E * F);
|
|
2875
|
+
const Y3 = M(G$1 * H);
|
|
2876
|
+
const T3 = M(E * H);
|
|
2877
|
+
const Z3 = M(F * G$1);
|
|
2878
|
+
return new Point(X3, Y3, Z3, T3);
|
|
2879
|
+
}
|
|
2880
|
+
/**
|
|
2881
|
+
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
2882
|
+
* Uses {@link wNAF} for base point.
|
|
2883
|
+
* Uses fake point to mitigate side-channel leakage.
|
|
2884
|
+
* @param n scalar by which point is multiplied
|
|
2885
|
+
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
2886
|
+
*/
|
|
2887
|
+
multiply(n, safe = true) {
|
|
2888
|
+
if (!safe && (n === 0n || this.is0())) return I;
|
|
2889
|
+
arange(n, 1n, N);
|
|
2890
|
+
if (n === 1n) return this;
|
|
2891
|
+
if (this.equals(G)) return wNAF(n).p;
|
|
2892
|
+
let p = I;
|
|
2893
|
+
let f = G;
|
|
2894
|
+
for (let d = this; n > 0n; d = d.double(), n >>= 1n) if (n & 1n) p = p.add(d);
|
|
2895
|
+
else if (safe) f = f.add(d);
|
|
2896
|
+
return p;
|
|
2897
|
+
}
|
|
2898
|
+
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
2899
|
+
toAffine() {
|
|
2900
|
+
const { ex: x, ey: y, ez: z } = this;
|
|
2901
|
+
if (this.equals(I)) return {
|
|
2902
|
+
x: 0n,
|
|
2903
|
+
y: 1n
|
|
2904
|
+
};
|
|
2905
|
+
const iz = invert(z, P);
|
|
2906
|
+
if (M(z * iz) !== 1n) err("invalid inverse");
|
|
2907
|
+
return {
|
|
2908
|
+
x: M(x * iz),
|
|
2909
|
+
y: M(y * iz)
|
|
2910
|
+
};
|
|
2911
|
+
}
|
|
2912
|
+
toBytes() {
|
|
2913
|
+
const { x, y } = this.assertValidity().toAffine();
|
|
2914
|
+
const b = numTo32bLE(y);
|
|
2915
|
+
b[31] |= x & 1n ? 128 : 0;
|
|
2916
|
+
return b;
|
|
2917
|
+
}
|
|
2918
|
+
toHex() {
|
|
2919
|
+
return bytesToHex$1(this.toBytes());
|
|
2920
|
+
}
|
|
2921
|
+
clearCofactor() {
|
|
2922
|
+
return this.multiply(big(h), false);
|
|
2923
|
+
}
|
|
2924
|
+
isSmallOrder() {
|
|
2925
|
+
return this.clearCofactor().is0();
|
|
2926
|
+
}
|
|
2927
|
+
isTorsionFree() {
|
|
2928
|
+
let p = this.multiply(N / 2n, false).double();
|
|
2929
|
+
if (N % 2n) p = p.add(this);
|
|
2930
|
+
return p.is0();
|
|
2931
|
+
}
|
|
2932
|
+
static fromHex(hex, zip215) {
|
|
2933
|
+
return Point.fromBytes(toU8(hex), zip215);
|
|
2934
|
+
}
|
|
2935
|
+
get x() {
|
|
2936
|
+
return this.toAffine().x;
|
|
2937
|
+
}
|
|
2938
|
+
get y() {
|
|
2939
|
+
return this.toAffine().y;
|
|
2940
|
+
}
|
|
2941
|
+
toRawBytes() {
|
|
2942
|
+
return this.toBytes();
|
|
2943
|
+
}
|
|
2944
|
+
};
|
|
2945
|
+
G = new Point(Gx, Gy, 1n, M(Gx * Gy));
|
|
2946
|
+
I = new Point(0n, 1n, 1n, 0n);
|
|
2947
|
+
Point.BASE = G;
|
|
2948
|
+
Point.ZERO = I;
|
|
2949
|
+
numTo32bLE = (num) => hexToBytes(padh(arange(num, 0n, B256), L2)).reverse();
|
|
2950
|
+
bytesToNumLE = (b) => big("0x" + bytesToHex$1(u8fr(abytes(b)).reverse()));
|
|
2951
|
+
pow2 = (x, power) => {
|
|
2952
|
+
let r = x;
|
|
2953
|
+
while (power-- > 0n) {
|
|
2954
|
+
r *= r;
|
|
2955
|
+
r %= P;
|
|
2956
|
+
}
|
|
2957
|
+
return r;
|
|
2958
|
+
};
|
|
2959
|
+
pow_2_252_3 = (x) => {
|
|
2960
|
+
const x2 = x * x % P;
|
|
2961
|
+
const b2 = x2 * x % P;
|
|
2962
|
+
const b4 = pow2(b2, 2n) * b2 % P;
|
|
2963
|
+
const b5 = pow2(b4, 1n) * x % P;
|
|
2964
|
+
const b10 = pow2(b5, 5n) * b5 % P;
|
|
2965
|
+
const b20 = pow2(b10, 10n) * b10 % P;
|
|
2966
|
+
const b40 = pow2(b20, 20n) * b20 % P;
|
|
2967
|
+
const b80 = pow2(b40, 40n) * b40 % P;
|
|
2968
|
+
const b160 = pow2(b80, 80n) * b80 % P;
|
|
2969
|
+
const b240 = pow2(b160, 80n) * b80 % P;
|
|
2970
|
+
const b250 = pow2(b240, 10n) * b10 % P;
|
|
2971
|
+
const pow_p_5_8 = pow2(b250, 2n) * x % P;
|
|
2972
|
+
return {
|
|
2973
|
+
pow_p_5_8,
|
|
2974
|
+
b2
|
|
2975
|
+
};
|
|
2976
|
+
};
|
|
2977
|
+
RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n;
|
|
2978
|
+
uvRatio = (u, v) => {
|
|
2979
|
+
const v3 = M(v * v * v);
|
|
2980
|
+
const v7 = M(v3 * v3 * v);
|
|
2981
|
+
const pow = pow_2_252_3(u * v7).pow_p_5_8;
|
|
2982
|
+
let x = M(u * v3 * pow);
|
|
2983
|
+
const vx2 = M(v * x * x);
|
|
2984
|
+
const root1 = x;
|
|
2985
|
+
const root2 = M(x * RM1);
|
|
2986
|
+
const useRoot1 = vx2 === u;
|
|
2987
|
+
const useRoot2 = vx2 === M(-u);
|
|
2988
|
+
const noRoot = vx2 === M(-u * RM1);
|
|
2989
|
+
if (useRoot1) x = root1;
|
|
2990
|
+
if (useRoot2 || noRoot) x = root2;
|
|
2991
|
+
if ((M(x) & 1n) === 1n) x = M(-x);
|
|
2992
|
+
return {
|
|
2993
|
+
isValid: useRoot1 || useRoot2,
|
|
2994
|
+
value: x
|
|
2995
|
+
};
|
|
2996
|
+
};
|
|
2997
|
+
modL_LE = (hash) => modN(bytesToNumLE(hash));
|
|
2998
|
+
sha512a = (...m) => etc.sha512Async(...m);
|
|
2999
|
+
sha512s = (...m) => callHash("sha512Sync")(...m);
|
|
3000
|
+
hash2extK = (hashed) => {
|
|
3001
|
+
const head = hashed.slice(0, L);
|
|
3002
|
+
head[0] &= 248;
|
|
3003
|
+
head[31] &= 127;
|
|
3004
|
+
head[31] |= 64;
|
|
3005
|
+
const prefix = hashed.slice(L, L2);
|
|
3006
|
+
const scalar = modL_LE(head);
|
|
3007
|
+
const point = G.multiply(scalar);
|
|
3008
|
+
const pointBytes = point.toBytes();
|
|
3009
|
+
return {
|
|
3010
|
+
head,
|
|
3011
|
+
prefix,
|
|
3012
|
+
scalar,
|
|
3013
|
+
point,
|
|
3014
|
+
pointBytes
|
|
3015
|
+
};
|
|
3016
|
+
};
|
|
3017
|
+
getExtendedPublicKeyAsync = (priv) => sha512a(toU8(priv, L)).then(hash2extK);
|
|
3018
|
+
getExtendedPublicKey = (priv) => hash2extK(sha512s(toU8(priv, L)));
|
|
3019
|
+
getPublicKeyAsync = (priv) => getExtendedPublicKeyAsync(priv).then((p) => p.pointBytes);
|
|
3020
|
+
etc = {
|
|
3021
|
+
sha512Async: async (...messages) => {
|
|
3022
|
+
const s = subtle();
|
|
3023
|
+
const m = concatBytes(...messages);
|
|
3024
|
+
return u8n(await s.digest("SHA-512", m.buffer));
|
|
3025
|
+
},
|
|
3026
|
+
sha512Sync: void 0,
|
|
3027
|
+
bytesToHex: bytesToHex$1,
|
|
3028
|
+
hexToBytes,
|
|
3029
|
+
concatBytes,
|
|
3030
|
+
mod: M,
|
|
3031
|
+
invert,
|
|
3032
|
+
randomBytes
|
|
3033
|
+
};
|
|
3034
|
+
utils = {
|
|
3035
|
+
getExtendedPublicKeyAsync,
|
|
3036
|
+
getExtendedPublicKey,
|
|
3037
|
+
randomPrivateKey: () => randomBytes(L),
|
|
3038
|
+
precompute: (w = 8, p = G) => {
|
|
3039
|
+
p.multiply(3n);
|
|
3040
|
+
return p;
|
|
3041
|
+
}
|
|
3042
|
+
};
|
|
3043
|
+
W = 8;
|
|
3044
|
+
scalarBits = 256;
|
|
3045
|
+
pwindows = Math.ceil(scalarBits / W) + 1;
|
|
3046
|
+
pwindowSize = 2 ** (W - 1);
|
|
3047
|
+
precompute = () => {
|
|
3048
|
+
const points = [];
|
|
3049
|
+
let p = G;
|
|
3050
|
+
let b = p;
|
|
3051
|
+
for (let w = 0; w < pwindows; w++) {
|
|
3052
|
+
b = p;
|
|
3053
|
+
points.push(b);
|
|
3054
|
+
for (let i = 1; i < pwindowSize; i++) {
|
|
3055
|
+
b = b.add(p);
|
|
3056
|
+
points.push(b);
|
|
3057
|
+
}
|
|
3058
|
+
p = b.double();
|
|
3059
|
+
}
|
|
3060
|
+
return points;
|
|
3061
|
+
};
|
|
3062
|
+
Gpows = void 0;
|
|
3063
|
+
ctneg = (cnd, p) => {
|
|
3064
|
+
const n = p.negate();
|
|
3065
|
+
return cnd ? n : p;
|
|
3066
|
+
};
|
|
3067
|
+
wNAF = (n) => {
|
|
3068
|
+
const comp = Gpows || (Gpows = precompute());
|
|
3069
|
+
let p = I;
|
|
3070
|
+
let f = G;
|
|
3071
|
+
const pow_2_w = 2 ** W;
|
|
3072
|
+
const maxNum = pow_2_w;
|
|
3073
|
+
const mask = big(pow_2_w - 1);
|
|
3074
|
+
const shiftBy = big(W);
|
|
3075
|
+
for (let w = 0; w < pwindows; w++) {
|
|
3076
|
+
let wbits = Number(n & mask);
|
|
3077
|
+
n >>= shiftBy;
|
|
3078
|
+
if (wbits > pwindowSize) {
|
|
3079
|
+
wbits -= maxNum;
|
|
3080
|
+
n += 1n;
|
|
3081
|
+
}
|
|
3082
|
+
const off = w * pwindowSize;
|
|
3083
|
+
const offF = off;
|
|
3084
|
+
const offP = off + Math.abs(wbits) - 1;
|
|
3085
|
+
const isEven = w % 2 !== 0;
|
|
3086
|
+
const isNeg = wbits < 0;
|
|
3087
|
+
if (wbits === 0) f = f.add(ctneg(isEven, comp[offF]));
|
|
3088
|
+
else p = p.add(ctneg(isNeg, comp[offP]));
|
|
3089
|
+
}
|
|
3090
|
+
return {
|
|
3091
|
+
p,
|
|
3092
|
+
f
|
|
3093
|
+
};
|
|
3094
|
+
};
|
|
3095
|
+
}) });
|
|
3096
|
+
|
|
3097
|
+
//#endregion
|
|
3098
|
+
//#region src/core/nearCrypto.ts
|
|
3099
|
+
/**
|
|
3100
|
+
* Ensure a key string has the NEAR Ed25519 prefix (`ed25519:`).
|
|
3101
|
+
*
|
|
3102
|
+
* - Accepts either `ed25519:<base58>` or a bare `<base58>` string.
|
|
3103
|
+
* - Canonicalizes `ED25519:` → `ed25519:`.
|
|
3104
|
+
* - If a different prefix is present (e.g. `secp256k1:`), returns the input unchanged.
|
|
3105
|
+
*/
|
|
3106
|
+
function ensureEd25519Prefix(value) {
|
|
3107
|
+
const raw = String(value || "").trim();
|
|
3108
|
+
if (!raw) return "";
|
|
3109
|
+
if (/^[a-z0-9_]+:/i.test(raw)) {
|
|
3110
|
+
if (/^ed25519:/i.test(raw)) return `${NEAR_ED25519_KEY_PREFIX}${raw.replace(/^ed25519:/i, "")}`;
|
|
3111
|
+
return raw;
|
|
3112
|
+
}
|
|
3113
|
+
return `${NEAR_ED25519_KEY_PREFIX}${raw}`;
|
|
3114
|
+
}
|
|
3115
|
+
/**
|
|
3116
|
+
* Creates a NEAR-compatible Ed25519 keypair formatted as strings:
|
|
3117
|
+
* - publicKey: 'ed25519:' + base58(pub)
|
|
3118
|
+
* - privateKey: 'ed25519:' + base58(seed(32) | pub(32))
|
|
3119
|
+
*/
|
|
3120
|
+
async function createNearKeypair() {
|
|
3121
|
+
const seed = utils.randomPrivateKey();
|
|
3122
|
+
const pub = await getPublicKeyAsync(seed);
|
|
3123
|
+
const secret = new Uint8Array(64);
|
|
3124
|
+
secret.set(seed, 0);
|
|
3125
|
+
secret.set(pub, 32);
|
|
3126
|
+
const publicKey = ensureEd25519Prefix(esm_default.encode(pub));
|
|
3127
|
+
const privateKey = ensureEd25519Prefix(esm_default.encode(secret));
|
|
3128
|
+
return {
|
|
3129
|
+
publicKey,
|
|
3130
|
+
privateKey
|
|
3131
|
+
};
|
|
3132
|
+
}
|
|
3133
|
+
var NEAR_ED25519_KEY_PREFIX;
|
|
3134
|
+
var init_nearCrypto = __esm({ "src/core/nearCrypto.ts": (() => {
|
|
3135
|
+
init_ed25519();
|
|
3136
|
+
NEAR_ED25519_KEY_PREFIX = "ed25519:";
|
|
3137
|
+
}) });
|
|
3138
|
+
|
|
2669
3139
|
//#endregion
|
|
2670
3140
|
//#region src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.ts
|
|
2671
3141
|
init_credentialsHelpers();
|
|
2672
3142
|
init_validation();
|
|
3143
|
+
init_nearCrypto();
|
|
2673
3144
|
function validateTransactionContextMaybe(input) {
|
|
2674
3145
|
if (input == null) return void 0;
|
|
2675
3146
|
if (!isObject(input)) throw new Error("Invalid transactionContext: expected object");
|
|
@@ -2730,9 +3201,6 @@ function parseAndValidateRegistrationCredentialConfirmationPayload(payload) {
|
|
|
2730
3201
|
error: normalizedError
|
|
2731
3202
|
};
|
|
2732
3203
|
}
|
|
2733
|
-
const ensureEd25519Prefix = (value) => {
|
|
2734
|
-
return value.startsWith("ed25519:") ? value : `ed25519:${value}`;
|
|
2735
|
-
};
|
|
2736
3204
|
const toPublicKeyString = (pk) => {
|
|
2737
3205
|
if (typeof pk === "string") return pk;
|
|
2738
3206
|
return ensureEd25519Prefix(base58Encode(pk.keyData));
|
|
@@ -3299,14 +3767,14 @@ const HANDLERS = {
|
|
|
3299
3767
|
});
|
|
3300
3768
|
},
|
|
3301
3769
|
[SecureConfirmationType.SIGN_TRANSACTION]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3302
|
-
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-
|
|
3770
|
+
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-DfdwDQCn.js"));
|
|
3303
3771
|
await handleTransactionSigningFlow(ctx, request, worker, {
|
|
3304
3772
|
confirmationConfig,
|
|
3305
3773
|
transactionSummary
|
|
3306
3774
|
});
|
|
3307
3775
|
},
|
|
3308
3776
|
[SecureConfirmationType.SIGN_NEP413_MESSAGE]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3309
|
-
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-
|
|
3777
|
+
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-DfdwDQCn.js"));
|
|
3310
3778
|
await handleTransactionSigningFlow(ctx, request, worker, {
|
|
3311
3779
|
confirmationConfig,
|
|
3312
3780
|
transactionSummary
|
|
@@ -8408,504 +8876,6 @@ var ChainsigAddressManager = class {
|
|
|
8408
8876
|
};
|
|
8409
8877
|
const chainsigAddressManager = new ChainsigAddressManager();
|
|
8410
8878
|
|
|
8411
|
-
//#endregion
|
|
8412
|
-
//#region ../node_modules/.pnpm/@noble+ed25519@2.3.0/node_modules/@noble/ed25519/index.js
|
|
8413
|
-
/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
8414
|
-
/**
|
|
8415
|
-
* 4KB JS implementation of ed25519 EdDSA signatures.
|
|
8416
|
-
* Compliant with RFC8032, FIPS 186-5 & ZIP215.
|
|
8417
|
-
* @module
|
|
8418
|
-
* @example
|
|
8419
|
-
* ```js
|
|
8420
|
-
import * as ed from '@noble/ed25519';
|
|
8421
|
-
(async () => {
|
|
8422
|
-
const privKey = ed.utils.randomPrivateKey();
|
|
8423
|
-
const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);
|
|
8424
|
-
const pubKey = await ed.getPublicKeyAsync(privKey); // Sync methods are also present
|
|
8425
|
-
const signature = await ed.signAsync(message, privKey);
|
|
8426
|
-
const isValid = await ed.verifyAsync(signature, message, pubKey);
|
|
8427
|
-
})();
|
|
8428
|
-
```
|
|
8429
|
-
*/
|
|
8430
|
-
/**
|
|
8431
|
-
* Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².
|
|
8432
|
-
* * P = `2n**255n - 19n` // field over which calculations are done
|
|
8433
|
-
* * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points
|
|
8434
|
-
* * h = 8 // cofactor
|
|
8435
|
-
* * a = `Fp.create(BigInt(-1))` // equation param
|
|
8436
|
-
* * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param
|
|
8437
|
-
* * Gx, Gy are coordinates of Generator / base point
|
|
8438
|
-
*/
|
|
8439
|
-
const ed25519_CURVE = {
|
|
8440
|
-
p: 57896044618658097711785492504343953926634992332820282019728792003956564819949n,
|
|
8441
|
-
n: 7237005577332262213973186563042994240857116359379907606001950938285454250989n,
|
|
8442
|
-
h: 8n,
|
|
8443
|
-
a: 57896044618658097711785492504343953926634992332820282019728792003956564819948n,
|
|
8444
|
-
d: 37095705934669439343138083508754565189542113879843219016388785533085940283555n,
|
|
8445
|
-
Gx: 15112221349535400772501151409588531511454012693041857206046113283949847762202n,
|
|
8446
|
-
Gy: 46316835694926478169428394003475163141307993866256225615783033603165251855960n
|
|
8447
|
-
};
|
|
8448
|
-
const { p: P, n: N, Gx, Gy, a: _a, d: _d } = ed25519_CURVE;
|
|
8449
|
-
const h = 8n;
|
|
8450
|
-
const L = 32;
|
|
8451
|
-
const L2 = 64;
|
|
8452
|
-
const err = (m = "") => {
|
|
8453
|
-
throw new Error(m);
|
|
8454
|
-
};
|
|
8455
|
-
const isBig = (n) => typeof n === "bigint";
|
|
8456
|
-
const isStr = (s) => typeof s === "string";
|
|
8457
|
-
const isBytes = (a) => a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
|
|
8458
|
-
/** assert is Uint8Array (of specific length) */
|
|
8459
|
-
const abytes = (a, l) => !isBytes(a) || typeof l === "number" && l > 0 && a.length !== l ? err("Uint8Array expected") : a;
|
|
8460
|
-
/** create Uint8Array */
|
|
8461
|
-
const u8n = (len) => new Uint8Array(len);
|
|
8462
|
-
const u8fr = (buf) => Uint8Array.from(buf);
|
|
8463
|
-
const padh = (n, pad) => n.toString(16).padStart(pad, "0");
|
|
8464
|
-
const bytesToHex$1 = (b) => Array.from(abytes(b)).map((e) => padh(e, 2)).join("");
|
|
8465
|
-
const C = {
|
|
8466
|
-
_0: 48,
|
|
8467
|
-
_9: 57,
|
|
8468
|
-
A: 65,
|
|
8469
|
-
F: 70,
|
|
8470
|
-
a: 97,
|
|
8471
|
-
f: 102
|
|
8472
|
-
};
|
|
8473
|
-
const _ch = (ch) => {
|
|
8474
|
-
if (ch >= C._0 && ch <= C._9) return ch - C._0;
|
|
8475
|
-
if (ch >= C.A && ch <= C.F) return ch - (C.A - 10);
|
|
8476
|
-
if (ch >= C.a && ch <= C.f) return ch - (C.a - 10);
|
|
8477
|
-
};
|
|
8478
|
-
const hexToBytes = (hex) => {
|
|
8479
|
-
const e = "hex invalid";
|
|
8480
|
-
if (!isStr(hex)) return err(e);
|
|
8481
|
-
const hl = hex.length;
|
|
8482
|
-
const al = hl / 2;
|
|
8483
|
-
if (hl % 2) return err(e);
|
|
8484
|
-
const array = u8n(al);
|
|
8485
|
-
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
8486
|
-
const n1 = _ch(hex.charCodeAt(hi));
|
|
8487
|
-
const n2 = _ch(hex.charCodeAt(hi + 1));
|
|
8488
|
-
if (n1 === void 0 || n2 === void 0) return err(e);
|
|
8489
|
-
array[ai] = n1 * 16 + n2;
|
|
8490
|
-
}
|
|
8491
|
-
return array;
|
|
8492
|
-
};
|
|
8493
|
-
/** normalize hex or ui8a to ui8a */
|
|
8494
|
-
const toU8 = (a, len) => abytes(isStr(a) ? hexToBytes(a) : u8fr(abytes(a)), len);
|
|
8495
|
-
const cr = () => globalThis?.crypto;
|
|
8496
|
-
const subtle = () => cr()?.subtle ?? err("crypto.subtle must be defined");
|
|
8497
|
-
const concatBytes = (...arrs) => {
|
|
8498
|
-
const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0));
|
|
8499
|
-
let pad = 0;
|
|
8500
|
-
arrs.forEach((a) => {
|
|
8501
|
-
r.set(a, pad);
|
|
8502
|
-
pad += a.length;
|
|
8503
|
-
});
|
|
8504
|
-
return r;
|
|
8505
|
-
};
|
|
8506
|
-
/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */
|
|
8507
|
-
const randomBytes = (len = L) => {
|
|
8508
|
-
const c = cr();
|
|
8509
|
-
return c.getRandomValues(u8n(len));
|
|
8510
|
-
};
|
|
8511
|
-
const big = BigInt;
|
|
8512
|
-
const arange = (n, min, max, msg = "bad number: out of range") => isBig(n) && min <= n && n < max ? n : err(msg);
|
|
8513
|
-
/** modular division */
|
|
8514
|
-
const M = (a, b = P) => {
|
|
8515
|
-
const r = a % b;
|
|
8516
|
-
return r >= 0n ? r : b + r;
|
|
8517
|
-
};
|
|
8518
|
-
const modN = (a) => M(a, N);
|
|
8519
|
-
/** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
|
|
8520
|
-
const invert = (num, md) => {
|
|
8521
|
-
if (num === 0n || md <= 0n) err("no inverse n=" + num + " mod=" + md);
|
|
8522
|
-
let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;
|
|
8523
|
-
while (a !== 0n) {
|
|
8524
|
-
const q = b / a, r = b % a;
|
|
8525
|
-
const m = x - u * q, n = y - v * q;
|
|
8526
|
-
b = a, a = r, x = u, y = v, u = m, v = n;
|
|
8527
|
-
}
|
|
8528
|
-
return b === 1n ? M(x, md) : err("no inverse");
|
|
8529
|
-
};
|
|
8530
|
-
const callHash = (name) => {
|
|
8531
|
-
const fn = etc[name];
|
|
8532
|
-
if (typeof fn !== "function") err("hashes." + name + " not set");
|
|
8533
|
-
return fn;
|
|
8534
|
-
};
|
|
8535
|
-
const apoint = (p) => p instanceof Point ? p : err("Point expected");
|
|
8536
|
-
const B256 = 2n ** 256n;
|
|
8537
|
-
/** Point in XYZT extended coordinates. */
|
|
8538
|
-
var Point = class Point {
|
|
8539
|
-
static BASE;
|
|
8540
|
-
static ZERO;
|
|
8541
|
-
ex;
|
|
8542
|
-
ey;
|
|
8543
|
-
ez;
|
|
8544
|
-
et;
|
|
8545
|
-
constructor(ex, ey, ez, et) {
|
|
8546
|
-
const max = B256;
|
|
8547
|
-
this.ex = arange(ex, 0n, max);
|
|
8548
|
-
this.ey = arange(ey, 0n, max);
|
|
8549
|
-
this.ez = arange(ez, 1n, max);
|
|
8550
|
-
this.et = arange(et, 0n, max);
|
|
8551
|
-
Object.freeze(this);
|
|
8552
|
-
}
|
|
8553
|
-
static fromAffine(p) {
|
|
8554
|
-
return new Point(p.x, p.y, 1n, M(p.x * p.y));
|
|
8555
|
-
}
|
|
8556
|
-
/** RFC8032 5.1.3: Uint8Array to Point. */
|
|
8557
|
-
static fromBytes(hex, zip215 = false) {
|
|
8558
|
-
const d = _d;
|
|
8559
|
-
const normed = u8fr(abytes(hex, L));
|
|
8560
|
-
const lastByte = hex[31];
|
|
8561
|
-
normed[31] = lastByte & -129;
|
|
8562
|
-
const y = bytesToNumLE(normed);
|
|
8563
|
-
const max = zip215 ? B256 : P;
|
|
8564
|
-
arange(y, 0n, max);
|
|
8565
|
-
const y2 = M(y * y);
|
|
8566
|
-
const u = M(y2 - 1n);
|
|
8567
|
-
const v = M(d * y2 + 1n);
|
|
8568
|
-
let { isValid, value: x } = uvRatio(u, v);
|
|
8569
|
-
if (!isValid) err("bad point: y not sqrt");
|
|
8570
|
-
const isXOdd = (x & 1n) === 1n;
|
|
8571
|
-
const isLastByteOdd = (lastByte & 128) !== 0;
|
|
8572
|
-
if (!zip215 && x === 0n && isLastByteOdd) err("bad point: x==0, isLastByteOdd");
|
|
8573
|
-
if (isLastByteOdd !== isXOdd) x = M(-x);
|
|
8574
|
-
return new Point(x, y, 1n, M(x * y));
|
|
8575
|
-
}
|
|
8576
|
-
/** Checks if the point is valid and on-curve. */
|
|
8577
|
-
assertValidity() {
|
|
8578
|
-
const a = _a;
|
|
8579
|
-
const d = _d;
|
|
8580
|
-
const p = this;
|
|
8581
|
-
if (p.is0()) throw new Error("bad point: ZERO");
|
|
8582
|
-
const { ex: X, ey: Y, ez: Z, et: T } = p;
|
|
8583
|
-
const X2 = M(X * X);
|
|
8584
|
-
const Y2 = M(Y * Y);
|
|
8585
|
-
const Z2 = M(Z * Z);
|
|
8586
|
-
const Z4 = M(Z2 * Z2);
|
|
8587
|
-
const aX2 = M(X2 * a);
|
|
8588
|
-
const left = M(Z2 * M(aX2 + Y2));
|
|
8589
|
-
const right = M(Z4 + M(d * M(X2 * Y2)));
|
|
8590
|
-
if (left !== right) throw new Error("bad point: equation left != right (1)");
|
|
8591
|
-
const XY = M(X * Y);
|
|
8592
|
-
const ZT = M(Z * T);
|
|
8593
|
-
if (XY !== ZT) throw new Error("bad point: equation left != right (2)");
|
|
8594
|
-
return this;
|
|
8595
|
-
}
|
|
8596
|
-
/** Equality check: compare points P&Q. */
|
|
8597
|
-
equals(other) {
|
|
8598
|
-
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
8599
|
-
const { ex: X2, ey: Y2, ez: Z2 } = apoint(other);
|
|
8600
|
-
const X1Z2 = M(X1 * Z2);
|
|
8601
|
-
const X2Z1 = M(X2 * Z1);
|
|
8602
|
-
const Y1Z2 = M(Y1 * Z2);
|
|
8603
|
-
const Y2Z1 = M(Y2 * Z1);
|
|
8604
|
-
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
8605
|
-
}
|
|
8606
|
-
is0() {
|
|
8607
|
-
return this.equals(I);
|
|
8608
|
-
}
|
|
8609
|
-
/** Flip point over y coordinate. */
|
|
8610
|
-
negate() {
|
|
8611
|
-
return new Point(M(-this.ex), this.ey, this.ez, M(-this.et));
|
|
8612
|
-
}
|
|
8613
|
-
/** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */
|
|
8614
|
-
double() {
|
|
8615
|
-
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
8616
|
-
const a = _a;
|
|
8617
|
-
const A = M(X1 * X1);
|
|
8618
|
-
const B = M(Y1 * Y1);
|
|
8619
|
-
const C$1 = M(2n * M(Z1 * Z1));
|
|
8620
|
-
const D = M(a * A);
|
|
8621
|
-
const x1y1 = X1 + Y1;
|
|
8622
|
-
const E = M(M(x1y1 * x1y1) - A - B);
|
|
8623
|
-
const G$1 = D + B;
|
|
8624
|
-
const F = G$1 - C$1;
|
|
8625
|
-
const H = D - B;
|
|
8626
|
-
const X3 = M(E * F);
|
|
8627
|
-
const Y3 = M(G$1 * H);
|
|
8628
|
-
const T3 = M(E * H);
|
|
8629
|
-
const Z3 = M(F * G$1);
|
|
8630
|
-
return new Point(X3, Y3, Z3, T3);
|
|
8631
|
-
}
|
|
8632
|
-
/** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */
|
|
8633
|
-
add(other) {
|
|
8634
|
-
const { ex: X1, ey: Y1, ez: Z1, et: T1 } = this;
|
|
8635
|
-
const { ex: X2, ey: Y2, ez: Z2, et: T2 } = apoint(other);
|
|
8636
|
-
const a = _a;
|
|
8637
|
-
const d = _d;
|
|
8638
|
-
const A = M(X1 * X2);
|
|
8639
|
-
const B = M(Y1 * Y2);
|
|
8640
|
-
const C$1 = M(T1 * d * T2);
|
|
8641
|
-
const D = M(Z1 * Z2);
|
|
8642
|
-
const E = M((X1 + Y1) * (X2 + Y2) - A - B);
|
|
8643
|
-
const F = M(D - C$1);
|
|
8644
|
-
const G$1 = M(D + C$1);
|
|
8645
|
-
const H = M(B - a * A);
|
|
8646
|
-
const X3 = M(E * F);
|
|
8647
|
-
const Y3 = M(G$1 * H);
|
|
8648
|
-
const T3 = M(E * H);
|
|
8649
|
-
const Z3 = M(F * G$1);
|
|
8650
|
-
return new Point(X3, Y3, Z3, T3);
|
|
8651
|
-
}
|
|
8652
|
-
/**
|
|
8653
|
-
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
8654
|
-
* Uses {@link wNAF} for base point.
|
|
8655
|
-
* Uses fake point to mitigate side-channel leakage.
|
|
8656
|
-
* @param n scalar by which point is multiplied
|
|
8657
|
-
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
8658
|
-
*/
|
|
8659
|
-
multiply(n, safe = true) {
|
|
8660
|
-
if (!safe && (n === 0n || this.is0())) return I;
|
|
8661
|
-
arange(n, 1n, N);
|
|
8662
|
-
if (n === 1n) return this;
|
|
8663
|
-
if (this.equals(G)) return wNAF(n).p;
|
|
8664
|
-
let p = I;
|
|
8665
|
-
let f = G;
|
|
8666
|
-
for (let d = this; n > 0n; d = d.double(), n >>= 1n) if (n & 1n) p = p.add(d);
|
|
8667
|
-
else if (safe) f = f.add(d);
|
|
8668
|
-
return p;
|
|
8669
|
-
}
|
|
8670
|
-
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
8671
|
-
toAffine() {
|
|
8672
|
-
const { ex: x, ey: y, ez: z } = this;
|
|
8673
|
-
if (this.equals(I)) return {
|
|
8674
|
-
x: 0n,
|
|
8675
|
-
y: 1n
|
|
8676
|
-
};
|
|
8677
|
-
const iz = invert(z, P);
|
|
8678
|
-
if (M(z * iz) !== 1n) err("invalid inverse");
|
|
8679
|
-
return {
|
|
8680
|
-
x: M(x * iz),
|
|
8681
|
-
y: M(y * iz)
|
|
8682
|
-
};
|
|
8683
|
-
}
|
|
8684
|
-
toBytes() {
|
|
8685
|
-
const { x, y } = this.assertValidity().toAffine();
|
|
8686
|
-
const b = numTo32bLE(y);
|
|
8687
|
-
b[31] |= x & 1n ? 128 : 0;
|
|
8688
|
-
return b;
|
|
8689
|
-
}
|
|
8690
|
-
toHex() {
|
|
8691
|
-
return bytesToHex$1(this.toBytes());
|
|
8692
|
-
}
|
|
8693
|
-
clearCofactor() {
|
|
8694
|
-
return this.multiply(big(h), false);
|
|
8695
|
-
}
|
|
8696
|
-
isSmallOrder() {
|
|
8697
|
-
return this.clearCofactor().is0();
|
|
8698
|
-
}
|
|
8699
|
-
isTorsionFree() {
|
|
8700
|
-
let p = this.multiply(N / 2n, false).double();
|
|
8701
|
-
if (N % 2n) p = p.add(this);
|
|
8702
|
-
return p.is0();
|
|
8703
|
-
}
|
|
8704
|
-
static fromHex(hex, zip215) {
|
|
8705
|
-
return Point.fromBytes(toU8(hex), zip215);
|
|
8706
|
-
}
|
|
8707
|
-
get x() {
|
|
8708
|
-
return this.toAffine().x;
|
|
8709
|
-
}
|
|
8710
|
-
get y() {
|
|
8711
|
-
return this.toAffine().y;
|
|
8712
|
-
}
|
|
8713
|
-
toRawBytes() {
|
|
8714
|
-
return this.toBytes();
|
|
8715
|
-
}
|
|
8716
|
-
};
|
|
8717
|
-
/** Generator / base point */
|
|
8718
|
-
const G = new Point(Gx, Gy, 1n, M(Gx * Gy));
|
|
8719
|
-
/** Identity / zero point */
|
|
8720
|
-
const I = new Point(0n, 1n, 1n, 0n);
|
|
8721
|
-
Point.BASE = G;
|
|
8722
|
-
Point.ZERO = I;
|
|
8723
|
-
const numTo32bLE = (num) => hexToBytes(padh(arange(num, 0n, B256), L2)).reverse();
|
|
8724
|
-
const bytesToNumLE = (b) => big("0x" + bytesToHex$1(u8fr(abytes(b)).reverse()));
|
|
8725
|
-
const pow2 = (x, power) => {
|
|
8726
|
-
let r = x;
|
|
8727
|
-
while (power-- > 0n) {
|
|
8728
|
-
r *= r;
|
|
8729
|
-
r %= P;
|
|
8730
|
-
}
|
|
8731
|
-
return r;
|
|
8732
|
-
};
|
|
8733
|
-
const pow_2_252_3 = (x) => {
|
|
8734
|
-
const x2 = x * x % P;
|
|
8735
|
-
const b2 = x2 * x % P;
|
|
8736
|
-
const b4 = pow2(b2, 2n) * b2 % P;
|
|
8737
|
-
const b5 = pow2(b4, 1n) * x % P;
|
|
8738
|
-
const b10 = pow2(b5, 5n) * b5 % P;
|
|
8739
|
-
const b20 = pow2(b10, 10n) * b10 % P;
|
|
8740
|
-
const b40 = pow2(b20, 20n) * b20 % P;
|
|
8741
|
-
const b80 = pow2(b40, 40n) * b40 % P;
|
|
8742
|
-
const b160 = pow2(b80, 80n) * b80 % P;
|
|
8743
|
-
const b240 = pow2(b160, 80n) * b80 % P;
|
|
8744
|
-
const b250 = pow2(b240, 10n) * b10 % P;
|
|
8745
|
-
const pow_p_5_8 = pow2(b250, 2n) * x % P;
|
|
8746
|
-
return {
|
|
8747
|
-
pow_p_5_8,
|
|
8748
|
-
b2
|
|
8749
|
-
};
|
|
8750
|
-
};
|
|
8751
|
-
const RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n;
|
|
8752
|
-
const uvRatio = (u, v) => {
|
|
8753
|
-
const v3 = M(v * v * v);
|
|
8754
|
-
const v7 = M(v3 * v3 * v);
|
|
8755
|
-
const pow = pow_2_252_3(u * v7).pow_p_5_8;
|
|
8756
|
-
let x = M(u * v3 * pow);
|
|
8757
|
-
const vx2 = M(v * x * x);
|
|
8758
|
-
const root1 = x;
|
|
8759
|
-
const root2 = M(x * RM1);
|
|
8760
|
-
const useRoot1 = vx2 === u;
|
|
8761
|
-
const useRoot2 = vx2 === M(-u);
|
|
8762
|
-
const noRoot = vx2 === M(-u * RM1);
|
|
8763
|
-
if (useRoot1) x = root1;
|
|
8764
|
-
if (useRoot2 || noRoot) x = root2;
|
|
8765
|
-
if ((M(x) & 1n) === 1n) x = M(-x);
|
|
8766
|
-
return {
|
|
8767
|
-
isValid: useRoot1 || useRoot2,
|
|
8768
|
-
value: x
|
|
8769
|
-
};
|
|
8770
|
-
};
|
|
8771
|
-
const modL_LE = (hash) => modN(bytesToNumLE(hash));
|
|
8772
|
-
const sha512a = (...m) => etc.sha512Async(...m);
|
|
8773
|
-
const sha512s = (...m) => callHash("sha512Sync")(...m);
|
|
8774
|
-
const hash2extK = (hashed) => {
|
|
8775
|
-
const head = hashed.slice(0, L);
|
|
8776
|
-
head[0] &= 248;
|
|
8777
|
-
head[31] &= 127;
|
|
8778
|
-
head[31] |= 64;
|
|
8779
|
-
const prefix = hashed.slice(L, L2);
|
|
8780
|
-
const scalar = modL_LE(head);
|
|
8781
|
-
const point = G.multiply(scalar);
|
|
8782
|
-
const pointBytes = point.toBytes();
|
|
8783
|
-
return {
|
|
8784
|
-
head,
|
|
8785
|
-
prefix,
|
|
8786
|
-
scalar,
|
|
8787
|
-
point,
|
|
8788
|
-
pointBytes
|
|
8789
|
-
};
|
|
8790
|
-
};
|
|
8791
|
-
const getExtendedPublicKeyAsync = (priv) => sha512a(toU8(priv, L)).then(hash2extK);
|
|
8792
|
-
const getExtendedPublicKey = (priv) => hash2extK(sha512s(toU8(priv, L)));
|
|
8793
|
-
/** Creates 32-byte ed25519 public key from 32-byte private key. Async. */
|
|
8794
|
-
const getPublicKeyAsync = (priv) => getExtendedPublicKeyAsync(priv).then((p) => p.pointBytes);
|
|
8795
|
-
/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */
|
|
8796
|
-
const etc = {
|
|
8797
|
-
sha512Async: async (...messages) => {
|
|
8798
|
-
const s = subtle();
|
|
8799
|
-
const m = concatBytes(...messages);
|
|
8800
|
-
return u8n(await s.digest("SHA-512", m.buffer));
|
|
8801
|
-
},
|
|
8802
|
-
sha512Sync: void 0,
|
|
8803
|
-
bytesToHex: bytesToHex$1,
|
|
8804
|
-
hexToBytes,
|
|
8805
|
-
concatBytes,
|
|
8806
|
-
mod: M,
|
|
8807
|
-
invert,
|
|
8808
|
-
randomBytes
|
|
8809
|
-
};
|
|
8810
|
-
/** ed25519-specific key utilities. */
|
|
8811
|
-
const utils = {
|
|
8812
|
-
getExtendedPublicKeyAsync,
|
|
8813
|
-
getExtendedPublicKey,
|
|
8814
|
-
randomPrivateKey: () => randomBytes(L),
|
|
8815
|
-
precompute: (w = 8, p = G) => {
|
|
8816
|
-
p.multiply(3n);
|
|
8817
|
-
return p;
|
|
8818
|
-
}
|
|
8819
|
-
};
|
|
8820
|
-
const W = 8;
|
|
8821
|
-
const scalarBits = 256;
|
|
8822
|
-
const pwindows = Math.ceil(scalarBits / W) + 1;
|
|
8823
|
-
const pwindowSize = 2 ** (W - 1);
|
|
8824
|
-
const precompute = () => {
|
|
8825
|
-
const points = [];
|
|
8826
|
-
let p = G;
|
|
8827
|
-
let b = p;
|
|
8828
|
-
for (let w = 0; w < pwindows; w++) {
|
|
8829
|
-
b = p;
|
|
8830
|
-
points.push(b);
|
|
8831
|
-
for (let i = 1; i < pwindowSize; i++) {
|
|
8832
|
-
b = b.add(p);
|
|
8833
|
-
points.push(b);
|
|
8834
|
-
}
|
|
8835
|
-
p = b.double();
|
|
8836
|
-
}
|
|
8837
|
-
return points;
|
|
8838
|
-
};
|
|
8839
|
-
let Gpows = void 0;
|
|
8840
|
-
const ctneg = (cnd, p) => {
|
|
8841
|
-
const n = p.negate();
|
|
8842
|
-
return cnd ? n : p;
|
|
8843
|
-
};
|
|
8844
|
-
/**
|
|
8845
|
-
* Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
|
|
8846
|
-
* caching multiples of G (base point). Cache is stored in 32MB of RAM.
|
|
8847
|
-
* Any time `G.multiply` is done, precomputes are used.
|
|
8848
|
-
* Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
|
|
8849
|
-
*
|
|
8850
|
-
* w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
|
|
8851
|
-
* but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
|
|
8852
|
-
*
|
|
8853
|
-
* !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
|
|
8854
|
-
*/
|
|
8855
|
-
const wNAF = (n) => {
|
|
8856
|
-
const comp = Gpows || (Gpows = precompute());
|
|
8857
|
-
let p = I;
|
|
8858
|
-
let f = G;
|
|
8859
|
-
const pow_2_w = 2 ** W;
|
|
8860
|
-
const maxNum = pow_2_w;
|
|
8861
|
-
const mask = big(pow_2_w - 1);
|
|
8862
|
-
const shiftBy = big(W);
|
|
8863
|
-
for (let w = 0; w < pwindows; w++) {
|
|
8864
|
-
let wbits = Number(n & mask);
|
|
8865
|
-
n >>= shiftBy;
|
|
8866
|
-
if (wbits > pwindowSize) {
|
|
8867
|
-
wbits -= maxNum;
|
|
8868
|
-
n += 1n;
|
|
8869
|
-
}
|
|
8870
|
-
const off = w * pwindowSize;
|
|
8871
|
-
const offF = off;
|
|
8872
|
-
const offP = off + Math.abs(wbits) - 1;
|
|
8873
|
-
const isEven = w % 2 !== 0;
|
|
8874
|
-
const isNeg = wbits < 0;
|
|
8875
|
-
if (wbits === 0) f = f.add(ctneg(isEven, comp[offF]));
|
|
8876
|
-
else p = p.add(ctneg(isNeg, comp[offP]));
|
|
8877
|
-
}
|
|
8878
|
-
return {
|
|
8879
|
-
p,
|
|
8880
|
-
f
|
|
8881
|
-
};
|
|
8882
|
-
};
|
|
8883
|
-
|
|
8884
|
-
//#endregion
|
|
8885
|
-
//#region src/core/nearCrypto.ts
|
|
8886
|
-
const NEAR_KEY_PREFIX = "ed25519:";
|
|
8887
|
-
function ensurePrefix(str) {
|
|
8888
|
-
return str.startsWith(NEAR_KEY_PREFIX) ? str : `${NEAR_KEY_PREFIX}${str}`;
|
|
8889
|
-
}
|
|
8890
|
-
/**
|
|
8891
|
-
* Creates a NEAR-compatible Ed25519 keypair formatted as strings:
|
|
8892
|
-
* - publicKey: 'ed25519:' + base58(pub)
|
|
8893
|
-
* - privateKey: 'ed25519:' + base58(seed(32) | pub(32))
|
|
8894
|
-
*/
|
|
8895
|
-
async function createNearKeypair() {
|
|
8896
|
-
const seed = utils.randomPrivateKey();
|
|
8897
|
-
const pub = await getPublicKeyAsync(seed);
|
|
8898
|
-
const secret = new Uint8Array(64);
|
|
8899
|
-
secret.set(seed, 0);
|
|
8900
|
-
secret.set(pub, 32);
|
|
8901
|
-
const publicKey = ensurePrefix(esm_default.encode(pub));
|
|
8902
|
-
const privateKey = ensurePrefix(esm_default.encode(secret));
|
|
8903
|
-
return {
|
|
8904
|
-
publicKey,
|
|
8905
|
-
privateKey
|
|
8906
|
-
};
|
|
8907
|
-
}
|
|
8908
|
-
|
|
8909
8879
|
//#endregion
|
|
8910
8880
|
//#region src/core/types/linkDevice.ts
|
|
8911
8881
|
var DeviceLinkingError = class extends Error {
|
|
@@ -8927,6 +8897,7 @@ let DeviceLinkingErrorCode = /* @__PURE__ */ function(DeviceLinkingErrorCode$1)
|
|
|
8927
8897
|
|
|
8928
8898
|
//#endregion
|
|
8929
8899
|
//#region src/core/TatchiPasskey/linkDevice.ts
|
|
8900
|
+
init_nearCrypto();
|
|
8930
8901
|
init_IndexedDBManager();
|
|
8931
8902
|
init_actions();
|
|
8932
8903
|
init_rpcCalls();
|
|
@@ -9625,6 +9596,7 @@ init_validation$1();
|
|
|
9625
9596
|
init_login();
|
|
9626
9597
|
init_sdkSentEvents();
|
|
9627
9598
|
init_rpcCalls();
|
|
9599
|
+
init_nearCrypto();
|
|
9628
9600
|
/**
|
|
9629
9601
|
* Device1 (original device): Link device using pre-scanned QR data
|
|
9630
9602
|
*/
|
|
@@ -9642,8 +9614,8 @@ async function linkDeviceWithScannedQRData(context, qrData, options) {
|
|
|
9642
9614
|
if (!device1LoginState.isLoggedIn || !device1LoginState.nearAccountId) throw new Error("Device1 must be logged in to authorize device linking");
|
|
9643
9615
|
const device1AccountId = device1LoginState.nearAccountId;
|
|
9644
9616
|
const fundingAmount = options.fundingAmount;
|
|
9645
|
-
const device2PublicKey = qrData.device2PublicKey;
|
|
9646
|
-
if (!device2PublicKey.
|
|
9617
|
+
const device2PublicKey = ensureEd25519Prefix(qrData.device2PublicKey);
|
|
9618
|
+
if (!device2PublicKey || !/^ed25519:/i.test(device2PublicKey)) throw new Error("Invalid device public key format");
|
|
9647
9619
|
onEvent?.({
|
|
9648
9620
|
step: 3,
|
|
9649
9621
|
phase: DeviceLinkingPhase.STEP_3_AUTHORIZATION,
|
|
@@ -9684,7 +9656,7 @@ async function linkDeviceWithScannedQRData(context, qrData, options) {
|
|
|
9684
9656
|
});
|
|
9685
9657
|
const result = {
|
|
9686
9658
|
success: true,
|
|
9687
|
-
device2PublicKey
|
|
9659
|
+
device2PublicKey,
|
|
9688
9660
|
transactionId: addKeyTxResult?.transaction?.hash || storeDeviceLinkingTxResult?.transaction?.hash || "unknown",
|
|
9689
9661
|
fundingAmount,
|
|
9690
9662
|
linkedToAccount: device1AccountId,
|
|
@@ -10037,6 +10009,28 @@ var init_emailRecoveryPendingStore = __esm({ "src/core/EmailRecovery/emailRecove
|
|
|
10037
10009
|
|
|
10038
10010
|
//#endregion
|
|
10039
10011
|
//#region src/core/EmailRecovery/index.ts
|
|
10012
|
+
function getTxSuccessValueBase64(outcome) {
|
|
10013
|
+
const status = outcome.status;
|
|
10014
|
+
if (!status || typeof status !== "object") return null;
|
|
10015
|
+
if (!("SuccessValue" in status)) return null;
|
|
10016
|
+
const value = status.SuccessValue;
|
|
10017
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
10018
|
+
}
|
|
10019
|
+
function parseLinkDeviceRegisterUserResponse(outcome) {
|
|
10020
|
+
try {
|
|
10021
|
+
const successValueB64 = getTxSuccessValueBase64(outcome);
|
|
10022
|
+
if (!successValueB64) return null;
|
|
10023
|
+
const bytes = base64Decode(successValueB64);
|
|
10024
|
+
const text = new TextDecoder().decode(bytes);
|
|
10025
|
+
if (!text.trim()) return null;
|
|
10026
|
+
const parsed = JSON.parse(text);
|
|
10027
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
10028
|
+
const candidate = parsed;
|
|
10029
|
+
return typeof candidate.verified === "boolean" ? candidate : null;
|
|
10030
|
+
} catch {
|
|
10031
|
+
return null;
|
|
10032
|
+
}
|
|
10033
|
+
}
|
|
10040
10034
|
async function hashRecoveryEmails(emails, accountId) {
|
|
10041
10035
|
const encoder = new TextEncoder();
|
|
10042
10036
|
const salt = (accountId || "").trim().toLowerCase();
|
|
@@ -10108,6 +10102,27 @@ var init_EmailRecovery = __esm({ "src/core/EmailRecovery/index.ts": (() => {
|
|
|
10108
10102
|
};
|
|
10109
10103
|
}) });
|
|
10110
10104
|
|
|
10105
|
+
//#endregion
|
|
10106
|
+
//#region src/core/types/emailRecovery.ts
|
|
10107
|
+
var EmailRecoveryErrorCode, EmailRecoveryError;
|
|
10108
|
+
var init_emailRecovery$1 = __esm({ "src/core/types/emailRecovery.ts": (() => {
|
|
10109
|
+
EmailRecoveryErrorCode = /* @__PURE__ */ function(EmailRecoveryErrorCode$1) {
|
|
10110
|
+
EmailRecoveryErrorCode$1["REGISTRATION_NOT_VERIFIED"] = "EMAIL_RECOVERY_REGISTRATION_NOT_VERIFIED";
|
|
10111
|
+
EmailRecoveryErrorCode$1["VRF_CHALLENGE_EXPIRED"] = "EMAIL_RECOVERY_VRF_CHALLENGE_EXPIRED";
|
|
10112
|
+
return EmailRecoveryErrorCode$1;
|
|
10113
|
+
}({});
|
|
10114
|
+
EmailRecoveryError = class extends Error {
|
|
10115
|
+
code;
|
|
10116
|
+
context;
|
|
10117
|
+
constructor(message, code, context) {
|
|
10118
|
+
super(message);
|
|
10119
|
+
this.name = "EmailRecoveryError";
|
|
10120
|
+
this.code = code;
|
|
10121
|
+
this.context = context;
|
|
10122
|
+
}
|
|
10123
|
+
};
|
|
10124
|
+
}) });
|
|
10125
|
+
|
|
10111
10126
|
//#endregion
|
|
10112
10127
|
//#region src/core/TatchiPasskey/emailRecovery.ts
|
|
10113
10128
|
var emailRecovery_exports = {};
|
|
@@ -10122,16 +10137,12 @@ function getEmailRecoveryConfig(configs) {
|
|
|
10122
10137
|
const maxPollingDurationMs = Number(relayerEmailCfg.maxPollingDurationMs);
|
|
10123
10138
|
const pendingTtlMs = Number(relayerEmailCfg.pendingTtlMs);
|
|
10124
10139
|
const mailtoAddress = String(relayerEmailCfg.mailtoAddress);
|
|
10125
|
-
const dkimVerifierAccountId = String(relayerEmailCfg.dkimVerifierAccountId);
|
|
10126
|
-
const verificationViewMethod = String(relayerEmailCfg.verificationViewMethod);
|
|
10127
10140
|
return {
|
|
10128
10141
|
minBalanceYocto,
|
|
10129
10142
|
pollingIntervalMs,
|
|
10130
10143
|
maxPollingDurationMs,
|
|
10131
10144
|
pendingTtlMs,
|
|
10132
|
-
mailtoAddress
|
|
10133
|
-
dkimVerifierAccountId,
|
|
10134
|
-
verificationViewMethod
|
|
10145
|
+
mailtoAddress
|
|
10135
10146
|
};
|
|
10136
10147
|
}
|
|
10137
10148
|
function generateEmailRecoveryRequestId() {
|
|
@@ -10147,6 +10158,7 @@ var EmailRecoveryFlow;
|
|
|
10147
10158
|
var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (() => {
|
|
10148
10159
|
init_IndexedDBManager();
|
|
10149
10160
|
init_validation$1();
|
|
10161
|
+
init_errors();
|
|
10150
10162
|
init_accountIds();
|
|
10151
10163
|
init_sdkSentEvents();
|
|
10152
10164
|
init_vrf_worker();
|
|
@@ -10154,6 +10166,9 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10154
10166
|
init_getDeviceNumber();
|
|
10155
10167
|
init_login();
|
|
10156
10168
|
init_EmailRecovery();
|
|
10169
|
+
init_emailRecovery$1();
|
|
10170
|
+
init_rpcCalls();
|
|
10171
|
+
init_nearCrypto();
|
|
10157
10172
|
EmailRecoveryFlow = class {
|
|
10158
10173
|
context;
|
|
10159
10174
|
options;
|
|
@@ -10181,8 +10196,9 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10181
10196
|
emit(event) {
|
|
10182
10197
|
this.options?.onEvent?.(event);
|
|
10183
10198
|
}
|
|
10184
|
-
emitError(step,
|
|
10185
|
-
const err$1 = new Error(
|
|
10199
|
+
emitError(step, messageOrError) {
|
|
10200
|
+
const err$1 = typeof messageOrError === "string" ? new Error(messageOrError) : messageOrError;
|
|
10201
|
+
const message = err$1.message || (typeof messageOrError === "string" ? messageOrError : "Unknown error");
|
|
10186
10202
|
this.phase = EmailRecoveryPhase.ERROR;
|
|
10187
10203
|
this.error = err$1;
|
|
10188
10204
|
this.emit({
|
|
@@ -10241,20 +10257,19 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10241
10257
|
const accountView = await this.context.nearClient.viewAccount(nearAccountId);
|
|
10242
10258
|
const available = this.computeAvailableBalance(accountView);
|
|
10243
10259
|
if (available < BigInt(minBalanceYocto)) await this.fail(1, `This account does not have enough NEAR to finalize recovery. Available: ${available.toString()} yocto; required: ${String(minBalanceYocto)}. Please top up and try again.`);
|
|
10244
|
-
} catch (
|
|
10245
|
-
await this.fail(1,
|
|
10260
|
+
} catch (err$1) {
|
|
10261
|
+
await this.fail(1, errorMessage(err$1) || "Failed to fetch account balance for recovery");
|
|
10246
10262
|
}
|
|
10247
10263
|
}
|
|
10248
|
-
|
|
10264
|
+
getCanonicalRecoveryEmail(recoveryEmail) {
|
|
10249
10265
|
const canonicalEmail = String(recoveryEmail || "").trim().toLowerCase();
|
|
10250
|
-
|
|
10251
|
-
return canonicalEmail;
|
|
10266
|
+
return canonicalEmail || void 0;
|
|
10252
10267
|
}
|
|
10253
10268
|
async getNextDeviceNumberFromContract(nearAccountId) {
|
|
10254
10269
|
try {
|
|
10255
|
-
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-
|
|
10270
|
+
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-CYGJSCgm.js");
|
|
10256
10271
|
const authenticators = await syncAuthenticatorsContractCall$1(this.context.nearClient, this.context.configs.contractId, nearAccountId);
|
|
10257
|
-
const numbers = authenticators.map((
|
|
10272
|
+
const numbers = authenticators.map(({ authenticator }) => authenticator.deviceNumber).filter((n) => typeof n === "number" && Number.isFinite(n));
|
|
10258
10273
|
const max = numbers.length > 0 ? Math.max(...numbers) : 0;
|
|
10259
10274
|
return max + 1;
|
|
10260
10275
|
} catch {
|
|
@@ -10306,7 +10321,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10306
10321
|
message: "New device key created; please send the recovery email from your registered address.",
|
|
10307
10322
|
data: {
|
|
10308
10323
|
accountId: rec.accountId,
|
|
10309
|
-
recoveryEmail: rec.recoveryEmail,
|
|
10324
|
+
...rec.recoveryEmail ? { recoveryEmail: rec.recoveryEmail } : {},
|
|
10310
10325
|
nearPublicKey: rec.nearPublicKey,
|
|
10311
10326
|
requestId: rec.requestId,
|
|
10312
10327
|
mailtoUrl
|
|
@@ -10322,44 +10337,57 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10322
10337
|
data
|
|
10323
10338
|
});
|
|
10324
10339
|
}
|
|
10325
|
-
async
|
|
10326
|
-
const { dkimVerifierAccountId, verificationViewMethod } = this.getConfig();
|
|
10327
|
-
if (!dkimVerifierAccountId) return null;
|
|
10340
|
+
async checkViaEmailRecovererAttempt(rec) {
|
|
10328
10341
|
try {
|
|
10329
|
-
const
|
|
10330
|
-
|
|
10331
|
-
if (!result) return {
|
|
10342
|
+
const attempt = await getEmailRecoveryAttempt(this.context.nearClient, rec.accountId, rec.requestId);
|
|
10343
|
+
if (!attempt) return {
|
|
10332
10344
|
completed: false,
|
|
10333
|
-
success: false
|
|
10345
|
+
success: false,
|
|
10346
|
+
missing: true
|
|
10334
10347
|
};
|
|
10335
|
-
if (
|
|
10336
|
-
|
|
10337
|
-
|
|
10348
|
+
if (attempt.request_id && attempt.request_id !== rec.requestId) return {
|
|
10349
|
+
completed: true,
|
|
10350
|
+
success: false,
|
|
10351
|
+
errorMessage: "Email recovery attempt request_id does not match requested requestId."
|
|
10352
|
+
};
|
|
10353
|
+
if (attempt.new_public_key && attempt.new_public_key !== rec.nearPublicKey) {
|
|
10354
|
+
const expected = ensureEd25519Prefix(rec.nearPublicKey);
|
|
10355
|
+
const actual = ensureEd25519Prefix(attempt.new_public_key);
|
|
10356
|
+
if (actual === expected) {} else return {
|
|
10338
10357
|
completed: true,
|
|
10339
10358
|
success: false,
|
|
10340
|
-
errorMessage:
|
|
10341
|
-
transactionHash: result.transaction_hash
|
|
10359
|
+
errorMessage: `Email recovery new_public_key mismatch for request ${rec.requestId}. Expected ${expected}; got ${actual}. This usually means the recovery email you sent was generated for a different device/attempt.`
|
|
10342
10360
|
};
|
|
10343
10361
|
}
|
|
10344
|
-
|
|
10362
|
+
const normalized = attempt.status.toLowerCase();
|
|
10363
|
+
if (normalized === "complete" || normalized === "completed") return {
|
|
10345
10364
|
completed: true,
|
|
10346
|
-
success:
|
|
10347
|
-
errorMessage: "Email verification account_id does not match requested account.",
|
|
10348
|
-
transactionHash: result.transaction_hash
|
|
10365
|
+
success: true
|
|
10349
10366
|
};
|
|
10350
|
-
if (
|
|
10367
|
+
if (normalized.includes("failed")) return {
|
|
10351
10368
|
completed: true,
|
|
10352
10369
|
success: false,
|
|
10353
|
-
errorMessage:
|
|
10354
|
-
transactionHash: result.transaction_hash
|
|
10370
|
+
errorMessage: attempt.error || `Email recovery failed (${attempt.status || "unknown status"})`
|
|
10355
10371
|
};
|
|
10356
10372
|
return {
|
|
10357
|
-
completed:
|
|
10358
|
-
success:
|
|
10359
|
-
transactionHash: result.transaction_hash
|
|
10373
|
+
completed: false,
|
|
10374
|
+
success: false
|
|
10360
10375
|
};
|
|
10361
10376
|
} catch (err$1) {
|
|
10362
|
-
console.warn("[EmailRecoveryFlow]
|
|
10377
|
+
console.warn("[EmailRecoveryFlow] get_recovery_attempt view failed; will retry", err$1);
|
|
10378
|
+
return null;
|
|
10379
|
+
}
|
|
10380
|
+
}
|
|
10381
|
+
async isRecoveryAccessKeyPresent(rec) {
|
|
10382
|
+
try {
|
|
10383
|
+
await this.context.nearClient.viewAccessKey(rec.accountId, rec.nearPublicKey);
|
|
10384
|
+
return true;
|
|
10385
|
+
} catch (err$1) {
|
|
10386
|
+
const kind = typeof err$1?.kind === "string" ? String(err$1.kind) : "";
|
|
10387
|
+
const short = typeof err$1?.short === "string" ? String(err$1.short) : "";
|
|
10388
|
+
const msg = typeof err$1?.message === "string" ? String(err$1.message) : "";
|
|
10389
|
+
if (/AccessKeyDoesNotExist/i.test(kind) || /AccessKeyDoesNotExist/i.test(short) || /access key does not exist/i.test(msg) || /access key .*does not exist/i.test(msg)) return false;
|
|
10390
|
+
console.warn("[EmailRecoveryFlow] view_access_key failed while checking recovery key; will retry", err$1);
|
|
10363
10391
|
return null;
|
|
10364
10392
|
}
|
|
10365
10393
|
}
|
|
@@ -10468,7 +10496,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10468
10496
|
});
|
|
10469
10497
|
const nearAccountId = await this.assertValidAccountIdOrFail(1, accountId);
|
|
10470
10498
|
await this.assertSufficientBalance(nearAccountId);
|
|
10471
|
-
const canonicalEmail =
|
|
10499
|
+
const canonicalEmail = this.getCanonicalRecoveryEmail(recoveryEmail);
|
|
10472
10500
|
const deviceNumber = await this.getNextDeviceNumberFromContract(nearAccountId);
|
|
10473
10501
|
this.phase = EmailRecoveryPhase.STEP_2_TOUCH_ID_REGISTRATION;
|
|
10474
10502
|
this.emit({
|
|
@@ -10502,7 +10530,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10502
10530
|
nearPublicKey: rec.nearPublicKey
|
|
10503
10531
|
};
|
|
10504
10532
|
} catch (e) {
|
|
10505
|
-
const err$1 = this.emitError(2, e
|
|
10533
|
+
const err$1 = this.emitError(2, errorMessage(e) || "Email recovery TouchID/derivation failed");
|
|
10506
10534
|
await this.options?.afterCall?.(false);
|
|
10507
10535
|
throw err$1;
|
|
10508
10536
|
}
|
|
@@ -10599,29 +10627,39 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10599
10627
|
await this.options?.afterCall?.(true, void 0);
|
|
10600
10628
|
}
|
|
10601
10629
|
async pollUntilAddKey(rec) {
|
|
10602
|
-
const { pollingIntervalMs, maxPollingDurationMs
|
|
10603
|
-
if (!dkimVerifierAccountId) {
|
|
10604
|
-
const err$2 = this.emitError(4, "Email recovery verification contract (dkimVerifierAccountId) is not configured");
|
|
10605
|
-
await this.options?.afterCall?.(false);
|
|
10606
|
-
throw err$2;
|
|
10607
|
-
}
|
|
10630
|
+
const { pollingIntervalMs, maxPollingDurationMs } = this.getConfig();
|
|
10608
10631
|
this.phase = EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT;
|
|
10609
10632
|
this.pollingStartedAt = Date.now();
|
|
10633
|
+
let sawAttempt = false;
|
|
10610
10634
|
const pollResult = await this.pollUntil({
|
|
10611
10635
|
intervalMs: pollingIntervalMs,
|
|
10612
10636
|
timeoutMs: maxPollingDurationMs,
|
|
10613
10637
|
isCancelled: () => this.cancelled,
|
|
10614
10638
|
tick: async ({ elapsedMs, pollCount }) => {
|
|
10615
|
-
const verification = await this.
|
|
10616
|
-
|
|
10617
|
-
|
|
10639
|
+
const verification = await this.checkViaEmailRecovererAttempt(rec);
|
|
10640
|
+
if (verification && !verification.missing) sawAttempt = true;
|
|
10641
|
+
let completed = verification?.completed === true;
|
|
10642
|
+
let success = verification?.success === true;
|
|
10643
|
+
let errorMessage$1 = verification?.errorMessage;
|
|
10644
|
+
let transactionHash;
|
|
10645
|
+
if (verification?.missing) {
|
|
10646
|
+
const hasKey = await this.isRecoveryAccessKeyPresent(rec);
|
|
10647
|
+
if (hasKey === true) {
|
|
10648
|
+
completed = true;
|
|
10649
|
+
success = true;
|
|
10650
|
+
} else if (hasKey === false && sawAttempt) {
|
|
10651
|
+
completed = true;
|
|
10652
|
+
success = false;
|
|
10653
|
+
errorMessage$1 = "Email recovery attempt was cleared on-chain before completion. Please resend the recovery email or restart the flow.";
|
|
10654
|
+
} else if (hasKey === null) return { done: false };
|
|
10655
|
+
}
|
|
10618
10656
|
this.emit({
|
|
10619
10657
|
step: 4,
|
|
10620
10658
|
phase: EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT,
|
|
10621
10659
|
status: EmailRecoveryStatus.PROGRESS,
|
|
10622
|
-
message: completed && success ? `Email
|
|
10660
|
+
message: completed && success ? `Email recovery completed for request ${rec.requestId}; finalizing registration` : `Waiting for email recovery for request ${rec.requestId}`,
|
|
10623
10661
|
data: this.buildPollingEventData(rec, {
|
|
10624
|
-
transactionHash
|
|
10662
|
+
transactionHash,
|
|
10625
10663
|
elapsedMs,
|
|
10626
10664
|
pollCount
|
|
10627
10665
|
})
|
|
@@ -10631,7 +10669,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10631
10669
|
done: true,
|
|
10632
10670
|
value: {
|
|
10633
10671
|
outcome: "failed",
|
|
10634
|
-
errorMessage:
|
|
10672
|
+
errorMessage: errorMessage$1 || "Email recovery failed"
|
|
10635
10673
|
}
|
|
10636
10674
|
};
|
|
10637
10675
|
return {
|
|
@@ -10672,7 +10710,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10672
10710
|
accountId
|
|
10673
10711
|
};
|
|
10674
10712
|
}
|
|
10675
|
-
async
|
|
10713
|
+
async signNewDevice2RegistrationTx(rec, accountId) {
|
|
10676
10714
|
const vrfChallenge = rec.vrfChallenge;
|
|
10677
10715
|
if (!vrfChallenge) return this.fail(5, "Missing VRF challenge for email recovery registration");
|
|
10678
10716
|
const registrationResult = await this.context.webAuthnManager.signDevice2RegistrationWithStoredKey({
|
|
@@ -10686,28 +10724,56 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10686
10724
|
return registrationResult.signedTransaction;
|
|
10687
10725
|
}
|
|
10688
10726
|
async broadcastRegistrationTxAndWaitFinal(rec, signedTx) {
|
|
10727
|
+
let txResult;
|
|
10689
10728
|
try {
|
|
10690
|
-
|
|
10691
|
-
|
|
10692
|
-
|
|
10693
|
-
|
|
10694
|
-
|
|
10695
|
-
|
|
10696
|
-
|
|
10697
|
-
|
|
10698
|
-
|
|
10699
|
-
|
|
10700
|
-
|
|
10701
|
-
|
|
10702
|
-
|
|
10703
|
-
|
|
10704
|
-
|
|
10705
|
-
|
|
10706
|
-
|
|
10707
|
-
|
|
10708
|
-
|
|
10729
|
+
txResult = await this.context.nearClient.sendTransaction(signedTx, DEFAULT_WAIT_STATUS.linkDeviceRegistration);
|
|
10730
|
+
} catch (err$1) {
|
|
10731
|
+
const msg = errorMessage(err$1) || "Failed to broadcast email recovery registration transaction (insufficient funds or RPC error)";
|
|
10732
|
+
throw new Error(msg);
|
|
10733
|
+
}
|
|
10734
|
+
const txHash = this.getTxHash(txResult);
|
|
10735
|
+
const linkDeviceResult = parseLinkDeviceRegisterUserResponse(txResult);
|
|
10736
|
+
if (linkDeviceResult?.verified === false) {
|
|
10737
|
+
const logs = this.extractNearExecutionLogs(txResult);
|
|
10738
|
+
const isStaleChallenge = logs.some((log) => /StaleChallenge|freshness validation failed/i.test(log));
|
|
10739
|
+
const txHint = txHash ? ` (tx: ${txHash})` : "";
|
|
10740
|
+
const code = isStaleChallenge ? EmailRecoveryErrorCode.VRF_CHALLENGE_EXPIRED : EmailRecoveryErrorCode.REGISTRATION_NOT_VERIFIED;
|
|
10741
|
+
const message = isStaleChallenge ? `Timed out finalizing registration (VRF challenge expired). Please restart email recovery and try again${txHint}.` : `Registration did not verify on-chain. Please try again${txHint}.`;
|
|
10742
|
+
throw new EmailRecoveryError(message, code, {
|
|
10743
|
+
accountId: rec.accountId,
|
|
10744
|
+
nearPublicKey: rec.nearPublicKey,
|
|
10745
|
+
transactionHash: txHash,
|
|
10746
|
+
logs,
|
|
10747
|
+
result: linkDeviceResult
|
|
10748
|
+
});
|
|
10749
|
+
}
|
|
10750
|
+
if (txHash) this.emit({
|
|
10751
|
+
step: 5,
|
|
10752
|
+
phase: EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
|
|
10753
|
+
status: EmailRecoveryStatus.PROGRESS,
|
|
10754
|
+
message: "Registration transaction confirmed",
|
|
10755
|
+
data: {
|
|
10756
|
+
accountId: rec.accountId,
|
|
10757
|
+
nearPublicKey: rec.nearPublicKey,
|
|
10758
|
+
transactionHash: txHash
|
|
10759
|
+
}
|
|
10760
|
+
});
|
|
10761
|
+
return txHash;
|
|
10762
|
+
}
|
|
10763
|
+
getTxHash(outcome) {
|
|
10764
|
+
const txUnknown = outcome.transaction;
|
|
10765
|
+
if (txUnknown && typeof txUnknown === "object") {
|
|
10766
|
+
const hash = txUnknown.hash;
|
|
10767
|
+
if (typeof hash === "string" && hash.length > 0) return hash;
|
|
10709
10768
|
}
|
|
10710
|
-
|
|
10769
|
+
const fallback = outcome.transaction_hash;
|
|
10770
|
+
return typeof fallback === "string" && fallback.length > 0 ? fallback : void 0;
|
|
10771
|
+
}
|
|
10772
|
+
extractNearExecutionLogs(outcome) {
|
|
10773
|
+
const logs = [];
|
|
10774
|
+
for (const entry of outcome.transaction_outcome.outcome.logs) logs.push(String(entry));
|
|
10775
|
+
for (const receipt of outcome.receipts_outcome) for (const entry of receipt.outcome.logs) logs.push(String(entry));
|
|
10776
|
+
return logs;
|
|
10711
10777
|
}
|
|
10712
10778
|
mapAuthenticatorsFromContract(authenticators) {
|
|
10713
10779
|
return authenticators.map(({ authenticator }) => ({
|
|
@@ -10722,7 +10788,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10722
10788
|
}
|
|
10723
10789
|
async syncAuthenticatorsBestEffort(accountId) {
|
|
10724
10790
|
try {
|
|
10725
|
-
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-
|
|
10791
|
+
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-CYGJSCgm.js");
|
|
10726
10792
|
const authenticators = await syncAuthenticatorsContractCall$1(this.context.nearClient, this.context.configs.contractId, accountId);
|
|
10727
10793
|
const mappedAuthenticators = this.mapAuthenticatorsFromContract(authenticators);
|
|
10728
10794
|
await IndexedDBManager.clientDB.syncAuthenticatorsFromContract(accountId, mappedAuthenticators);
|
|
@@ -10743,7 +10809,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10743
10809
|
}
|
|
10744
10810
|
async updateNonceBestEffort(nonceManager, signedTx) {
|
|
10745
10811
|
try {
|
|
10746
|
-
const txNonce = signedTx.transaction
|
|
10812
|
+
const txNonce = signedTx.transaction.nonce;
|
|
10747
10813
|
if (txNonce != null) await nonceManager.updateNonceFromBlockchain(this.context.nearClient, String(txNonce));
|
|
10748
10814
|
} catch {}
|
|
10749
10815
|
}
|
|
@@ -10859,7 +10925,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10859
10925
|
} catch (err$1) {
|
|
10860
10926
|
return {
|
|
10861
10927
|
success: false,
|
|
10862
|
-
reason: err$1
|
|
10928
|
+
reason: errorMessage(err$1) || String(err$1)
|
|
10863
10929
|
};
|
|
10864
10930
|
}
|
|
10865
10931
|
}
|
|
@@ -10887,7 +10953,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10887
10953
|
});
|
|
10888
10954
|
try {
|
|
10889
10955
|
const { nonceManager, accountId } = this.initializeNonceManager(rec);
|
|
10890
|
-
const signedTx = await this.
|
|
10956
|
+
const signedTx = await this.signNewDevice2RegistrationTx(rec, accountId);
|
|
10891
10957
|
const txHash = await this.broadcastRegistrationTxAndWaitFinal(rec, signedTx);
|
|
10892
10958
|
if (!txHash) console.warn("[EmailRecoveryFlow] Registration transaction confirmed without hash; continuing local persistence");
|
|
10893
10959
|
await this.persistRecoveredUserData(rec, accountId);
|
|
@@ -10915,7 +10981,10 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10915
10981
|
}
|
|
10916
10982
|
});
|
|
10917
10983
|
} catch (e) {
|
|
10918
|
-
|
|
10984
|
+
rec.status = "error";
|
|
10985
|
+
await this.savePending(rec).catch(() => {});
|
|
10986
|
+
const original = e instanceof Error ? e : new Error(errorMessage(e) || "Email recovery finalization failed");
|
|
10987
|
+
const err$1 = this.emitError(5, original);
|
|
10919
10988
|
await this.options?.afterCall?.(false);
|
|
10920
10989
|
throw err$1;
|
|
10921
10990
|
}
|
|
@@ -10937,7 +11006,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10937
11006
|
};
|
|
10938
11007
|
return this.handleAutoLoginFailure(touchIdResult.reason || "Auto-login failed");
|
|
10939
11008
|
} catch (err$1) {
|
|
10940
|
-
return this.handleAutoLoginFailure(err$1
|
|
11009
|
+
return this.handleAutoLoginFailure(errorMessage(err$1) || String(err$1), err$1);
|
|
10941
11010
|
}
|
|
10942
11011
|
}
|
|
10943
11012
|
};
|
|
@@ -11009,7 +11078,7 @@ var TatchiPasskey = class {
|
|
|
11009
11078
|
} catch {}
|
|
11010
11079
|
if (!this.iframeRouter) {
|
|
11011
11080
|
if (!this.walletIframeInitInFlight) this.walletIframeInitInFlight = (async () => {
|
|
11012
|
-
const { WalletIframeRouter } = await import("./router-
|
|
11081
|
+
const { WalletIframeRouter } = await import("./router-BWtacLJg.js");
|
|
11013
11082
|
this.iframeRouter = new WalletIframeRouter({
|
|
11014
11083
|
walletOrigin,
|
|
11015
11084
|
servicePath: walletIframeConfig?.walletServicePath || "/wallet-service",
|
|
@@ -12047,6 +12116,7 @@ var TatchiPasskey = class {
|
|
|
12047
12116
|
const { accountId, recoveryEmail, options } = args;
|
|
12048
12117
|
if (this.shouldUseWalletIframe()) try {
|
|
12049
12118
|
const router = await this.requireWalletIframeRouter();
|
|
12119
|
+
const normalizedRecoveryEmail = typeof recoveryEmail === "string" && recoveryEmail.trim().length > 0 ? recoveryEmail.trim() : void 0;
|
|
12050
12120
|
const confirmerText = options?.confirmerText;
|
|
12051
12121
|
const confirmationConfig = options?.confirmationConfig;
|
|
12052
12122
|
const safeOptions = {
|
|
@@ -12055,7 +12125,7 @@ var TatchiPasskey = class {
|
|
|
12055
12125
|
};
|
|
12056
12126
|
const res = await router.startEmailRecovery({
|
|
12057
12127
|
accountId,
|
|
12058
|
-
recoveryEmail,
|
|
12128
|
+
recoveryEmail: normalizedRecoveryEmail,
|
|
12059
12129
|
onEvent: options?.onEvent,
|
|
12060
12130
|
options: Object.keys(safeOptions).length > 0 ? safeOptions : void 0
|
|
12061
12131
|
});
|