@100pay-hq/100pay.js 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -117,11 +117,13 @@ try {
117
117
 
118
118
  Subaccounts allow you to create and manage separate accounts under your main account.
119
119
 
120
+ > **Note:** The `networks` array should contain lowercase network names (e.g., `"ethereum"`, `"bsc"`).
121
+
120
122
  ```typescript
121
123
  // Create a subaccount
122
124
  const subaccount = await client.subaccounts.create({
123
125
  symbols: ["BTC", "ETH", "USDT"],
124
- networks: ["ETHEREUM", "BSC"],
126
+ networks: ["ethereum", "bsc"],
125
127
  owner: {
126
128
  name: "Partner Store",
127
129
  email: "partner@example.com",
@@ -246,8 +248,8 @@ Preview currency conversion rates and fees:
246
248
  // Preview a currency conversion
247
249
  const conversion = await client.conversion.preview({
248
250
  amount: 100,
249
- fromSymbol: "BTC",
250
- toSymbol: "USDT",
251
+ from_symbol: "BTC",
252
+ to_symbol: "USDT",
251
253
  appId: "your_app_id" // Optional
252
254
  });
253
255
  ```
@@ -257,28 +259,37 @@ const conversion = await client.conversion.preview({
257
259
  ```typescript
258
260
  interface CurrencyConversionPayload {
259
261
  amount: number; // Amount to convert
260
- fromSymbol: string; // Source currency symbol
261
- toSymbol: string; // Target currency symbol
262
+ from_symbol: string; // Source currency symbol (snake_case)
263
+ to_symbol: string; // Target currency symbol (snake_case)
262
264
  appId?: string; // Optional application ID
265
+ mode?: string; // Optional conversion mode
263
266
  }
264
267
  ```
265
268
 
266
269
  **Returns:**
267
270
 
271
+ The preview may return a simple result or an enhanced response with more details:
272
+
268
273
  ```typescript
274
+ // Simple result
269
275
  interface CurrencyConversionResult {
270
276
  convertedAmount: number; // Final amount after conversion
271
277
  totalAmount: number; // Total amount including fees
278
+ finalAmount: number; // Final amount after all deductions
272
279
  feeInUSD: number; // Fee amount in USD
273
280
  feeInToCurrency: number; // Fee amount in target currency
274
- feeInfromSymbol: number; // Fee amount in source currency
281
+ feeInFromCurrency: number; // Fee amount in source currency
275
282
  conversionFeeInUSD: number; // Conversion fee in USD
276
283
  conversionFeeInToCurrency: number; // Conversion fee in target currency
277
- conversionFeeInfromSymbol: number; // Conversion fee in source currency
284
+ conversionFeeInFromCurrency: number; // Conversion fee in source currency
278
285
  fromRate: number; // Exchange rate for source currency
279
286
  toRate: number; // Exchange rate for target currency
280
287
  intermediateUSDAmount: number; // Intermediate amount in USD
288
+ percentageConversionFee: number; // Percentage conversion fee
281
289
  }
290
+
291
+ // Enhanced response (see types for full structure)
292
+ type EnhancedConversionResponse = { ... }
282
293
  ```
283
294
 
284
295
  **Example:**
@@ -287,14 +298,18 @@ interface CurrencyConversionResult {
287
298
  try {
288
299
  const preview = await client.conversion.preview({
289
300
  amount: 0.5,
290
- fromSymbol: "BTC",
291
- toSymbol: "USDT"
301
+ from_symbol: "BTC",
302
+ to_symbol: "USDT"
292
303
  });
293
304
 
294
- console.log(`Converting 0.5 BTC to USDT:`);
295
- console.log(`You will receive: ${preview.convertedAmount} USDT`);
296
- console.log(`Exchange rate: 1 BTC = ${preview.toRate / preview.fromRate} USDT`);
297
- console.log(`Total fees: ${preview.feeInUSD} USD (${preview.feeInfromSymbol} BTC)`);
305
+ if ("convertedAmount" in preview) {
306
+ console.log(`You will receive: ${preview.convertedAmount} USDT`);
307
+ console.log(`Exchange rate: 1 BTC = ${preview.toRate / preview.fromRate} USDT`);
308
+ console.log(`Total fees: ${preview.feeInUSD} USD (${preview.feeInFromCurrency} BTC)`);
309
+ } else {
310
+ // Handle enhanced response
311
+ console.log("Enhanced conversion preview:", preview);
312
+ }
298
313
  } catch (error) {
299
314
  console.error(`Conversion preview failed: ${error.message}`);
300
315
  }
@@ -568,7 +583,7 @@ import {
568
583
  ```typescript
569
584
  const subaccount = await client.subaccounts.create({
570
585
  symbols: ["BTC", "ETH", "USDT"],
571
- networks: ["ETHEREUM"],
586
+ networks: ["ethereum"],
572
587
  owner: {
573
588
  name: "Partner Name",
574
589
  email: "partner@example.com",
@@ -592,14 +607,19 @@ subaccount.accounts.forEach(account => {
592
607
  // Get conversion rates before executing a trade
593
608
  const preview = await client.conversion.preview({
594
609
  amount: 1000,
595
- fromSymbol: "USDT",
596
- toSymbol: "BTC"
610
+ from_symbol: "USDT",
611
+ to_symbol: "BTC"
597
612
  });
598
613
 
599
614
  // Show user the conversion details
600
- console.log(`You will receive approximately ${preview.convertedAmount} BTC`);
601
- console.log(`Exchange rate: 1 USDT = ${preview.toRate / preview.fromRate} BTC`);
602
- console.log(`Fee: ${preview.feeInfromSymbol} USDT (${preview.feeInUSD} USD)`);
615
+ if ("convertedAmount" in preview) {
616
+ console.log(`You will receive approximately ${preview.convertedAmount} BTC`);
617
+ console.log(`Exchange rate: 1 USDT = ${preview.toRate / preview.fromRate} BTC`);
618
+ console.log(`Fee: ${preview.feeInFromCurrency} USDT (${preview.feeInUSD} USD)`);
619
+ } else {
620
+ // Handle enhanced response
621
+ console.log("Enhanced conversion preview:", preview);
622
+ }
603
623
  ```
604
624
 
605
625
  ### Bank Transfer Workflow
package/dist/index.cjs CHANGED
@@ -142,16 +142,15 @@ var Pay100 = class {
142
142
  * @throws Error if the request fails or returns invalid data
143
143
  */
144
144
  preview: async (data) => {
145
- return this.request(
146
- "POST",
147
- "/api/v1/user/preview-convert-asset",
148
- {
149
- amount: data.amount,
150
- to_symbol: data.toSymbol,
151
- from_symbol: data.fromSymbol,
152
- appId: data.appId
145
+ return this.request("POST", "/api/v1/user/preview-convert-asset", {
146
+ ...data,
147
+ ...data.fromSymbol && {
148
+ from_symbol: data.fromSymbol
149
+ },
150
+ ...data.toSymbol && {
151
+ to_symbol: data.toSymbol
153
152
  }
154
- );
153
+ });
155
154
  }
156
155
  };
157
156
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\nimport * as crypto from \"crypto\";\nimport {\n CreateSubAccountData,\n CreateSubAccountResponse,\n} from \"./types/subAccount\";\nimport {\n CurrencyConversionPayload,\n CurrencyConversionResult,\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 { logger } from \"@untools/logger\";\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/**\n * Interface for raw API responses before processing\n * Provides a flexible structure while capturing common response elements\n */\ninterface IRawApiResponse {\n status?: string;\n message?: string;\n data?: unknown;\n [key: string]: unknown;\n}\n\n// /**\n// * Standardized response interface for transaction verification\n// * @property status - Result status ('success' or 'error')\n// * @property data - Transaction details when successful, empty object on failure\n// * @property message - Optional response message, typically present on errors\n// */\n// interface IVerifyResponse {\n// status: \"success\" | \"error\";\n// data: ITransactionData | Record<string, never>;\n// message?: string;\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: AxiosResponse<IRawApiResponse> = await axios({\n method: \"POST\",\n url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n headers: this.getHeaders(payload),\n data: payload,\n });\n\n // Handle empty response\n if (!response.data) {\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 response.data === \"string\") {\n if (response.data === \"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 (response.data === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Validate and transform response data to ensure type safety\n const responseData = response.data;\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 Axios errors with detailed message\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n throw new PaymentVerificationError(\n axiosError.message ||\n \"Something went wrong, be sure you supplied a valid payment id.\"\n );\n }\n\n // Handle other 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> => {\n return this.request<CurrencyConversionResult>(\n \"POST\",\n \"/api/v1/user/preview-convert-asset\",\n {\n amount: data.amount,\n to_symbol: data.toSymbol,\n from_symbol: data.fromSymbol,\n appId: data.appId,\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 return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n data\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 * 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 ): Promise<T> {\n try {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers,\n data: method !== \"GET\" ? data : undefined,\n params: method === \"GET\" ? data : undefined,\n });\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n response.data &&\n typeof response.data === \"object\" &&\n \"success\" in response.data\n ) {\n if ((response.data as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(response.data);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return response.data as T;\n } catch (error) {\n logger.error(error);\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n logger.error(axiosError?.response);\n\n // Extract error message from response data if available\n const errorMessage = axiosError.response?.data\n ? this.extractErrorMessage(axiosError.response.data)\n : axiosError.message;\n\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Rethrow original error if not an Axios error\n throw 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\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAiD;AACjD,aAAwB;AAwBxB,oBAAuB;AA8CvB,IAAM,WAAW,QAAQ,IAAI,YAAY;AAMlC,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAIlD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO,CAAC;AAAA,EACf;AACF;AAOO,IAAM,SAAN,MAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EASlB,YAAY,EAAE,WAAW,WAAW,UAAU,SAAS,GAAkB;AA+EzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAS,OAAO,kBAAoD;AAClE,UAAI;AACF,cAAM,UAAU,EAAE,cAAc;AAEhC,cAAM,WAA2C,UAAM,aAAAA,SAAM;AAAA,UAC3D,QAAQ;AAAA,UACR,KAAK,GAAG,KAAK,OAAO,8BAA8B,aAAa;AAAA,UAC/D,SAAS,KAAK,WAAW,OAAO;AAAA,UAChC,MAAM;AAAA,QACR,CAAC;AAGD,YAAI,CAAC,SAAS,MAAM;AAClB,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,SACE;AAAA,UACJ;AAAA,QACF;AAGA,YAAI,OAAO,SAAS,SAAS,UAAU;AACrC,cAAI,SAAS,SAAS,uCAAuC;AAC3D,mBAAO;AAAA,cACL,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAEA,cAAI,SAAS,SAAS,+BAA+B;AACnD,mBAAO;AAAA,cACL,QAAQ;AAAA,cACR,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAGA,cAAM,eAAe,SAAS;AAG9B,cAAM,kBACJ,gBAAgB,OAAO,iBAAiB,WACnC,eACD;AAGN,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF,SAAS,OAAO;AAEd,YAAI,aAAAA,QAAM,aAAa,KAAK,GAAG;AAC7B,gBAAM,aAAa;AACnB,gBAAM,IAAI;AAAA,YACR,WAAW,WACT;AAAA,UACJ;AAAA,QACF;AAGA,cAAM,IAAI;AAAA,UACR,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAMA;AAAA;AAAA;AAAA;AAAA,uBAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQZ,QAAQ,OACN,SACsC;AAEtC,aAAK,WAAW,KAAK,SAAS,IAAI,CAAC,YAAY,QAAQ,YAAY,CAAC;AACpE,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAMA;AAAA;AAAA;AAAA;AAAA,sBAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQX,SAAS,OACP,SACsC;AACtC,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,YACE,QAAQ,KAAK;AAAA,YACb,WAAW,KAAK;AAAA,YAChB,aAAa,KAAK;AAAA,YAClB,OAAO,KAAK;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAMA;AAAA;AAAA;AAAA;AAAA,oBAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQT,iBAAiB,OACf,SACoC;AACpC,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,YAAY,OACV,WACsC;AACtC,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,cAAc,OACZ,WACkC;AAClC,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAMA;AAAA;AAAA;AAAA;AAAA,kBAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOP,qBAAqB,YAA+C;AAClE,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAMA;AAAA;AAAA;AAAA;AAAA,wBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMb,aAAa,YAAwC;AACnD,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,YAAY,OAAO,SAAwD;AACzE,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,UAAU,OACR,SACmC;AACnC,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAnUE,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,gBAAgB,SAGtB;AACA,UAAM,YAAY,KAAK,IAAI,EAAE,SAAS;AAItC,QAAI,gBAAgB,MAAM;AAE1B,QAAI,MAAM,WAAW,SAAS,GAAG,GAAG;AAClC,YAAM,iBAAiB,KAAK,UAAU,MAAM,GAAG;AAC/C,UAAI,eAAe,WAAW,GAAG;AAE/B,wBAAgB,eAAe,CAAC;AAAA,MAClC;AAAA,IACF;AAEA,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAGA,UAAM,YACH,kBAAW,UAAU,aAAa,EAClC,OAAO,YAAY,KAAK,UAAU,OAAO,CAAC,EAC1C,OAAO,KAAK;AAEf,WAAO,EAAE,WAAW,UAAU;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,WACN,UAAmC,CAAC,GACZ;AAExB,QAAI,KAAK,WAAW;AAClB,YAAM,EAAE,WAAW,UAAU,IAAI,KAAK,gBAAgB,OAAO;AAC7D,aAAO;AAAA,QACL,WAAW,KAAK;AAAA,QAChB,gBAAgB,KAAK;AAAA,QACrB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,IACF;AAGA,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyQA,MAAM,QACJ,QACA,UACA,OAAgC,CAAC,GACrB;AACZ,QAAI;AACF,YAAM,MAAM,GAAG,KAAK,OAAO,GAAG,QAAQ;AACtC,YAAM,UAAU,KAAK,WAAW,IAAI;AAEpC,YAAM,WAAW,UAAM,aAAAA,SAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,WAAW,QAAQ,OAAO;AAAA,QAChC,QAAQ,WAAW,QAAQ,OAAO;AAAA,MACpC,CAAC;AAGD,UACE,SAAS,QACT,OAAO,SAAS,SAAS,YACzB,aAAa,SAAS,MACtB;AACA,YAAK,SAAS,KAA+B,YAAY,OAAO;AAE9D,gBAAM,eAAe,KAAK,oBAAoB,SAAS,IAAI;AAC3D,gBAAM,IAAI,MAAM,uBAAuB,YAAY,EAAE;AAAA,QACvD;AAAA,MACF;AAEA,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AACd,2BAAO,MAAM,KAAK;AAClB,UAAI,aAAAA,QAAM,aAAa,KAAK,GAAG;AAC7B,cAAM,aAAa;AACnB,6BAAO,MAAM,YAAY,QAAQ;AAGjC,cAAM,eAAe,WAAW,UAAU,OACtC,KAAK,oBAAoB,WAAW,SAAS,IAAI,IACjD,WAAW;AAEf,cAAM,IAAI,MAAM,uBAAuB,YAAY,EAAE;AAAA,MACvD;AAGA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAoB,MAAuB;AAEjD,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,aAAO;AAAA,IACT;AAGA,UAAM,UAAU;AAGhB,QAAI,aAAa,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC/D,aAAO,QAAQ;AAAA,IACjB;AAGA,QAAI,WAAW,SAAS;AACtB,YAAM,QAAQ,QAAQ;AAGtB,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO;AAAA,MACT;AAGA,UAAI,SAAS,OAAO,UAAU,UAAU;AACtC,cAAM,WAAW;AAEjB,YAAI,aAAa,YAAY,OAAO,SAAS,YAAY,UAAU;AACjE,iBAAO,SAAS;AAAA,QAClB;AAGA,YAAI,UAAU,YAAY,OAAO,SAAS,SAAS,UAAU;AAC3D,iBAAO,eAAe,SAAS,IAAI;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,UAAU,WAAW,QAAQ,QAAQ,OAAO,QAAQ,SAAS,UAAU;AACzE,YAAM,aAAa,QAAQ;AAE3B,UAAI,aAAa,cAAc,OAAO,WAAW,YAAY,UAAU;AACrE,eAAO,WAAW;AAAA,MACpB;AAEA,UACE,WAAW,cACX,WAAW,SACX,OAAO,WAAW,UAAU,UAC5B;AACA,cAAM,cAAc,WAAW;AAC/B,YACE,aAAa,eACb,OAAO,YAAY,YAAY,UAC/B;AACA,iBAAO,YAAY;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,gBAAgB,WAAW,OAAO,QAAQ,eAAe,UAAU;AACrE,aAAO,QAAQ;AAAA,IACjB;AAGA,QAAI;AACF,aAAO,kBAAkB,KAAK,UAAU,OAAO,CAAC;AAAA,IAClD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":["axios"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\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 { logger } from \"@untools/logger\";\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/**\n * Interface for raw API responses before processing\n * Provides a flexible structure while capturing common response elements\n */\ninterface IRawApiResponse {\n status?: string;\n message?: string;\n data?: unknown;\n [key: string]: unknown;\n}\n\n// /**\n// * Standardized response interface for transaction verification\n// * @property status - Result status ('success' or 'error')\n// * @property data - Transaction details when successful, empty object on failure\n// * @property message - Optional response message, typically present on errors\n// */\n// interface IVerifyResponse {\n// status: \"success\" | \"error\";\n// data: ITransactionData | Record<string, never>;\n// message?: string;\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: AxiosResponse<IRawApiResponse> = await axios({\n method: \"POST\",\n url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n headers: this.getHeaders(payload),\n data: payload,\n });\n\n // Handle empty response\n if (!response.data) {\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 response.data === \"string\") {\n if (response.data === \"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 (response.data === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Validate and transform response data to ensure type safety\n const responseData = response.data;\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 Axios errors with detailed message\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n throw new PaymentVerificationError(\n axiosError.message ||\n \"Something went wrong, be sure you supplied a valid payment id.\"\n );\n }\n\n // Handle other 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 return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n data\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 * 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 ): Promise<T> {\n try {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers,\n data: method !== \"GET\" ? data : undefined,\n params: method === \"GET\" ? data : undefined,\n });\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n response.data &&\n typeof response.data === \"object\" &&\n \"success\" in response.data\n ) {\n if ((response.data as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(response.data);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return response.data as T;\n } catch (error) {\n logger.error(error);\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n logger.error(axiosError?.response);\n\n // Extract error message from response data if available\n const errorMessage = axiosError.response?.data\n ? this.extractErrorMessage(axiosError.response.data)\n : axiosError.message;\n\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Rethrow original error if not an Axios error\n throw 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\";\n"],"mappings":"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","names":["axios"]}
package/dist/index.d.cts CHANGED
@@ -62,24 +62,85 @@ type Crypto = {
62
62
  mac: string;
63
63
  };
64
64
 
65
- type CurrencyConversionPayload = {
65
+ type CurrencyConversionPayload = Record<string, unknown> & {
66
66
  amount: number;
67
- fromSymbol: string;
68
- toSymbol: string;
67
+ from_symbol?: string;
68
+ to_symbol?: string;
69
69
  appId?: string;
70
+ mode?: string;
71
+ fromSymbol?: string;
72
+ toSymbol?: string;
73
+ };
74
+ type EnhancedConversionResponse = {
75
+ conversion: {
76
+ fromSymbol: string;
77
+ toSymbol: string;
78
+ requestedAmount: number;
79
+ convertedAmount: number;
80
+ feeInFromCurrency: number;
81
+ feeInToCurrency: number;
82
+ totalDebitAmount: number;
83
+ totalAmount: number;
84
+ finalAmount: number;
85
+ feeInUSD: number;
86
+ conversionFeeInUSD: number;
87
+ conversionFeeInToCurrency: number;
88
+ conversionFeeInFromCurrency: number;
89
+ fromRate: number;
90
+ toRate: number;
91
+ intermediateUSDAmount: number;
92
+ percentageConversionFee: number;
93
+ };
94
+ balance: {
95
+ currentBalance: number;
96
+ availableBalance: number;
97
+ hasSufficientBalance: boolean;
98
+ shortfall: number;
99
+ };
100
+ wallets: {
101
+ fromWallet: {
102
+ exists: boolean;
103
+ symbol: string;
104
+ walletType: "crypto" | "local" | string;
105
+ };
106
+ toWallet: {
107
+ exists: boolean;
108
+ symbol: string;
109
+ walletType: "crypto" | "local" | string;
110
+ };
111
+ };
112
+ canProceed: boolean;
113
+ restrictions: {
114
+ isWhitelisted: boolean;
115
+ validationPassed: boolean;
116
+ additionalValidations: {
117
+ [key: string]: {
118
+ allowed: boolean;
119
+ message: string;
120
+ } | null;
121
+ };
122
+ };
123
+ user: {
124
+ status: string;
125
+ canTransact: boolean;
126
+ };
127
+ mode: string;
128
+ timestamp: string;
70
129
  };
71
130
  type CurrencyConversionResult = {
72
131
  convertedAmount: number;
73
132
  totalAmount: number;
133
+ finalAmount: number;
74
134
  feeInUSD: number;
75
135
  feeInToCurrency: number;
76
- feeInfromSymbol: number;
136
+ feeInFromCurrency: number;
77
137
  conversionFeeInUSD: number;
78
138
  conversionFeeInToCurrency: number;
79
- conversionFeeInfromSymbol: number;
139
+ conversionFeeInFromCurrency: number;
80
140
  fromRate: number;
81
141
  toRate: number;
82
142
  intermediateUSDAmount: number;
143
+ percentageConversionFee: number;
83
144
  };
84
145
 
85
146
  interface IWalletTransaction {
@@ -501,7 +562,7 @@ declare class Pay100 {
501
562
  * @returns Promise resolving to detailed conversion calculation
502
563
  * @throws Error if the request fails or returns invalid data
503
564
  */
504
- preview: (data: CurrencyConversionPayload) => Promise<CurrencyConversionResult>;
565
+ preview: (data: CurrencyConversionPayload) => Promise<CurrencyConversionResult | EnhancedConversionResponse>;
505
566
  };
506
567
  /**
507
568
  * Namespace for asset transfer operations
@@ -591,4 +652,4 @@ declare class Pay100 {
591
652
  private extractErrorMessage;
592
653
  }
593
654
 
594
- export { type Account, type AccountDetails, type CreateSubAccountData, type CreateSubAccountResponse, type Crypto, type CurrencyConversionPayload, type CurrencyConversionResult, type IBank, type IBankListResponse, type IBankTransferData, type IBankTransferResponse, type IChargeData, type ISupportedWallet, type ISupportedWalletResponse, type ITransactionData, type ITransferAssetData, type ITransferAssetResponse, type ITransferFeeParams, type ITransferFeeResponse, type ITransferHistoryItem, type ITransferHistoryParams, type ITransferHistoryResponse, type IVerifyBankData, type IVerifyBankResponse, type IVerifyResponse, type IWalletAccount, type IWalletBalance, type IWalletFee, type IWalletTransaction, type Key, type Network, Pay100, PaymentVerificationError };
655
+ export { type Account, type AccountDetails, type CreateSubAccountData, type CreateSubAccountResponse, type Crypto, type CurrencyConversionPayload, type CurrencyConversionResult, type EnhancedConversionResponse, type IBank, type IBankListResponse, type IBankTransferData, type IBankTransferResponse, type IChargeData, type ISupportedWallet, type ISupportedWalletResponse, type ITransactionData, type ITransferAssetData, type ITransferAssetResponse, type ITransferFeeParams, type ITransferFeeResponse, type ITransferHistoryItem, type ITransferHistoryParams, type ITransferHistoryResponse, type IVerifyBankData, type IVerifyBankResponse, type IVerifyResponse, type IWalletAccount, type IWalletBalance, type IWalletFee, type IWalletTransaction, type Key, type Network, Pay100, PaymentVerificationError };
package/dist/index.d.ts CHANGED
@@ -62,24 +62,85 @@ type Crypto = {
62
62
  mac: string;
63
63
  };
64
64
 
65
- type CurrencyConversionPayload = {
65
+ type CurrencyConversionPayload = Record<string, unknown> & {
66
66
  amount: number;
67
- fromSymbol: string;
68
- toSymbol: string;
67
+ from_symbol?: string;
68
+ to_symbol?: string;
69
69
  appId?: string;
70
+ mode?: string;
71
+ fromSymbol?: string;
72
+ toSymbol?: string;
73
+ };
74
+ type EnhancedConversionResponse = {
75
+ conversion: {
76
+ fromSymbol: string;
77
+ toSymbol: string;
78
+ requestedAmount: number;
79
+ convertedAmount: number;
80
+ feeInFromCurrency: number;
81
+ feeInToCurrency: number;
82
+ totalDebitAmount: number;
83
+ totalAmount: number;
84
+ finalAmount: number;
85
+ feeInUSD: number;
86
+ conversionFeeInUSD: number;
87
+ conversionFeeInToCurrency: number;
88
+ conversionFeeInFromCurrency: number;
89
+ fromRate: number;
90
+ toRate: number;
91
+ intermediateUSDAmount: number;
92
+ percentageConversionFee: number;
93
+ };
94
+ balance: {
95
+ currentBalance: number;
96
+ availableBalance: number;
97
+ hasSufficientBalance: boolean;
98
+ shortfall: number;
99
+ };
100
+ wallets: {
101
+ fromWallet: {
102
+ exists: boolean;
103
+ symbol: string;
104
+ walletType: "crypto" | "local" | string;
105
+ };
106
+ toWallet: {
107
+ exists: boolean;
108
+ symbol: string;
109
+ walletType: "crypto" | "local" | string;
110
+ };
111
+ };
112
+ canProceed: boolean;
113
+ restrictions: {
114
+ isWhitelisted: boolean;
115
+ validationPassed: boolean;
116
+ additionalValidations: {
117
+ [key: string]: {
118
+ allowed: boolean;
119
+ message: string;
120
+ } | null;
121
+ };
122
+ };
123
+ user: {
124
+ status: string;
125
+ canTransact: boolean;
126
+ };
127
+ mode: string;
128
+ timestamp: string;
70
129
  };
71
130
  type CurrencyConversionResult = {
72
131
  convertedAmount: number;
73
132
  totalAmount: number;
133
+ finalAmount: number;
74
134
  feeInUSD: number;
75
135
  feeInToCurrency: number;
76
- feeInfromSymbol: number;
136
+ feeInFromCurrency: number;
77
137
  conversionFeeInUSD: number;
78
138
  conversionFeeInToCurrency: number;
79
- conversionFeeInfromSymbol: number;
139
+ conversionFeeInFromCurrency: number;
80
140
  fromRate: number;
81
141
  toRate: number;
82
142
  intermediateUSDAmount: number;
143
+ percentageConversionFee: number;
83
144
  };
84
145
 
85
146
  interface IWalletTransaction {
@@ -501,7 +562,7 @@ declare class Pay100 {
501
562
  * @returns Promise resolving to detailed conversion calculation
502
563
  * @throws Error if the request fails or returns invalid data
503
564
  */
504
- preview: (data: CurrencyConversionPayload) => Promise<CurrencyConversionResult>;
565
+ preview: (data: CurrencyConversionPayload) => Promise<CurrencyConversionResult | EnhancedConversionResponse>;
505
566
  };
506
567
  /**
507
568
  * Namespace for asset transfer operations
@@ -591,4 +652,4 @@ declare class Pay100 {
591
652
  private extractErrorMessage;
592
653
  }
593
654
 
594
- export { type Account, type AccountDetails, type CreateSubAccountData, type CreateSubAccountResponse, type Crypto, type CurrencyConversionPayload, type CurrencyConversionResult, type IBank, type IBankListResponse, type IBankTransferData, type IBankTransferResponse, type IChargeData, type ISupportedWallet, type ISupportedWalletResponse, type ITransactionData, type ITransferAssetData, type ITransferAssetResponse, type ITransferFeeParams, type ITransferFeeResponse, type ITransferHistoryItem, type ITransferHistoryParams, type ITransferHistoryResponse, type IVerifyBankData, type IVerifyBankResponse, type IVerifyResponse, type IWalletAccount, type IWalletBalance, type IWalletFee, type IWalletTransaction, type Key, type Network, Pay100, PaymentVerificationError };
655
+ export { type Account, type AccountDetails, type CreateSubAccountData, type CreateSubAccountResponse, type Crypto, type CurrencyConversionPayload, type CurrencyConversionResult, type EnhancedConversionResponse, type IBank, type IBankListResponse, type IBankTransferData, type IBankTransferResponse, type IChargeData, type ISupportedWallet, type ISupportedWalletResponse, type ITransactionData, type ITransferAssetData, type ITransferAssetResponse, type ITransferFeeParams, type ITransferFeeResponse, type ITransferHistoryItem, type ITransferHistoryParams, type ITransferHistoryResponse, type IVerifyBankData, type IVerifyBankResponse, type IVerifyResponse, type IWalletAccount, type IWalletBalance, type IWalletFee, type IWalletTransaction, type Key, type Network, Pay100, PaymentVerificationError };
package/dist/index.js CHANGED
@@ -107,16 +107,15 @@ var Pay100 = class {
107
107
  * @throws Error if the request fails or returns invalid data
108
108
  */
109
109
  preview: async (data) => {
110
- return this.request(
111
- "POST",
112
- "/api/v1/user/preview-convert-asset",
113
- {
114
- amount: data.amount,
115
- to_symbol: data.toSymbol,
116
- from_symbol: data.fromSymbol,
117
- appId: data.appId
110
+ return this.request("POST", "/api/v1/user/preview-convert-asset", {
111
+ ...data,
112
+ ...data.fromSymbol && {
113
+ from_symbol: data.fromSymbol
114
+ },
115
+ ...data.toSymbol && {
116
+ to_symbol: data.toSymbol
118
117
  }
119
- );
118
+ });
120
119
  }
121
120
  };
122
121
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\nimport * as crypto from \"crypto\";\nimport {\n CreateSubAccountData,\n CreateSubAccountResponse,\n} from \"./types/subAccount\";\nimport {\n CurrencyConversionPayload,\n CurrencyConversionResult,\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 { logger } from \"@untools/logger\";\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/**\n * Interface for raw API responses before processing\n * Provides a flexible structure while capturing common response elements\n */\ninterface IRawApiResponse {\n status?: string;\n message?: string;\n data?: unknown;\n [key: string]: unknown;\n}\n\n// /**\n// * Standardized response interface for transaction verification\n// * @property status - Result status ('success' or 'error')\n// * @property data - Transaction details when successful, empty object on failure\n// * @property message - Optional response message, typically present on errors\n// */\n// interface IVerifyResponse {\n// status: \"success\" | \"error\";\n// data: ITransactionData | Record<string, never>;\n// message?: string;\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: AxiosResponse<IRawApiResponse> = await axios({\n method: \"POST\",\n url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n headers: this.getHeaders(payload),\n data: payload,\n });\n\n // Handle empty response\n if (!response.data) {\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 response.data === \"string\") {\n if (response.data === \"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 (response.data === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Validate and transform response data to ensure type safety\n const responseData = response.data;\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 Axios errors with detailed message\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n throw new PaymentVerificationError(\n axiosError.message ||\n \"Something went wrong, be sure you supplied a valid payment id.\"\n );\n }\n\n // Handle other 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> => {\n return this.request<CurrencyConversionResult>(\n \"POST\",\n \"/api/v1/user/preview-convert-asset\",\n {\n amount: data.amount,\n to_symbol: data.toSymbol,\n from_symbol: data.fromSymbol,\n appId: data.appId,\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 return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n data\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 * 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 ): Promise<T> {\n try {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers,\n data: method !== \"GET\" ? data : undefined,\n params: method === \"GET\" ? data : undefined,\n });\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n response.data &&\n typeof response.data === \"object\" &&\n \"success\" in response.data\n ) {\n if ((response.data as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(response.data);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return response.data as T;\n } catch (error) {\n logger.error(error);\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n logger.error(axiosError?.response);\n\n // Extract error message from response data if available\n const errorMessage = axiosError.response?.data\n ? this.extractErrorMessage(axiosError.response.data)\n : axiosError.message;\n\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Rethrow original error if not an Axios error\n throw 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\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\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 { logger } from \"@untools/logger\";\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/**\n * Interface for raw API responses before processing\n * Provides a flexible structure while capturing common response elements\n */\ninterface IRawApiResponse {\n status?: string;\n message?: string;\n data?: unknown;\n [key: string]: unknown;\n}\n\n// /**\n// * Standardized response interface for transaction verification\n// * @property status - Result status ('success' or 'error')\n// * @property data - Transaction details when successful, empty object on failure\n// * @property message - Optional response message, typically present on errors\n// */\n// interface IVerifyResponse {\n// status: \"success\" | \"error\";\n// data: ITransactionData | Record<string, never>;\n// message?: string;\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: AxiosResponse<IRawApiResponse> = await axios({\n method: \"POST\",\n url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n headers: this.getHeaders(payload),\n data: payload,\n });\n\n // Handle empty response\n if (!response.data) {\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 response.data === \"string\") {\n if (response.data === \"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 (response.data === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Validate and transform response data to ensure type safety\n const responseData = response.data;\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 Axios errors with detailed message\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n throw new PaymentVerificationError(\n axiosError.message ||\n \"Something went wrong, be sure you supplied a valid payment id.\"\n );\n }\n\n // Handle other 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 return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n data\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 * 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 ): Promise<T> {\n try {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers,\n data: method !== \"GET\" ? data : undefined,\n params: method === \"GET\" ? data : undefined,\n });\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n response.data &&\n typeof response.data === \"object\" &&\n \"success\" in response.data\n ) {\n if ((response.data as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(response.data);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return response.data as T;\n } catch (error) {\n logger.error(error);\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n logger.error(axiosError?.response);\n\n // Extract error message from response data if available\n const errorMessage = axiosError.response?.data\n ? this.extractErrorMessage(axiosError.response.data)\n : axiosError.message;\n\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Rethrow original error if not an Axios error\n throw 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\";\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@100pay-hq/100pay.js",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "100Pay.js is the official Nodejs API wrapper SDK that lets you easily verify crypto payments, run bulk payout, transfer assets and many more.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",