@tatchi-xyz/sdk 0.20.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/TatchiPasskey/emailRecovery.js +67 -45
- 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/react/components/AccountMenuButton/{LinkedDevicesModal-BCrFe5p3.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
- package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-BCrFe5p3.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-CRJrtxDb.css → ProfileDropdown-BG_6hcim.css} +1 -1
- package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-CRJrtxDb.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css → TouchIcon-C-RcGfr5.css} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.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 +254 -140
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/cjs/react/components/{ShowQRCode-CL4gsszN.css → ShowQRCode-CB0UCQ_h.css} +1 -1
- package/dist/cjs/react/components/{ShowQRCode-CL4gsszN.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 +1 -0
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +67 -45
- 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/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/TatchiPasskey/emailRecovery.js +67 -45
- 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/react/components/AccountMenuButton/{LinkedDevicesModal-BCrFe5p3.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
- package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-BCrFe5p3.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-CRJrtxDb.css → ProfileDropdown-BG_6hcim.css} +1 -1
- package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-CRJrtxDb.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css → TouchIcon-C-RcGfr5.css} +1 -1
- package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.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 +254 -140
- package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/esm/react/components/{ShowQRCode-CL4gsszN.css → ShowQRCode-CB0UCQ_h.css} +1 -1
- package/dist/esm/react/components/{ShowQRCode-CL4gsszN.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 +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +67 -45
- 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/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 +549 -557
- 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/TatchiPasskey/emailRecovery.d.ts +5 -4
- 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/tatchi.d.ts +0 -4
- package/dist/types/src/core/types/tatchi.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
|
@@ -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
|
|
@@ -2667,10 +2667,480 @@ async function signTransactionsWithActions$1({ ctx, transactions, rpcCall, onEve
|
|
|
2667
2667
|
}
|
|
2668
2668
|
}
|
|
2669
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
|
+
|
|
2670
3139
|
//#endregion
|
|
2671
3140
|
//#region src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.ts
|
|
2672
3141
|
init_credentialsHelpers();
|
|
2673
3142
|
init_validation();
|
|
3143
|
+
init_nearCrypto();
|
|
2674
3144
|
function validateTransactionContextMaybe(input) {
|
|
2675
3145
|
if (input == null) return void 0;
|
|
2676
3146
|
if (!isObject(input)) throw new Error("Invalid transactionContext: expected object");
|
|
@@ -2731,9 +3201,6 @@ function parseAndValidateRegistrationCredentialConfirmationPayload(payload) {
|
|
|
2731
3201
|
error: normalizedError
|
|
2732
3202
|
};
|
|
2733
3203
|
}
|
|
2734
|
-
const ensureEd25519Prefix = (value) => {
|
|
2735
|
-
return value.startsWith("ed25519:") ? value : `ed25519:${value}`;
|
|
2736
|
-
};
|
|
2737
3204
|
const toPublicKeyString = (pk) => {
|
|
2738
3205
|
if (typeof pk === "string") return pk;
|
|
2739
3206
|
return ensureEd25519Prefix(base58Encode(pk.keyData));
|
|
@@ -3300,14 +3767,14 @@ const HANDLERS = {
|
|
|
3300
3767
|
});
|
|
3301
3768
|
},
|
|
3302
3769
|
[SecureConfirmationType.SIGN_TRANSACTION]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3303
|
-
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-
|
|
3770
|
+
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-DfdwDQCn.js"));
|
|
3304
3771
|
await handleTransactionSigningFlow(ctx, request, worker, {
|
|
3305
3772
|
confirmationConfig,
|
|
3306
3773
|
transactionSummary
|
|
3307
3774
|
});
|
|
3308
3775
|
},
|
|
3309
3776
|
[SecureConfirmationType.SIGN_NEP413_MESSAGE]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
|
|
3310
|
-
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-
|
|
3777
|
+
const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-DfdwDQCn.js"));
|
|
3311
3778
|
await handleTransactionSigningFlow(ctx, request, worker, {
|
|
3312
3779
|
confirmationConfig,
|
|
3313
3780
|
transactionSummary
|
|
@@ -8409,504 +8876,6 @@ var ChainsigAddressManager = class {
|
|
|
8409
8876
|
};
|
|
8410
8877
|
const chainsigAddressManager = new ChainsigAddressManager();
|
|
8411
8878
|
|
|
8412
|
-
//#endregion
|
|
8413
|
-
//#region ../node_modules/.pnpm/@noble+ed25519@2.3.0/node_modules/@noble/ed25519/index.js
|
|
8414
|
-
/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
8415
|
-
/**
|
|
8416
|
-
* 4KB JS implementation of ed25519 EdDSA signatures.
|
|
8417
|
-
* Compliant with RFC8032, FIPS 186-5 & ZIP215.
|
|
8418
|
-
* @module
|
|
8419
|
-
* @example
|
|
8420
|
-
* ```js
|
|
8421
|
-
import * as ed from '@noble/ed25519';
|
|
8422
|
-
(async () => {
|
|
8423
|
-
const privKey = ed.utils.randomPrivateKey();
|
|
8424
|
-
const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);
|
|
8425
|
-
const pubKey = await ed.getPublicKeyAsync(privKey); // Sync methods are also present
|
|
8426
|
-
const signature = await ed.signAsync(message, privKey);
|
|
8427
|
-
const isValid = await ed.verifyAsync(signature, message, pubKey);
|
|
8428
|
-
})();
|
|
8429
|
-
```
|
|
8430
|
-
*/
|
|
8431
|
-
/**
|
|
8432
|
-
* Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².
|
|
8433
|
-
* * P = `2n**255n - 19n` // field over which calculations are done
|
|
8434
|
-
* * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points
|
|
8435
|
-
* * h = 8 // cofactor
|
|
8436
|
-
* * a = `Fp.create(BigInt(-1))` // equation param
|
|
8437
|
-
* * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param
|
|
8438
|
-
* * Gx, Gy are coordinates of Generator / base point
|
|
8439
|
-
*/
|
|
8440
|
-
const ed25519_CURVE = {
|
|
8441
|
-
p: 57896044618658097711785492504343953926634992332820282019728792003956564819949n,
|
|
8442
|
-
n: 7237005577332262213973186563042994240857116359379907606001950938285454250989n,
|
|
8443
|
-
h: 8n,
|
|
8444
|
-
a: 57896044618658097711785492504343953926634992332820282019728792003956564819948n,
|
|
8445
|
-
d: 37095705934669439343138083508754565189542113879843219016388785533085940283555n,
|
|
8446
|
-
Gx: 15112221349535400772501151409588531511454012693041857206046113283949847762202n,
|
|
8447
|
-
Gy: 46316835694926478169428394003475163141307993866256225615783033603165251855960n
|
|
8448
|
-
};
|
|
8449
|
-
const { p: P, n: N, Gx, Gy, a: _a, d: _d } = ed25519_CURVE;
|
|
8450
|
-
const h = 8n;
|
|
8451
|
-
const L = 32;
|
|
8452
|
-
const L2 = 64;
|
|
8453
|
-
const err = (m = "") => {
|
|
8454
|
-
throw new Error(m);
|
|
8455
|
-
};
|
|
8456
|
-
const isBig = (n) => typeof n === "bigint";
|
|
8457
|
-
const isStr = (s) => typeof s === "string";
|
|
8458
|
-
const isBytes = (a) => a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
|
|
8459
|
-
/** assert is Uint8Array (of specific length) */
|
|
8460
|
-
const abytes = (a, l) => !isBytes(a) || typeof l === "number" && l > 0 && a.length !== l ? err("Uint8Array expected") : a;
|
|
8461
|
-
/** create Uint8Array */
|
|
8462
|
-
const u8n = (len) => new Uint8Array(len);
|
|
8463
|
-
const u8fr = (buf) => Uint8Array.from(buf);
|
|
8464
|
-
const padh = (n, pad) => n.toString(16).padStart(pad, "0");
|
|
8465
|
-
const bytesToHex$1 = (b) => Array.from(abytes(b)).map((e) => padh(e, 2)).join("");
|
|
8466
|
-
const C = {
|
|
8467
|
-
_0: 48,
|
|
8468
|
-
_9: 57,
|
|
8469
|
-
A: 65,
|
|
8470
|
-
F: 70,
|
|
8471
|
-
a: 97,
|
|
8472
|
-
f: 102
|
|
8473
|
-
};
|
|
8474
|
-
const _ch = (ch) => {
|
|
8475
|
-
if (ch >= C._0 && ch <= C._9) return ch - C._0;
|
|
8476
|
-
if (ch >= C.A && ch <= C.F) return ch - (C.A - 10);
|
|
8477
|
-
if (ch >= C.a && ch <= C.f) return ch - (C.a - 10);
|
|
8478
|
-
};
|
|
8479
|
-
const hexToBytes = (hex) => {
|
|
8480
|
-
const e = "hex invalid";
|
|
8481
|
-
if (!isStr(hex)) return err(e);
|
|
8482
|
-
const hl = hex.length;
|
|
8483
|
-
const al = hl / 2;
|
|
8484
|
-
if (hl % 2) return err(e);
|
|
8485
|
-
const array = u8n(al);
|
|
8486
|
-
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
8487
|
-
const n1 = _ch(hex.charCodeAt(hi));
|
|
8488
|
-
const n2 = _ch(hex.charCodeAt(hi + 1));
|
|
8489
|
-
if (n1 === void 0 || n2 === void 0) return err(e);
|
|
8490
|
-
array[ai] = n1 * 16 + n2;
|
|
8491
|
-
}
|
|
8492
|
-
return array;
|
|
8493
|
-
};
|
|
8494
|
-
/** normalize hex or ui8a to ui8a */
|
|
8495
|
-
const toU8 = (a, len) => abytes(isStr(a) ? hexToBytes(a) : u8fr(abytes(a)), len);
|
|
8496
|
-
const cr = () => globalThis?.crypto;
|
|
8497
|
-
const subtle = () => cr()?.subtle ?? err("crypto.subtle must be defined");
|
|
8498
|
-
const concatBytes = (...arrs) => {
|
|
8499
|
-
const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0));
|
|
8500
|
-
let pad = 0;
|
|
8501
|
-
arrs.forEach((a) => {
|
|
8502
|
-
r.set(a, pad);
|
|
8503
|
-
pad += a.length;
|
|
8504
|
-
});
|
|
8505
|
-
return r;
|
|
8506
|
-
};
|
|
8507
|
-
/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */
|
|
8508
|
-
const randomBytes = (len = L) => {
|
|
8509
|
-
const c = cr();
|
|
8510
|
-
return c.getRandomValues(u8n(len));
|
|
8511
|
-
};
|
|
8512
|
-
const big = BigInt;
|
|
8513
|
-
const arange = (n, min, max, msg = "bad number: out of range") => isBig(n) && min <= n && n < max ? n : err(msg);
|
|
8514
|
-
/** modular division */
|
|
8515
|
-
const M = (a, b = P) => {
|
|
8516
|
-
const r = a % b;
|
|
8517
|
-
return r >= 0n ? r : b + r;
|
|
8518
|
-
};
|
|
8519
|
-
const modN = (a) => M(a, N);
|
|
8520
|
-
/** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
|
|
8521
|
-
const invert = (num, md) => {
|
|
8522
|
-
if (num === 0n || md <= 0n) err("no inverse n=" + num + " mod=" + md);
|
|
8523
|
-
let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;
|
|
8524
|
-
while (a !== 0n) {
|
|
8525
|
-
const q = b / a, r = b % a;
|
|
8526
|
-
const m = x - u * q, n = y - v * q;
|
|
8527
|
-
b = a, a = r, x = u, y = v, u = m, v = n;
|
|
8528
|
-
}
|
|
8529
|
-
return b === 1n ? M(x, md) : err("no inverse");
|
|
8530
|
-
};
|
|
8531
|
-
const callHash = (name) => {
|
|
8532
|
-
const fn = etc[name];
|
|
8533
|
-
if (typeof fn !== "function") err("hashes." + name + " not set");
|
|
8534
|
-
return fn;
|
|
8535
|
-
};
|
|
8536
|
-
const apoint = (p) => p instanceof Point ? p : err("Point expected");
|
|
8537
|
-
const B256 = 2n ** 256n;
|
|
8538
|
-
/** Point in XYZT extended coordinates. */
|
|
8539
|
-
var Point = class Point {
|
|
8540
|
-
static BASE;
|
|
8541
|
-
static ZERO;
|
|
8542
|
-
ex;
|
|
8543
|
-
ey;
|
|
8544
|
-
ez;
|
|
8545
|
-
et;
|
|
8546
|
-
constructor(ex, ey, ez, et) {
|
|
8547
|
-
const max = B256;
|
|
8548
|
-
this.ex = arange(ex, 0n, max);
|
|
8549
|
-
this.ey = arange(ey, 0n, max);
|
|
8550
|
-
this.ez = arange(ez, 1n, max);
|
|
8551
|
-
this.et = arange(et, 0n, max);
|
|
8552
|
-
Object.freeze(this);
|
|
8553
|
-
}
|
|
8554
|
-
static fromAffine(p) {
|
|
8555
|
-
return new Point(p.x, p.y, 1n, M(p.x * p.y));
|
|
8556
|
-
}
|
|
8557
|
-
/** RFC8032 5.1.3: Uint8Array to Point. */
|
|
8558
|
-
static fromBytes(hex, zip215 = false) {
|
|
8559
|
-
const d = _d;
|
|
8560
|
-
const normed = u8fr(abytes(hex, L));
|
|
8561
|
-
const lastByte = hex[31];
|
|
8562
|
-
normed[31] = lastByte & -129;
|
|
8563
|
-
const y = bytesToNumLE(normed);
|
|
8564
|
-
const max = zip215 ? B256 : P;
|
|
8565
|
-
arange(y, 0n, max);
|
|
8566
|
-
const y2 = M(y * y);
|
|
8567
|
-
const u = M(y2 - 1n);
|
|
8568
|
-
const v = M(d * y2 + 1n);
|
|
8569
|
-
let { isValid, value: x } = uvRatio(u, v);
|
|
8570
|
-
if (!isValid) err("bad point: y not sqrt");
|
|
8571
|
-
const isXOdd = (x & 1n) === 1n;
|
|
8572
|
-
const isLastByteOdd = (lastByte & 128) !== 0;
|
|
8573
|
-
if (!zip215 && x === 0n && isLastByteOdd) err("bad point: x==0, isLastByteOdd");
|
|
8574
|
-
if (isLastByteOdd !== isXOdd) x = M(-x);
|
|
8575
|
-
return new Point(x, y, 1n, M(x * y));
|
|
8576
|
-
}
|
|
8577
|
-
/** Checks if the point is valid and on-curve. */
|
|
8578
|
-
assertValidity() {
|
|
8579
|
-
const a = _a;
|
|
8580
|
-
const d = _d;
|
|
8581
|
-
const p = this;
|
|
8582
|
-
if (p.is0()) throw new Error("bad point: ZERO");
|
|
8583
|
-
const { ex: X, ey: Y, ez: Z, et: T } = p;
|
|
8584
|
-
const X2 = M(X * X);
|
|
8585
|
-
const Y2 = M(Y * Y);
|
|
8586
|
-
const Z2 = M(Z * Z);
|
|
8587
|
-
const Z4 = M(Z2 * Z2);
|
|
8588
|
-
const aX2 = M(X2 * a);
|
|
8589
|
-
const left = M(Z2 * M(aX2 + Y2));
|
|
8590
|
-
const right = M(Z4 + M(d * M(X2 * Y2)));
|
|
8591
|
-
if (left !== right) throw new Error("bad point: equation left != right (1)");
|
|
8592
|
-
const XY = M(X * Y);
|
|
8593
|
-
const ZT = M(Z * T);
|
|
8594
|
-
if (XY !== ZT) throw new Error("bad point: equation left != right (2)");
|
|
8595
|
-
return this;
|
|
8596
|
-
}
|
|
8597
|
-
/** Equality check: compare points P&Q. */
|
|
8598
|
-
equals(other) {
|
|
8599
|
-
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
8600
|
-
const { ex: X2, ey: Y2, ez: Z2 } = apoint(other);
|
|
8601
|
-
const X1Z2 = M(X1 * Z2);
|
|
8602
|
-
const X2Z1 = M(X2 * Z1);
|
|
8603
|
-
const Y1Z2 = M(Y1 * Z2);
|
|
8604
|
-
const Y2Z1 = M(Y2 * Z1);
|
|
8605
|
-
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
8606
|
-
}
|
|
8607
|
-
is0() {
|
|
8608
|
-
return this.equals(I);
|
|
8609
|
-
}
|
|
8610
|
-
/** Flip point over y coordinate. */
|
|
8611
|
-
negate() {
|
|
8612
|
-
return new Point(M(-this.ex), this.ey, this.ez, M(-this.et));
|
|
8613
|
-
}
|
|
8614
|
-
/** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */
|
|
8615
|
-
double() {
|
|
8616
|
-
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
8617
|
-
const a = _a;
|
|
8618
|
-
const A = M(X1 * X1);
|
|
8619
|
-
const B = M(Y1 * Y1);
|
|
8620
|
-
const C$1 = M(2n * M(Z1 * Z1));
|
|
8621
|
-
const D = M(a * A);
|
|
8622
|
-
const x1y1 = X1 + Y1;
|
|
8623
|
-
const E = M(M(x1y1 * x1y1) - A - B);
|
|
8624
|
-
const G$1 = D + B;
|
|
8625
|
-
const F = G$1 - C$1;
|
|
8626
|
-
const H = D - B;
|
|
8627
|
-
const X3 = M(E * F);
|
|
8628
|
-
const Y3 = M(G$1 * H);
|
|
8629
|
-
const T3 = M(E * H);
|
|
8630
|
-
const Z3 = M(F * G$1);
|
|
8631
|
-
return new Point(X3, Y3, Z3, T3);
|
|
8632
|
-
}
|
|
8633
|
-
/** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */
|
|
8634
|
-
add(other) {
|
|
8635
|
-
const { ex: X1, ey: Y1, ez: Z1, et: T1 } = this;
|
|
8636
|
-
const { ex: X2, ey: Y2, ez: Z2, et: T2 } = apoint(other);
|
|
8637
|
-
const a = _a;
|
|
8638
|
-
const d = _d;
|
|
8639
|
-
const A = M(X1 * X2);
|
|
8640
|
-
const B = M(Y1 * Y2);
|
|
8641
|
-
const C$1 = M(T1 * d * T2);
|
|
8642
|
-
const D = M(Z1 * Z2);
|
|
8643
|
-
const E = M((X1 + Y1) * (X2 + Y2) - A - B);
|
|
8644
|
-
const F = M(D - C$1);
|
|
8645
|
-
const G$1 = M(D + C$1);
|
|
8646
|
-
const H = M(B - a * A);
|
|
8647
|
-
const X3 = M(E * F);
|
|
8648
|
-
const Y3 = M(G$1 * H);
|
|
8649
|
-
const T3 = M(E * H);
|
|
8650
|
-
const Z3 = M(F * G$1);
|
|
8651
|
-
return new Point(X3, Y3, Z3, T3);
|
|
8652
|
-
}
|
|
8653
|
-
/**
|
|
8654
|
-
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
8655
|
-
* Uses {@link wNAF} for base point.
|
|
8656
|
-
* Uses fake point to mitigate side-channel leakage.
|
|
8657
|
-
* @param n scalar by which point is multiplied
|
|
8658
|
-
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
8659
|
-
*/
|
|
8660
|
-
multiply(n, safe = true) {
|
|
8661
|
-
if (!safe && (n === 0n || this.is0())) return I;
|
|
8662
|
-
arange(n, 1n, N);
|
|
8663
|
-
if (n === 1n) return this;
|
|
8664
|
-
if (this.equals(G)) return wNAF(n).p;
|
|
8665
|
-
let p = I;
|
|
8666
|
-
let f = G;
|
|
8667
|
-
for (let d = this; n > 0n; d = d.double(), n >>= 1n) if (n & 1n) p = p.add(d);
|
|
8668
|
-
else if (safe) f = f.add(d);
|
|
8669
|
-
return p;
|
|
8670
|
-
}
|
|
8671
|
-
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
8672
|
-
toAffine() {
|
|
8673
|
-
const { ex: x, ey: y, ez: z } = this;
|
|
8674
|
-
if (this.equals(I)) return {
|
|
8675
|
-
x: 0n,
|
|
8676
|
-
y: 1n
|
|
8677
|
-
};
|
|
8678
|
-
const iz = invert(z, P);
|
|
8679
|
-
if (M(z * iz) !== 1n) err("invalid inverse");
|
|
8680
|
-
return {
|
|
8681
|
-
x: M(x * iz),
|
|
8682
|
-
y: M(y * iz)
|
|
8683
|
-
};
|
|
8684
|
-
}
|
|
8685
|
-
toBytes() {
|
|
8686
|
-
const { x, y } = this.assertValidity().toAffine();
|
|
8687
|
-
const b = numTo32bLE(y);
|
|
8688
|
-
b[31] |= x & 1n ? 128 : 0;
|
|
8689
|
-
return b;
|
|
8690
|
-
}
|
|
8691
|
-
toHex() {
|
|
8692
|
-
return bytesToHex$1(this.toBytes());
|
|
8693
|
-
}
|
|
8694
|
-
clearCofactor() {
|
|
8695
|
-
return this.multiply(big(h), false);
|
|
8696
|
-
}
|
|
8697
|
-
isSmallOrder() {
|
|
8698
|
-
return this.clearCofactor().is0();
|
|
8699
|
-
}
|
|
8700
|
-
isTorsionFree() {
|
|
8701
|
-
let p = this.multiply(N / 2n, false).double();
|
|
8702
|
-
if (N % 2n) p = p.add(this);
|
|
8703
|
-
return p.is0();
|
|
8704
|
-
}
|
|
8705
|
-
static fromHex(hex, zip215) {
|
|
8706
|
-
return Point.fromBytes(toU8(hex), zip215);
|
|
8707
|
-
}
|
|
8708
|
-
get x() {
|
|
8709
|
-
return this.toAffine().x;
|
|
8710
|
-
}
|
|
8711
|
-
get y() {
|
|
8712
|
-
return this.toAffine().y;
|
|
8713
|
-
}
|
|
8714
|
-
toRawBytes() {
|
|
8715
|
-
return this.toBytes();
|
|
8716
|
-
}
|
|
8717
|
-
};
|
|
8718
|
-
/** Generator / base point */
|
|
8719
|
-
const G = new Point(Gx, Gy, 1n, M(Gx * Gy));
|
|
8720
|
-
/** Identity / zero point */
|
|
8721
|
-
const I = new Point(0n, 1n, 1n, 0n);
|
|
8722
|
-
Point.BASE = G;
|
|
8723
|
-
Point.ZERO = I;
|
|
8724
|
-
const numTo32bLE = (num) => hexToBytes(padh(arange(num, 0n, B256), L2)).reverse();
|
|
8725
|
-
const bytesToNumLE = (b) => big("0x" + bytesToHex$1(u8fr(abytes(b)).reverse()));
|
|
8726
|
-
const pow2 = (x, power) => {
|
|
8727
|
-
let r = x;
|
|
8728
|
-
while (power-- > 0n) {
|
|
8729
|
-
r *= r;
|
|
8730
|
-
r %= P;
|
|
8731
|
-
}
|
|
8732
|
-
return r;
|
|
8733
|
-
};
|
|
8734
|
-
const pow_2_252_3 = (x) => {
|
|
8735
|
-
const x2 = x * x % P;
|
|
8736
|
-
const b2 = x2 * x % P;
|
|
8737
|
-
const b4 = pow2(b2, 2n) * b2 % P;
|
|
8738
|
-
const b5 = pow2(b4, 1n) * x % P;
|
|
8739
|
-
const b10 = pow2(b5, 5n) * b5 % P;
|
|
8740
|
-
const b20 = pow2(b10, 10n) * b10 % P;
|
|
8741
|
-
const b40 = pow2(b20, 20n) * b20 % P;
|
|
8742
|
-
const b80 = pow2(b40, 40n) * b40 % P;
|
|
8743
|
-
const b160 = pow2(b80, 80n) * b80 % P;
|
|
8744
|
-
const b240 = pow2(b160, 80n) * b80 % P;
|
|
8745
|
-
const b250 = pow2(b240, 10n) * b10 % P;
|
|
8746
|
-
const pow_p_5_8 = pow2(b250, 2n) * x % P;
|
|
8747
|
-
return {
|
|
8748
|
-
pow_p_5_8,
|
|
8749
|
-
b2
|
|
8750
|
-
};
|
|
8751
|
-
};
|
|
8752
|
-
const RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n;
|
|
8753
|
-
const uvRatio = (u, v) => {
|
|
8754
|
-
const v3 = M(v * v * v);
|
|
8755
|
-
const v7 = M(v3 * v3 * v);
|
|
8756
|
-
const pow = pow_2_252_3(u * v7).pow_p_5_8;
|
|
8757
|
-
let x = M(u * v3 * pow);
|
|
8758
|
-
const vx2 = M(v * x * x);
|
|
8759
|
-
const root1 = x;
|
|
8760
|
-
const root2 = M(x * RM1);
|
|
8761
|
-
const useRoot1 = vx2 === u;
|
|
8762
|
-
const useRoot2 = vx2 === M(-u);
|
|
8763
|
-
const noRoot = vx2 === M(-u * RM1);
|
|
8764
|
-
if (useRoot1) x = root1;
|
|
8765
|
-
if (useRoot2 || noRoot) x = root2;
|
|
8766
|
-
if ((M(x) & 1n) === 1n) x = M(-x);
|
|
8767
|
-
return {
|
|
8768
|
-
isValid: useRoot1 || useRoot2,
|
|
8769
|
-
value: x
|
|
8770
|
-
};
|
|
8771
|
-
};
|
|
8772
|
-
const modL_LE = (hash) => modN(bytesToNumLE(hash));
|
|
8773
|
-
const sha512a = (...m) => etc.sha512Async(...m);
|
|
8774
|
-
const sha512s = (...m) => callHash("sha512Sync")(...m);
|
|
8775
|
-
const hash2extK = (hashed) => {
|
|
8776
|
-
const head = hashed.slice(0, L);
|
|
8777
|
-
head[0] &= 248;
|
|
8778
|
-
head[31] &= 127;
|
|
8779
|
-
head[31] |= 64;
|
|
8780
|
-
const prefix = hashed.slice(L, L2);
|
|
8781
|
-
const scalar = modL_LE(head);
|
|
8782
|
-
const point = G.multiply(scalar);
|
|
8783
|
-
const pointBytes = point.toBytes();
|
|
8784
|
-
return {
|
|
8785
|
-
head,
|
|
8786
|
-
prefix,
|
|
8787
|
-
scalar,
|
|
8788
|
-
point,
|
|
8789
|
-
pointBytes
|
|
8790
|
-
};
|
|
8791
|
-
};
|
|
8792
|
-
const getExtendedPublicKeyAsync = (priv) => sha512a(toU8(priv, L)).then(hash2extK);
|
|
8793
|
-
const getExtendedPublicKey = (priv) => hash2extK(sha512s(toU8(priv, L)));
|
|
8794
|
-
/** Creates 32-byte ed25519 public key from 32-byte private key. Async. */
|
|
8795
|
-
const getPublicKeyAsync = (priv) => getExtendedPublicKeyAsync(priv).then((p) => p.pointBytes);
|
|
8796
|
-
/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */
|
|
8797
|
-
const etc = {
|
|
8798
|
-
sha512Async: async (...messages) => {
|
|
8799
|
-
const s = subtle();
|
|
8800
|
-
const m = concatBytes(...messages);
|
|
8801
|
-
return u8n(await s.digest("SHA-512", m.buffer));
|
|
8802
|
-
},
|
|
8803
|
-
sha512Sync: void 0,
|
|
8804
|
-
bytesToHex: bytesToHex$1,
|
|
8805
|
-
hexToBytes,
|
|
8806
|
-
concatBytes,
|
|
8807
|
-
mod: M,
|
|
8808
|
-
invert,
|
|
8809
|
-
randomBytes
|
|
8810
|
-
};
|
|
8811
|
-
/** ed25519-specific key utilities. */
|
|
8812
|
-
const utils = {
|
|
8813
|
-
getExtendedPublicKeyAsync,
|
|
8814
|
-
getExtendedPublicKey,
|
|
8815
|
-
randomPrivateKey: () => randomBytes(L),
|
|
8816
|
-
precompute: (w = 8, p = G) => {
|
|
8817
|
-
p.multiply(3n);
|
|
8818
|
-
return p;
|
|
8819
|
-
}
|
|
8820
|
-
};
|
|
8821
|
-
const W = 8;
|
|
8822
|
-
const scalarBits = 256;
|
|
8823
|
-
const pwindows = Math.ceil(scalarBits / W) + 1;
|
|
8824
|
-
const pwindowSize = 2 ** (W - 1);
|
|
8825
|
-
const precompute = () => {
|
|
8826
|
-
const points = [];
|
|
8827
|
-
let p = G;
|
|
8828
|
-
let b = p;
|
|
8829
|
-
for (let w = 0; w < pwindows; w++) {
|
|
8830
|
-
b = p;
|
|
8831
|
-
points.push(b);
|
|
8832
|
-
for (let i = 1; i < pwindowSize; i++) {
|
|
8833
|
-
b = b.add(p);
|
|
8834
|
-
points.push(b);
|
|
8835
|
-
}
|
|
8836
|
-
p = b.double();
|
|
8837
|
-
}
|
|
8838
|
-
return points;
|
|
8839
|
-
};
|
|
8840
|
-
let Gpows = void 0;
|
|
8841
|
-
const ctneg = (cnd, p) => {
|
|
8842
|
-
const n = p.negate();
|
|
8843
|
-
return cnd ? n : p;
|
|
8844
|
-
};
|
|
8845
|
-
/**
|
|
8846
|
-
* Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
|
|
8847
|
-
* caching multiples of G (base point). Cache is stored in 32MB of RAM.
|
|
8848
|
-
* Any time `G.multiply` is done, precomputes are used.
|
|
8849
|
-
* Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
|
|
8850
|
-
*
|
|
8851
|
-
* w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
|
|
8852
|
-
* but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
|
|
8853
|
-
*
|
|
8854
|
-
* !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
|
|
8855
|
-
*/
|
|
8856
|
-
const wNAF = (n) => {
|
|
8857
|
-
const comp = Gpows || (Gpows = precompute());
|
|
8858
|
-
let p = I;
|
|
8859
|
-
let f = G;
|
|
8860
|
-
const pow_2_w = 2 ** W;
|
|
8861
|
-
const maxNum = pow_2_w;
|
|
8862
|
-
const mask = big(pow_2_w - 1);
|
|
8863
|
-
const shiftBy = big(W);
|
|
8864
|
-
for (let w = 0; w < pwindows; w++) {
|
|
8865
|
-
let wbits = Number(n & mask);
|
|
8866
|
-
n >>= shiftBy;
|
|
8867
|
-
if (wbits > pwindowSize) {
|
|
8868
|
-
wbits -= maxNum;
|
|
8869
|
-
n += 1n;
|
|
8870
|
-
}
|
|
8871
|
-
const off = w * pwindowSize;
|
|
8872
|
-
const offF = off;
|
|
8873
|
-
const offP = off + Math.abs(wbits) - 1;
|
|
8874
|
-
const isEven = w % 2 !== 0;
|
|
8875
|
-
const isNeg = wbits < 0;
|
|
8876
|
-
if (wbits === 0) f = f.add(ctneg(isEven, comp[offF]));
|
|
8877
|
-
else p = p.add(ctneg(isNeg, comp[offP]));
|
|
8878
|
-
}
|
|
8879
|
-
return {
|
|
8880
|
-
p,
|
|
8881
|
-
f
|
|
8882
|
-
};
|
|
8883
|
-
};
|
|
8884
|
-
|
|
8885
|
-
//#endregion
|
|
8886
|
-
//#region src/core/nearCrypto.ts
|
|
8887
|
-
const NEAR_KEY_PREFIX = "ed25519:";
|
|
8888
|
-
function ensurePrefix(str) {
|
|
8889
|
-
return str.startsWith(NEAR_KEY_PREFIX) ? str : `${NEAR_KEY_PREFIX}${str}`;
|
|
8890
|
-
}
|
|
8891
|
-
/**
|
|
8892
|
-
* Creates a NEAR-compatible Ed25519 keypair formatted as strings:
|
|
8893
|
-
* - publicKey: 'ed25519:' + base58(pub)
|
|
8894
|
-
* - privateKey: 'ed25519:' + base58(seed(32) | pub(32))
|
|
8895
|
-
*/
|
|
8896
|
-
async function createNearKeypair() {
|
|
8897
|
-
const seed = utils.randomPrivateKey();
|
|
8898
|
-
const pub = await getPublicKeyAsync(seed);
|
|
8899
|
-
const secret = new Uint8Array(64);
|
|
8900
|
-
secret.set(seed, 0);
|
|
8901
|
-
secret.set(pub, 32);
|
|
8902
|
-
const publicKey = ensurePrefix(esm_default.encode(pub));
|
|
8903
|
-
const privateKey = ensurePrefix(esm_default.encode(secret));
|
|
8904
|
-
return {
|
|
8905
|
-
publicKey,
|
|
8906
|
-
privateKey
|
|
8907
|
-
};
|
|
8908
|
-
}
|
|
8909
|
-
|
|
8910
8879
|
//#endregion
|
|
8911
8880
|
//#region src/core/types/linkDevice.ts
|
|
8912
8881
|
var DeviceLinkingError = class extends Error {
|
|
@@ -8928,6 +8897,7 @@ let DeviceLinkingErrorCode = /* @__PURE__ */ function(DeviceLinkingErrorCode$1)
|
|
|
8928
8897
|
|
|
8929
8898
|
//#endregion
|
|
8930
8899
|
//#region src/core/TatchiPasskey/linkDevice.ts
|
|
8900
|
+
init_nearCrypto();
|
|
8931
8901
|
init_IndexedDBManager();
|
|
8932
8902
|
init_actions();
|
|
8933
8903
|
init_rpcCalls();
|
|
@@ -9626,6 +9596,7 @@ init_validation$1();
|
|
|
9626
9596
|
init_login();
|
|
9627
9597
|
init_sdkSentEvents();
|
|
9628
9598
|
init_rpcCalls();
|
|
9599
|
+
init_nearCrypto();
|
|
9629
9600
|
/**
|
|
9630
9601
|
* Device1 (original device): Link device using pre-scanned QR data
|
|
9631
9602
|
*/
|
|
@@ -9643,8 +9614,8 @@ async function linkDeviceWithScannedQRData(context, qrData, options) {
|
|
|
9643
9614
|
if (!device1LoginState.isLoggedIn || !device1LoginState.nearAccountId) throw new Error("Device1 must be logged in to authorize device linking");
|
|
9644
9615
|
const device1AccountId = device1LoginState.nearAccountId;
|
|
9645
9616
|
const fundingAmount = options.fundingAmount;
|
|
9646
|
-
const device2PublicKey = qrData.device2PublicKey;
|
|
9647
|
-
if (!device2PublicKey.
|
|
9617
|
+
const device2PublicKey = ensureEd25519Prefix(qrData.device2PublicKey);
|
|
9618
|
+
if (!device2PublicKey || !/^ed25519:/i.test(device2PublicKey)) throw new Error("Invalid device public key format");
|
|
9648
9619
|
onEvent?.({
|
|
9649
9620
|
step: 3,
|
|
9650
9621
|
phase: DeviceLinkingPhase.STEP_3_AUTHORIZATION,
|
|
@@ -9685,7 +9656,7 @@ async function linkDeviceWithScannedQRData(context, qrData, options) {
|
|
|
9685
9656
|
});
|
|
9686
9657
|
const result = {
|
|
9687
9658
|
success: true,
|
|
9688
|
-
device2PublicKey
|
|
9659
|
+
device2PublicKey,
|
|
9689
9660
|
transactionId: addKeyTxResult?.transaction?.hash || storeDeviceLinkingTxResult?.transaction?.hash || "unknown",
|
|
9690
9661
|
fundingAmount,
|
|
9691
9662
|
linkedToAccount: device1AccountId,
|
|
@@ -10166,16 +10137,12 @@ function getEmailRecoveryConfig(configs) {
|
|
|
10166
10137
|
const maxPollingDurationMs = Number(relayerEmailCfg.maxPollingDurationMs);
|
|
10167
10138
|
const pendingTtlMs = Number(relayerEmailCfg.pendingTtlMs);
|
|
10168
10139
|
const mailtoAddress = String(relayerEmailCfg.mailtoAddress);
|
|
10169
|
-
const dkimVerifierAccountId = String(relayerEmailCfg.dkimVerifierAccountId);
|
|
10170
|
-
const verificationViewMethod = String(relayerEmailCfg.verificationViewMethod);
|
|
10171
10140
|
return {
|
|
10172
10141
|
minBalanceYocto,
|
|
10173
10142
|
pollingIntervalMs,
|
|
10174
10143
|
maxPollingDurationMs,
|
|
10175
10144
|
pendingTtlMs,
|
|
10176
|
-
mailtoAddress
|
|
10177
|
-
dkimVerifierAccountId,
|
|
10178
|
-
verificationViewMethod
|
|
10145
|
+
mailtoAddress
|
|
10179
10146
|
};
|
|
10180
10147
|
}
|
|
10181
10148
|
function generateEmailRecoveryRequestId() {
|
|
@@ -10200,6 +10167,8 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10200
10167
|
init_login();
|
|
10201
10168
|
init_EmailRecovery();
|
|
10202
10169
|
init_emailRecovery$1();
|
|
10170
|
+
init_rpcCalls();
|
|
10171
|
+
init_nearCrypto();
|
|
10203
10172
|
EmailRecoveryFlow = class {
|
|
10204
10173
|
context;
|
|
10205
10174
|
options;
|
|
@@ -10292,14 +10261,13 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10292
10261
|
await this.fail(1, errorMessage(err$1) || "Failed to fetch account balance for recovery");
|
|
10293
10262
|
}
|
|
10294
10263
|
}
|
|
10295
|
-
|
|
10264
|
+
getCanonicalRecoveryEmail(recoveryEmail) {
|
|
10296
10265
|
const canonicalEmail = String(recoveryEmail || "").trim().toLowerCase();
|
|
10297
|
-
|
|
10298
|
-
return canonicalEmail;
|
|
10266
|
+
return canonicalEmail || void 0;
|
|
10299
10267
|
}
|
|
10300
10268
|
async getNextDeviceNumberFromContract(nearAccountId) {
|
|
10301
10269
|
try {
|
|
10302
|
-
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-
|
|
10270
|
+
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-CYGJSCgm.js");
|
|
10303
10271
|
const authenticators = await syncAuthenticatorsContractCall$1(this.context.nearClient, this.context.configs.contractId, nearAccountId);
|
|
10304
10272
|
const numbers = authenticators.map(({ authenticator }) => authenticator.deviceNumber).filter((n) => typeof n === "number" && Number.isFinite(n));
|
|
10305
10273
|
const max = numbers.length > 0 ? Math.max(...numbers) : 0;
|
|
@@ -10353,7 +10321,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10353
10321
|
message: "New device key created; please send the recovery email from your registered address.",
|
|
10354
10322
|
data: {
|
|
10355
10323
|
accountId: rec.accountId,
|
|
10356
|
-
recoveryEmail: rec.recoveryEmail,
|
|
10324
|
+
...rec.recoveryEmail ? { recoveryEmail: rec.recoveryEmail } : {},
|
|
10357
10325
|
nearPublicKey: rec.nearPublicKey,
|
|
10358
10326
|
requestId: rec.requestId,
|
|
10359
10327
|
mailtoUrl
|
|
@@ -10369,44 +10337,57 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10369
10337
|
data
|
|
10370
10338
|
});
|
|
10371
10339
|
}
|
|
10372
|
-
async
|
|
10373
|
-
const { dkimVerifierAccountId, verificationViewMethod } = this.getConfig();
|
|
10374
|
-
if (!dkimVerifierAccountId) return null;
|
|
10340
|
+
async checkViaEmailRecovererAttempt(rec) {
|
|
10375
10341
|
try {
|
|
10376
|
-
const
|
|
10377
|
-
|
|
10378
|
-
if (!result) return {
|
|
10342
|
+
const attempt = await getEmailRecoveryAttempt(this.context.nearClient, rec.accountId, rec.requestId);
|
|
10343
|
+
if (!attempt) return {
|
|
10379
10344
|
completed: false,
|
|
10380
|
-
success: false
|
|
10345
|
+
success: false,
|
|
10346
|
+
missing: true
|
|
10381
10347
|
};
|
|
10382
|
-
if (
|
|
10383
|
-
|
|
10384
|
-
|
|
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 {
|
|
10385
10357
|
completed: true,
|
|
10386
10358
|
success: false,
|
|
10387
|
-
errorMessage:
|
|
10388
|
-
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.`
|
|
10389
10360
|
};
|
|
10390
10361
|
}
|
|
10391
|
-
|
|
10362
|
+
const normalized = attempt.status.toLowerCase();
|
|
10363
|
+
if (normalized === "complete" || normalized === "completed") return {
|
|
10392
10364
|
completed: true,
|
|
10393
|
-
success:
|
|
10394
|
-
errorMessage: "Email verification account_id does not match requested account.",
|
|
10395
|
-
transactionHash: result.transaction_hash
|
|
10365
|
+
success: true
|
|
10396
10366
|
};
|
|
10397
|
-
if (
|
|
10367
|
+
if (normalized.includes("failed")) return {
|
|
10398
10368
|
completed: true,
|
|
10399
10369
|
success: false,
|
|
10400
|
-
errorMessage:
|
|
10401
|
-
transactionHash: result.transaction_hash
|
|
10370
|
+
errorMessage: attempt.error || `Email recovery failed (${attempt.status || "unknown status"})`
|
|
10402
10371
|
};
|
|
10403
10372
|
return {
|
|
10404
|
-
completed:
|
|
10405
|
-
success:
|
|
10406
|
-
transactionHash: result.transaction_hash
|
|
10373
|
+
completed: false,
|
|
10374
|
+
success: false
|
|
10407
10375
|
};
|
|
10408
10376
|
} catch (err$1) {
|
|
10409
|
-
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);
|
|
10410
10391
|
return null;
|
|
10411
10392
|
}
|
|
10412
10393
|
}
|
|
@@ -10515,7 +10496,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10515
10496
|
});
|
|
10516
10497
|
const nearAccountId = await this.assertValidAccountIdOrFail(1, accountId);
|
|
10517
10498
|
await this.assertSufficientBalance(nearAccountId);
|
|
10518
|
-
const canonicalEmail =
|
|
10499
|
+
const canonicalEmail = this.getCanonicalRecoveryEmail(recoveryEmail);
|
|
10519
10500
|
const deviceNumber = await this.getNextDeviceNumberFromContract(nearAccountId);
|
|
10520
10501
|
this.phase = EmailRecoveryPhase.STEP_2_TOUCH_ID_REGISTRATION;
|
|
10521
10502
|
this.emit({
|
|
@@ -10646,29 +10627,39 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10646
10627
|
await this.options?.afterCall?.(true, void 0);
|
|
10647
10628
|
}
|
|
10648
10629
|
async pollUntilAddKey(rec) {
|
|
10649
|
-
const { pollingIntervalMs, maxPollingDurationMs
|
|
10650
|
-
if (!dkimVerifierAccountId) {
|
|
10651
|
-
const err$2 = this.emitError(4, "Email recovery verification contract (dkimVerifierAccountId) is not configured");
|
|
10652
|
-
await this.options?.afterCall?.(false);
|
|
10653
|
-
throw err$2;
|
|
10654
|
-
}
|
|
10630
|
+
const { pollingIntervalMs, maxPollingDurationMs } = this.getConfig();
|
|
10655
10631
|
this.phase = EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT;
|
|
10656
10632
|
this.pollingStartedAt = Date.now();
|
|
10633
|
+
let sawAttempt = false;
|
|
10657
10634
|
const pollResult = await this.pollUntil({
|
|
10658
10635
|
intervalMs: pollingIntervalMs,
|
|
10659
10636
|
timeoutMs: maxPollingDurationMs,
|
|
10660
10637
|
isCancelled: () => this.cancelled,
|
|
10661
10638
|
tick: async ({ elapsedMs, pollCount }) => {
|
|
10662
|
-
const verification = await this.
|
|
10663
|
-
|
|
10664
|
-
|
|
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
|
+
}
|
|
10665
10656
|
this.emit({
|
|
10666
10657
|
step: 4,
|
|
10667
10658
|
phase: EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT,
|
|
10668
10659
|
status: EmailRecoveryStatus.PROGRESS,
|
|
10669
|
-
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}`,
|
|
10670
10661
|
data: this.buildPollingEventData(rec, {
|
|
10671
|
-
transactionHash
|
|
10662
|
+
transactionHash,
|
|
10672
10663
|
elapsedMs,
|
|
10673
10664
|
pollCount
|
|
10674
10665
|
})
|
|
@@ -10678,7 +10669,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10678
10669
|
done: true,
|
|
10679
10670
|
value: {
|
|
10680
10671
|
outcome: "failed",
|
|
10681
|
-
errorMessage:
|
|
10672
|
+
errorMessage: errorMessage$1 || "Email recovery failed"
|
|
10682
10673
|
}
|
|
10683
10674
|
};
|
|
10684
10675
|
return {
|
|
@@ -10797,7 +10788,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
|
|
|
10797
10788
|
}
|
|
10798
10789
|
async syncAuthenticatorsBestEffort(accountId) {
|
|
10799
10790
|
try {
|
|
10800
|
-
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-
|
|
10791
|
+
const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-CYGJSCgm.js");
|
|
10801
10792
|
const authenticators = await syncAuthenticatorsContractCall$1(this.context.nearClient, this.context.configs.contractId, accountId);
|
|
10802
10793
|
const mappedAuthenticators = this.mapAuthenticatorsFromContract(authenticators);
|
|
10803
10794
|
await IndexedDBManager.clientDB.syncAuthenticatorsFromContract(accountId, mappedAuthenticators);
|
|
@@ -11087,7 +11078,7 @@ var TatchiPasskey = class {
|
|
|
11087
11078
|
} catch {}
|
|
11088
11079
|
if (!this.iframeRouter) {
|
|
11089
11080
|
if (!this.walletIframeInitInFlight) this.walletIframeInitInFlight = (async () => {
|
|
11090
|
-
const { WalletIframeRouter } = await import("./router-
|
|
11081
|
+
const { WalletIframeRouter } = await import("./router-BWtacLJg.js");
|
|
11091
11082
|
this.iframeRouter = new WalletIframeRouter({
|
|
11092
11083
|
walletOrigin,
|
|
11093
11084
|
servicePath: walletIframeConfig?.walletServicePath || "/wallet-service",
|
|
@@ -12125,6 +12116,7 @@ var TatchiPasskey = class {
|
|
|
12125
12116
|
const { accountId, recoveryEmail, options } = args;
|
|
12126
12117
|
if (this.shouldUseWalletIframe()) try {
|
|
12127
12118
|
const router = await this.requireWalletIframeRouter();
|
|
12119
|
+
const normalizedRecoveryEmail = typeof recoveryEmail === "string" && recoveryEmail.trim().length > 0 ? recoveryEmail.trim() : void 0;
|
|
12128
12120
|
const confirmerText = options?.confirmerText;
|
|
12129
12121
|
const confirmationConfig = options?.confirmationConfig;
|
|
12130
12122
|
const safeOptions = {
|
|
@@ -12133,7 +12125,7 @@ var TatchiPasskey = class {
|
|
|
12133
12125
|
};
|
|
12134
12126
|
const res = await router.startEmailRecovery({
|
|
12135
12127
|
accountId,
|
|
12136
|
-
recoveryEmail,
|
|
12128
|
+
recoveryEmail: normalizedRecoveryEmail,
|
|
12137
12129
|
onEvent: options?.onEvent,
|
|
12138
12130
|
options: Object.keys(safeOptions).length > 0 ? safeOptions : void 0
|
|
12139
12131
|
});
|