@swype-org/react-sdk 0.2.375 → 0.2.377

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/index.js CHANGED
@@ -11,6 +11,7 @@ import { getAccount, reconnect, disconnect, getWalletClient, getConnectors } fro
11
11
  import { encodeFunctionData, recoverTypedDataAddress, decodeAbiParameters } from 'viem';
12
12
  import { parseErc6492Signature } from 'viem/utils';
13
13
  import * as QRCode from 'qrcode';
14
+ import posthog from 'posthog-js';
14
15
  import * as Select from '@radix-ui/react-select';
15
16
 
16
17
  var __defProp = Object.defineProperty;
@@ -1553,11 +1554,11 @@ function detachAccountChangeListeners() {
1553
1554
  accountChangeBinding = null;
1554
1555
  }
1555
1556
  function providerKey(selection) {
1556
- const providerName = selection.providerName?.trim();
1557
- if (!providerName) {
1557
+ const providerName2 = selection.providerName?.trim();
1558
+ if (!providerName2) {
1558
1559
  throw new Error("Solana wallet metadata is missing providerName.");
1559
1560
  }
1560
- return `${selection.providerId ?? ""}:${providerName.toLowerCase()}`;
1561
+ return `${selection.providerId ?? ""}:${providerName2.toLowerCase()}`;
1561
1562
  }
1562
1563
  function assertSupportedProvider(selection) {
1563
1564
  const name = selection.providerName?.trim().toLowerCase();
@@ -4125,14 +4126,14 @@ function isBatchableAction(action) {
4125
4126
  return BATCHABLE_ACTION_TYPES.has(action.type);
4126
4127
  }
4127
4128
  function getSolanaWalletSelection(action) {
4128
- const providerName = action.metadata?.providerName;
4129
- if (typeof providerName !== "string" || providerName.trim() === "") {
4129
+ const providerName2 = action.metadata?.providerName;
4130
+ if (typeof providerName2 !== "string" || providerName2.trim() === "") {
4130
4131
  throw new Error(`${action.type} metadata is missing providerName.`);
4131
4132
  }
4132
4133
  const providerId = action.metadata?.providerId;
4133
4134
  return {
4134
4135
  ...typeof providerId === "string" && providerId.trim() !== "" ? { providerId } : {},
4135
- providerName
4136
+ providerName: providerName2
4136
4137
  };
4137
4138
  }
4138
4139
  function isPhantomEvmProviderAvailable() {
@@ -8443,6 +8444,209 @@ function applyAction(state, action) {
8443
8444
  return state;
8444
8445
  }
8445
8446
  }
8447
+ var BLOCKED_SUBSTRINGS = [
8448
+ "bearer",
8449
+ "signature",
8450
+ "signedpayload",
8451
+ "userop",
8452
+ "jwt",
8453
+ "secret",
8454
+ "password",
8455
+ "privatekey",
8456
+ "mnemonic",
8457
+ "seedphrase"
8458
+ ];
8459
+ function isBlockedKey(key) {
8460
+ const lower = key.toLowerCase();
8461
+ if (lower === "token" || lower.endsWith("token")) return true;
8462
+ return BLOCKED_SUBSTRINGS.some((blocked) => lower.includes(blocked));
8463
+ }
8464
+ function isReady() {
8465
+ return typeof posthog !== "undefined" && posthog.__loaded === true;
8466
+ }
8467
+ function sanitizeProps(props) {
8468
+ if (!props) return props;
8469
+ const clean = {};
8470
+ for (const [key, value] of Object.entries(props)) {
8471
+ if (isBlockedKey(key)) continue;
8472
+ if (value === void 0) continue;
8473
+ clean[key] = value;
8474
+ }
8475
+ return clean;
8476
+ }
8477
+ function registerSuperProps(props) {
8478
+ if (!isReady()) return;
8479
+ try {
8480
+ posthog.register(sanitizeProps(props) ?? {});
8481
+ } catch {
8482
+ }
8483
+ }
8484
+ function track(event, props) {
8485
+ if (!isReady()) return;
8486
+ try {
8487
+ posthog.capture(event, sanitizeProps(props));
8488
+ } catch {
8489
+ }
8490
+ }
8491
+ function identifyUser(privyUserId, props) {
8492
+ if (!isReady() || !privyUserId) return;
8493
+ try {
8494
+ posthog.identify(privyUserId, sanitizeProps(props));
8495
+ } catch {
8496
+ }
8497
+ }
8498
+ function resolveAnalyticsEnvironment(opts) {
8499
+ const explicit = opts.explicit?.trim();
8500
+ if (explicit) return explicit;
8501
+ const raw = opts.apiBaseUrl ?? "";
8502
+ let host = raw;
8503
+ try {
8504
+ host = new URL(raw).hostname;
8505
+ } catch {
8506
+ }
8507
+ const h = host.toLowerCase();
8508
+ if (h === "" || h.includes("localhost") || h.startsWith("127.")) return "development";
8509
+ if (h.includes("smokebox")) return "smokebox";
8510
+ if (h.includes("sandbox")) return "sandbox";
8511
+ if (h.includes("staging")) return "staging";
8512
+ return "production";
8513
+ }
8514
+ function resetUser() {
8515
+ if (!isReady()) return;
8516
+ try {
8517
+ posthog.reset();
8518
+ } catch {
8519
+ }
8520
+ }
8521
+
8522
+ // src/analyticsEvents.ts
8523
+ function providerName(state, providerId) {
8524
+ return state.providers.find((p) => p.id === providerId)?.name;
8525
+ }
8526
+ function amountUsd(transfer) {
8527
+ return transfer.amount?.currency === "USD" ? transfer.amount.amount : transfer.amount?.amount;
8528
+ }
8529
+ function sourceChain(transfer) {
8530
+ return transfer.sources?.[0]?.provider?.chainFamily;
8531
+ }
8532
+ function trackAction(action, state, ctx) {
8533
+ const device = ctx.device;
8534
+ switch (action.type) {
8535
+ case "PASSKEY_ACTIVATED":
8536
+ track("auth_succeeded", { method: "passkey", device });
8537
+ break;
8538
+ case "SELECT_PROVIDER":
8539
+ track("wallet_provider_selected", {
8540
+ device,
8541
+ providerId: action.providerId,
8542
+ providerName: providerName(state, action.providerId),
8543
+ transport: device === "desktop" ? "inline" : "deeplink"
8544
+ });
8545
+ break;
8546
+ case "MOBILE_DEEPLINK_READY":
8547
+ track("wallet_deeplink_opened", { device });
8548
+ break;
8549
+ case "SET_SETUP_DEPOSIT_TOKEN":
8550
+ track("token_selected", {
8551
+ device,
8552
+ tokenSymbol: action.symbol,
8553
+ chainName: action.chainName
8554
+ });
8555
+ break;
8556
+ case "FINALIZE_AMOUNT": {
8557
+ const parsed = Number(state.amount);
8558
+ track("amount_entered", {
8559
+ device,
8560
+ amountUsd: Number.isFinite(parsed) ? parsed : void 0
8561
+ });
8562
+ break;
8563
+ }
8564
+ case "PAY_STARTED":
8565
+ track("deposit_clicked", { device });
8566
+ break;
8567
+ case "TRANSFER_CREATED":
8568
+ track("transfer_created", {
8569
+ device,
8570
+ chainFamily: sourceChain(action.transfer)
8571
+ });
8572
+ break;
8573
+ case "TRANSFER_SIGNED":
8574
+ track("transfer_signed", { device });
8575
+ break;
8576
+ case "TRANSFER_COMPLETED":
8577
+ track("transfer_completed", {
8578
+ device,
8579
+ amountUsd: amountUsd(action.transfer),
8580
+ chainFamily: sourceChain(action.transfer)
8581
+ });
8582
+ break;
8583
+ case "CONFIRM_SIGN_SUCCESS":
8584
+ track("confirm_sign_success", { device });
8585
+ break;
8586
+ case "MOBILE_SETUP_COMPLETE":
8587
+ track("wallet_setup_complete", { device });
8588
+ break;
8589
+ case "TRANSFER_FAILED":
8590
+ track("transfer_error", {
8591
+ device,
8592
+ type: "transfer_failed",
8593
+ stage: "processing",
8594
+ message: action.error
8595
+ });
8596
+ break;
8597
+ case "PROCESSING_TIMEOUT":
8598
+ track("transfer_error", {
8599
+ device,
8600
+ type: "processing_timeout",
8601
+ stage: "processing",
8602
+ message: action.error
8603
+ });
8604
+ break;
8605
+ case "SIGN_PAYLOAD_EXPIRED":
8606
+ track("transfer_error", {
8607
+ device,
8608
+ type: "sign_payload_expired",
8609
+ stage: "signing",
8610
+ message: action.error
8611
+ });
8612
+ break;
8613
+ case "PAY_ERROR":
8614
+ track("transfer_error", {
8615
+ device,
8616
+ type: "pay_error",
8617
+ stage: "creation",
8618
+ message: action.error
8619
+ });
8620
+ break;
8621
+ }
8622
+ }
8623
+ function useAnalyticsScreenView(phase, device) {
8624
+ const lastScreenRef = useRef(null);
8625
+ const screen = screenForPhase(phase);
8626
+ useEffect(() => {
8627
+ if (lastScreenRef.current === screen) return;
8628
+ lastScreenRef.current = screen;
8629
+ track("screen_viewed", { screen, phase: phase.step, device });
8630
+ }, [screen, phase.step, device]);
8631
+ }
8632
+ function usePostHogIdentify() {
8633
+ const { ready, authenticated, user } = usePrivy();
8634
+ const identifiedIdRef = useRef(null);
8635
+ useEffect(() => {
8636
+ if (!ready) return;
8637
+ if (authenticated && user?.id) {
8638
+ if (identifiedIdRef.current !== user.id) {
8639
+ identifyUser(user.id);
8640
+ identifiedIdRef.current = user.id;
8641
+ }
8642
+ return;
8643
+ }
8644
+ if (identifiedIdRef.current !== null) {
8645
+ resetUser();
8646
+ identifiedIdRef.current = null;
8647
+ }
8648
+ }, [ready, authenticated, user?.id]);
8649
+ }
8446
8650
 
8447
8651
  // src/setupDepositConfirmation.ts
8448
8652
  function deriveEffectiveSetupSource(setupDepositToken, setupSelectedSourceOption) {
@@ -9307,6 +9511,7 @@ var USDH_LOGO = svgToDataUri(USDH_SVG);
9307
9511
  var ETH_LOGO = "https://assets.relay.link/icons/currencies/eth.png";
9308
9512
  var SOL_LOGO = "https://assets.relay.link/icons/currencies/sol.png";
9309
9513
  var MON_LOGO = "https://assets.relay.link/icons/currencies/mon.png";
9514
+ var BNB_LOGO = "https://assets.relay.link/icons/currencies/bnb.png";
9310
9515
  var KNOWN_LOGOS = {
9311
9516
  metamask: METAMASK_LOGO,
9312
9517
  base: BASE_LOGO,
@@ -9325,7 +9530,8 @@ var TOKEN_LOGOS = {
9325
9530
  USDH: USDH_LOGO,
9326
9531
  ETH: ETH_LOGO,
9327
9532
  SOL: SOL_LOGO,
9328
- MON: MON_LOGO
9533
+ MON: MON_LOGO,
9534
+ BNB: BNB_LOGO
9329
9535
  };
9330
9536
  var CHAIN_LOGOS = {
9331
9537
  base: BASE_CHAIN_LOGO,
@@ -13099,7 +13305,7 @@ var lockBannerTextStyle = (color) => ({
13099
13305
  function ManualTransferPasskeyScreen({
13100
13306
  onCreatePasskey,
13101
13307
  onNoThanks,
13102
- amountUsd,
13308
+ amountUsd: amountUsd2,
13103
13309
  loading = false,
13104
13310
  error,
13105
13311
  onBack,
@@ -17803,6 +18009,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17803
18009
  dispatch({ type: "PASSKEY_ACTIVATED", credentialId: result.credentialId, publicKey: result.publicKey });
17804
18010
  dispatch({ type: "SYNC_PRIVY_SESSION", ready: true, authenticated: true });
17805
18011
  window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, result.credentialId);
18012
+ track("login_succeeded", { method: "passkey", popup: true });
17806
18013
  } catch (err) {
17807
18014
  captureException(err);
17808
18015
  dispatch({
@@ -17815,6 +18022,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17815
18022
  }, [dispatch, popupAuthRef]);
17816
18023
  const { loginWithPasskey, state: loginState } = useLoginWithPasskey({
17817
18024
  onComplete: (params) => {
18025
+ track("login_succeeded", { method: "passkey", popup: false });
17818
18026
  handleAuthComplete(params.user);
17819
18027
  },
17820
18028
  onError: (error) => {
@@ -17843,6 +18051,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17843
18051
  dispatch({ type: "PASSKEY_ACTIVATED", credentialId: result.credentialId, publicKey: result.publicKey });
17844
18052
  dispatch({ type: "SYNC_PRIVY_SESSION", ready: true, authenticated: true });
17845
18053
  window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, result.credentialId);
18054
+ track("signup_succeeded", { method: "passkey", popup: true });
17846
18055
  } catch (err) {
17847
18056
  captureException(err);
17848
18057
  dispatch({
@@ -17855,6 +18064,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17855
18064
  }, [dispatch, popupAuthRef]);
17856
18065
  const { signupWithPasskey, state: signupState } = useSignupWithPasskey({
17857
18066
  onComplete: (params) => {
18067
+ track("signup_succeeded", { method: "passkey", popup: false });
17858
18068
  handleAuthComplete(params.user);
17859
18069
  },
17860
18070
  onError: (error) => {
@@ -18625,7 +18835,7 @@ function useProviderHandlers(deps) {
18625
18835
  return null;
18626
18836
  }
18627
18837
  const provider = providers.find((p) => p.id === providerId);
18628
- const providerName = provider?.name ?? "Wallet";
18838
+ const providerName2 = provider?.name ?? "Wallet";
18629
18839
  try {
18630
18840
  const token = await getAccessToken();
18631
18841
  if (!token) throw new Error("Not authenticated");
@@ -18633,7 +18843,7 @@ function useProviderHandlers(deps) {
18633
18843
  const accountId = crypto.randomUUID();
18634
18844
  const account = await createAccount(apiBaseUrl, token, {
18635
18845
  id: accountId,
18636
- name: providerName,
18846
+ name: providerName2,
18637
18847
  credentialId: activeCredentialId,
18638
18848
  providerId,
18639
18849
  ...merchantAuthorization ? {
@@ -18682,7 +18892,7 @@ function useProviderHandlers(deps) {
18682
18892
  return;
18683
18893
  }
18684
18894
  const provider = providers.find((p) => p.id === providerId);
18685
- const providerName = provider?.name ?? "Wallet";
18895
+ const providerName2 = provider?.name ?? "Wallet";
18686
18896
  let shouldRestoreDesktopSelectionOnError = shouldSnapshotDesktopSelection;
18687
18897
  try {
18688
18898
  await resetWalletConnect();
@@ -18705,7 +18915,7 @@ function useProviderHandlers(deps) {
18705
18915
  const newAccountId = crypto.randomUUID();
18706
18916
  const account = await createAccount(apiBaseUrl, token, {
18707
18917
  id: newAccountId,
18708
- name: providerName,
18918
+ name: providerName2,
18709
18919
  credentialId: activeCredentialId,
18710
18920
  providerId,
18711
18921
  ...merchantAuthorization ? {
@@ -20883,7 +21093,7 @@ function BlinkPaymentInner({
20883
21093
  useWalletConnector: useWalletConnectorProp,
20884
21094
  userAgent: typeof navigator === "undefined" ? void 0 : navigator.userAgent
20885
21095
  });
20886
- const [state, dispatch] = useReducer(
21096
+ const [state, rawDispatch] = useReducer(
20887
21097
  paymentReducer,
20888
21098
  {
20889
21099
  depositAmount,
@@ -20893,6 +21103,30 @@ function BlinkPaymentInner({
20893
21103
  },
20894
21104
  createInitialState
20895
21105
  );
21106
+ const device = isDesktop ? "desktop" : "mobile";
21107
+ const stateRef = useRef(state);
21108
+ stateRef.current = state;
21109
+ const dispatch = useCallback(
21110
+ (action) => {
21111
+ trackAction(action, stateRef.current, { device });
21112
+ rawDispatch(action);
21113
+ },
21114
+ [device]
21115
+ );
21116
+ usePostHogIdentify();
21117
+ useAnalyticsScreenView(state.phase, device);
21118
+ const flowOpenedRef = useRef(false);
21119
+ useEffect(() => {
21120
+ if (flowOpenedRef.current) return;
21121
+ flowOpenedRef.current = true;
21122
+ registerSuperProps({ device });
21123
+ track("flow_opened", {
21124
+ device,
21125
+ isMobileApp: isMobileApp ?? false,
21126
+ fullWidget: enableFullWidget ?? false,
21127
+ hasAmount: depositAmount != null
21128
+ });
21129
+ }, []);
20896
21130
  const polling = useTransferPolling(3e3, effectiveGetAccessToken);
20897
21131
  const transferSigning = useTransferSigning(2e3, { getAccessToken: effectiveGetAccessToken });
20898
21132
  const mobileFlowRefs = {
@@ -21496,6 +21730,6 @@ function BlinkPaymentInner({
21496
21730
  ) });
21497
21731
  }
21498
21732
 
21499
- export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, ManualTransferPasskeyScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, WelcomeBackScreen, appendDebug, api_exports as blinkApi, buildNativeUnsupportedEntries, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, formatNativeAmount, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resolvePasskeyRpId, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };
21733
+ export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, ManualTransferPasskeyScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, WelcomeBackScreen, appendDebug, api_exports as blinkApi, buildNativeUnsupportedEntries, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, formatNativeAmount, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, identifyUser, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resetUser, resolveAnalyticsEnvironment, resolvePasskeyRpId, sanitizeProps, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, track, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };
21500
21734
  //# sourceMappingURL=index.js.map
21501
21735
  //# sourceMappingURL=index.js.map