{"version":3,"sources":["../src/constants/settings.ts","../src/interfaces/Auth.ts","../src/interfaces/EmbeddedWallets/EmbeddedWallets.ts","../src/utils/iFrameCommunication/EmbeddedWalletIframeCommunicator.ts","../src/utils/Storage/LocalStorage.ts","../src/utils/iFrameCommunication/IframeCommunicator.ts","../src/lib/Auth/AwsManagedLogin.ts","../src/lib/Auth/AbstractLogin.ts","../src/lib/Auth/UserManagedLogin.ts","../src/lib/Auth/index.ts","../src/lib/EmbeddedWallets/EmbeddedWallet.ts","../src/lib/EmbeddedWallets/GaslessTransactionMaker.ts","../src/lib/EmbeddedWallets/Signer.ts","../src/lib/Paper.ts"],"sourcesContent":["export const EMBEDDED_WALLET_PATH = \"/sdk/2022-08-12/embedded-wallet\";\nexport const HEADLESS_GOOGLE_OAUTH_ROUTE = `${EMBEDDED_WALLET_PATH}/auth/headless-google-login-managed`;\n\nexport const WALLET_USER_DETAILS_LOCAL_STORAGE_NAME = (clientId: string) =>\n  `paperEwsWalletUserDetails-${clientId}`;\nexport const WALLET_USER_ID_LOCAL_STORAGE_NAME = (clientId: string) =>\n  `paperEwsWalletUserId-${clientId}`;\nconst AUTH_TOKEN_LOCAL_STORAGE_PREFIX = \"walletToken\";\nexport const AUTH_TOKEN_LOCAL_STORAGE_NAME = (clientId: string) => {\n  return `${AUTH_TOKEN_LOCAL_STORAGE_PREFIX}-${clientId}`;\n};\nconst DEVICE_SHARE_LOCAL_STORAGE_PREFIX = \"a\";\nexport const DEVICE_SHARE_LOCAL_STORAGE_NAME = (\n  clientId: string,\n  userId: string,\n) => `${DEVICE_SHARE_LOCAL_STORAGE_PREFIX}-${clientId}-${userId}`;\nexport const DEVICE_SHARE_LOCAL_STORAGE_NAME_DEPRECATED = (clientId: string) =>\n  `${DEVICE_SHARE_LOCAL_STORAGE_PREFIX}-${clientId}`;\n","import type {\n  AuthDetails,\n  InitializedUser,\n  SetUpWalletRpcReturnType,\n} from \"./EmbeddedWallets/EmbeddedWallets\";\n\nexport enum RecoveryShareManagement {\n  USER_MANAGED = \"USER_MANAGED\",\n  AWS_MANAGED = \"AWS_MANAGED\",\n}\n\nexport type AdvancedOptions<T extends RecoveryShareManagement> = {\n  // This is a hack to allow us to assign default value to recoveryShareManagement\n  recoveryShareManagement: RecoveryShareManagement | T;\n};\n\nexport enum AuthProvider {\n  PAPER_EMAIL_OTP = \"PaperEmailOTP\",\n  GOOGLE = \"Google\",\n  TWITTER = \"Twitter\",\n  COGNITO = \"Cognito\",\n  AUTH0 = \"Auth0\",\n  CUSTOM_JWT = \"CustomJWT\",\n}\n\nexport type GetSocialLoginClientIdReturnType = {\n  clientId: string;\n};\n\nexport type GetHeadlessLoginLinkReturnType = {\n  loginLink: string;\n};\n\n// TODO: Clean up tech debt of random type Objects\n// E.g. StoredTokenType is really not used anywhere but it exists as this object for legacy reason\nexport type StoredTokenType = {\n  jwtToken: string;\n  authProvider: AuthProvider;\n  authDetails: AuthDetails;\n  developerClientId: string;\n};\n\nexport type AuthStoredTokenWithCookieReturnType = {\n  storedToken: StoredTokenType & {\n    cookieString: string;\n    shouldStoreCookieString: boolean;\n    isNewUser: boolean;\n  };\n};\nexport type AuthAndWalletRpcReturnType = AuthStoredTokenWithCookieReturnType & {\n  walletDetails: SetUpWalletRpcReturnType;\n};\n\nexport type AuthLoginReturnType = { user: InitializedUser };\n","import type {\n  Chain,\n  CustomizationOptionsType,\n} from \"@paperxyz/sdk-common-utilities\";\nimport type { EmbeddedWallet } from \"../../lib/EmbeddedWallets/EmbeddedWallet\";\nimport type { EmbeddedWalletIframeCommunicator } from \"../../utils/iFrameCommunication/EmbeddedWalletIframeCommunicator\";\nimport type {\n  AdvancedOptions,\n  AuthAndWalletRpcReturnType,\n  RecoveryShareManagement,\n} from \"../Auth\";\n\n// Class constructor types\n// types for class constructors still a little messy right now.\n// Open to PRs from whoever sees this and knows of a cleaner way to handle things\nexport type ClientIdConstructorType = { clientId: string };\nexport type PaperConstructorType<T extends RecoveryShareManagement> =\n  ClientIdConstructorType & {\n    chain: Chain;\n    onAuthSuccess?: (authResult: AuthAndWalletRpcReturnType) => void;\n    advancedOptions?: Partial<AdvancedOptions<T>>;\n    styles?: CustomizationOptionsType;\n  };\nexport type ClientIdWithQuerierType = ClientIdConstructorType & {\n  querier: EmbeddedWalletIframeCommunicator<any>;\n};\nexport type ClientIdWithQuerierAndChainType = ClientIdWithQuerierType & {\n  chain: Chain;\n};\n\n// Auth Types\nexport type AuthDetails = {\n  email?: string;\n  userWalletId: string;\n  recoveryCode?: string;\n};\n\nexport type InitializedUser = {\n  status: UserStatus.LOGGED_IN_WALLET_INITIALIZED;\n  wallet: EmbeddedWallet;\n  walletAddress: string;\n  authDetails: AuthDetails;\n};\n\n// Embedded Wallet Types\nexport enum UserStatus {\n  LOGGED_OUT = \"Logged Out\",\n  LOGGED_IN_WALLET_INITIALIZED = \"Logged In, Wallet Initialized\",\n}\nexport enum UserWalletStatus {\n  LOGGED_OUT = \"Logged Out\",\n  LOGGED_IN_WALLET_UNINITIALIZED = \"Logged In, Wallet Uninitialized\",\n  LOGGED_IN_NEW_DEVICE = \"Logged In, New Device\",\n  LOGGED_IN_WALLET_INITIALIZED = \"Logged In, Wallet Initialized\",\n}\n\nexport type WalletAddressObjectType = {\n  walletAddress: string;\n};\n\nexport type SetUpWalletRpcReturnType = WalletAddressObjectType & {\n  deviceShareStored: string;\n  isIframeStorageEnabled: boolean;\n};\n\nexport type SendEmailOtpReturnType = {\n  recoveryShareManagement: RecoveryShareManagement;\n  isNewUser: boolean;\n  isNewDevice: boolean;\n};\nexport type LogoutReturnType = { success: boolean };\nexport type GetAuthDetailsReturnType = { authDetails?: AuthDetails };\n\n// ! Types seem repetitive, but the name should identify which goes where\n// this is the return type from the EmbeddedWallet Class getUserWalletStatus method iframe call\nexport type GetUserWalletStatusRpcReturnType =\n  | {\n      status: UserWalletStatus.LOGGED_OUT;\n      user: undefined;\n    }\n  | {\n      status: UserWalletStatus.LOGGED_IN_WALLET_UNINITIALIZED;\n      user: { authDetails: AuthDetails };\n    }\n  | {\n      status: UserWalletStatus.LOGGED_IN_NEW_DEVICE;\n      user: { authDetails: AuthDetails; walletAddress: string };\n    }\n  | {\n      status: UserWalletStatus.LOGGED_IN_WALLET_INITIALIZED;\n      user: Omit<InitializedUser, \"wallet\" | \"status\">;\n    };\n\n// this is the return type from the EmbeddedWallet Class getUserWalletStatus method\nexport type GetUserWalletStatusFnReturnType =\n  | {\n      status: UserWalletStatus.LOGGED_OUT;\n      user: undefined;\n    }\n  | {\n      status: UserWalletStatus.LOGGED_IN_WALLET_UNINITIALIZED;\n      user: { authDetails: AuthDetails };\n    }\n  | {\n      status: UserWalletStatus.LOGGED_IN_NEW_DEVICE;\n      user: { authDetails: AuthDetails; walletAddress: string };\n    }\n  | {\n      status: UserWalletStatus.LOGGED_IN_WALLET_INITIALIZED;\n      user: Omit<InitializedUser, \"status\">;\n    };\n\n// This is returned from the getUser method in PaperEmbeddedWalletSdk\nexport type GetUser =\n  | {\n      status: UserStatus.LOGGED_OUT;\n    }\n  | InitializedUser;\n","import type { CustomizationOptionsType } from \"@paperxyz/sdk-common-utilities\";\nimport { getPaperOriginUrl } from \"@paperxyz/sdk-common-utilities\";\nimport { EMBEDDED_WALLET_PATH } from \"../../constants/settings\";\nimport { LocalStorage } from \"../Storage/LocalStorage\";\nimport { IframeCommunicator } from \"./IframeCommunicator\";\n\nexport class EmbeddedWalletIframeCommunicator<\n  T extends { [key: string]: any },\n> extends IframeCommunicator<T> {\n  clientId: string;\n  constructor({\n    clientId,\n    customizationOptions,\n  }: {\n    clientId: string;\n    customizationOptions?: CustomizationOptionsType;\n  }) {\n    super({\n      iframeId: EMBEDDED_WALLET_IFRAME_ID,\n      link: createEmbeddedWalletIframeLink({\n        clientId,\n        path: EMBEDDED_WALLET_PATH,\n        queryParams: customizationOptions,\n      }).href,\n      container: document.body,\n    });\n    this.clientId = clientId;\n  }\n\n  override async onIframeLoadedInitVariables() {\n    const localStorage = new LocalStorage({\n      clientId: this.clientId,\n    });\n\n    return {\n      authCookie: await localStorage.getAuthCookie(),\n      deviceShareStored: await localStorage.getDeviceShare(),\n      walletUserId: await localStorage.getWalletUserId(),\n      clientId: this.clientId,\n    };\n  }\n}\n\n// This is the URL and ID tag of the iFrame that we communicate with\nexport function createEmbeddedWalletIframeLink({\n  clientId,\n  path,\n  queryParams,\n}: {\n  clientId: string;\n  path: string;\n  queryParams?: { [key: string]: string | number };\n}) {\n  const embeddedWalletUrl = new URL(path, getPaperOriginUrl());\n  if (queryParams) {\n    for (const queryKey of Object.keys(queryParams)) {\n      embeddedWalletUrl.searchParams.set(\n        queryKey,\n        queryParams[queryKey]?.toString() || \"\",\n      );\n    }\n  }\n  embeddedWalletUrl.searchParams.set(\"clientId\", clientId);\n  return embeddedWalletUrl;\n}\nexport const EMBEDDED_WALLET_IFRAME_ID = \"paper-embedded-wallet-iframe\";\n","import {\n  AUTH_TOKEN_LOCAL_STORAGE_NAME,\n  DEVICE_SHARE_LOCAL_STORAGE_NAME,\n  WALLET_USER_ID_LOCAL_STORAGE_NAME,\n} from \"../../constants/settings\";\n\nconst data = new Map<string, string>();\n\nexport class LocalStorage {\n  protected isSupported: boolean;\n  protected clientId: string;\n  constructor({ clientId }: { clientId: string }) {\n    this.isSupported = typeof window !== \"undefined\" && !!window.localStorage;\n    this.clientId = clientId;\n  }\n\n  protected async getItem(key: string): Promise<string | null> {\n    if (this.isSupported) {\n      return window.localStorage.getItem(key);\n    } else {\n      return data.get(key) ?? null;\n    }\n  }\n\n  protected async setItem(key: string, value: string): Promise<void> {\n    if (this.isSupported) {\n      return window.localStorage.setItem(key, value);\n    } else {\n      data.set(key, value);\n    }\n  }\n\n  protected async removeItem(key: string): Promise<boolean> {\n    const item = await this.getItem(key);\n    if (this.isSupported && item) {\n      window.localStorage.removeItem(key);\n      return true;\n    }\n    return false;\n  }\n\n  async saveAuthCookie(cookie: string): Promise<void> {\n    await this.setItem(AUTH_TOKEN_LOCAL_STORAGE_NAME(this.clientId), cookie);\n  }\n  async getAuthCookie(): Promise<string | null> {\n    return this.getItem(AUTH_TOKEN_LOCAL_STORAGE_NAME(this.clientId));\n  }\n  async removeAuthCookie(): Promise<boolean> {\n    return this.removeItem(AUTH_TOKEN_LOCAL_STORAGE_NAME(this.clientId));\n  }\n\n  async saveDeviceShare(share: string, userId: string): Promise<void> {\n    await this.saveWalletUserId(userId);\n    await this.setItem(\n      DEVICE_SHARE_LOCAL_STORAGE_NAME(this.clientId, userId),\n      share,\n    );\n  }\n  async getDeviceShare(): Promise<string | null> {\n    const userId = await this.getWalletUserId();\n    if (userId) {\n      return this.getItem(\n        DEVICE_SHARE_LOCAL_STORAGE_NAME(this.clientId, userId),\n      );\n    }\n    return null;\n  }\n  async removeDeviceShare(): Promise<boolean> {\n    const userId = await this.getWalletUserId();\n    if (userId) {\n      return this.removeItem(\n        DEVICE_SHARE_LOCAL_STORAGE_NAME(this.clientId, userId),\n      );\n    }\n    return false;\n  }\n\n  async getWalletUserId(): Promise<string | null> {\n    return this.getItem(WALLET_USER_ID_LOCAL_STORAGE_NAME(this.clientId));\n  }\n  async saveWalletUserId(userId: string): Promise<void> {\n    await this.setItem(\n      WALLET_USER_ID_LOCAL_STORAGE_NAME(this.clientId),\n      userId,\n    );\n  }\n  async removeWalletUserId(): Promise<boolean> {\n    return this.removeItem(WALLET_USER_ID_LOCAL_STORAGE_NAME(this.clientId));\n  }\n}\n","import type { MessageType, StyleObject } from \"@paperxyz/sdk-common-utilities\";\nimport { getPaperOriginUrl } from \"@paperxyz/sdk-common-utilities\";\nimport { EMBEDDED_WALLET_PATH } from \"../../constants/settings\";\n\ntype IFrameCommunicatorProps = {\n  link: string;\n  iframeId: string;\n  container?: HTMLElement;\n  iframeStyles?: StyleObject;\n  onIframeInitialize?: () => void;\n};\n\nfunction sleep(seconds: number) {\n  return new Promise((resolve) => {\n    setTimeout(resolve, seconds * 1000);\n  });\n}\n\nconst iframeBaseStyle = {\n  height: \"100%\",\n  width: \"100%\",\n  border: \"none\",\n  backgroundColor: \"transparent\",\n  colorScheme: \"light\",\n  position: \"fixed\",\n  top: \"0px\",\n  right: \"0px\",\n  zIndex: \"2147483646\",\n  display: \"none\",\n};\n\n// Global var to help track iframe state\nconst isIframeLoaded = new Map<string, boolean>();\n\nexport class IframeCommunicator<T extends { [key: string]: any }> {\n  private iframe: HTMLIFrameElement;\n  private POLLING_INTERVAL_SECONDS = 1.4;\n  private POST_LOAD_BUFFER_SECONDS = 1;\n\n  constructor({\n    link,\n    iframeId,\n    container = document.body,\n    iframeStyles,\n    onIframeInitialize,\n  }: IFrameCommunicatorProps) {\n    // Creating the IFrame element for communication\n    let iframe = document.getElementById(iframeId) as HTMLIFrameElement | null;\n    const hrefLink = new URL(link);\n    const sdkVersion = process.env.SDK_VERSION;\n    if (!sdkVersion) {\n      throw new Error(\"Missing SDK_VERSION env var\");\n    }\n    hrefLink.searchParams.set(\"sdkVersion\", sdkVersion);\n    if (!iframe || iframe.src != hrefLink.href) {\n      // ! Do not update the hrefLink here or it'll cause multiple re-renders\n      if (!iframe) {\n        iframe = document.createElement(\"iframe\");\n        const mergedIframeStyles = {\n          ...iframeBaseStyle,\n          ...iframeStyles,\n        };\n        Object.assign(iframe.style, mergedIframeStyles);\n        iframe.setAttribute(\"id\", iframeId);\n        iframe.setAttribute(\"fetchpriority\", \"high\");\n        container.appendChild(iframe);\n      }\n      iframe.src = hrefLink.href;\n      iframe.setAttribute(\"data-version\", sdkVersion);\n      iframe.onload = this.onIframeLoadHandler(\n        iframe,\n        this.POST_LOAD_BUFFER_SECONDS,\n        onIframeInitialize,\n      );\n    }\n    this.iframe = iframe;\n  }\n\n  protected async onIframeLoadedInitVariables(): Promise<Record<string, any>> {\n    return {};\n  }\n\n  onIframeLoadHandler(\n    iframe: HTMLIFrameElement,\n    prePostMessageSleepInSeconds: number,\n    onIframeInitialize?: () => void,\n  ) {\n    return async () => {\n      const promise = new Promise<boolean>(async (res, rej) => {\n        const channel = new MessageChannel();\n        channel.port1.onmessage = (event: MessageEvent<MessageType<void>>) => {\n          const { data } = event;\n          channel.port1.close();\n          if (!data.success) {\n            return rej(new Error(data.error));\n          }\n          isIframeLoaded.set(iframe.src, true);\n          if (onIframeInitialize) {\n            onIframeInitialize();\n          }\n          return res(true);\n        };\n        // iFrame takes a bit of time after loading to be ready for message receiving\n        // This is hacky\n        await sleep(prePostMessageSleepInSeconds);\n        const INIT_IFRAME_EVENT = \"initIframe\";\n        iframe?.contentWindow?.postMessage(\n          // ? We initialise the iframe with a bunch\n          // of useful information so that we don't have to pass it\n          // through in each of the future call. This would be where we do it.\n          {\n            eventType: INIT_IFRAME_EVENT,\n            data: await this.onIframeLoadedInitVariables(),\n          },\n          `${getPaperOriginUrl()}${EMBEDDED_WALLET_PATH}`,\n          [channel.port2],\n        );\n      });\n      await promise;\n    };\n  }\n\n  async call<ReturnData>({\n    procedureName,\n    params,\n    showIframe = false,\n    injectRecoveryCode = { isInjectRecoveryCode: false },\n  }: {\n    procedureName: keyof T;\n    params: T[keyof T];\n    showIframe?: boolean;\n    injectRecoveryCode?: {\n      getRecoveryCode?: (userWalletId: string) => Promise<string | undefined>;\n      isInjectRecoveryCode: boolean;\n    };\n  }) {\n    while (!isIframeLoaded.get(this.iframe.src)) {\n      await sleep(this.POLLING_INTERVAL_SECONDS);\n    }\n    if (showIframe) {\n      this.iframe.style.display = \"block\";\n      // magic number to let the display render before performing the animation of the modal in\n      await sleep(0.005);\n    }\n    const promise = new Promise<ReturnData>((res, rej) => {\n      if (injectRecoveryCode.isInjectRecoveryCode) {\n        const injectRecoveryCodeListener = async (\n          e: MessageEvent<{ type: string; userWalletId: string }>,\n        ) => {\n          if (\n            e.origin !== getPaperOriginUrl() ||\n            e.data.type !== \"paper_getRecoveryCode\" ||\n            typeof e.data.userWalletId !== \"string\"\n          ) {\n            return;\n          }\n          const recoveryCode = await injectRecoveryCode.getRecoveryCode?.(\n            e.data.userWalletId,\n          );\n          this.iframe.contentWindow?.postMessage(\n            { type: \"paper_getRecoveryCode_response\", recoveryCode },\n            getPaperOriginUrl(),\n          );\n          window.removeEventListener(\"message\", injectRecoveryCodeListener);\n        };\n        window.addEventListener(\"message\", injectRecoveryCodeListener);\n      }\n\n      const channel = new MessageChannel();\n      channel.port1.onmessage = async (\n        event: MessageEvent<MessageType<ReturnData>>,\n      ) => {\n        const { data } = event;\n        channel.port1.close();\n        if (showIframe) {\n          // magic number to let modal fade out before hiding it\n          await sleep(0.1);\n          this.iframe.style.display = \"none\";\n        }\n        if (!data.success) {\n          rej(new Error(data.error));\n        } else {\n          res(data.data);\n        }\n      };\n      this.iframe.contentWindow?.postMessage(\n        { eventType: procedureName, data: params },\n        `${getPaperOriginUrl()}${EMBEDDED_WALLET_PATH}`,\n        [channel.port2],\n      );\n    });\n    return promise;\n  }\n\n  /**\n   * This has to be called by any iframe that will be removed from the DOM.\n   * Use to make sure that we reset the global loaded state of the particular iframe.src\n   */\n  destroy() {\n    isIframeLoaded.delete(this.iframe.src);\n  }\n}\n","import { getPaperOriginUrl } from \"@paperxyz/sdk-common-utilities\";\nimport type {\n  AuthAndWalletRpcReturnType,\n  AuthLoginReturnType,\n  GetHeadlessLoginLinkReturnType,\n} from \"../../interfaces/Auth\";\nimport { RecoveryShareManagement } from \"../../interfaces/Auth\";\nimport { AbstractLogin } from \"./AbstractLogin\";\n\nexport class AwsManagedLogin extends AbstractLogin<\n  void,\n  { email: string },\n  { email: string; otp: string }\n> {\n  override async loginWithPaperModal(): Promise<AuthLoginReturnType> {\n    await this.preLogin();\n    const result = await this.LoginQuerier.call<AuthAndWalletRpcReturnType>({\n      procedureName: \"loginWithPaperModal\",\n      params: { recoveryShareManagement: RecoveryShareManagement.AWS_MANAGED },\n      showIframe: true,\n      injectRecoveryCode: {\n        isInjectRecoveryCode: true,\n      },\n    });\n    return this.postLogin(result);\n  }\n\n  private async getGoogleLoginUrl(): Promise<GetHeadlessLoginLinkReturnType> {\n    const result = await this.LoginQuerier.call<GetHeadlessLoginLinkReturnType>(\n      {\n        procedureName: \"getHeadlessGoogleLoginLink\",\n        params: undefined,\n      },\n    );\n    return result;\n  }\n\n  private closeWindow = ({\n    isWindowOpenedByFn,\n    win,\n    closeOpenedWindow,\n  }: {\n    win?: Window | null;\n    isWindowOpenedByFn: boolean;\n    closeOpenedWindow?: (openedWindow: Window) => void;\n  }) => {\n    if (isWindowOpenedByFn) {\n      win?.close();\n    } else {\n      if (win && closeOpenedWindow) {\n        closeOpenedWindow(win);\n      } else if (win) {\n        win.close();\n      }\n    }\n  };\n\n  override async loginWithGoogle(args?: {\n    openedWindow?: Window | null;\n    closeOpenedWindow?: (openedWindow: Window) => void;\n  }): Promise<AuthLoginReturnType> {\n    await this.preLogin();\n    let win = args?.openedWindow;\n    let isWindowOpenedByFn = false;\n    if (!win) {\n      win = window.open(\"\", \"Login\", \"width=350, height=500\");\n      isWindowOpenedByFn = true;\n    }\n    if (!win) {\n      throw new Error(\"Something went wrong opening pop-up\");\n    }\n    await this.preLogin();\n    // fetch the url to open the login window from iframe\n    const { loginLink } = await this.getGoogleLoginUrl();\n\n    win.location.href = loginLink;\n\n    // listen to result from the login window\n    const result = await new Promise<AuthAndWalletRpcReturnType>(\n      (resolve, reject) => {\n        // detect when the user closes the login window\n        const pollTimer = window.setInterval(async () => {\n          if (!win) {\n            return;\n          }\n          if (win.closed) {\n            clearInterval(pollTimer);\n            window.removeEventListener(\"message\", messageListener);\n            reject(new Error(\"User closed login window\"));\n          }\n        }, 1000);\n\n        const messageListener = async (\n          event: MessageEvent<{\n            eventType: string;\n            authResult?: AuthAndWalletRpcReturnType;\n            error?: string;\n          }>,\n        ) => {\n          if (event.origin !== getPaperOriginUrl()) {\n            return;\n          }\n          if (typeof event.data !== \"object\") {\n            reject(new Error(\"Invalid event data\"));\n            return;\n          }\n\n          switch (event.data.eventType) {\n            case \"userLoginSuccess\": {\n              window.removeEventListener(\"message\", messageListener);\n              clearInterval(pollTimer);\n              this.closeWindow({\n                isWindowOpenedByFn,\n                win,\n                closeOpenedWindow: args?.closeOpenedWindow,\n              });\n              if (event.data.authResult) {\n                resolve(event.data.authResult);\n              }\n              break;\n            }\n            case \"userLoginFailed\": {\n              window.removeEventListener(\"message\", messageListener);\n              clearInterval(pollTimer);\n              this.closeWindow({\n                isWindowOpenedByFn,\n                win,\n                closeOpenedWindow: args?.closeOpenedWindow,\n              });\n              reject(new Error(event.data.error));\n              break;\n            }\n            case \"injectDeveloperClientId\": {\n              win?.postMessage(\n                {\n                  eventType: \"injectDeveloperClientIdResult\",\n                  developerClientId: this.clientId,\n                },\n                getPaperOriginUrl(),\n              );\n              break;\n            }\n          }\n        };\n        window.addEventListener(\"message\", messageListener);\n      },\n    );\n\n    return this.postLogin({\n      storedToken: { ...result.storedToken, shouldStoreCookieString: true },\n      walletDetails: { ...result.walletDetails, isIframeStorageEnabled: false },\n    });\n  }\n\n  override async loginWithPaperEmailOtp({\n    email,\n  }: {\n    email: string;\n  }): Promise<AuthLoginReturnType> {\n    await this.preLogin();\n    const result = await this.LoginQuerier.call<AuthAndWalletRpcReturnType>({\n      procedureName: \"loginWithPaperModal\",\n      params: {\n        email,\n        recoveryShareManagement: RecoveryShareManagement.AWS_MANAGED,\n      },\n      showIframe: true,\n      injectRecoveryCode: {\n        isInjectRecoveryCode: true,\n      },\n    });\n    return this.postLogin(result);\n  }\n  override async verifyPaperEmailLoginOtp({\n    email,\n    otp,\n  }: {\n    email: string;\n    otp: string;\n  }): Promise<AuthLoginReturnType> {\n    const result = await this.LoginQuerier.call<AuthAndWalletRpcReturnType>({\n      procedureName: \"verifyPaperEmailLoginOtp\",\n      params: {\n        email,\n        otp,\n        recoveryShareManagement: RecoveryShareManagement.AWS_MANAGED,\n      },\n      injectRecoveryCode: {\n        isInjectRecoveryCode: true,\n      },\n    });\n    return this.postLogin(result);\n  }\n}\n","import type {\n  AuthAndWalletRpcReturnType,\n  AuthLoginReturnType,\n  RecoveryShareManagement,\n} from \"../../interfaces/Auth\";\nimport type {\n  ClientIdWithQuerierType,\n  SendEmailOtpReturnType,\n} from \"../../interfaces/EmbeddedWallets/EmbeddedWallets\";\nimport type { EmbeddedWalletIframeCommunicator } from \"../../utils/iFrameCommunication/EmbeddedWalletIframeCommunicator\";\n\ntype LoginQuerierTypes = {\n  loginWithPaperModal:\n    | undefined\n    | { email: string; recoveryCode?: string }\n    | { recoveryShareManagement: RecoveryShareManagement }\n    | { email: string };\n  sendPaperEmailLoginOtp: {\n    email: string;\n    recoveryShareManagement?: RecoveryShareManagement;\n  };\n  verifyPaperEmailLoginOtp:\n    | {\n        email: string;\n        otp: string;\n        recoveryCode?: string;\n      }\n    | {\n        email: string;\n        otp: string;\n        recoveryShareManagement: RecoveryShareManagement;\n      };\n  injectDeveloperClientId: void;\n  getHeadlessGoogleLoginLink: void;\n  loginWithGoogle: void;\n};\n\nexport abstract class AbstractLogin<\n  MODAL = void,\n  EMAIL_MODAL extends { email: string } = { email: string },\n  EMAIL_VERIFICATION extends { email: string; otp: string } = {\n    email: string;\n    otp: string;\n  },\n> {\n  protected LoginQuerier: EmbeddedWalletIframeCommunicator<LoginQuerierTypes>;\n  protected preLogin;\n  protected postLogin: (\n    authResults: AuthAndWalletRpcReturnType,\n  ) => Promise<AuthLoginReturnType>;\n  protected clientId: string;\n  /**\n   * Used to manage the user's auth states. This should not be instantiated directly.\n   * Call {@link PaperEmbeddedWalletSdk.auth} instead.\n   *\n   * Authentication settings can be managed via the [authentication settings dashboard](https://withpaper.com/dashboard/embedded-wallets/auth-settings)\n   */\n  constructor({\n    querier,\n    preLogin,\n    postLogin,\n    clientId,\n  }: ClientIdWithQuerierType & {\n    preLogin: () => Promise<void>;\n    postLogin: (\n      authDetails: AuthAndWalletRpcReturnType,\n    ) => Promise<AuthLoginReturnType>;\n  }) {\n    this.LoginQuerier = querier;\n    this.preLogin = preLogin;\n    this.postLogin = postLogin;\n    this.clientId = clientId;\n  }\n\n  abstract loginWithPaperModal(args?: MODAL): Promise<AuthLoginReturnType>;\n  abstract loginWithPaperEmailOtp(\n    args: EMAIL_MODAL,\n  ): Promise<AuthLoginReturnType>;\n\n  abstract loginWithGoogle(args?: {\n    openedWindow?: Window | null;\n    closeOpenedWindow?: (openedWindow: Window) => void;\n  }): Promise<AuthLoginReturnType>;\n\n  async sendPaperEmailLoginOtp({\n    email,\n    recoveryShareManagement,\n  }: LoginQuerierTypes[\"sendPaperEmailLoginOtp\"]): Promise<SendEmailOtpReturnType> {\n    await this.preLogin();\n    const {\n      isNewUser,\n      isNewDevice,\n      recoveryShareManagement: userRecoveryShareManagement,\n    } = await this.LoginQuerier.call<SendEmailOtpReturnType>({\n      procedureName: \"sendPaperEmailLoginOtp\",\n      params: { email, recoveryShareManagement },\n    });\n    return {\n      isNewUser,\n      isNewDevice,\n      recoveryShareManagement: userRecoveryShareManagement,\n    };\n  }\n\n  abstract verifyPaperEmailLoginOtp(\n    args: EMAIL_VERIFICATION,\n  ): Promise<AuthLoginReturnType>;\n}\n","import type {\n  AuthAndWalletRpcReturnType,\n  AuthLoginReturnType,\n} from \"../../interfaces/Auth\";\nimport { AbstractLogin } from \"./AbstractLogin\";\nexport class UserManagedLogin extends AbstractLogin<\n  {\n    getRecoveryCode: (userWalletId: string) => Promise<string | undefined>;\n  },\n  { email: string; recoveryCode?: string },\n  { email: string; otp: string; recoveryCode?: string }\n> {\n  override async loginWithPaperModal(args?: {\n    getRecoveryCode: (userWalletId: string) => Promise<string | undefined>;\n  }): Promise<AuthLoginReturnType> {\n    await this.preLogin();\n    const result = await this.LoginQuerier.call<AuthAndWalletRpcReturnType>({\n      procedureName: \"loginWithPaperModal\",\n      params: undefined,\n      showIframe: true,\n      injectRecoveryCode: {\n        isInjectRecoveryCode: true,\n        getRecoveryCode: args?.getRecoveryCode,\n      },\n    });\n    return this.postLogin(result);\n  }\n\n  override async loginWithGoogle(args?: {\n    openedWindow?: Window | null;\n    closeOpenedWindow?: (openedWindow: Window) => void;\n  }): Promise<AuthLoginReturnType> {\n    throw new Error(\n      \"loginWithGoogle is not yet supported in the RecoveryShareManagement.USER_MANAGED flow. Please use RecoveryShareManagement.AWS_MANAGED instead.\",\n    );\n  }\n\n  override async loginWithPaperEmailOtp({\n    email,\n    recoveryCode,\n  }: {\n    email: string;\n    recoveryCode?: string | undefined;\n  }): Promise<AuthLoginReturnType> {\n    await this.preLogin();\n    const result = await this.LoginQuerier.call<AuthAndWalletRpcReturnType>({\n      procedureName: \"loginWithPaperModal\",\n      params: { email, recoveryCode },\n      showIframe: true,\n      injectRecoveryCode: {\n        isInjectRecoveryCode: true,\n      },\n    });\n    return this.postLogin(result);\n  }\n  override async verifyPaperEmailLoginOtp({\n    email,\n    otp,\n    recoveryCode,\n  }: {\n    email: string;\n    otp: string;\n    recoveryCode?: string | undefined;\n  }): Promise<AuthLoginReturnType> {\n    const result = await this.LoginQuerier.call<AuthAndWalletRpcReturnType>({\n      procedureName: \"verifyPaperEmailLoginOtp\",\n      params: { email, otp, recoveryCode },\n      injectRecoveryCode: {\n        isInjectRecoveryCode: true,\n      },\n    });\n    return this.postLogin(result);\n  }\n}\n","import type {\n  AdvancedOptions,\n  AuthAndWalletRpcReturnType,\n  AuthLoginReturnType,\n  AuthProvider,\n} from \"../../interfaces/Auth\";\nimport { RecoveryShareManagement } from \"../../interfaces/Auth\";\nimport type {\n  ClientIdWithQuerierType,\n  LogoutReturnType,\n  SendEmailOtpReturnType,\n} from \"../../interfaces/EmbeddedWallets/EmbeddedWallets\";\nimport { LocalStorage } from \"../../utils/Storage/LocalStorage\";\nimport type { EmbeddedWalletIframeCommunicator } from \"../../utils/iFrameCommunication/EmbeddedWalletIframeCommunicator\";\nimport { AwsManagedLogin } from \"./AwsManagedLogin\";\nimport { UserManagedLogin } from \"./UserManagedLogin\";\n\nexport type AuthQuerierTypes = {\n  initIframe: {\n    clientId: string;\n    authCookie: string;\n    walletUserId: string;\n    deviceShareStored: string;\n  };\n  loginWithJwtAuthCallback: {\n    token: string;\n    authProvider: AuthProvider;\n    recoveryCode?: string;\n  };\n  logout: void;\n  sendPaperEmailLoginOtp: { email: string };\n};\n\nexport class Auth<\n  T extends RecoveryShareManagement = RecoveryShareManagement.USER_MANAGED,\n> {\n  protected advancedOptions: AdvancedOptions<T>;\n  protected clientId: string;\n  protected AuthQuerier: EmbeddedWalletIframeCommunicator<AuthQuerierTypes>;\n  protected localStorage: LocalStorage;\n  protected onAuthSuccess: (\n    authResults: AuthAndWalletRpcReturnType,\n  ) => Promise<AuthLoginReturnType>;\n  public userManagedLogin: UserManagedLogin;\n  public awsManagedLogin: AwsManagedLogin;\n\n  /**\n   * Used to manage the user's auth states. This should not be instantiated directly.\n   * Call {@link PaperEmbeddedWalletSdk.auth} instead.\n   *\n   * Authentication settings can be managed via the [authentication settings dashboard](https://withpaper.com/dashboard/embedded-wallets/auth-settings)\n   * @param {string} params.clientId the clientId associated with the various authentication settings\n   */\n  constructor({\n    clientId,\n    advancedOptions,\n    querier,\n    onAuthSuccess,\n  }: ClientIdWithQuerierType & {\n    advancedOptions?: Partial<AdvancedOptions<T>>;\n    onAuthSuccess: (\n      authDetails: AuthAndWalletRpcReturnType,\n    ) => Promise<AuthLoginReturnType>;\n  }) {\n    this.clientId = clientId;\n    this.advancedOptions = {\n      recoveryShareManagement:\n        advancedOptions?.recoveryShareManagement ??\n        RecoveryShareManagement.AWS_MANAGED,\n    };\n    this.AuthQuerier = querier;\n    this.localStorage = new LocalStorage({ clientId });\n    this.onAuthSuccess = onAuthSuccess;\n    this.userManagedLogin = new UserManagedLogin({\n      postLogin: async (result) => {\n        return this.postLogin(result);\n      },\n      preLogin: async () => {\n        await this.preLogin();\n      },\n      querier: querier,\n      clientId,\n    });\n    this.awsManagedLogin = new AwsManagedLogin({\n      postLogin: async (result) => {\n        return this.postLogin(result);\n      },\n      preLogin: async () => {\n        await this.preLogin();\n      },\n      querier: querier,\n      clientId,\n    });\n  }\n\n  private async preLogin() {\n    await this.logout();\n  }\n\n  private async postLogin({\n    storedToken,\n    walletDetails,\n  }: AuthAndWalletRpcReturnType): Promise<AuthLoginReturnType> {\n    if (storedToken.shouldStoreCookieString) {\n      await this.localStorage.saveAuthCookie(storedToken.cookieString);\n    }\n    const initializedUser = await this.onAuthSuccess({\n      storedToken,\n      walletDetails,\n    });\n    return initializedUser;\n  }\n\n  /**\n   * @description\n   * Used to log the user in with an oauth login flow\n   *\n   * Note that you have to either enable \"Auth0\" or \"Custom JSON Web Token\" in the [auth setting dashboard](https://withpaper.com/dashboard/auth-settings) in order to use this\n   * @param {string} jwtParams.token The associate token from the oauth callback\n   * @param {AuthProvider} jwtParams.provider The Auth provider that is being used\n   * @param {string} jwtParams.recoveryCode This has to be passed in if the user is not logging in for the first time in order for us to decrypt and recover the users wallet\n   * @returns {{user: InitializedUser}} An InitializedUser object containing the user's status, wallet, authDetails, and more\n   */\n  async loginWithJwtAuth({\n    token,\n    authProvider,\n    recoveryCode,\n  }: AuthQuerierTypes[\"loginWithJwtAuthCallback\"]): Promise<AuthLoginReturnType> {\n    await this.preLogin();\n    const result = await this.AuthQuerier.call<AuthAndWalletRpcReturnType>({\n      procedureName: \"loginWithJwtAuthCallback\",\n      params: {\n        token,\n        authProvider,\n        recoveryCode,\n      },\n    });\n    return this.postLogin(result);\n  }\n\n  /**\n   * @description\n   * Used to log the user into their Paper wallet on your platform via a myriad of auth providers\n   *\n   * @example\n   * const Paper = new PaperEmbeddedWalletSdk({clientId: \"YOUR_CLIENT_ID\", chain: \"Polygon\"})\n   * try {\n   *   const user = await Paper.auth.loginWithPaperModal();\n   *   // user is now logged in\n   * } catch (e) {\n   *   // User closed modal or something else went wrong during the authentication process\n   *   console.error(e)\n   * }\n   *\n   * @param {(userWalletId: string) => Promise<string | undefined>} args.getRecoveryCode Only present when using RecoveryShareManagement.USER_MANAGED recovery share management. A function that returns the recovery code for a given userWalletId.\n   *\n   * @returns {{user: InitializedUser}} An InitializedUser object. See {@link PaperEmbeddedWalletSdk.getUser} for more\n   */\n  async loginWithPaperModal(\n    args?: T extends RecoveryShareManagement.AWS_MANAGED\n      ? void\n      : Parameters<UserManagedLogin[\"loginWithPaperModal\"]>[0],\n  ): Promise<AuthLoginReturnType> {\n    await this.preLogin();\n    if (\n      this.advancedOptions.recoveryShareManagement ===\n      RecoveryShareManagement.AWS_MANAGED\n    ) {\n      return this.awsManagedLogin.loginWithPaperModal();\n    }\n    return this.userManagedLogin.loginWithPaperModal(\n      args as Parameters<UserManagedLogin[\"loginWithPaperModal\"]>[0],\n    );\n  }\n\n  /**\n   * @description\n   * Used to log the user into their Paper wallet using email OTP\n   *\n   * @example\n   *  // Basic Flow\n   *  const Paper = new PaperEmbeddedWalletSdk({clientId: \"\", chain: \"Polygon\"});\n   *  try {\n   *    // prompts user to enter the code they received\n   *    const user = await Paper.auth.loginWithPaperEmailOtp({ email : \"you@example.com\" });\n   *    // user is now logged in\n   *  } catch (e) {\n   *    // User closed the OTP modal or something else went wrong during the authentication process\n   *    console.error(e)\n   *  }\n   *\n   * @example\n   *  // If you want users to never be prompted for a recovery code.\n   *  const Paper = new PaperEmbeddedWalletSdk({clientId: \"\", chain: \"Polygon\"});\n   *  try {\n   *    const email = \"you@example.com\";\n   *\n   *    // getRecoveryCodeForUser is a function to get a recovery code based on an email\n   *    // you write the function below\n   *    const recoveryCode: string | undefined = await getRecoveryCodeForUser(email);\n   *\n   *    // prompts user to enter the code they received\n   *    // Because you pass in a recovery code wherever possible, for existing users on a new device, they would not be prompted to enter the recovery code flow\n   *    const user = await Paper.auth.loginWithPaperEmailOtp({ email, recoveryCode });\n   *    // user is now logged in\n   *    if (user.authDetails.recoveryCode) {\n   *      // user has a recovery code that you can store to pass in to the function above\n   *      // you write the function below\n   *      await storeRecoveryCodeForUser(email, user.authDetails.recoveryCode);\n   *    }\n   *  } catch (e) {\n   *    // User closed the OTP modal or something else went wrong during the authentication process\n   *    console.error(e)\n   *  }\n   *\n   * @param {string} props.email We will send the email an OTP that needs to be entered in order for them to be logged in.\n   * @param {string} props.recoveryCode Only present when using RecoveryShareManagement.USER_MANAGED recovery share management. Specifies the recoveryCode for the given email. This will set recoveryCode as the code for the user if they are new, or user recoveryCode for the user if they are an existing user\n   * @returns {{user: InitializedUser}} An InitializedUser object. See {@link PaperEmbeddedWalletSdk.getUser} for more\n   */\n  async loginWithPaperEmailOtp(\n    args: T extends RecoveryShareManagement.AWS_MANAGED\n      ? Parameters<AwsManagedLogin[\"loginWithPaperEmailOtp\"]>[0]\n      : Parameters<UserManagedLogin[\"loginWithPaperEmailOtp\"]>[0],\n  ): Promise<AuthLoginReturnType> {\n    if (\n      this.advancedOptions.recoveryShareManagement ===\n      RecoveryShareManagement.AWS_MANAGED\n    ) {\n      return this.awsManagedLogin.loginWithPaperEmailOtp({\n        email: args.email,\n      });\n    }\n    return this.userManagedLogin.loginWithPaperEmailOtp(args);\n  }\n\n  async loginWithGoogle(\n    args?: T extends RecoveryShareManagement.AWS_MANAGED\n      ? Parameters<AwsManagedLogin[\"loginWithGoogle\"]>[0]\n      : Parameters<UserManagedLogin[\"loginWithGoogle\"]>[0],\n  ): Promise<AuthLoginReturnType> {\n    if (\n      this.advancedOptions.recoveryShareManagement ===\n      RecoveryShareManagement.AWS_MANAGED\n    ) {\n      return this.awsManagedLogin.loginWithGoogle(args);\n    }\n    return this.userManagedLogin.loginWithGoogle();\n  }\n\n  /**\n   * @description\n   * A headless way to send the users at {email} an OTP code.\n   * You need to then call {@link Auth.verifyPaperEmailLoginOtp} in order to complete the login process\n   *\n   * @example\n   *  const Paper = new PaperEmbeddedWalletSdk({clientId: \"\", chain: \"Polygon\"});\n   *  // sends user an OTP code\n   * try {\n   *    const { isNewUser } = await Paper.auth.sendPaperEmailLoginOtp({ email : \"you@example.com\" });\n   * } catch(e) {\n   *    // Error Sending user's email an OTP code\n   *    console.error(e);\n   * }\n   *\n   * // Then when your user is ready to verify their OTP\n   * try {\n   *    const user = await Paper.auth.verifyPaperEmailLoginOtp({ email: \"you@example.com\", otp: \"6-DIGIT_CODE_HERE\", recoveryCode: \"Required if user is an existing user. i.e. !isNewUser\"});\n   * } catch(e) {\n   *    // Error verifying the OTP code\n   *    console.error(e)\n   * }\n   *\n   * @param {string} props.email We will send the email an OTP that needs to be entered in order for them to be logged in.\n   * @returns {{ success: boolean, isNewUser: boolean }} Success: indicating if the email was successfully sent (Note the email could still end up in the user's spam folder). IsNewUser indicates if the user is a new user to your platform\n   */\n  async sendPaperEmailLoginOtp({\n    email,\n  }: AuthQuerierTypes[\"sendPaperEmailLoginOtp\"]): Promise<SendEmailOtpReturnType> {\n    if (\n      this.advancedOptions.recoveryShareManagement ===\n      RecoveryShareManagement.AWS_MANAGED\n    ) {\n      return this.awsManagedLogin.sendPaperEmailLoginOtp({\n        email,\n        recoveryShareManagement: RecoveryShareManagement.AWS_MANAGED,\n      });\n    }\n    return this.userManagedLogin.sendPaperEmailLoginOtp({\n      email,\n    });\n  }\n\n  /**\n   *  @description\n   * Used to verify the otp that the user receives from  Paper\n   *\n   * See {@link Auth.sendPaperEmailLoginOtp} for how the headless call flow looks like. Simply swap out the calls to `loginWithPaperEmailOtp` with `verifyPaperEmailLoginOtp`\n   *\n   * @param {string} props.email We will send the email an OTP that needs to be entered in order for them to be logged in.\n   * @param {string} props.otp The code that the user received in their email\n   * @param {string} props.recoveryCode The code that is first sent to the user when they sign up. Required if user is an existing user. i.e. !isNewUser from return params of {@link Auth.sendPaperEmailLoginOtp}\n   * @returns {{user: InitializedUser}} An InitializedUser object containing the user's status, wallet, authDetails, and more\n   */\n  async verifyPaperEmailLoginOtp(\n    args: T extends RecoveryShareManagement.AWS_MANAGED\n      ? Parameters<AwsManagedLogin[\"verifyPaperEmailLoginOtp\"]>[0]\n      : Parameters<UserManagedLogin[\"verifyPaperEmailLoginOtp\"]>[0],\n  ) {\n    if (\n      this.advancedOptions.recoveryShareManagement ===\n      RecoveryShareManagement.AWS_MANAGED\n    ) {\n      return this.awsManagedLogin.verifyPaperEmailLoginOtp(args);\n    }\n    return this.userManagedLogin.verifyPaperEmailLoginOtp(args);\n  }\n\n  /**\n   * @description\n   * Logs any existing user out of their wallet.\n   * @returns {{success: boolean}} true if a user is successfully logged out. false if there's no user currently logged in.\n   */\n  async logout(): Promise<LogoutReturnType> {\n    const { success } = await this.AuthQuerier.call<LogoutReturnType>({\n      procedureName: \"logout\",\n      params: undefined,\n    });\n    const isRemoveAuthCookie = await this.localStorage.removeAuthCookie();\n    const isRemoveUserId = await this.localStorage.removeWalletUserId();\n\n    return {\n      success: success || isRemoveAuthCookie || isRemoveUserId,\n    };\n  }\n}\n","import type { Networkish } from \"@ethersproject/providers\";\nimport { getDefaultProvider } from \"@ethersproject/providers\";\nimport type { Chain } from \"@paperxyz/sdk-common-utilities\";\nimport { ChainToPublicRpc } from \"@paperxyz/sdk-common-utilities\";\nimport type {\n  ClientIdWithQuerierAndChainType,\n  GetUserWalletStatusFnReturnType,\n  GetUserWalletStatusRpcReturnType,\n  SetUpWalletRpcReturnType,\n  WalletAddressObjectType,\n} from \"../../interfaces/EmbeddedWallets/EmbeddedWallets\";\nimport { UserWalletStatus } from \"../../interfaces/EmbeddedWallets/EmbeddedWallets\";\n\nimport type { EmbeddedWalletIframeCommunicator } from \"../../utils/iFrameCommunication/EmbeddedWalletIframeCommunicator\";\nimport { LocalStorage } from \"../../utils/Storage/LocalStorage\";\nimport { GaslessTransactionMaker } from \"./GaslessTransactionMaker\";\nimport { EthersSigner } from \"./Signer\";\n\nexport type WalletManagementTypes = {\n  createWallet: void;\n  setUpNewDevice: void;\n  getUserStatus: void;\n};\nexport type WalletManagementUiTypes = {\n  createWalletUi: void;\n  setUpNewDeviceUi: void;\n};\n\nexport type EmbeddedWalletInternalHelperType = { showUi: boolean };\n\nexport class EmbeddedWallet {\n  protected clientId: string;\n  protected chain: Chain;\n  protected walletManagerQuerier: EmbeddedWalletIframeCommunicator<\n    WalletManagementTypes & WalletManagementUiTypes\n  >;\n  protected localStorage: LocalStorage;\n\n  public gasless: GaslessTransactionMaker;\n\n  /**\n   * Not meant to be initialized directly. Call {@link .initializeUser} to get an instance\n   * @param param0\n   */\n  constructor({ clientId, chain, querier }: ClientIdWithQuerierAndChainType) {\n    this.clientId = clientId;\n    this.chain = chain;\n    this.walletManagerQuerier = querier;\n\n    this.gasless = new GaslessTransactionMaker({\n      chain,\n      clientId,\n      querier,\n    });\n\n    this.localStorage = new LocalStorage({ clientId });\n  }\n\n  /**\n   * @internal\n   * Used to set-up the user device in the case that they are using incognito\n   * @param {string} param.deviceShareStored the value that is saved for the user's device share.\n   * We save this into the localStorage on the site itself if we could not save it within the iframe's localStorage.\n   * This happens in incognito mostly\n   * @param {string} param.walletAddress User's wallet address\n   * @param {boolean} param.isIframeStorageEnabled Tells us if we were able to store values in the localStorage in our iframe.\n   * We need to store it under the dev's domain localStorage if we weren't able to store things in the iframe\n   * @returns {{ walletAddress : string }} The user's wallet details\n   */\n  async postWalletSetUp({\n    deviceShareStored,\n    walletAddress,\n    isIframeStorageEnabled,\n    walletUserId,\n  }: SetUpWalletRpcReturnType & {\n    walletUserId: string;\n  }): Promise<WalletAddressObjectType> {\n    if (!isIframeStorageEnabled) {\n      await this.localStorage.saveDeviceShare(deviceShareStored, walletUserId);\n    }\n    return { walletAddress };\n  }\n\n  /**\n   * @internal\n   * Gets the various status states of the user\n   * @example\n   *  const userStatus = await Paper.getUserWalletStatus();\n   *  switch (userStatus.status) {\n   *  case UserWalletStatus.LOGGED_OUT: {\n   *    // User is logged out, call one of the auth methods on Paper.auth to authenticate the user\n   *    break;\n   *  }\n   *  case UserWalletStatus.LOGGED_IN_WALLET_UNINITIALIZED: {\n   *    // User is logged in, but does not have a wallet associated with it\n   *    // you also have access to the user's details\n   *    userStatus.user.authDetails;\n   *    break;\n   *  }\n   *  case UserWalletStatus.LOGGED_IN_NEW_DEVICE: {\n   *    // User is logged in and created a wallet already, but is missing the device shard\n   *    // You have access to:\n   *    userStatus.user.authDetails;\n   *    userStatus.user.walletAddress;\n   *    break;\n   *  }\n   *  case UserWalletStatus.LOGGED_IN_WALLET_INITIALIZED: {\n   *    // user is logged in and wallet is all set up.\n   *    // You have access to:\n   *    userStatus.user.authDetails;\n   *    userStatus.user.walletAddress;\n   *    userStatus.user.wallet;\n   *    break;\n   *  }\n   *}\n   * @returns {GetUserWalletStatusFnReturnType} an object to containing various information on the user statuses\n   */\n  async getUserWalletStatus(): Promise<GetUserWalletStatusFnReturnType> {\n    const userStatus =\n      await this.walletManagerQuerier.call<GetUserWalletStatusRpcReturnType>({\n        procedureName: \"getUserStatus\",\n        params: undefined,\n      });\n    if (userStatus.status === UserWalletStatus.LOGGED_IN_WALLET_INITIALIZED) {\n      return {\n        status: UserWalletStatus.LOGGED_IN_WALLET_INITIALIZED,\n        user: { ...userStatus.user, wallet: this },\n      };\n    }\n    return userStatus;\n  }\n\n  /**\n   * @description\n   * Switches the chain that the user wallet is currently on.\n   * @example\n   * // user wallet will be set to Polygon\n   * const Paper = new PaperEmbeddedWalletSdk({clientId: \"\", chain: \"Polygon\"});\n   * const user = await Paper.initializeUser();\n   * // Switch the user wallet to Mumbai\n   * await user.wallet.setChain({ chain: \"Mumbai\" });\n   * @param {Chain} params.chain The chain that we are changing the user wallet too\n   */\n  async setChain({ chain }: { chain: Chain }): Promise<void> {\n    this.chain = chain;\n    this.gasless = new GaslessTransactionMaker({\n      chain,\n      clientId: this.clientId,\n      querier: this.walletManagerQuerier,\n    });\n  }\n\n  /**\n   * Returns an Ethers.Js compatible signer that you can use in conjunction with the rest of dApp\n   * @example\n   * const Paper = new PaperEmbeddedWalletSdk({clientId: \"\", chain: \"Polygon\"});\n   * const user = await Paper.getUser();\n   * if (user.status === UserStatus.LOGGED_IN_WALLET_INITIALIZED) {\n   *    // returns a signer on the Polygon mainnet\n   *    const signer = await user.getEthersJsSigner();\n   *    // returns a signer on the specified RPC endpoints\n   *    const signer = await user.getEthersJsSigner({rpcEndpoint: \"https://eth-rpc.gateway.pokt.network\"});\n   * }\n   * @param {Networkish} network.rpcEndpoint the rpc url where calls will be routed through\n   * @throws If attempting to call the function without the user wallet initialize on their current device. This should never happen if call {@link PaperEmbeddedWalletSdk.initializeUser} before accessing this function\n   * @returns A signer that is compatible with Ether.js. Defaults to the public rpc on the chain specified when initializing the {@link PaperEmbeddedWalletSdk} instance\n   */\n  async getEthersJsSigner(network?: {\n    rpcEndpoint: Networkish;\n  }): Promise<EthersSigner> {\n    const signer = new EthersSigner({\n      clientId: this.clientId,\n      provider: getDefaultProvider(\n        network?.rpcEndpoint ?? ChainToPublicRpc[this.chain],\n      ),\n      querier: this.walletManagerQuerier,\n    });\n    return signer;\n  }\n}\n","import type { Chain } from \"@paperxyz/sdk-common-utilities\";\nimport type { ClientIdWithQuerierAndChainType } from \"../../interfaces/EmbeddedWallets/EmbeddedWallets\";\nimport type {\n  CallContractReturnType,\n  ContractCallInputType,\n} from \"../../interfaces/EmbeddedWallets/GaslessTransactionMaker\";\nimport type { EmbeddedWalletIframeCommunicator } from \"../../utils/iFrameCommunication/EmbeddedWalletIframeCommunicator\";\n\nexport type GaslessTransactionQuerierTypes = {\n  callContract: {\n    contractAddress: string;\n    method: {\n      stub: string;\n      args: Array<unknown>;\n    };\n    chain: Chain;\n  };\n};\n\n/**\n * @description GaslessTransactionMaker is used to execute gasless transactions from the embedded wallets\n */\nexport class GaslessTransactionMaker {\n  protected chain: Chain;\n  protected clientId: string;\n  protected gaslessTransactionQuerier: EmbeddedWalletIframeCommunicator<GaslessTransactionQuerierTypes>;\n  constructor({ chain, clientId, querier }: ClientIdWithQuerierAndChainType) {\n    this.chain = chain;\n    this.clientId = clientId;\n    this.gaslessTransactionQuerier = querier;\n  }\n  /**\n   * @description\n   * Use to call arbitrary contracts on the blockchain. Note that you have to enable {@link https://withpaper.com/dashboard/developers Sponsored Fees} in order for this to work.\n   *\n   * @param {string} params.contractAddress The address for which the contract call is directed too.\n   * @param {string} params.methodInterface the function stub on the contract. This looks something like `function myFunctionName(address user, uint256 tokenId) external payable`. Refer to this {@link https://blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917 ethers.js article} for more.\n   * @param {Array} params.methodArgs The arguments that is to be passed to the contract in order that they are to be passed to the contract.\n   * @throws if there is an error calling the contract for whatever reason.\n   * @returns {{ transactionHash: string }} The transaction hash associated with the successful contract call.\n   */\n  async callContract({\n    contractAddress,\n    methodArgs,\n    methodInterface,\n  }: ContractCallInputType): Promise<CallContractReturnType> {\n    return await this.gaslessTransactionQuerier.call<CallContractReturnType>({\n      procedureName: \"callContract\",\n      params: {\n        chain: this.chain,\n        contractAddress,\n        method: {\n          args: methodArgs,\n          stub: methodInterface,\n        },\n      },\n    });\n  }\n}\n","import type {\n  Provider,\n  TransactionRequest,\n} from \"@ethersproject/abstract-provider\";\nimport type {\n  TypedDataDomain,\n  TypedDataField,\n} from \"@ethersproject/abstract-signer\";\nimport { Signer } from \"@ethersproject/abstract-signer\";\nimport type { Bytes } from \"@ethersproject/bytes\";\nimport type { Deferrable } from \"@ethersproject/properties\";\nimport { defineReadOnly } from \"@ethersproject/properties\";\nimport type { ClientIdWithQuerierType } from \"../../interfaces/EmbeddedWallets/EmbeddedWallets\";\nimport type {\n  GetAddressReturnType,\n  SignMessageReturnType,\n  SignTransactionReturnType,\n  SignedTypedDataReturnType,\n} from \"../../interfaces/EmbeddedWallets/Signer\";\n\nimport type { JsonRpcProvider } from \"@ethersproject/providers\";\nimport type { EmbeddedWalletIframeCommunicator } from \"../../utils/iFrameCommunication/EmbeddedWalletIframeCommunicator\";\n\nexport type SignerProcedureTypes = {\n  getAddress: void;\n  signMessage: {\n    message: string | Bytes;\n    chainId: number;\n    rpcEndpoint: string;\n  };\n  signTransaction: {\n    transaction: Deferrable<TransactionRequest>;\n    chainId: number;\n    rpcEndpoint: string;\n  };\n  signTypedDataV4: {\n    domain: TypedDataDomain;\n    types: Record<string, Array<TypedDataField>>;\n    message: Record<string, unknown>;\n    chainId: number;\n    rpcEndpoint: string;\n  };\n  connect: { provider: Provider };\n};\n\nexport class EthersSigner extends Signer {\n  protected querier: EmbeddedWalletIframeCommunicator<SignerProcedureTypes>;\n  protected clientId: string;\n  protected endpoint: string;\n  private DEFAULT_ETHEREUM_CHAIN_ID = 5;\n  constructor({\n    provider,\n    clientId,\n    querier,\n  }: ClientIdWithQuerierType & {\n    provider: Provider;\n  }) {\n    super();\n    this.clientId = clientId;\n    this.querier = querier;\n    // we try to extract a url if possible\n    this.endpoint = (provider as JsonRpcProvider).connection?.url;\n    defineReadOnly(this, \"provider\", provider);\n  }\n\n  override async getAddress(): Promise<string> {\n    const { address } = await this.querier.call<GetAddressReturnType>({\n      procedureName: \"getAddress\",\n      params: undefined,\n    });\n    return address;\n  }\n\n  override async signMessage(message: string | Bytes): Promise<string> {\n    const network = await this.provider?.getNetwork();\n    if (network) {\n      network._defaultProvider;\n    }\n\n    const { signedMessage } = await this.querier.call<SignMessageReturnType>({\n      procedureName: \"signMessage\",\n      params: {\n        message,\n        chainId:\n          (await this.provider?.getNetwork())?.chainId ??\n          this.DEFAULT_ETHEREUM_CHAIN_ID,\n        rpcEndpoint: this.endpoint,\n      },\n    });\n    return signedMessage;\n  }\n\n  override async signTransaction(\n    transaction: TransactionRequest,\n  ): Promise<string> {\n    const { signedTransaction } =\n      await this.querier.call<SignTransactionReturnType>({\n        procedureName: \"signTransaction\",\n        params: {\n          transaction,\n          chainId:\n            (await this.provider?.getNetwork())?.chainId ??\n            this.DEFAULT_ETHEREUM_CHAIN_ID,\n          rpcEndpoint: this.endpoint,\n        },\n      });\n    return signedTransaction;\n  }\n\n  async _signTypedData(\n    domain: SignerProcedureTypes[\"signTypedDataV4\"][\"domain\"],\n    types: SignerProcedureTypes[\"signTypedDataV4\"][\"types\"],\n    message: SignerProcedureTypes[\"signTypedDataV4\"][\"message\"],\n  ): Promise<string> {\n    const { signedTypedData } =\n      await this.querier.call<SignedTypedDataReturnType>({\n        procedureName: \"signTypedDataV4\",\n        params: {\n          domain,\n          types,\n          message,\n          chainId:\n            (await this.provider?.getNetwork())?.chainId ??\n            this.DEFAULT_ETHEREUM_CHAIN_ID,\n          rpcEndpoint: this.endpoint,\n        },\n      });\n    return signedTypedData;\n  }\n\n  override connect(provider: Provider): EthersSigner {\n    return new EthersSigner({\n      clientId: this.clientId,\n      provider,\n      querier: this.querier,\n    });\n  }\n}\n","import { RecoveryShareManagement } from \"../interfaces/Auth\";\nimport type {\n  GetUser,\n  PaperConstructorType,\n} from \"../interfaces/EmbeddedWallets/EmbeddedWallets\";\nimport {\n  UserStatus,\n  UserWalletStatus,\n} from \"../interfaces/EmbeddedWallets/EmbeddedWallets\";\nimport { EmbeddedWalletIframeCommunicator } from \"../utils/iFrameCommunication/EmbeddedWalletIframeCommunicator\";\nimport type { AuthQuerierTypes } from \"./Auth\";\nimport { Auth } from \"./Auth\";\nimport { EmbeddedWallet } from \"./EmbeddedWallets/EmbeddedWallet\";\n\nexport class PaperEmbeddedWalletSdk<\n  T extends RecoveryShareManagement = RecoveryShareManagement.USER_MANAGED,\n> {\n  protected clientId: string;\n  protected querier: EmbeddedWalletIframeCommunicator<AuthQuerierTypes>;\n\n  private wallet: EmbeddedWallet;\n  /**\n   * Used to manage the Auth state of the user.\n   */\n  auth: Auth<T>;\n\n  /**\n   * @example\n   * const Paper = new PaperEmbeddedWalletSdk({ clientId: \"\", chain: \"Goerli\" });\n   * @param {string} initParams.clientId the clientId found on the {@link https://withpaper.com/dashboard/developers developer's dashboard}\n   * @param {Chain} initParams.chain sets the default chain that the EmbeddedWallet will live on.\n   * @param {CustomizationOptionsType} initParams.styles sets the default style override for any modal that pops up asking for user's details when creating wallet or logging in.\n   */\n  constructor({\n    clientId,\n    chain,\n    styles,\n    advancedOptions,\n    onAuthSuccess,\n  }: PaperConstructorType<T>) {\n    this.clientId = clientId;\n    this.querier = new EmbeddedWalletIframeCommunicator({\n      clientId,\n      customizationOptions: styles,\n    });\n    this.wallet = new EmbeddedWallet({\n      clientId,\n      chain,\n      querier: this.querier,\n    });\n\n    this.auth = new Auth<T>({\n      clientId,\n      advancedOptions: {\n        recoveryShareManagement: RecoveryShareManagement.USER_MANAGED,\n        ...(advancedOptions ?? {}),\n      },\n      querier: this.querier,\n      onAuthSuccess: async (authResult) => {\n        await this.wallet.postWalletSetUp({\n          ...authResult.walletDetails,\n          walletUserId: authResult.storedToken.authDetails.userWalletId,\n        });\n        await this.querier.call({\n          procedureName: \"initIframe\",\n          params: {\n            deviceShareStored: authResult.walletDetails.deviceShareStored,\n            clientId: this.clientId,\n            walletUserId: authResult.storedToken.authDetails.userWalletId,\n            authCookie: authResult.storedToken.cookieString,\n          },\n        });\n        onAuthSuccess?.(authResult);\n        return {\n          user: {\n            status: UserStatus.LOGGED_IN_WALLET_INITIALIZED,\n            authDetails: authResult.storedToken.authDetails,\n            wallet: this.wallet,\n            walletAddress: authResult.walletDetails.walletAddress,\n          },\n        };\n      },\n    });\n  }\n\n  /**\n   * Gets the usr if they are logged in\n   * @example\n   *  const user = await Paper.getUser();\n   *  switch (user.status) {\n   *     case UserStatus.LOGGED_OUT: {\n   *       // User is logged out, call one of the auth methods on Paper.auth to authenticate the user\n   *       break;\n   *     }\n   *     case UserStatus.LOGGED_IN_WALLET_INITIALIZED: {\n   *       // user is logged in and wallet is all set up.\n   *       // You have access to:\n   *       user.status;\n   *       user.authDetails;\n   *       user.walletAddress;\n   *       user.wallet;\n   *       break;\n   *     }\n   *}\n   * @returns {GetUser} an object to containing various information on the user statuses\n   */\n  async getUser(): Promise<GetUser> {\n    const userStatus = await this.wallet.getUserWalletStatus();\n    switch (userStatus.status) {\n      // user gets {UserWalletStatus.LOGGED_IN_NEW_DEVICE} when they log in but never complete the recovery flow and exits (close modal, refresh etc)\n      case UserWalletStatus.LOGGED_IN_NEW_DEVICE:\n      // User gets {UserWalletStatus.LOGGED_IN_WALLET_UNINITIALIZED} when they log in but manage to exit the client in the small window between auth completion and sending them their wallet recovery details\n      case UserWalletStatus.LOGGED_IN_WALLET_UNINITIALIZED:\n        // in both case, we simply log them out to reset their state\n        await this.auth.logout();\n        return this.getUser();\n      case UserWalletStatus.LOGGED_OUT:\n        return {\n          status: UserStatus.LOGGED_OUT,\n        };\n      case UserWalletStatus.LOGGED_IN_WALLET_INITIALIZED:\n        return {\n          status: UserStatus.LOGGED_IN_WALLET_INITIALIZED,\n          ...userStatus.user,\n        };\n    }\n  }\n}\n"],"mappings":"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","names":["EMBEDDED_WALLET_PATH","HEADLESS_GOOGLE_OAUTH_ROUTE","WALLET_USER_DETAILS_LOCAL_STORAGE_NAME","clientId","WALLET_USER_ID_LOCAL_STORAGE_NAME","AUTH_TOKEN_LOCAL_STORAGE_PREFIX","AUTH_TOKEN_LOCAL_STORAGE_NAME","DEVICE_SHARE_LOCAL_STORAGE_PREFIX","DEVICE_SHARE_LOCAL_STORAGE_NAME","userId","DEVICE_SHARE_LOCAL_STORAGE_NAME_DEPRECATED","RecoveryShareManagement","AuthProvider","UserStatus","UserWalletStatus","getPaperOriginUrl","data","LocalStorage","clientId","key","__async","_a","value","item","cookie","AUTH_TOKEN_LOCAL_STORAGE_NAME","share","userId","DEVICE_SHARE_LOCAL_STORAGE_NAME","WALLET_USER_ID_LOCAL_STORAGE_NAME","getPaperOriginUrl","sleep","seconds","resolve","iframeBaseStyle","isIframeLoaded","IframeCommunicator","link","iframeId","container","iframeStyles","onIframeInitialize","iframe","hrefLink","sdkVersion","mergedIframeStyles","__spreadValues","__async","prePostMessageSleepInSeconds","res","rej","_a","channel","event","data","INIT_IFRAME_EVENT","getPaperOriginUrl","EMBEDDED_WALLET_PATH","_0","procedureName","params","showIframe","injectRecoveryCode","injectRecoveryCodeListener","e","_b","recoveryCode","EmbeddedWalletIframeCommunicator","IframeCommunicator","clientId","customizationOptions","EMBEDDED_WALLET_IFRAME_ID","createEmbeddedWalletIframeLink","EMBEDDED_WALLET_PATH","__async","localStorage","LocalStorage","path","queryParams","_a","embeddedWalletUrl","getPaperOriginUrl","queryKey","getPaperOriginUrl","AbstractLogin","querier","preLogin","postLogin","clientId","_0","__async","email","recoveryShareManagement","isNewUser","isNewDevice","userRecoveryShareManagement","AwsManagedLogin","AbstractLogin","isWindowOpenedByFn","win","closeOpenedWindow","__async","result","args","loginLink","resolve","reject","pollTimer","messageListener","event","getPaperOriginUrl","__spreadProps","__spreadValues","_0","email","otp","UserManagedLogin","AbstractLogin","args","__async","result","_0","email","recoveryCode","otp","Auth","clientId","advancedOptions","querier","onAuthSuccess","_a","LocalStorage","UserManagedLogin","result","__async","AwsManagedLogin","_0","storedToken","walletDetails","token","authProvider","recoveryCode","args","email","success","isRemoveAuthCookie","isRemoveUserId","getDefaultProvider","ChainToPublicRpc","GaslessTransactionMaker","chain","clientId","querier","_0","__async","contractAddress","methodArgs","methodInterface","Signer","defineReadOnly","EthersSigner","Signer","provider","clientId","querier","_a","defineReadOnly","__async","address","message","_b","_c","_d","network","signedMessage","transaction","signedTransaction","domain","types","signedTypedData","EmbeddedWallet","clientId","chain","querier","GaslessTransactionMaker","LocalStorage","_0","__async","deviceShareStored","walletAddress","isIframeStorageEnabled","walletUserId","userStatus","__spreadProps","__spreadValues","network","_a","EthersSigner","getDefaultProvider","ChainToPublicRpc","PaperEmbeddedWalletSdk","clientId","chain","styles","advancedOptions","onAuthSuccess","EmbeddedWalletIframeCommunicator","EmbeddedWallet","Auth","__spreadValues","authResult","__async","__spreadProps","userStatus"]}