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