@chipi-stack/backend 11.5.0 → 11.7.0

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/dist/index.mjs CHANGED
@@ -1,7 +1,8 @@
1
- import { isValidApiKey, ChipiAuthError, STARKNET_NETWORKS, validateErrorResponse, ChipiApiError, handleApiError, API_ENDPOINTS, ChipiTransactionError, formatAmount, CONTRACT_ADDRESSES } from '@chipi-stack/shared';
1
+ import { isValidApiKey, ChipiAuthError, STARKNET_NETWORKS, validateErrorResponse, ChipiApiError, handleApiError, API_ENDPOINTS, ChipiTransactionError, formatAmount, getUsdAmount, SKU_CONTRACTS, CARRIER_IDS, SERVICE_TYPES, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES } from '@chipi-stack/shared';
2
2
  import CryptoES from 'crypto-es';
3
- import { RpcProvider, stark, ec, CairoCustomEnum, CairoOption, CairoOptionVariant, CallData, hash, Account, num } from 'starknet';
3
+ import { RpcProvider, stark, ec, CairoCustomEnum, CairoOption, CairoOptionVariant, CallData, hash, Account, num, cairo } from 'starknet';
4
4
  import { STARKNET_CONTRACTS } from '@chipi-stack/types';
5
+ import { createHash, randomUUID } from 'crypto';
5
6
 
6
7
  // src/chipi-sdk.ts
7
8
  var ChipiClient = class {
@@ -291,9 +292,14 @@ var ChipiWallets = class {
291
292
  return getBalanceResponse;
292
293
  }
293
294
  };
