[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/EdgeApp/edge-react-gui/develop/src/types/DeepLinkTypes.ts [Back]  [Original]

/*
 * All Edge deep-linking features are available through the `edge://`
 * protocol. This protocol comes in three flavors, which are fully equivalent:
 *
 *   - edge:///...
 *   - airbitz:///...
 *   - https://deep.edge.app//...
 *   - https://dp.edge.app//...
 *
 * The `edge://` protocol supports the following link types:
 *
 *   - buy: Buy flow entry, optionally pinning a ramp provider / payment type
 *   - edge: Edge login
 *   - pay: Payment request
 *   - plugin: GUI plugin deep link
 *   - promotion: Activate a promotion code
 *   - recovery: Password recovery
 *   - sell: Sell flow entry, optionally pinning a ramp provider / payment type
 *   - swap: Crypto-to-crypto swap
 *   - x-callback-url: Address request
 *
 * The `edge://` protocol is the preferred way to link into the application,
 * but Edge also supports some feature-specific https domains:
 *
 *   - https://dl.edge.app/... = edge://promotion/...
 *   - https://dl.edge.app/?af=... = edge://promotion/...
 *
 * `deep.edge.app` URLs may also carry an `?af=` query parameter.
 * When present alongside another payload (e.g. a `pay` private-key URI), the
 * deep link resolves to an `affiliate` wrapper that activates the promotion
 * and then delegates to the inner link.
 *
 * We also support some legacy prefixes (but don't use these):
 *
 *   - edge-ret://plugins/simplex/... = edge://plugin/simplex/...
 *   - edge-ret://x-callback-url/... = edge://x-callback-url/...
 *   - airbitz-ret://x-callback-url/... = edge://x-callback-url/...
 *
 * Besides the edge:// protocol, there are also various coin-specific URI
 * protocols like `bitcoin:`, which we just pass through as "other".
 */
import { asValue } from 'cleaners'
import type { EdgeTokenId } from 'edge-core-js'

import type {
  FiatDirection,
  FiatPaymentType
} from '../plugins/gui/fiatPluginTypes'
import type { AppParamList } from './routerTypes'

export interface AztecoLink {
  type: 'azteco'
  uri: string
}

export interface PaymentProtoLink {
  type: 'paymentProto'
  uri: string
}

/**
 * A provider sell-completion redirect (e.g. MoonPay's "Send with Edge" button).
 * Carries everything needed to open the Send scene so the user can finish
 * depositing crypto for a pending sell order:
 *
 *   https://edge.app/redirect/payment/?baseCurrencyCode=btc&baseCurrencyAmount=0.001&depositWalletAddress=...&depositWalletAddressTag=...
 *
 * `currencyCode` is the provider's base currency code (resolved to a wallet at
 * handle time), `addressTag` is the destination tag / memo (required for chains
 * like XRP), and `amount` is in whole units of the base currency.
 */
export interface PaymentRedirectLink {
  type: 'paymentRedirect'
  currencyCode: string
  depositAddress: string
  amount?: string
  addressTag?: string
}

export interface EdgeLoginLink {
  type: 'edgeLogin'
  lobbyId: string
}

export interface PasswordRecoveryLink {
  type: 'passwordRecovery'
  passwordRecoveryKey: string
}

export interface PluginLink {
  type: 'plugin'
  pluginId: string
  path: string
  query: Record
}

export interface FiatPluginLink {
  type: 'fiatPlugin'
  pluginId: string
  direction?: FiatDirection
  providerId?: string
  paymentType?: FiatPaymentType
}

export interface FiatProviderLink {
  type: 'fiatProvider'
  direction: FiatDirection
  providerId: string
  path: string
  query: Record
  uri: string
}

export interface PromotionLink {
  type: 'promotion'
  installerId?: string
}

export interface PriceChangeLink {
  type: 'price-change'
  pluginId: string
  body: string // Human-readable message
}

/**
 * A link-scoped entry into the ramps buy/sell flow:
 *
 *   edge://buy[/[/]]
 *   edge://sell[/[/]]
 *
 * `providerId` and `paymentType` pin a ramp provider and payment method to the
 * top of the quote results for this navigation only; they are never written to
 * the account referral state. A pin that matches no quote degrades to the
 * normal ordering. The `?af=` query on the `https://deep.edge.app` form keeps
 * its existing attribution behavior, independent of the pinning.
 */
export interface RampCreateLink {
  type: 'rampCreate'
  direction: FiatDirection
  providerId?: string
  paymentType?: FiatPaymentType
}

export interface MarketingLink {
  type: 'marketing'
  campaignId: string // Correlates notification opens to a marketing campaign
  link?: DeepLink // Optional navigation target parsed from the payload URL
}

/**
 * A provider return link (e.g. Simplex or Paybis sending the user back into the
 * app once their session finishes). Handled by the ramp deeplink manager, not
 * by scene navigation.
 */
export interface RampLink {
  type: 'ramp'
  direction: FiatDirection
  providerId: string
  path: string
  query: Record
  uri: string
}

export interface RewardsLink {
  type: 'rewards'
  pluginId: string
  tokenId: EdgeTokenId
}

export interface RequestAddressLink {
  type: 'requestAddress'
  assets: Array
  post?: string // Either post or redir must be specified
  redir?: string
  payer?: string
}

export interface SwapLink {
  type: 'swap'
  // We may eventually add query parameters to pre-populate currencies.
}

export interface WalletConnectLink {
  type: 'walletConnect'
  uri: string
}

export interface NoopLink {
  type: 'noop'
}

export interface SceneLink {
  type: 'scene'
  sceneName: keyof AppParamList
  query: AppParamList[keyof AppParamList]
}

export const asModalNames = asValue('fundAccount', 'test')
export type ModalNames = ReturnType

export interface ModalLink {
  type: 'modal'
  modalName: ModalNames
}

export interface AffiliateLink {
  type: 'affiliate'
  installerId: string
  link: DeepLink
}

export type DeepLink =
  | AffiliateLink
  | AztecoLink
  | SceneLink
  | EdgeLoginLink
  | FiatPluginLink
  | FiatProviderLink
  | MarketingLink
  | ModalLink
  | NoopLink
  | PasswordRecoveryLink
  | PaymentProtoLink
  | PaymentRedirectLink
  | PluginLink
  | PriceChangeLink
  | PromotionLink
  | RequestAddressLink
  | SwapLink
  | WalletConnectLink
  | RampCreateLink
  | RampLink
  | RewardsLink
  | {
      type: 'other'
      protocol: string // Without the ':'
      uri: string
    }

Web Proxy Viewer  |  New URL  |  Original Page