{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport * as crypto from \"crypto\";\nimport {\n  CreateSubAccountData,\n  CreateSubAccountResponse,\n} from \"./types/subAccount\";\nimport {\n  CurrencyConversionPayload,\n  CurrencyConversionResult,\n  EnhancedConversionResponse,\n  IBankListResponse,\n  IBankTransferData,\n  IBankTransferResponse,\n  ISupportedWalletResponse,\n  IVerifyBankData,\n  IVerifyBankResponse,\n  IVerifyResponse,\n} from \"./types\";\nimport {\n  ITransferAssetData,\n  ITransferAssetResponse,\n  ITransferHistoryParams,\n  ITransferHistoryResponse,\n  ITransferFeeParams,\n  ITransferFeeResponse,\n} from \"./types/transfer\";\nimport { IAppInfo, IOAuthApp, ITokenData, IUserInfo } from \"./types/oauth\";\nimport { logger } from \"@untools/logger\";\n\nexport interface IApiResponse<T = unknown> {\n  success: boolean;\n  data: T;\n  message: string;\n  meta?: Record<string, unknown>;\n  [key: string]: unknown;\n}\n\n/**\n * Configuration interface for initializing the Pay100 SDK\n * @property publicKey - API public key required for all API calls\n * @property secretKey - Secret key used for server-side authentication and request signing\n * @property baseUrl - Optional API base URL, defaults to production endpoint\n */\ninterface IPay100Config {\n  publicKey: string;\n  secretKey?: string;\n  baseUrl?: string;\n}\n\n/**\n * Interface representing transaction data returned from payment verification\n * Flexible structure to accommodate various transaction types and properties\n */\nexport interface ITransactionData {\n  [key: string]: unknown;\n}\n\n// Default API endpoint if not otherwise specified\nconst BASE_URL = process.env.BASE_URL || \"https://api.100pay.co\";\n\n/**\n * Custom error class for payment verification failures\n * Provides consistent error structure for better error handling\n */\nexport class PaymentVerificationError extends Error {\n  status: string;\n  data: Record<string, never>;\n\n  constructor(message: string) {\n    super(message);\n    this.name = \"PaymentVerificationError\";\n    this.status = \"error\";\n    this.data = {};\n  }\n}\n\n/**\n * Main SDK class for interacting with the 100Pay payment platform\n * Provides methods for transaction verification, subaccount management,\n * currency conversion, and asset transfers\n */\nexport class Pay100 {\n  private publicKey: string;\n  private secretKey?: string;\n  private baseUrl: string;\n\n  /**\n   * Initialize the Pay100 SDK\n   * @param config - Configuration object containing API keys and optional base URL\n   */\n  constructor({ publicKey, secretKey, baseUrl = BASE_URL }: IPay100Config) {\n    this.publicKey = publicKey;\n    this.secretKey = secretKey;\n    this.baseUrl = baseUrl;\n  }\n\n  /**\n   * Creates a cryptographic signature for secure server-to-server communication\n   *\n   * @param payload - Request payload that needs to be signed\n   * @returns Object containing current timestamp and HMAC SHA-256 signature\n   * @throws Error if secret key is missing or invalid\n   */\n  private createSignature(payload: Record<string, unknown>): {\n    timestamp: string;\n    signature: string;\n  } {\n    const timestamp = Date.now().toString();\n\n    // Extract the token part from the secret key if it's in the format\n    // STATUS;TYPE;TOKEN (e.g., \"LIVE;SK;eyJhbGciOiJIUzI1...\")\n    let signingSecret = this?.secretKey;\n\n    if (this?.secretKey?.includes(\";\")) {\n      const secretKeyParts = this.secretKey.split(\";\");\n      if (secretKeyParts.length === 3) {\n        // Use just the token part as the signing secret\n        signingSecret = secretKeyParts[2];\n      }\n    }\n\n    if (!signingSecret) {\n      throw new Error(\"Secret key is required for signing\");\n    }\n\n    // Create signature using HMAC SHA-256\n    const signature = crypto\n      .createHmac(\"sha256\", signingSecret)\n      .update(timestamp + JSON.stringify(payload))\n      .digest(\"hex\");\n\n    return { timestamp, signature };\n  }\n\n  /**\n   * Constructs HTTP headers for API requests with optional authentication\n   *\n   * @param payload - Request payload used to generate security signature\n   * @returns Object containing all necessary HTTP headers\n   */\n  private getHeaders(\n    payload: Record<string, unknown> = {}\n  ): Record<string, string> {\n    // Generate authentication headers if secret key is available (server-side mode)\n    if (this.secretKey) {\n      const { timestamp, signature } = this.createSignature(payload);\n      return {\n        \"api-key\": this.publicKey,\n        \"x-secret-key\": this.secretKey,\n        \"x-timestamp\": timestamp,\n        \"x-signature\": signature,\n        \"Content-Type\": \"application/json\",\n      };\n    }\n\n    // Basic headers for public API usage (client-side mode)\n    return {\n      \"api-key\": this.publicKey,\n      \"Content-Type\": \"application/json\",\n    };\n  }\n\n  /**\n   * Verifies the status and details of a payment transaction\n   *\n   * @param transactionId - Unique identifier of the transaction to verify\n   * @returns Promise resolving to verification result with transaction data\n   * @throws PaymentVerificationError on network issues or invalid responses\n   */\n  verify = async (transactionId: string): Promise<IVerifyResponse> => {\n    try {\n      const payload = { transactionId };\n\n      const response = await fetch(\n        `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n        {\n          method: \"POST\",\n          headers: this.getHeaders(payload),\n          body: JSON.stringify(payload),\n        }\n      );\n\n      // Parse response data\n      const responseData: unknown = await response.json().catch(() => null);\n\n      // Handle empty response\n      if (!responseData) {\n        return {\n          status: \"error\",\n          data: null,\n          message:\n            \"Something went wrong, be sure you supplied a valid payment id.\",\n        };\n      }\n\n      // Handle string responses which indicate errors\n      if (typeof responseData === \"string\") {\n        if (responseData === \"Access Denied, Invalid KEY supplied\") {\n          return {\n            status: \"error\",\n            data: null,\n            message: \"Access Denied, Invalid KEY supplied\",\n          };\n        }\n\n        if (responseData === \"invalid payment id supplied\") {\n          return {\n            status: \"error\",\n            data: null,\n          };\n        }\n      }\n\n      // Ensure the response data is an object that can be safely cast to ITransactionData\n      const transactionData: IVerifyResponse[\"data\"] =\n        responseData && typeof responseData === \"object\"\n          ? (responseData as unknown as IVerifyResponse[\"data\"])\n          : null;\n\n      // Return successful response with properly typed data\n      return {\n        status: \"success\",\n        data: transactionData,\n      };\n    } catch (error) {\n      // Handle errors with appropriate message\n      throw new PaymentVerificationError(\n        error instanceof Error ? error.message : \"An unknown error occurred\"\n      );\n    }\n  };\n\n  /**\n   * Namespace for subaccount management operations\n   * Provides methods to create and manage subaccounts\n   */\n  subaccounts = {\n    /**\n     * Creates a new subaccount within the platform\n     *\n     * @param data - Subaccount configuration including owner details and supported currencies\n     * @returns Promise resolving to the created subaccount details\n     * @throws Error if the request fails or returns invalid data\n     */\n    create: async (\n      data: CreateSubAccountData\n    ): Promise<CreateSubAccountResponse> => {\n      // Make sure the networks are lowercase\n      data.networks = data.networks.map((network) => network.toLowerCase());\n      return this.request<CreateSubAccountResponse>(\n        \"POST\",\n        \"/api/v1/assets/subaccount/create\",\n        data\n      );\n    },\n  };\n\n  /**\n   * Namespace for currency conversion operations\n   * Provides methods to calculate exchange rates and fees\n   */\n  conversion = {\n    /**\n     * Calculates a preview of currency conversion with rates and fees\n     *\n     * @param data - Conversion details including amount, source and target currencies\n     * @returns Promise resolving to detailed conversion calculation\n     * @throws Error if the request fails or returns invalid data\n     */\n    preview: async (\n      data: CurrencyConversionPayload\n    ): Promise<CurrencyConversionResult | EnhancedConversionResponse> => {\n      return this.request<\n        CurrencyConversionResult | EnhancedConversionResponse\n      >(\"POST\", \"/api/v1/user/preview-convert-asset\", {\n        ...data,\n        ...(data.fromSymbol && {\n          from_symbol: data.fromSymbol,\n        }),\n        ...(data.toSymbol && {\n          to_symbol: data.toSymbol,\n        }),\n      });\n    },\n  };\n\n  /**\n   * Namespace for asset transfer operations\n   * Provides methods to transfer assets, view history, and calculate fees\n   */\n  transfer = {\n    /**\n     * Transfer assets between wallets\n     *\n     * @param data - Transfer details including amount, currency, destination, and authentication\n     * @returns Promise resolving to transfer confirmation with receipt and transaction ID\n     * @throws Error if the transfer fails due to validation, insufficient funds, or other issues\n     */\n    executeTransfer: async (\n      data: ITransferAssetData\n    ): Promise<ITransferAssetResponse> => {\n      const { oauthAccessToken, ...transferData } = data;\n      return this.request<ITransferAssetResponse>(\n        \"POST\",\n        \"/api/v1/transfer/asset\",\n        transferData,\n        oauthAccessToken ? { Authorization: `Bearer ${oauthAccessToken}` } : {}\n      );\n    },\n\n    /**\n     * Get transfer history for the authenticated user\n     *\n     * @param params - Filtering and pagination parameters\n     * @returns Promise resolving to paginated transfer history records\n     * @throws Error if the request fails or authentication is invalid\n     */\n    getHistory: async (\n      params: ITransferHistoryParams\n    ): Promise<ITransferHistoryResponse> => {\n      return this.request<ITransferHistoryResponse>(\n        \"GET\",\n        \"/api/v1/transfer/history\",\n        params\n      );\n    },\n\n    /**\n     * Calculate transfer fees for a potential transaction\n     *\n     * @param params - Fee calculation parameters including currency and transfer type\n     * @returns Promise resolving to detailed fee breakdown\n     * @throws Error if the fee calculation fails or currency is not supported\n     */\n    calculateFee: async (\n      params: ITransferFeeParams\n    ): Promise<ITransferFeeResponse> => {\n      return this.request<ITransferFeeResponse>(\n        \"GET\",\n        \"/api/v1/transfer/fee\",\n        params\n      );\n    },\n  };\n\n  /**\n   * Namespace for wallet operations\n   * Provides methods to retrieve supported wallets\n   */\n  wallet = {\n    /**\n     * Get a list of supported wallets and their details\n     *\n     * @returns Promise resolving to an array of supported wallet configurations\n     * @throws Error if the request fails or authentication is invalid\n     */\n    getSupportedWallets: async (): Promise<ISupportedWalletResponse> => {\n      return this.request<ISupportedWalletResponse>(\n        \"GET\",\n        \"/api/v1/wallet/supported\"\n      );\n    },\n  };\n\n  /**\n   * Namespace for bank transfer operations\n   * Provides methods to transfer to external bank accounts\n   */\n  bankTransfer = {\n    /**\n     * Get Bank List\n     * @returns Promise resolving to an array of supported banks\n     * @throws Error if the request fails or authentication is invalid\n     */\n    getBankList: async (): Promise<IBankListResponse> => {\n      return this.request<IBankListResponse>(\n        \"GET\",\n        \"/api/v1/bank-transfers/banks\"\n      );\n    },\n\n    /**\n     * Verify Bank\n     * @param data - Bank details\n     * @returns Promise resolving to bank details\n     * @throws Error if the request fails or authentication is invalid\n     */\n    verifyBank: async (data: IVerifyBankData): Promise<IVerifyBankResponse> => {\n      return this.request<IVerifyBankResponse>(\n        \"POST\",\n        \"/api/v1/bank-transfers/verify-account\",\n        data\n      );\n    },\n\n    /**\n     * Perform a bank transfer\n     * @param data - Bank transfer details\n     * @returns Promise resolving to bank transfer details\n     * @throws Error if the request fails or authentication is invalid\n     */\n    transfer: async (\n      data: IBankTransferData\n    ): Promise<IBankTransferResponse> => {\n      return this.request<IBankTransferResponse>(\n        \"POST\",\n        \"/api/v1/bank-transfers\",\n        data\n      );\n    },\n  };\n\n  /**\n   * Namespace for OAuth 2.0 operations\n   */\n  oauth = {\n    /**\n     * Register a new OAuth application.\n     * @param data - Application details.\n     * @returns Promise resolving to the registered OAuth application details.\n     */\n    registerApp: async (data: {\n      appName: string;\n      appDescription: string;\n      appLogo: string;\n      redirectUris: string[];\n      allowedScopes: string[];\n    }): Promise<IOAuthApp> => {\n      return this.request<IOAuthApp>(\"POST\", \"/api/v1/oauth/register\", data);\n    },\n\n    /**\n     * Get the authorization URL to redirect the user to.\n     * @param params - Authorization parameters.\n     * @returns Promise resolving to the authorization URL.\n     */\n    getAuthorizationUrl: async (params: {\n      client_id: string;\n      redirect_uri: string;\n      scope?: string;\n      state?: string;\n    }): Promise<string> => {\n      const response = await this.request<{\n        data: { authorizationUrl: string };\n      }>(\"GET\", \"/api/v1/oauth/authorize\", params);\n      return response.data.authorizationUrl;\n    },\n\n    /**\n     * Exchange authorization code for an access token.\n     * @param data - Code exchange details.\n     * @returns Promise resolving to the token data.\n     */\n    exchangeCodeForToken: async (data: {\n      grant_type: \"authorization_code\";\n      code: string;\n      client_id: string;\n      client_secret: string;\n      redirect_uri: string;\n    }): Promise<IApiResponse<ITokenData>> => {\n      return this.request<IApiResponse<ITokenData>>(\n        \"POST\",\n        \"/api/v1/oauth/token\",\n        data\n      );\n    },\n\n    /**\n     * Get user information using the access token.\n     * @param accessToken - The access token.\n     * @returns Promise resolving to the user information.\n     */\n    getUserInfo: async (\n      accessToken: string\n    ): Promise<IApiResponse<IUserInfo>> => {\n      return this.request<IApiResponse<IUserInfo>>(\n        \"GET\",\n        \"/api/v1/oauth/userinfo\",\n        {},\n        { Authorization: `Bearer ${accessToken}` }\n      );\n    },\n\n    /**\n     * Get application information using the access token.\n     * @param accessToken - The access token.\n     * @returns Promise resolving to the application information.\n     */\n    getAppInfo: async (\n      accessToken: string\n    ): Promise<IApiResponse<IAppInfo>> => {\n      return this.request<IApiResponse<IAppInfo>>(\n        \"GET\",\n        \"/api/v1/oauth/appinfo\",\n        {},\n        { Authorization: `Bearer ${accessToken}` }\n      );\n    },\n\n    /**\n     * Revoke an access token.\n     * @param token - The access token to revoke.\n     * @returns Promise resolving when the token is revoked.\n     */\n    revokeToken: async (token: string): Promise<void> => {\n      return this.request<void>(\"POST\", \"/api/v1/oauth/revoke\", { token });\n    },\n  };\n\n  /**\n   * Generic method to make authenticated API requests to any endpoint\n   *\n   * @param method - HTTP method to use (GET, POST, PUT, DELETE)\n   * @param endpoint - API endpoint path (will be appended to base URL)\n   * @param data - Request payload or query parameters\n   * @returns Promise resolving to the typed API response\n   * @throws Error with detailed message on request failure\n   */\n  async request<T>(\n    method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n    endpoint: string,\n    data: Record<string, unknown> = {},\n    customHeaders: Record<string, string> = {}\n  ): Promise<T> {\n    try {\n      // Build URL with query parameters for GET requests\n      const url =\n        method === \"GET\" && Object.keys(data).length > 0\n          ? `${this.baseUrl}${endpoint}?${new URLSearchParams(\n              data as Record<string, string>\n            )}`\n          : `${this.baseUrl}${endpoint}`;\n\n      const headers = this.getHeaders(data);\n      const options = {\n        method,\n        headers: { ...headers, ...customHeaders },\n        body: method !== \"GET\" ? JSON.stringify(data) : undefined,\n      };\n      logger?.debug(`Request to ${url}`, { options });\n      const response = await fetch(url, options);\n\n      // Handle response.ok check and throw errors for failed requests\n      if (!response.ok) {\n        const errorData: unknown = await response.json().catch(() => ({}));\n        logger.error(errorData);\n        const errorMessage = this.extractErrorMessage(errorData);\n        throw new Error(`API Request Failed: ${errorMessage}`);\n      }\n\n      // Parse JSON response\n      const responseData: unknown = await response.json();\n\n      // Check if the response indicates an error despite a successful HTTP status\n      if (\n        responseData &&\n        typeof responseData === \"object\" &&\n        \"success\" in responseData\n      ) {\n        if ((responseData as { success?: boolean }).success === false) {\n          // Extract error from the API's own error indication\n          const errorMessage = this.extractErrorMessage(responseData);\n          throw new Error(`API Request Failed: ${errorMessage}`);\n        }\n      }\n\n      return responseData as T;\n    } catch (error) {\n      if (error instanceof Error) {\n        throw error;\n      }\n\n      // Handle unexpected error types\n      throw new Error(`API Request Failed: ${String(error)}`);\n    }\n  }\n\n  /**\n   * Extracts error message from various response data structures\n   *\n   * @param data - The response data object which may contain error information\n   * @returns The most specific error message available\n   */\n  private extractErrorMessage(data: unknown): string {\n    // If data is a string, return it directly\n    if (typeof data === \"string\") {\n      return data;\n    }\n\n    // If data is not an object or is null, return a generic message\n    if (typeof data !== \"object\" || data === null) {\n      return \"Unknown error\";\n    }\n\n    // Handle different error structures\n    const dataObj = data as Record<string, unknown>;\n\n    // Direct error message in data.message\n    if (\"message\" in dataObj && typeof dataObj.message === \"string\") {\n      return dataObj.message;\n    }\n\n    // Error object with message property\n    if (\"error\" in dataObj) {\n      const error = dataObj.error;\n\n      // String error\n      if (typeof error === \"string\") {\n        return error;\n      }\n\n      // Object error with message\n      if (error && typeof error === \"object\") {\n        const errorObj = error as Record<string, unknown>;\n\n        if (\"message\" in errorObj && typeof errorObj.message === \"string\") {\n          return errorObj.message;\n        }\n\n        // Try to get any useful information from the error object\n        if (\"code\" in errorObj && typeof errorObj.code === \"string\") {\n          return `Error code: ${errorObj.code}`;\n        }\n      }\n    }\n\n    // Look for error in the 'data' property\n    if (\"data\" in dataObj && dataObj.data && typeof dataObj.data === \"object\") {\n      const nestedData = dataObj.data as Record<string, unknown>;\n\n      if (\"message\" in nestedData && typeof nestedData.message === \"string\") {\n        return nestedData.message;\n      }\n\n      if (\n        \"error\" in nestedData &&\n        nestedData.error &&\n        typeof nestedData.error === \"object\"\n      ) {\n        const nestedError = nestedData.error as Record<string, unknown>;\n        if (\n          \"message\" in nestedError &&\n          typeof nestedError.message === \"string\"\n        ) {\n          return nestedError.message;\n        }\n      }\n    }\n\n    // If we have a statusText from the response, use that\n    if (\"statusText\" in dataObj && typeof dataObj.statusText === \"string\") {\n      return dataObj.statusText;\n    }\n\n    // Stringify the error if nothing else works\n    try {\n      return `Error details: ${JSON.stringify(dataObj)}`;\n    } catch {\n      return \"Unknown error occurred\";\n    }\n  }\n}\n\nexport * from \"./types\";\nexport * from \"./types/transfer\";\nexport * from \"./types/oauth\";\n"],"mappings":"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","names":[]}