@100pay-hq/100pay.js 1.4.17 → 1.5.1

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.
package/README.MD CHANGED
@@ -149,7 +149,7 @@ try {
149
149
 
150
150
  Subaccounts allow you to create and manage separate accounts under your main account.
151
151
 
152
- > **Note:** The `networks` array should contain lowercase network names (e.g., `"ethereum"`, `"bsc"`).
152
+ > **Important:** The `networks` array must contain lowercase network names (e.g., `"ethereum"`, `"bsc"`, `"polygon"`, `"tron"`, `"sol"`, `"bitcoin"`).
153
153
 
154
154
  ```typescript
155
155
  // Create a subaccount
@@ -173,7 +173,7 @@ const subaccount = await client.subaccounts.create({
173
173
  ```typescript
174
174
  interface CreateSubAccountData {
175
175
  symbols: string[]; // List of supported cryptocurrencies
176
- networks: string[]; // List of supported blockchain networks
176
+ networks: string[]; // List of supported blockchain networks (must be lowercase)
177
177
  owner: {
178
178
  name: string; // Owner's name
179
179
  email: string; // Owner's email
@@ -251,7 +251,7 @@ interface Crypto {
251
251
  try {
252
252
  const result = await client.subaccounts.create({
253
253
  symbols: ["USDT", "BTC"],
254
- networks: ["ETHEREUM"],
254
+ networks: ["ethereum"],
255
255
  owner: {
256
256
  name: "Merchant Store",
257
257
  email: "merchant@example.com",
@@ -363,10 +363,11 @@ Transfer assets between wallets and manage transfer operations:
363
363
  // Execute an asset transfer
364
364
  const transfer = await client.transfer.executeTransfer({
365
365
  amount: 100,
366
- symbol: "USDT", // Use 'symbol' not 'currency'
367
- to: "0x1234567890abcdef...", // Use 'to' not 'recipientAddress'
368
- transferType: "external", // Optional: "internal" or "external"
369
- note: "Payment for services", // Optional note
366
+ symbol: "USDT",
367
+ to: "0x1234567890abcdef...",
368
+ transferType: "external",
369
+ note: "Payment for services",
370
+ oauthAccessToken: "your_oauth_token", // Optional: for OAuth 2.0 authentication
370
371
  });
371
372
 
372
373
  // Get transfer history
@@ -374,16 +375,113 @@ const history = await client.transfer.getHistory({
374
375
  page: 1,
375
376
  limit: 10,
376
377
  symbols: ["USDT"], // Optional filter by symbols
377
- type: "debit", // Optional filter by type
378
+ type: "credit", // Optional filter: "credit" or "debit"
379
+ accountIds: ["account_123"], // Optional filter by account IDs
380
+ addresses: ["0x..."], // Optional filter by addresses
378
381
  });
379
382
 
380
383
  // Calculate transfer fees
381
384
  const fees = await client.transfer.calculateFee({
382
- symbol: "USDT", // Use 'symbol' not 'currency'
383
- transferType: "external", // Use "internal" or "external"
385
+ symbol: "USDT",
386
+ transferType: "external",
384
387
  });
385
388
  ```
386
389
 
390
+ **Transfer Parameters:**
391
+
392
+ ```typescript
393
+ interface ITransferAssetData {
394
+ amount: number | string; // Amount to transfer (must be greater than zero)
395
+ symbol: string; // Asset symbol/currency code
396
+ to: string; // Destination address or account identifier
397
+ transferType?: "internal" | "external"; // Type of transfer
398
+ note?: string; // Optional note or memo
399
+ oauthAccessToken?: string; // Optional OAuth 2.0 access token
400
+ }
401
+ ```
402
+
403
+ **Transfer Response:**
404
+
405
+ ```typescript
406
+ interface ITransferAssetResponse {
407
+ statusCode: number;
408
+ message: string;
409
+ data: {
410
+ receipt: string; // Transaction receipt/confirmation
411
+ transactionId: string; // Unique transaction identifier
412
+ timestamp: string | number; // Transaction timestamp
413
+ };
414
+ }
415
+ ```
416
+
417
+ **History Parameters:**
418
+
419
+ ```typescript
420
+ interface ITransferHistoryParams {
421
+ accountIds?: string[]; // Filter by account IDs
422
+ addresses?: string[]; // Filter by addresses
423
+ symbols?: string[]; // Filter by currency symbols
424
+ page?: number; // Page number for pagination
425
+ limit?: number; // Records per page
426
+ type?: string; // Filter by type: "credit" or "debit"
427
+ }
428
+ ```
429
+
430
+ **History Response:**
431
+
432
+ ```typescript
433
+ interface ITransferHistoryResponse {
434
+ statusCode: number;
435
+ message: string;
436
+ data: ITransferHistoryItem[];
437
+ meta: {
438
+ total: number;
439
+ page: number;
440
+ limit: number;
441
+ pages: number;
442
+ hasNextPage: boolean;
443
+ hasPreviousPage: boolean;
444
+ };
445
+ }
446
+
447
+ interface ITransferHistoryItem {
448
+ _id: string;
449
+ accountId: string;
450
+ subAccountId: string;
451
+ appId: string;
452
+ userId: string;
453
+ symbol: string;
454
+ from: string;
455
+ to: string;
456
+ type: "credit" | "debit";
457
+ description: string;
458
+ failureReason: string;
459
+ transactionHash?: string | null;
460
+ transactionSignature: string;
461
+ status?: string;
462
+ amount: string;
463
+ note?: string; // Optional note attached to the transfer
464
+ createdAt?: Date;
465
+ updatedAt?: Date;
466
+ }
467
+ ```
468
+
469
+ **Fee Response:**
470
+
471
+ ```typescript
472
+ interface ITransferFeeResponse {
473
+ statusCode: number;
474
+ message: string;
475
+ data: {
476
+ baseFee: string | number; // Base fee amount
477
+ networkFee?: string | number; // Network fee (for blockchain transfers)
478
+ totalFee: string | number; // Total fee to be paid
479
+ feeSymbol: string; // Currency symbol of the fee
480
+ networkCongestion?: "low" | "medium" | "high"; // Current network congestion level
481
+ };
482
+ }
483
+ ```
484
+
387
485
  ### Wallet Operations
388
486
 
389
487
  Get information about supported wallets:
@@ -396,7 +494,7 @@ console.log(`Supported wallets:`, wallets);
396
494
 
397
495
  ### Bank Transfers
398
496
 
399
- The SDK now supports bank transfer operations including getting bank lists, verifying accounts, and executing transfers:
497
+ The SDK supports bank transfer operations including getting bank lists, verifying accounts, and executing transfers:
400
498
 
401
499
  ```typescript
402
500
  // Get list of supported banks
@@ -417,7 +515,7 @@ if (verification.data.verified) {
417
515
  beneficiaryBankCode: "044",
418
516
  beneficiaryAccountNumber: "1234567890",
419
517
  beneficiaryAccountName: "John Doe",
420
- amount: 500, // Amount in Naira (NGN 500)
518
+ amount: 50000, // Amount in Naira (₦50,000)
421
519
  narration: "Payment for services",
422
520
  paymentReference: `ref_${Date.now()}`,
423
521
  saveBeneficiary: true,
@@ -499,53 +597,13 @@ const transfer = await client.bankTransfer.transfer({
499
597
  beneficiaryBankCode: "044",
500
598
  beneficiaryAccountNumber: "1234567890",
501
599
  beneficiaryAccountName: "John Doe",
502
- amount: 50000,
600
+ amount: 50000, // Amount in Nigerian Naira (NGN)
503
601
  narration: "Payment description",
504
602
  paymentReference: "unique_ref_123",
505
603
  saveBeneficiary: true,
506
604
  });
507
605
  ```
508
606
 
509
- ### OAuth 2.0 Authorization
510
-
511
- #### Get Authorization URL
512
-
513
- ```typescript
514
- const authUrl = await client.oauth.getAuthorizationUrl({
515
- client_id: "your_client_id",
516
- redirect_uri: "https://yourapp.com/callback",
517
- scope: "read_user_info read_app_info",
518
- state: "some_random_state",
519
- });
520
- ```
521
-
522
- #### Exchange Code for Access Token
523
-
524
- ```typescript
525
- const tokenResponse = await client.oauth.exchangeCodeForToken({
526
- grant_type: "authorization_code",
527
- code: "authorization_code",
528
- client_id: "your_client_id",
529
- client_secret: "your_client_secret",
530
- redirect_uri: "https://yourapp.com/callback",
531
- });
532
- const tokenData = tokenResponse.data;
533
- ```
534
-
535
- #### Get User Info
536
-
537
- ```typescript
538
- const userInfoResponse = await client.oauth.getUserInfo(tokenData.access_token);
539
- const userInfo = userInfoResponse.data;
540
- ```
541
-
542
- #### Get App Info
543
-
544
- ```typescript
545
- const appInfoResponse = await client.oauth.getAppInfo(tokenData.access_token);
546
- const appInfo = appInfoResponse.data;
547
- ```
548
-
549
607
  **Parameters:**
550
608
 
551
609
  ```typescript
@@ -553,7 +611,7 @@ interface IBankTransferData {
553
611
  beneficiaryBankCode: string; // Recipient's bank code
554
612
  beneficiaryAccountNumber: string; // Recipient's account number
555
613
  beneficiaryAccountName: string; // Recipient's account name
556
- amount: number; // Amount in Naira
614
+ amount: number; // Amount in Nigerian Naira (NGN)
557
615
  narration: string; // Transfer description
558
616
  paymentReference: string; // Unique payment reference
559
617
  saveBeneficiary: boolean; // Whether to save this beneficiary
@@ -581,20 +639,40 @@ interface IBankTransferResponse {
581
639
  }
582
640
  ```
583
641
 
584
- ### OAuth 2.0
642
+ ### OAuth 2.0 Authorization
643
+
644
+ The SDK provides comprehensive OAuth 2.0 methods for secure authorization:
645
+
646
+ #### Register an OAuth Application
647
+
648
+ ```typescript
649
+ // Register a new OAuth application
650
+ const app = await client.oauth.registerApp({
651
+ appName: "My Application",
652
+ appDescription: "Description of my app",
653
+ appLogo: "https://example.com/logo.png",
654
+ redirectUris: ["https://myapp.com/callback"],
655
+ allowedScopes: ["read_user_info", "read_app_info"],
656
+ });
657
+
658
+ console.log(`Client ID: ${app.clientId}`);
659
+ console.log(`Client Secret: ${app.clientSecret}`);
660
+ ```
585
661
 
586
- The SDK provides methods for OAuth 2.0 authorization:
662
+ #### Get Authorization URL
587
663
 
588
664
  ```typescript
589
- // Get authorization URL
590
665
  const authUrl = await client.oauth.getAuthorizationUrl({
591
666
  client_id: "your_client_id",
592
667
  redirect_uri: "https://yourapp.com/callback",
593
668
  scope: "read_user_info read_app_info",
594
669
  state: "some_random_state",
595
670
  });
671
+ ```
672
+
673
+ #### Exchange Code for Access Token
596
674
 
597
- // Exchange code for access token
675
+ ```typescript
598
676
  const tokenResponse = await client.oauth.exchangeCodeForToken({
599
677
  grant_type: "authorization_code",
600
678
  code: "authorization_code",
@@ -602,20 +680,71 @@ const tokenResponse = await client.oauth.exchangeCodeForToken({
602
680
  client_secret: "your_client_secret",
603
681
  redirect_uri: "https://yourapp.com/callback",
604
682
  });
683
+ const tokenData = tokenResponse.data;
684
+ ```
605
685
 
606
- // Get user info
607
- const userInfoResponse = await client.oauth.getUserInfo(
608
- tokenResponse.data.access_token
609
- );
686
+ #### Get User Info
687
+
688
+ ```typescript
689
+ const userInfoResponse = await client.oauth.getUserInfo(tokenData.access_token);
610
690
  const userInfo = userInfoResponse.data;
691
+ ```
611
692
 
612
- // Get app info
613
- const appInfoResponse = await client.oauth.getAppInfo(
614
- tokenResponse.data.access_token
615
- );
693
+ #### Get App Info
694
+
695
+ ```typescript
696
+ const appInfoResponse = await client.oauth.getAppInfo(tokenData.access_token);
616
697
  const appInfo = appInfoResponse.data;
617
698
  ```
618
699
 
700
+ #### Revoke Token
701
+
702
+ ```typescript
703
+ await client.oauth.revokeToken(tokenData.access_token);
704
+ console.log("Token revoked successfully");
705
+ ```
706
+
707
+ **OAuth Types:**
708
+
709
+ ```typescript
710
+ interface IOAuthApp {
711
+ clientId: string;
712
+ clientSecret: string;
713
+ appName: string;
714
+ redirectUris: string[];
715
+ allowedScopes: string[];
716
+ }
717
+
718
+ interface ITokenData {
719
+ access_token: string;
720
+ token_type: string;
721
+ expires_in: number;
722
+ scope: string;
723
+ }
724
+
725
+ interface IUserInfo {
726
+ id: string;
727
+ first_name: string;
728
+ last_name: string;
729
+ username: string;
730
+ country: string;
731
+ avatar: string;
732
+ email: string;
733
+ isEmailVerified: boolean;
734
+ phone: string;
735
+ verified: boolean;
736
+ }
737
+
738
+ interface IAppInfo {
739
+ id: string;
740
+ app_name: string;
741
+ business_name: string;
742
+ country: string;
743
+ status: string;
744
+ support_email: string;
745
+ }
746
+ ```
747
+
619
748
  ### Generic API Requests
620
749
 
621
750
  The SDK provides a generic `request` method for making any API call to the 100Pay API:
@@ -624,17 +753,20 @@ The SDK provides a generic `request` method for making any API call to the 100Pa
624
753
  const response = await client.request<ResponseType>(
625
754
  method, // 'GET', 'POST', 'PUT', or 'DELETE'
626
755
  endpoint, // API endpoint path
627
- data // Request payload
756
+ data, // Request payload or query parameters
757
+ customHeaders // Optional: custom headers (e.g., Authorization)
628
758
  );
629
759
  ```
630
760
 
631
761
  **Example:**
632
762
 
633
763
  ```typescript
634
- // Get user app balance
764
+ // Get user app balance with custom headers
635
765
  const balance = await client.request<BalanceResponse>(
636
766
  "GET",
637
- "/api/v1/user-apps/:appId/wallet-balance/:symbol"
767
+ "/api/v1/user-apps/:appId/wallet-balance/:symbol",
768
+ {},
769
+ { Authorization: `Bearer ${accessToken}` }
638
770
  );
639
771
  ```
640
772
 
@@ -688,6 +820,7 @@ import {
688
820
  ITransferAssetResponse,
689
821
  ITransferHistoryParams,
690
822
  ITransferHistoryResponse,
823
+ ITransferHistoryItem,
691
824
  ITransferFeeParams,
692
825
  ITransferFeeResponse,
693
826
  ISupportedWalletResponse,
@@ -792,7 +925,7 @@ async function performBankTransfer() {
792
925
  beneficiaryBankCode: targetBank.bankCode!,
793
926
  beneficiaryAccountNumber: "1234567890",
794
927
  beneficiaryAccountName: verification.data.accountName,
795
- amount: 500, // NGN 500 in Naira
928
+ amount: 50000, // ₦50,000 in Nigerian Naira
796
929
  narration: "Payment for services rendered",
797
930
  paymentReference: `PAY_${Date.now()}`,
798
931
  saveBeneficiary: true,
@@ -813,35 +946,48 @@ async function performBankTransfer() {
813
946
  // Complete OAuth 2.0 workflow
814
947
  async function performOAuth() {
815
948
  try {
816
- // 1. Get authorization URL
949
+ // 1. Register OAuth application (one-time setup)
950
+ const app = await client.oauth.registerApp({
951
+ appName: "My Application",
952
+ appDescription: "My app description",
953
+ appLogo: "https://example.com/logo.png",
954
+ redirectUris: ["https://myapp.com/callback"],
955
+ allowedScopes: ["read_user_info", "read_app_info"],
956
+ });
957
+
958
+ // 2. Get authorization URL
817
959
  const authUrl = await client.oauth.getAuthorizationUrl({
818
- client_id: "your_client_id",
819
- redirect_uri: "https://yourapp.com/callback",
960
+ client_id: app.clientId,
961
+ redirect_uri: "https://myapp.com/callback",
820
962
  scope: "read_user_info read_app_info",
821
963
  state: "some_random_state",
822
964
  });
823
965
  console.log(`Authorization URL: ${authUrl}`);
824
966
 
825
- // 2. Exchange code for access token
967
+ // 3. Exchange code for access token (after user authorizes)
826
968
  const tokenResponse = await client.oauth.exchangeCodeForToken({
827
969
  grant_type: "authorization_code",
828
- code: "authorization_code",
829
- client_id: "your_client_id",
830
- client_secret: "your_client_secret",
831
- redirect_uri: "https://yourapp.com/callback",
970
+ code: "authorization_code_from_callback",
971
+ client_id: app.clientId,
972
+ client_secret: app.clientSecret,
973
+ redirect_uri: "https://myapp.com/callback",
832
974
  });
833
975
 
834
- // 3. Get user info
976
+ // 4. Get user info
835
977
  const userInfoResponse = await client.oauth.getUserInfo(
836
978
  tokenResponse.data.access_token
837
979
  );
838
980
  console.log(`User info:`, userInfoResponse.data);
839
981
 
840
- // 4. Get app info
982
+ // 5. Get app info
841
983
  const appInfoResponse = await client.oauth.getAppInfo(
842
984
  tokenResponse.data.access_token
843
985
  );
844
986
  console.log(`App info:`, appInfoResponse.data);
987
+
988
+ // 6. Revoke token when done
989
+ await client.oauth.revokeToken(tokenResponse.data.access_token);
990
+ console.log("Token revoked successfully");
845
991
  } catch (error) {
846
992
  console.error(`OAuth workflow failed: ${error.message}`);
847
993
  throw error;
@@ -883,13 +1029,15 @@ interface BankTransferWebhook {
883
1029
  }
884
1030
  ```
885
1031
 
886
- **Webhook Event Types:**
1032
+ **Common Webhook Event Types:**
887
1033
 
888
1034
  - `bank_transfer.debit` - Outgoing bank transfer initiated
889
1035
  - `bank_transfer.credit` - Incoming bank transfer received
890
1036
  - `wallet.deposit` - Wallet deposit received
891
1037
  - `wallet.deposit.internal` - Internal wallet deposit received
892
1038
 
1039
+ > **Note:** Refer to the [100Pay API documentation](https://documenter.getpostman.com/view/13045730/2s93RMUatE) for a complete list of webhook events and their payloads.
1040
+
893
1041
  Always verify webhook signatures and use the SDK's `verify()` method to confirm transaction details.
894
1042
 
895
1043
  ## Resources
package/dist/index.cjs CHANGED
@@ -34,7 +34,6 @@ __export(index_exports, {
34
34
  PaymentVerificationError: () => PaymentVerificationError
35
35
  });
36
36
  module.exports = __toCommonJS(index_exports);
37
- var import_axios = __toESM(require("axios"), 1);
38
37
  var crypto = __toESM(require("crypto"), 1);
39
38
  var import_logger = require("@untools/logger");
40
39
  var BASE_URL = process.env.BASE_URL || "https://api.100pay.co";
@@ -62,47 +61,43 @@ var Pay100 = class {
62
61
  this.verify = async (transactionId) => {
63
62
  try {
64
63
  const payload = { transactionId };
65
- const response = await (0, import_axios.default)({
66
- method: "POST",
67
- url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,
68
- headers: this.getHeaders(payload),
69
- data: payload
70
- });
71
- if (!response.data) {
64
+ const response = await fetch(
65
+ `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,
66
+ {
67
+ method: "POST",
68
+ headers: this.getHeaders(payload),
69
+ body: JSON.stringify(payload)
70
+ }
71
+ );
72
+ const responseData = await response.json().catch(() => null);
73
+ if (!responseData) {
72
74
  return {
73
75
  status: "error",
74
76
  data: null,
75
77
  message: "Something went wrong, be sure you supplied a valid payment id."
76
78
  };
77
79
  }
78
- if (typeof response.data === "string") {
79
- if (response.data === "Access Denied, Invalid KEY supplied") {
80
+ if (typeof responseData === "string") {
81
+ if (responseData === "Access Denied, Invalid KEY supplied") {
80
82
  return {
81
83
  status: "error",
82
84
  data: null,
83
85
  message: "Access Denied, Invalid KEY supplied"
84
86
  };
85
87
  }
86
- if (response.data === "invalid payment id supplied") {
88
+ if (responseData === "invalid payment id supplied") {
87
89
  return {
88
90
  status: "error",
89
91
  data: null
90
92
  };
91
93
  }
92
94
  }
93
- const responseData = response.data;
94
95
  const transactionData = responseData && typeof responseData === "object" ? responseData : null;
95
96
  return {
96
97
  status: "success",
97
98
  data: transactionData
98
99
  };
99
100
  } catch (error) {
100
- if (import_axios.default.isAxiosError(error)) {
101
- const axiosError = error;
102
- throw new PaymentVerificationError(
103
- axiosError.message || "Something went wrong, be sure you supplied a valid payment id."
104
- );
105
- }
106
101
  throw new PaymentVerificationError(
107
102
  error instanceof Error ? error.message : "An unknown error occurred"
108
103
  );
@@ -391,30 +386,36 @@ var Pay100 = class {
391
386
  */
392
387
  async request(method, endpoint, data = {}, customHeaders = {}) {
393
388
  try {
394
- const url = `${this.baseUrl}${endpoint}`;
389
+ const url = method === "GET" && Object.keys(data).length > 0 ? `${this.baseUrl}${endpoint}?${new URLSearchParams(
390
+ data
391
+ )}` : `${this.baseUrl}${endpoint}`;
395
392
  const headers = this.getHeaders(data);
396
- const response = await (0, import_axios.default)({
393
+ const options = {
397
394
  method,
398
- url,
399
395
  headers: { ...headers, ...customHeaders },
400
- data: method !== "GET" ? data : void 0,
401
- params: method === "GET" ? data : void 0
402
- });
403
- if (response.data && typeof response.data === "object" && "success" in response.data) {
404
- if (response.data.success === false) {
405
- const errorMessage = this.extractErrorMessage(response.data);
396
+ body: method !== "GET" ? JSON.stringify(data) : void 0
397
+ };
398
+ import_logger.logger?.debug(`Request to ${url}`, { options });
399
+ const response = await fetch(url, options);
400
+ if (!response.ok) {
401
+ const errorData = await response.json().catch(() => ({}));
402
+ import_logger.logger.error(errorData);
403
+ const errorMessage = this.extractErrorMessage(errorData);
404
+ throw new Error(`API Request Failed: ${errorMessage}`);
405
+ }
406
+ const responseData = await response.json();
407
+ if (responseData && typeof responseData === "object" && "success" in responseData) {
408
+ if (responseData.success === false) {
409
+ const errorMessage = this.extractErrorMessage(responseData);
406
410
  throw new Error(`API Request Failed: ${errorMessage}`);
407
411
  }
408
412
  }
409
- return response.data;
413
+ return responseData;
410
414
  } catch (error) {
411
- if (import_axios.default.isAxiosError(error)) {
412
- const axiosError = error;
413
- import_logger.logger.error(axiosError?.response);
414
- const errorMessage = axiosError.response?.data ? this.extractErrorMessage(axiosError.response.data) : axiosError.message;
415
- throw new Error(`API Request Failed: ${errorMessage}`);
415
+ if (error instanceof Error) {
416
+ throw error;
416
417
  }
417
- throw error;
418
+ throw new Error(`API Request Failed: ${String(error)}`);
418
419
  }
419
420
  }
420
421
  /**
@@ -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 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/**\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 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 const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers: { ...headers, ...customHeaders },\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 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\";\nexport * from \"./types/oauth\";\n"],"mappings":"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","names":["axios"]}
1
+ {"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":[]}
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  // src/index.ts
2
- import axios from "axios";
3
2
  import * as crypto from "crypto";
4
3
  import { logger } from "@untools/logger";
5
4
  var BASE_URL = process.env.BASE_URL || "https://api.100pay.co";
@@ -27,47 +26,43 @@ var Pay100 = class {
27
26
  this.verify = async (transactionId) => {
28
27
  try {
29
28
  const payload = { transactionId };
30
- const response = await axios({
31
- method: "POST",
32
- url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,
33
- headers: this.getHeaders(payload),
34
- data: payload
35
- });
36
- if (!response.data) {
29
+ const response = await fetch(
30
+ `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,
31
+ {
32
+ method: "POST",
33
+ headers: this.getHeaders(payload),
34
+ body: JSON.stringify(payload)
35
+ }
36
+ );
37
+ const responseData = await response.json().catch(() => null);
38
+ if (!responseData) {
37
39
  return {
38
40
  status: "error",
39
41
  data: null,
40
42
  message: "Something went wrong, be sure you supplied a valid payment id."
41
43
  };
42
44
  }
43
- if (typeof response.data === "string") {
44
- if (response.data === "Access Denied, Invalid KEY supplied") {
45
+ if (typeof responseData === "string") {
46
+ if (responseData === "Access Denied, Invalid KEY supplied") {
45
47
  return {
46
48
  status: "error",
47
49
  data: null,
48
50
  message: "Access Denied, Invalid KEY supplied"
49
51
  };
50
52
  }
51
- if (response.data === "invalid payment id supplied") {
53
+ if (responseData === "invalid payment id supplied") {
52
54
  return {
53
55
  status: "error",
54
56
  data: null
55
57
  };
56
58
  }
57
59
  }
58
- const responseData = response.data;
59
60
  const transactionData = responseData && typeof responseData === "object" ? responseData : null;
60
61
  return {
61
62
  status: "success",
62
63
  data: transactionData
63
64
  };
64
65
  } catch (error) {
65
- if (axios.isAxiosError(error)) {
66
- const axiosError = error;
67
- throw new PaymentVerificationError(
68
- axiosError.message || "Something went wrong, be sure you supplied a valid payment id."
69
- );
70
- }
71
66
  throw new PaymentVerificationError(
72
67
  error instanceof Error ? error.message : "An unknown error occurred"
73
68
  );
@@ -356,30 +351,36 @@ var Pay100 = class {
356
351
  */
357
352
  async request(method, endpoint, data = {}, customHeaders = {}) {
358
353
  try {
359
- const url = `${this.baseUrl}${endpoint}`;
354
+ const url = method === "GET" && Object.keys(data).length > 0 ? `${this.baseUrl}${endpoint}?${new URLSearchParams(
355
+ data
356
+ )}` : `${this.baseUrl}${endpoint}`;
360
357
  const headers = this.getHeaders(data);
361
- const response = await axios({
358
+ const options = {
362
359
  method,
363
- url,
364
360
  headers: { ...headers, ...customHeaders },
365
- data: method !== "GET" ? data : void 0,
366
- params: method === "GET" ? data : void 0
367
- });
368
- if (response.data && typeof response.data === "object" && "success" in response.data) {
369
- if (response.data.success === false) {
370
- const errorMessage = this.extractErrorMessage(response.data);
361
+ body: method !== "GET" ? JSON.stringify(data) : void 0
362
+ };
363
+ logger?.debug(`Request to ${url}`, { options });
364
+ const response = await fetch(url, options);
365
+ if (!response.ok) {
366
+ const errorData = await response.json().catch(() => ({}));
367
+ logger.error(errorData);
368
+ const errorMessage = this.extractErrorMessage(errorData);
369
+ throw new Error(`API Request Failed: ${errorMessage}`);
370
+ }
371
+ const responseData = await response.json();
372
+ if (responseData && typeof responseData === "object" && "success" in responseData) {
373
+ if (responseData.success === false) {
374
+ const errorMessage = this.extractErrorMessage(responseData);
371
375
  throw new Error(`API Request Failed: ${errorMessage}`);
372
376
  }
373
377
  }
374
- return response.data;
378
+ return responseData;
375
379
  } catch (error) {
376
- if (axios.isAxiosError(error)) {
377
- const axiosError = error;
378
- logger.error(axiosError?.response);
379
- const errorMessage = axiosError.response?.data ? this.extractErrorMessage(axiosError.response.data) : axiosError.message;
380
- throw new Error(`API Request Failed: ${errorMessage}`);
380
+ if (error instanceof Error) {
381
+ throw error;
381
382
  }
382
- throw error;
383
+ throw new Error(`API Request Failed: ${String(error)}`);
383
384
  }
384
385
  }
385
386
  /**
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 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/**\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 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 const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers: { ...headers, ...customHeaders },\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 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\";\nexport * from \"./types/oauth\";\n"],"mappings":"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","names":[]}
1
+ {"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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@100pay-hq/100pay.js",
3
- "version": "1.4.17",
3
+ "version": "1.5.1",
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",
@@ -29,14 +29,15 @@
29
29
  "dev": "nodemon",
30
30
  "build": "tsup",
31
31
  "build:clean": "rm -rf dist && tsup",
32
- "test": "jest",
33
- "test:watch": "jest --watch",
34
- "test:coverage": "jest --coverage",
35
32
  "type-check": "tsc --noEmit",
36
33
  "lint": "eslint . --ext .ts",
37
34
  "lint:fix": "eslint . --ext .ts --fix",
38
- "verify": "npm run lint && npm run test && npm run build",
39
- "prepare": "npm run verify"
35
+ "verify": "npm run lint && npm run build",
36
+ "prepare": "npm run build",
37
+ "release": "standard-version",
38
+ "release:minor": "standard-version --release-as minor",
39
+ "release:major": "standard-version --release-as major",
40
+ "release:patch": "standard-version --release-as patch"
40
41
  },
41
42
  "repository": {
42
43
  "type": "git",
@@ -59,20 +60,17 @@
59
60
  "homepage": "https://github.com/shop100global/100pay.js#readme",
60
61
  "devDependencies": {
61
62
  "@eslint/js": "^9.23.0",
62
- "@types/jest": "^29.5.14",
63
63
  "@types/node": "^22.13.14",
64
64
  "@typescript-eslint/eslint-plugin": "^8.28.0",
65
65
  "@typescript-eslint/parser": "^8.28.0",
66
66
  "eslint": "^9.23.0",
67
67
  "globals": "^16.0.0",
68
- "jest": "^29.7.0",
69
68
  "nodemon": "^3.1.10",
70
- "ts-jest": "^29.3.0",
69
+ "standard-version": "^9.5.0",
71
70
  "tsup": "^8.4.0",
72
71
  "typescript": "^5.8.2"
73
72
  },
74
73
  "dependencies": {
75
- "@untools/logger": "^0.0.6",
76
- "axios": "^1.8.4"
74
+ "@untools/logger": "^0.0.6"
77
75
  }
78
76
  }