294
- var executePaymasterTransaction = async (params) => {
295
+ var executePaymasterTransaction = async ({
296
+ params,
297
+ bearerToken,
298
+ apiPublicKey,
299
+ backendUrl
300
+ }) => {
295
301
  try {
296
- const { encryptKey, wallet, calls, apiPublicKey, bearerToken, backendUrl } = params;
302
+ const { encryptKey, wallet, calls } = params;
297
303
  const privateKeyDecrypted = decryptPrivateKey(
298
304
  wallet.encryptedPrivateKey,
299
305
  encryptKey
@@ -374,9 +380,13 @@ var ChipiTransactions = class {
374
380
  /**
375
381
  * Execute a gasless transaction using paymaster
376
382
  */
377
- async executeTransaction(params) {
383
+ async executeTransaction({
384
+ params,
385
+ bearerToken
386
+ }) {
378
387
  return executePaymasterTransaction({
379
- ...params,
388
+ params,
389
+ bearerToken,
380
390
  backendUrl: this.client.baseUrl,
381
391
  apiPublicKey: this.client.getApiPublicKey()
382
392
  });
@@ -401,16 +411,18 @@ var ChipiTransactions = class {
401
411
  }
402
412
  const formattedAmount = formatAmount(amount, decimals);
403
413
  return this.executeTransaction({
404
- encryptKey,
405
- wallet,
406
- bearerToken,
407
- calls: [
408
- {
409
- contractAddress,
410
- entrypoint: "transfer",
411
- calldata: [recipient, formattedAmount, "0x0"]
412
- }
413
- ]
414
+ params: {
415
+ encryptKey,
416
+ wallet,
417
+ calls: [
418
+ {
419
+ contractAddress,
420
+ entrypoint: "transfer",
421
+ calldata: [recipient, formattedAmount, "0x0"]
422
+ }
423
+ ]
424
+ },
425
+ bearerToken
414
426
  });
415
427
  }
416
428
  /**
@@ -419,27 +431,36 @@ var ChipiTransactions = class {
419
431
  async approve(params) {
420
432
  const formattedAmount = formatAmount(params.amount, params.decimals);
421
433
  return this.executeTransaction({
422
- encryptKey: params.encryptKey,
423
- wallet: params.wallet,
424
- bearerToken: params.bearerToken,
425
- calls: [
426
- {
427
- contractAddress: params.contractAddress,
428
- entrypoint: "approve",
429
- calldata: [params.spender, formattedAmount, "0x0"]
430
- }
431
- ]
434
+ params: {
435
+ encryptKey: params.encryptKey,
436
+ wallet: params.wallet,
437
+ calls: [
438
+ {
439
+ contractAddress: params.contractAddress,
440
+ entrypoint: "approve",
441
+ calldata: [params.spender, formattedAmount, "0x0"]
442
+ }
443
+ ]
444
+ },
445
+ bearerToken: params.bearerToken
432
446
  });
433
447
  }
434
448
  /**
435
449
  * Call any contract method
436
450
  */
437
- async callAnyContract(params) {
451
+ // {
452
+ // encryptKey: string;
453
+ // wallet: any;
454
+ // calls: any[];
455
+ // bearerToken: string;
456
+ // }
457
+ async callAnyContract({
458
+ params,
459
+ bearerToken
460
+ }) {
438
461
  return this.executeTransaction({
439
- encryptKey: params.encryptKey,
440
- wallet: params.wallet,
441
- bearerToken: params.bearerToken,
442
- calls: params.calls
462
+ params,
463
+ bearerToken
443
464
  });
444
465
  }
445
466
  /**
@@ -457,12 +478,119 @@ var ChipiTransactions = class {
457
478
  return response;
458
479
  }
459
480
  };
460
-
461
- // src/skus.ts
481
+ var ChipiSkuTransactions = class {
482
+ constructor(client) {
483
+ this.client = client;
484
+ this.transactions = new ChipiTransactions(client);
485
+ }
486
+ /**
487
+ * Creates a SKU transaction with gasless execution
488
+ * @param params - Transaction parameters including amount, SKU ID, wallet, etc.
489
+ * @param bearerToken - Authentication token for API calls
490
+ * @returns Promise<SkuTransaction> - The created transaction record
491
+ */
492
+ async createSkuTransaction(params, bearerToken) {
493
+ const { mxnAmount, skuId, wallet, reference, externalUserId } = params;
494
+ this.client.baseUrl;
495
+ const usdAmount = await getUsdAmount(mxnAmount, bearerToken, this.client);
496
+ const tokenAddress = STARKNET_CONTRACTS.USDC.contractAddress;
497
+ if (usdAmount <= 0) {
498
+ throw new Error(`Invalid USD amount: ${usdAmount}. Amount must be positive.`);
499
+ }
500
+ const minUsdAmount = Math.max(usdAmount, 1e-6);
501
+ const parsedAmount = formatAmount(minUsdAmount.toString(), STARKNET_CONTRACTS.USDC.decimals);
502
+ const calls = [
503
+ {
504
+ contractAddress: tokenAddress,
505
+ entrypoint: "approve",
506
+ calldata: CallData.compile({
507
+ spender: SKU_CONTRACTS.RECHARGER_WITH_STRK_MAINNET,
508
+ amount: cairo.uint256(parsedAmount)
509
+ })
510
+ },
511
+ {
512
+ contractAddress: SKU_CONTRACTS.RECHARGER_WITH_STRK_MAINNET,
513
+ entrypoint: "newRecharge",
514
+ calldata: CallData.compile({
515
+ token_address: tokenAddress,
516
+ amount: cairo.uint256(parsedAmount),
517
+ rechargeId: createHash("sha256").update(randomUUID()).digest("hex").slice(0, 20),
518
+ productId: skuId,
519
+ carrierId: CARRIER_IDS.CHIPI_PAY
520
+ })
521
+ },
522
+ {
523
+ contractAddress: SKU_CONTRACTS.CHIPI_BILL_SERVICE,
524
+ entrypoint: "mint_item",
525
+ calldata: CallData.compile({
526
+ recipient: wallet.publicKey,
527
+ metadata: {
528
+ service_type: SERVICE_TYPES.BUY_SERVICE,
529
+ timestamp: Date.now(),
530
+ chipi_user_id: hash.starknetKeccak(externalUserId || "0x0").toString(),
531
+ kyc: true,
532
+ amount: cairo.uint256(parsedAmount)
533
+ }
534
+ })
535
+ }
536
+ ];
537
+ const transactionHash = await this.transactions.executeTransaction({
538
+ params: {
539
+ encryptKey: params.encryptKey,
540
+ wallet,
541
+ calls
542
+ },
543
+ bearerToken
544
+ });
545
+ const input = {
546
+ walletAddress: wallet.publicKey,
547
+ skuId,
548
+ chain: CHAIN_TYPES.STARKNET,
549
+ chainToken: CHAIN_TOKEN_TYPES.USDC,
550
+ mxnAmount,
551
+ reference,
552
+ transactionHash,
553
+ usdAmount: minUsdAmount
554
+ };
555
+ const response = await this.client.post({
556
+ endpoint: `${API_ENDPOINTS.SKU_TRANSACTIONS}`,
557
+ bearerToken,
558
+ body: input
559
+ });
560
+ return response;
561
+ }
562
+ /**
563
+ * Get a SKU transaction by transaction id
564
+ * @param id - The SKU transaction id
565
+ * @param bearerToken - Authentication token for API calls
566
+ * @returns Promise<SkuTransaction> - Single SKU transaction
567
+ */
568
+ async getSkuTransactionById(id, bearerToken) {
569
+ const response = await this.client.get({
570
+ endpoint: `${API_ENDPOINTS.SKU_TRANSACTIONS}/${id}`,
571
+ bearerToken
572
+ });
573
+ return response;
574
+ }
575
+ };
462
576
  var ChipiSkus = class {
463
577
  constructor(client) {
464
578
  this.client = client;
465
579
  }
580
+ /**
581
+ * Get available SKUs for purchase with pagination
582
+ * @param bearerToken - Authentication token for API calls
583
+ * @param query - Pagination query parameters
584
+ * @returns Promise<PaginatedResponse<Sku>> - Paginated list of available SKUs
585
+ */
586
+ async getSkus(bearerToken, query) {
587
+ const response = await this.client.get({
588
+ endpoint: `${API_ENDPOINTS.SKUS}/available`,
589
+ params: query,
590
+ bearerToken
591
+ });
592
+ return response;
593
+ }
466
594
  };
467
595
 
468
596
  // src/chipi-sdk.ts
@@ -470,8 +598,10 @@ var ChipiSDK = class {
470
598
  constructor(config) {
471
599
  this.client = new ChipiClient(config);
472
600
  this.nodeUrl = config.nodeUrl || STARKNET_NETWORKS.MAINNET;
601
+ this.apiSecretKey = config.apiSecretKey;
473
602
  this.wallets = new ChipiWallets(this.client);
474
603
  this.transactions = new ChipiTransactions(this.client);
604
+ this.skuTransactions = new ChipiSkuTransactions(this.client);
475
605
  this.skus = new ChipiSkus(this.client);
476
606
  this.executeTransaction = this.executeTransaction.bind(this);
477
607
  this.transfer = this.transfer.bind(this);
@@ -481,12 +611,31 @@ var ChipiSDK = class {
481
611
  this.callAnyContract = this.callAnyContract.bind(this);
482
612
  this.createWallet = this.createWallet.bind(this);
483
613
  this.recordSendTransaction = this.recordSendTransaction.bind(this);
614
+ this.createSkuTransaction = this.createSkuTransaction.bind(this);
615
+ }
616
+ /**
617
+ * Resolve bearer token - uses provided token or falls back to apiSecretKey
618
+ */
619
+ resolveBearerToken(bearerToken) {
620
+ const token = bearerToken ?? this.apiSecretKey;
621
+ if (!token) {
622
+ throw new Error(
623
+ "Authentication required: either pass a bearerToken or configure the SDK with an apiSecretKey"
624
+ );
625
+ }
626
+ return token;
484
627
  }
485
628
  /**
486
629
  * Execute a gasless transaction
487
630
  */
488
- async executeTransaction(params) {
489
- return this.transactions.executeTransaction(params);
631
+ async executeTransaction({
632
+ params,
633
+ bearerToken
634
+ }) {
635
+ return this.transactions.executeTransaction({
636
+ params,
637
+ bearerToken: this.resolveBearerToken(bearerToken)
638
+ });
490
639
  }
491
640
  /**
492
641
  * Transfer tokens
@@ -497,28 +646,30 @@ var ChipiSDK = class {
497
646
  }) {
498
647
  return this.transactions.transfer({
499
648
  params,
500
- bearerToken
649
+ bearerToken: this.resolveBearerToken(bearerToken)
501
650
  });
502
651
  }
503
652
  /**
504
- * Approve token spending
505
- */
653
+ * Approve token spending
654
+ */
506
655
  async approve({
507
656
  params,
508
657
  bearerToken
509
658
  }) {
510
659
  const { encryptKey, wallet, contractAddress, spender, amount, decimals } = params;
511
660
  return this.executeTransaction({
512
- encryptKey,
513
- wallet,
514
- bearerToken,
515
- calls: [
516
- {
517
- contractAddress,
518
- entrypoint: "approve",
519
- calldata: [spender, formatAmount(amount, decimals), "0x0"]
520
- }
521
- ]
661
+ params: {
662
+ encryptKey,
663
+ wallet,
664
+ calls: [
665
+ {
666
+ contractAddress,
667
+ entrypoint: "approve",
668
+ calldata: [spender, formatAmount(amount, decimals), "0x0"]
669
+ }
670
+ ]
671
+ },
672
+ bearerToken: this.resolveBearerToken(bearerToken)
522
673
  });
523
674
  }
524
675
  /**
@@ -531,25 +682,27 @@ var ChipiSDK = class {
531
682
  const { encryptKey, wallet, amount, receiverWallet } = params;
532
683
  const formattedAmount = formatAmount(amount, 6);
533
684
  return this.executeTransaction({
534
- encryptKey,
535
- wallet,
536
- bearerToken,
537
- calls: [
538
- {
539
- contractAddress: CONTRACT_ADDRESSES.USDC_MAINNET,
540
- entrypoint: "approve",
541
- calldata: [
542
- CONTRACT_ADDRESSES.VESU_USDC_MAINNET,
543
- formattedAmount,
544
- "0x0"
545
- ]
546
- },
547
- {
548
- contractAddress: CONTRACT_ADDRESSES.VESU_USDC_MAINNET,
549
- entrypoint: "deposit",
550
- calldata: [formattedAmount, "0x0", receiverWallet]
551
- }
552
- ]
685
+ params: {
686
+ encryptKey,
687
+ wallet,
688
+ calls: [
689
+ {
690
+ contractAddress: CONTRACT_ADDRESSES.USDC_MAINNET,
691
+ entrypoint: "approve",
692
+ calldata: [
693
+ CONTRACT_ADDRESSES.VESU_USDC_MAINNET,
694
+ formattedAmount,
695
+ "0x0"
696
+ ]
697
+ },
698
+ {
699
+ contractAddress: CONTRACT_ADDRESSES.VESU_USDC_MAINNET,
700
+ entrypoint: "deposit",
701
+ calldata: [formattedAmount, "0x0", receiverWallet]
702
+ }
703
+ ]
704
+ },
705
+ bearerToken: this.resolveBearerToken(bearerToken)
553
706
  });
554
707
  }
555
708
  /**
@@ -562,16 +715,18 @@ var ChipiSDK = class {
562
715
  const { encryptKey, wallet, amount, recipient } = params;
563
716
  const formattedAmount = formatAmount(amount, 6);
564
717
  return this.executeTransaction({
565
- encryptKey,
566
- wallet,
567
- bearerToken,
568
- calls: [
569
- {
570
- contractAddress: CONTRACT_ADDRESSES.VESU_USDC_MAINNET,
571
- entrypoint: "withdraw",
572
- calldata: [formattedAmount, recipient, "0x0"]
573
- }
574
- ]
718
+ params: {
719
+ encryptKey,
720
+ wallet,
721
+ calls: [
722
+ {
723
+ contractAddress: CONTRACT_ADDRESSES.VESU_USDC_MAINNET,
724
+ entrypoint: "withdraw",
725
+ calldata: [formattedAmount, recipient, "0x0"]
726
+ }
727
+ ]
728
+ },
729
+ bearerToken: this.resolveBearerToken(bearerToken)
575
730
  });
576
731
  }
577
732
  /**
@@ -583,10 +738,12 @@ var ChipiSDK = class {
583
738
  }) {
584
739
  const { encryptKey, wallet, calls } = params;
585
740
  return this.executeTransaction({
586
- encryptKey,
587
- wallet,
588
- bearerToken,
589
- calls
741
+ params: {
742
+ encryptKey,
743
+ wallet,
744
+ calls
745
+ },
746
+ bearerToken: this.resolveBearerToken(bearerToken)
590
747
  });
591
748
  }
592
749
  /**
@@ -598,7 +755,7 @@ var ChipiSDK = class {
598
755
  }) {
599
756
  return this.wallets.createWallet({
600
757
  ...params,
601
- bearerToken
758
+ bearerToken: this.resolveBearerToken(bearerToken)
602
759
  });
603
760
  }
604
761
  async recordSendTransaction({
@@ -607,20 +764,52 @@ var ChipiSDK = class {
607
764
  }) {
608
765
  return this.transactions.recordSendTransaction({
609
766
  params,
610
- bearerToken
767
+ bearerToken: this.resolveBearerToken(bearerToken)
611
768
  });
612
769
  }
613
770
  async getWallet(params, bearerToken) {
614
- return this.wallets.getWallet(params, bearerToken);
771
+ return this.wallets.getWallet(params, this.resolveBearerToken(bearerToken));
615
772
  }
616
773
  async getTokenBalance(params, bearerToken) {
617
774
  return this.wallets.getTokenBalance({
618
775
  params,
619
- bearerToken
776
+ bearerToken: this.resolveBearerToken(bearerToken)
620
777
  });
621
778
  }
779
+ /**
780
+ * Create a SKU transaction
781
+ */
782
+ async createSkuTransaction({
783
+ params,
784
+ bearerToken
785
+ }) {
786
+ return this.skuTransactions.createSkuTransaction(params, bearerToken);
787
+ }
788
+ };
789
+
790
+ // src/chipi-server-sdk.ts
791
+ var ChipiServerSDK = class extends ChipiSDK {
792
+ constructor(config) {
793
+ if (!config.apiSecretKey) {
794
+ throw new Error(
795
+ "apiSecretKey is required for ChipiServerSDK. Use ChipiBrowserSDK for client-side applications."
796
+ );
797
+ }
798
+ super(config);
799
+ }
800
+ // All methods are inherited from ChipiSDK
801
+ // The apiSecretKey from config is automatically used via resolveBearerToken()
802
+ };
803
+
804
+ // src/chipi-browser-sdk.ts
805
+ var ChipiBrowserSDK = class extends ChipiSDK {
806
+ constructor(config) {
807
+ super(config);
808
+ }
809
+ // All methods are inherited from ChipiSDK
810
+ // bearerToken parameter is required for each authenticated request
622
811
  };
623
812
 
624
- export { ChipiClient, ChipiSDK, ChipiSkus, ChipiTransactions, ChipiWallets, decryptPrivateKey, encryptPrivateKey };
813
+ export { ChipiBrowserSDK, ChipiClient, ChipiSDK, ChipiServerSDK, ChipiSkuTransactions, ChipiSkus, ChipiTransactions, ChipiWallets, decryptPrivateKey, encryptPrivateKey };
625
814
  //# sourceMappingURL=index.mjs.map
626
815
  //# sourceMappingURL=index.mjs.map