UNPKG

@upbond/upbond-embed

Version:
1,004 lines (925 loc) 23 kB
import { JRPCId, JRPCMiddleware, JRPCRequest, JRPCVersion, SafeEventEmitter } from "@toruslabs/openlogin-jrpc"; import createHash from "create-hash"; import type { Duplex } from "readable-stream"; export const LOGIN_PROVIDER = { GOOGLE: "google", FACEBOOK: "facebook", TWITCH: "twitch", REDDIT: "reddit", DISCORD: "discord", } as const; export const WALLET_VERIFIERS = { GOOGLE: "google", FACEBOOK: "facebook", TWITCH: "twitch", REDDIT: "reddit", DISCORD: "discord", EMAIL_PASSWORDLESS: "torus-auth0-email-passwordless", } as const; export const WALLET_OPENLOGIN_VERIFIER_MAP = { [WALLET_VERIFIERS.GOOGLE]: "tkey-google", [WALLET_VERIFIERS.FACEBOOK]: "tkey-facebook", [WALLET_VERIFIERS.TWITCH]: "tkey-twitch", [WALLET_VERIFIERS.REDDIT]: "tkey-reddit", [WALLET_VERIFIERS.DISCORD]: "tkey-discord", [WALLET_VERIFIERS.EMAIL_PASSWORDLESS]: "tkey-auth0-email-passwordless", } as const; export const PAYMENT_PROVIDER = { MOONPAY: "moonpay", WYRE: "wyre", RAMPNETWORK: "rampnetwork", XANPOOL: "xanpool", MERCURYO: "mercuryo", TRANSAK: "transak", } as const; export const SUPPORTED_PAYMENT_NETWORK = { MAINNET: "mainnet", MATIC: "matic", BSC_MAINNET: "bsc_mainnet", AVALANCHE_MAINNET: "avalanche_mainnet", XDAI: "xdai", } as const; export const UPBOND_BUILD_ENV = { PRODUCTION: "production", STAGING: "staging", DEVELOPMENT: "development", TESTING: "testing", LOCAL: "local", V1_DEBUG: "v1_debug", V1_LOCAL: "v1_local", V1_DEVELOPMENT: "v1_development", V1_STAGING: "v1_staging", V1_PRODUCTION: "v1_production", V2_DEBUG: "v2_debug", V2_LOCAL: "v2_local", V2_DEVELOPMENT: "v2_development", V2_STAGING: "v2_staging", V2_PRODUCTION: "v2_production", V3_DEVELOPMENT: "v3_development", V3_STAGING: "v3_staging", V3_PRODUCTION: "v3_production", DEBUG: "debug", WALLET_DID: "wallet-did", MPC_DEV: "mpc-dev", } as const; export type BuildEnv = | "production" | "staging" | "development" | "testing" | "local" | "v1_production" | "v1_development" | "v1_staging" | "v1_local" | "v1_debug" | "v2_production" | "v2_development" | "v2_staging" | "v2_local" | "v2_debug" | "debug" | "wallet-did" | "mpc-dev"; export type PAYMENT_PROVIDER_TYPE = (typeof PAYMENT_PROVIDER)[keyof typeof PAYMENT_PROVIDER]; export type SUPPORTED_PAYMENT_NETWORK_TYPE = (typeof SUPPORTED_PAYMENT_NETWORK)[keyof typeof SUPPORTED_PAYMENT_NETWORK]; export type UPBOND_BUILD_ENV_TYPE = (typeof UPBOND_BUILD_ENV)[keyof typeof UPBOND_BUILD_ENV]; export interface IPaymentProvider { line1: string; line2: string; line3: string; supportPage: string; minOrderValue: number; maxOrderValue: number; validCurrencies: string[]; validCryptoCurrenciesByChain: Partial<Record<string, { value: string; display: string }[]>>; includeFees: boolean; enforceMax: boolean; sell?: boolean; } export interface IBcHandler { url: URL; channelName: string; } export interface IHashAlgorithmOptions { algorithms?: createHash.algorithm[]; delimiter?: string; full?: boolean; } export interface SRI { hashes: Record<createHash.algorithm, string>; integrity?: string; } export const BUTTON_POSITION = { BOTTOM_LEFT: "bottom-left", TOP_LEFT: "top-left", BOTTOM_RIGHT: "bottom-right", TOP_RIGHT: "top-right", } as const; export type EMBED_TRANSLATION_ITEM = { continue: string; actionRequired: string; pendingAction: string; cookiesRequired: string; enableCookies: string; clickHere: string; }; export type BUTTON_POSITION_TYPE = (typeof BUTTON_POSITION)[keyof typeof BUTTON_POSITION]; export type WALLET_PATH = "home" | "account"; export type ETHEREUM_NETWORK_TYPE = | "ropsten" | "rinkeby" | "kovan" | "mainnet" | "goerli" | "localhost" | "matic" | "mumbai" | "xdai" | "bsc_mainnet" | "bsc_testnet"; export type LOGIN_TYPE = | "google" | "facebook" | "reddit" | "discord" | "twitch" | "apple" | "github" | "linkedin" | "twitter" | "weibo" | "line" | "jwt" | "email_password" | "passwordless"; export interface TorusCtorArgs { /** * Determines where the torus widget is visible on the page. * @defaultValue bottom-left */ buttonPosition?: BUTTON_POSITION_TYPE; /** * Size of the widget button * @defaultValue 56 */ buttonSize?: number; /** * Z-index of the modal and iframe * @defaultValue 99999 */ modalZIndex?: number; /** * Api key * Get yours today at {@link https://developer.tor.us | Dashboard} */ apiKey?: string; } export interface TorusLoginParams { verifier?: string; login_hint?: string; } export interface NetworkInterface { /** * If any network other than the ones in enum, it should a JSON RPC URL */ host: ETHEREUM_NETWORK_TYPE | string; /** * chainId for the network. If not provided, we query the host */ chainId?: number; /** * Name of the network */ networkName?: string; /** * Url of the block explorer */ blockExplorer?: string; /** * Default currency ticker of the network (e.g: BNB) */ ticker?: string; /** * Name for currency ticker (e.g: `Binance Coin`) */ tickerName?: string; /** * URL for RPC (e.g: `https://rpc.ankr.com/polygon_mumbai`) */ rpcUrl?: string; } export interface BaseLoginOptions { /** * If you need to send custom parameters to the Authorization Server, * make sure to use the original parameter name. */ [key: string]: unknown; /** * - `'page'`: displays the UI with a full page view * - `'popup'`: displays the UI with a popup window * - `'touch'`: displays the UI in a way that leverages a touch interface * - `'wap'`: displays the UI with a "feature phone" type interface */ display?: "page" | "popup" | "touch" | "wap"; /** * - `'none'`: do not prompt user for login or consent on reauthentication * - `'login'`: prompt user for reauthentication * - `'consent'`: prompt user for consent before processing request * - `'select_account'`: prompt user to select an account */ prompt?: "none" | "login" | "consent" | "select_account"; /** * Maximum allowable elasped time (in seconds) since authentication. * If the last time the user authenticated is greater than this value, * the user must be reauthenticated. */ max_age?: string | number; /** * The space-separated list of language tags, ordered by preference. * For example: `'fr-CA fr en'`. */ ui_locales?: string; /** * Previously issued ID Token. */ id_token_hint?: string; /** * The user's email address or other identifier. When your app knows * which user is trying to authenticate, you can provide this parameter * to pre-fill the email box or select the right session for sign-in. * * This currently only affects the classic Lock experience. */ login_hint?: string; acr_values?: string; /** * The default scope to be used on authentication requests. * The defaultScope defined in the Auth0Client is included * along with this scope */ scope?: string; /** * The default audience to be used for requesting API access. */ audience?: string; /** * The name of the connection configured for your application. * If null, it will redirect to the Auth0 Login Page and show * the Login Widget. */ connection?: string; } export interface JwtParameters extends BaseLoginOptions { /** * Your Auth0 account domain such as `'example.auth0.com'`, * `'example.eu.auth0.com'` or , `'example.mycompany.com'` * (when using [custom domains](https://auth0.com/docs/custom-domains)) */ domain: string; /** * The Client ID found on your Application settings page */ client_id?: string; /** * The default URL where Auth0 will redirect your browser to with * the authentication result. It must be whitelisted in * the "Allowed Callback URLs" field in your Auth0 Application's * settings. If not provided here, it should be provided in the other * methods that provide authentication. */ redirect_uri?: string; /** * The value in seconds used to account for clock skew in JWT expirations. * Typically, this value is no more than a minute or two at maximum. * Defaults to 60s. */ leeway?: number; /** * The field in jwt token which maps to verifier id */ verifierIdField?: string; /** * Whether the verifier id field is case sensitive * @defaultValue true */ isVerifierIdCaseSensitive?: boolean; } export interface LoginConfigItem { /** * Display Name. If not provided, we use the default for torus app */ name: string; /** * The type of login. Refer to enum `LOGIN_TYPE` */ typeOfLogin: LOGIN_TYPE; /** * Description for button. If provided, it renders as a full length button. else, icon button */ description?: string; /** * Custom client_id. If not provided, we use the default for torus app */ clientId?: string; /** * Logo to be shown on mouse hover. If not provided, we use the default for torus app */ logoHover?: string; /** * Logo to be shown on dark background (dark theme). If not provided, we use the default for torus app */ logoLight?: string; /** * Logo to be shown on light background (light theme). If not provided, we use the default for torus app */ logoDark?: string; /** * Whether to show the login button on modal or not */ showOnModal?: boolean; /** * Whether to show the login button on mobile */ showOnMobile?: boolean; /** * Custom jwt parameters to configure the login. Useful for Auth0 configuration */ jwtParameters?: JwtParameters; /** * Show login button on the main list */ mainOption?: boolean; /** * Whether to show the login button on desktop */ showOnDesktop?: boolean; /** * Modify the order of buttons. Should be greater than zero, where 1 is top priority. */ priority?: number; /** * Motify button bg that shown on the modal */ buttonBgColor?: string; /** * Motify button text color that shown on the modal */ buttonTextColor?: string; /** * Required. choose which Login provider that you will use, starts with upbond- */ loginProvider: string; } export interface LoginConfig { /** * Use the verifier provided by torus as a key or a default verifier used by torus * {@link https://docs.tor.us/torus-wallet/developing-with-torus-wallet/oauth | Documentation} */ [verifier: string]: LoginConfigItem; } export interface TorusNodePub { /** * X component of a Public Key */ X: string; /** * Y component of a Public Key */ Y: string; } export interface TorusPublicKey extends TorusNodePub { /** * Ethereum Public Address */ address: string; } export interface PaymentParams { /** * Address to send the funds to */ selectedAddress?: string; /** * Default fiat currency for the user to make the payment in */ selectedCurrency?: string; /** * Amount to buy in the selectedCurrency */ fiatValue?: number; /** * Cryptocurrency to buy */ selectedCryptoCurrency?: string; /** * Chain Network to use */ chainNetwork?: SUPPORTED_PAYMENT_NETWORK_TYPE; } export interface VerifierArgs { /** * Verifier Enum */ verifier: "google" | "reddit" | "discord"; /** * email for google * * username for reddit * * id for discord */ verifierId: string; /** * If true, returns {@link TorusPublicKey}, else returns string */ isExtended?: boolean; } export interface LoginParams { verifier?: string; login_hint?: string; } export interface UserInfo { /** * Email of the logged in user */ email: string; /** * Full name of the logged in user */ name: string; /** * Profile image of the logged in user */ profileImage: string; /** * verifier of the logged in user (google, facebook etc) */ verifier: string; /** * Verifier Id of the logged in user * * email for google, * id for facebook, * username for reddit, * id for twitch, * id for discord */ verifierId: string; /** * Returns if the logged in user is new */ isNewUser: boolean; /** * login type of the logged in user (google, facebook etc) */ typeOfLogin: LOGIN_TYPE; } export interface LocaleLinks<T> { /** * Item corresponding to english */ en?: T; /** * Item corresponding to japanese */ ja?: T; /** * Item corresponding to korean */ ko?: T; /** * Item corresponding to german */ de?: T; /** * Item corresponding to chinese (simplified) */ zh?: T; /** * Item corresponding to spanish */ es?: T; } export interface ThemeParams { /** * If true, enables dark mode * Defaults to false * @defaultValue false */ isDark: boolean; /** * Colors object to customize colors in torus theme. * * Contact us for whitelabel. Example provided in `examples/vue-app` */ colors: Record<string, string>; } export interface IntegrityParams { /** * Whether to check for integrity. * Defaults to false * @defaultValue false */ check: boolean; /** * if check is true, hash must be provided. The SRI sha-384 integrity hash * {@link https://www.srihash.org/ | SRI Hash} */ hash?: string; /** * Version of torus-website to load */ version?: string; } export interface VerifierStatus { /** * Defaults to true * @defaultValue true */ google?: boolean; /** * Defaults to true * @defaultValue true */ facebook?: boolean; /** * Defaults to true * @defaultValue true */ reddit?: boolean; /** * Defaults to true * @defaultValue true */ twitch?: boolean; /** * Defaults to true * @defaultValue true */ discord?: boolean; } export interface WhiteLabelParams { /** * Whitelabel theme */ theme?: ThemeParams; /** * Language of whitelabel. * * order of preference: Whitelabel language \> user language (in torus-website) \> browser language */ defaultLanguage?: string; /** * Logo Url to be used in light mode (dark logo) */ logoDark?: string; /** * Logo Url to be used in dark mode (light logo) */ logoLight?: string; /** * Shows/hides topup option in torus-website/widget. * Defaults to false * @defaultValue false */ topupHide?: boolean; /** * Shows/hides billboard in torus-website. * Defaults to false * @defaultValue false */ featuredBillboardHide?: boolean; /** * Shows/hides disclaimers on login page. Only works if special logins are hidden * Defaults to false * @defaultValue false */ disclaimerHide?: boolean; /** * Language specific link for terms and conditions on torus-website. See (examples/vue-app) to configure */ tncLink?: LocaleLinks<string>; /** * Language specific link for privacy policy on torus-website. See (examples/vue-app) to configure */ privacyPolicy?: LocaleLinks<string>; /** * Language specific link for privacy policy on torus-website. See (examples/vue-app) to configure */ contactLink?: LocaleLinks<string>; /** * Custom translations. See (examples/vue-app) to configure */ customTranslations?: LocaleLinks<unknown>; /** * Wallet theme */ walletTheme?: { /** * Logo for wallet embed popup login * @type {string} */ logo?: string; /** * This value must true, if it's not true it will cause an UI error * @type {boolean} * @defaultValue true */ isActive?: boolean; /** * Specify the name of the DApps * @type {string} */ name?: string; /** * Logo for the flying widget button * @type {string} */ buttonLogo?: string; /** * Background color for the login popup modal * @type {string} */ modalColor?: string; /** * Text color for the buttons text and some text on the notification popup * @type {string} */ textColor?: string; /** * Background color the buttons background. * @type {string} */ bgColor?: string; /** * Background color the hovered buttons. * @type {string} */ bgColorHover?: string; /** * Text color for the hovered buttons text and some text on the notification popup * @type {string} */ textColorHover?: string; /** * Config for the background and text in upbond login * @type {{ * globalBgColor: string; * globalTextColor: string; * }} */ upbondLogin?: { globalBgColor: string; globalTextColor: string; }; }; } export interface IUpbondEmbedParams { /** * * * @type {string} * will redirect you after upbond login reconstruct your key, then you will get your public key * @defaultValue {window.location.origin} * @memberof TorusParams */ dappRedirectUri?: string; /** * Torus Network Object */ network?: NetworkInterface; /** * Build Environment of Torus. * * production uses https://app.tor.us, * * development uses http://localhost:4050 (expects torus-website to be run locally), * * binance uses https://binance.tor.us, * * bnb uses https://bnb.tor.us, * * polygon uses https://polygon.tor.us, * * lrc uses https://lrc.tor.us, * * beta uses https://beta.tor.us, (currently supports tkey) * * testing uses https://testing.tor.us (latest internal build) * @defaultValue production */ buildEnv?: BuildEnv; /** * If using direct upbond embed will not going to open the window * @defaultValue true * @type {boolean} * @memberof IUpbondEmbedParams */ isUsingDirect?: boolean; /** * Upbond button state, you can configure the button will be shown after or before loggedIn * * @type {{ * showAfterLoggedIn: boolean; * showBeforeLoggedIn: boolean; * }} * @memberof IUpbondEmbedParams */ widgetConfig?: { showAfterLoggedIn: boolean; showBeforeLoggedIn: boolean; }; /** * Enables or disables logging. * * Defaults to false in prod and true in other environments */ enableLogging?: boolean; /** * whether to show/hide torus widget. * * Defaults to true * @defaultValue true */ showUpbondButton?: boolean; /** * setting false, hides those verifiers from login modal * @deprecated * Please use loginConfig instead */ enabledVerifiers?: VerifierStatus; /** * Array of login config items. Used to modify the default logins/ add new logins */ loginConfig?: LoginConfig; /** * Params to enable integrity checks and load specific versions of torus-website */ integrity?: IntegrityParams; /** * Params to enable whitelabelling of torus website and widget */ whiteLabel?: WhiteLabelParams; /** * Skips TKey onboarding for new users * * Defaults to false * @defaultValue false */ skipTKey?: boolean; /** * Setting `useWalletConnect` to true allows to display wallet connect qr scanner from torus-embed. * * Defaults to false * @defaultValue false */ useWalletConnect?: boolean; /** * Setting mfa level to `default` will present mfa screen to user on every third login * Setting mfa level to `optional` will present mfa screen to user on every login but user can skip it * Setting mfa level to `mandatory` will make it mandatory for user to setup mfa after login * Setting mfa level to`none` will make the user skip the mfa setup screen * * Defaults to default * @defaultValue default */ mfaLevel?: "none" | "default" | "optional" | "mandatory"; /** * * * @type {boolean} * @memberof IUpbondEmbedParams */ skipDialog?: boolean; selectedVerifier?: string; consentConfiguration?: { enable: boolean; config: { publicKey: string; scope: string[]; origin: string; }; }; flowConfig?: "normal" | "fastlogin"; state?: string; } export interface UnvalidatedJsonRpcRequest { id?: JRPCId; jsonrpc?: JRPCVersion; method: string; params?: unknown; preopenInstanceId?: string; } export interface ProviderOptions { /** * The name of the stream used to connect to the wallet. */ jsonRpcStreamName?: string; /** * The maximum number of event listeners. */ maxEventListeners?: number; /** * Whether the provider should send page metadata. */ shouldSendMetadata?: boolean; } export interface RequestArguments { /** The RPC method to request. */ method: string; /** The params of the RPC method, if any. */ params?: unknown[] | Record<string, unknown>; } export interface BaseProviderState { accounts: null | string[]; isConnected: boolean; isUnlocked: boolean; initialized: boolean; isPermanentlyDisconnected: boolean; hasEmittedConnection: boolean; } export interface JsonRpcConnection { events: SafeEventEmitter; middleware: JRPCMiddleware<unknown, unknown>; stream: Duplex; } export interface SentWarningsState { // methods enable: boolean; experimentalMethods: boolean; send: boolean; publicConfigStore: boolean; // events events: { close: boolean; data: boolean; networkChanged: boolean; notification: boolean; }; } export interface SendSyncJsonRpcRequest extends JRPCRequest<unknown> { method: "eth_accounts" | "eth_coinbase" | "eth_uninstallFilter" | "net_version"; } export interface PublicConfigState { isUnlocked?: boolean; selectedAddress?: string; chainId?: string; networkVersion?: string; storageKey: string; } export type Maybe<T> = Partial<T> | null | undefined; export type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "base64url" | "latin1" | "binary" | "hex"; export type IObjectMultiplex = Duplex; export type WalletProviderState = { accounts: string[]; chainId: string; isUnlocked: boolean; networkVersion: string; }; export interface RequestedData { email: string; name: string; address: string; birthday: string; } export interface Vc { userTarget: string; } export interface UserData { dateAccepted: number; userAddress: string; dapp: string; dappDescription: string; dappId: number; } export interface CredentialSubject { id: string; ["@scope"]: string[]; userData: UserData; signHash: string; clientHost: string; } export interface Issuer { id: string; } export interface Proof { type: string; jwt: string; } export interface Data { requestedData: RequestedData; vc: Vc; credentialSubject: CredentialSubject; issuer: Issuer; type: string[]; ["@context"]: string[]; issuanceDate: Date; proof: Proof; } export interface ConsentDidResponse { data: Data; deadline: number; origin: string; permited: string; did: string; }