payment-kit 1.20.10 → 1.20.12

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.
Files changed (83) hide show
  1. package/README.md +25 -24
  2. package/api/src/index.ts +2 -0
  3. package/api/src/integrations/stripe/handlers/invoice.ts +63 -5
  4. package/api/src/integrations/stripe/handlers/payment-intent.ts +1 -0
  5. package/api/src/integrations/stripe/resource.ts +253 -2
  6. package/api/src/libs/currency.ts +31 -0
  7. package/api/src/libs/discount/coupon.ts +1061 -0
  8. package/api/src/libs/discount/discount.ts +349 -0
  9. package/api/src/libs/discount/nft.ts +239 -0
  10. package/api/src/libs/discount/redemption.ts +636 -0
  11. package/api/src/libs/discount/vc.ts +73 -0
  12. package/api/src/libs/invoice.ts +50 -16
  13. package/api/src/libs/math-utils.ts +6 -0
  14. package/api/src/libs/price.ts +43 -0
  15. package/api/src/libs/session.ts +242 -57
  16. package/api/src/libs/subscription.ts +2 -6
  17. package/api/src/locales/en.ts +38 -38
  18. package/api/src/queues/auto-recharge.ts +1 -1
  19. package/api/src/queues/discount-status.ts +200 -0
  20. package/api/src/queues/subscription.ts +98 -5
  21. package/api/src/queues/usage-record.ts +1 -1
  22. package/api/src/routes/auto-recharge-configs.ts +5 -3
  23. package/api/src/routes/checkout-sessions.ts +755 -64
  24. package/api/src/routes/connect/change-payment.ts +6 -1
  25. package/api/src/routes/connect/change-plan.ts +6 -1
  26. package/api/src/routes/connect/setup.ts +6 -1
  27. package/api/src/routes/connect/shared.ts +80 -9
  28. package/api/src/routes/connect/subscribe.ts +12 -2
  29. package/api/src/routes/coupons.ts +518 -0
  30. package/api/src/routes/index.ts +4 -0
  31. package/api/src/routes/invoices.ts +44 -3
  32. package/api/src/routes/meter-events.ts +2 -1
  33. package/api/src/routes/payment-currencies.ts +1 -0
  34. package/api/src/routes/promotion-codes.ts +482 -0
  35. package/api/src/routes/subscriptions.ts +23 -2
  36. package/api/src/store/migrations/20250904-discount.ts +136 -0
  37. package/api/src/store/migrations/20250910-timestamp-fields.ts +116 -0
  38. package/api/src/store/migrations/20250916-add-description-fields.ts +30 -0
  39. package/api/src/store/models/checkout-session.ts +12 -0
  40. package/api/src/store/models/coupon.ts +144 -4
  41. package/api/src/store/models/discount.ts +23 -10
  42. package/api/src/store/models/index.ts +13 -2
  43. package/api/src/store/models/promotion-code.ts +295 -18
  44. package/api/src/store/models/types.ts +30 -1
  45. package/api/tests/libs/session.spec.ts +48 -27
  46. package/blocklet.yml +1 -1
  47. package/doc/vendor_fulfillment_system.md +38 -38
  48. package/package.json +20 -20
  49. package/src/app.tsx +2 -0
  50. package/src/components/customer/link.tsx +1 -1
  51. package/src/components/discount/discount-info.tsx +178 -0
  52. package/src/components/invoice/table.tsx +140 -48
  53. package/src/components/invoice-pdf/styles.ts +6 -0
  54. package/src/components/invoice-pdf/template.tsx +59 -33
  55. package/src/components/metadata/form.tsx +14 -5
  56. package/src/components/payment-link/actions.tsx +42 -0
  57. package/src/components/price/form.tsx +91 -65
  58. package/src/components/product/vendor-config.tsx +5 -3
  59. package/src/components/promotion/active-redemptions.tsx +534 -0
  60. package/src/components/promotion/currency-multi-select.tsx +350 -0
  61. package/src/components/promotion/currency-restrictions.tsx +117 -0
  62. package/src/components/promotion/product-select.tsx +292 -0
  63. package/src/components/promotion/promotion-code-form.tsx +534 -0
  64. package/src/components/subscription/portal/list.tsx +6 -1
  65. package/src/components/subscription/vendor-service-list.tsx +13 -2
  66. package/src/locales/en.tsx +253 -26
  67. package/src/locales/zh.tsx +222 -1
  68. package/src/pages/admin/billing/subscriptions/detail.tsx +5 -0
  69. package/src/pages/admin/products/coupons/applicable-products.tsx +166 -0
  70. package/src/pages/admin/products/coupons/create.tsx +612 -0
  71. package/src/pages/admin/products/coupons/detail.tsx +538 -0
  72. package/src/pages/admin/products/coupons/edit.tsx +127 -0
  73. package/src/pages/admin/products/coupons/index.tsx +210 -3
  74. package/src/pages/admin/products/index.tsx +22 -3
  75. package/src/pages/admin/products/products/detail.tsx +12 -2
  76. package/src/pages/admin/products/promotion-codes/actions.tsx +103 -0
  77. package/src/pages/admin/products/promotion-codes/create.tsx +235 -0
  78. package/src/pages/admin/products/promotion-codes/detail.tsx +416 -0
  79. package/src/pages/admin/products/promotion-codes/list.tsx +247 -0
  80. package/src/pages/admin/products/promotion-codes/verification-config.tsx +327 -0
  81. package/src/pages/admin/products/vendors/index.tsx +17 -5
  82. package/src/pages/customer/subscription/detail.tsx +5 -0
  83. package/vite.config.ts +4 -3
@@ -5,17 +5,19 @@ export default flat({
5
5
  redirecting: 'Redirecting...',
6
6
  title: 'Name',
7
7
  estimated: 'Estimated',
8
+ active: 'Active',
9
+ inactive: 'Inactive',
8
10
  metadata: {
9
11
  label: 'Metadata',
10
12
  description: 'Add custom key-value pairs to store additional information about this meter.',
11
13
  add: 'Add more metadata',
12
14
  edit: 'Edit metadata',
13
15
  empty: 'No metadata',
14
- emptyTip: "You haven't added any metadata yet, you can add it",
16
+ emptyTip: "You haven't added any metadata yet. You can add it now",
15
17
  formMode: 'Switch to form mode',
16
18
  jsonMode: 'Switch to JSON mode',
17
19
  jsonPlaceholder: 'Enter JSON data...',
18
- invalidJson: 'Invalid JSON format, please check your input',
20
+ invalidJson: 'Invalid JSON format. Please check your input',
19
21
  formatJson: 'Format JSON',
20
22
  },
21
23
  price: 'Price',
@@ -26,7 +28,7 @@ export default flat({
26
28
  minLength: 'Min {len} characters',
27
29
  invalidCharacters: 'Invalid characters',
28
30
  latinOnly:
29
- 'At least one letter and cannot include Chinese characters and special characters such as <, >、"、’ or \\',
31
+ 'Must contain at least one letter and cannot include Chinese characters or special characters such as <, >, ", \' or \\',
30
32
  loading: 'Loading...',
31
33
  rechargeTime: 'Recharge Time',
32
34
  submit: 'Submit',
@@ -41,13 +43,26 @@ export default flat({
41
43
  quickStarts: 'Quick Starts',
42
44
  copy: 'Copy',
43
45
  copied: 'Copied',
44
- copySuccess: 'Copy Success',
45
- copyFailed: 'Copy Failed',
46
+ copySuccess: 'Copied successfully',
47
+ copyFailed: 'Copy failed',
46
48
  copyTip: 'Please copy manually',
47
49
  save: 'Save',
48
50
  cancel: 'Cancel',
49
51
  know: 'I Know',
50
52
  confirm: 'Confirm',
53
+ edit: 'Edit',
54
+ delete: 'Delete',
55
+ deleting: 'Deleting...',
56
+ yes: 'Yes',
57
+ no: 'No',
58
+ never: 'Never',
59
+ created: 'Created',
60
+ updated: 'Updated',
61
+ valid: 'Valid',
62
+ events: 'Events',
63
+ details: 'Details',
64
+ discount: 'Discount',
65
+ deleted: 'Deleted',
51
66
  maxAmount: 'Max amount is {max}',
52
67
  days: {
53
68
  sunday: 'Sunday',
@@ -254,7 +269,7 @@ export default flat({
254
269
  'Credit products are used to provide consumable credits to users, supporting both one-time purchase and package pricing models.',
255
270
  creditAmount: {
256
271
  label: 'Credit Amount',
257
- placeholder: 'Amount of credits users get when purchasing this price',
272
+ placeholder: 'Amount of credits users receive when purchasing this price',
258
273
  help: 'Leave empty for pay-per-unit pricing, enter a number for fixed package deals',
259
274
  description: 'Purchase quantity determines the amount of Credits received',
260
275
  },
@@ -367,14 +382,14 @@ export default flat({
367
382
  archiveTip: 'Archiving will hide this product from new purchases. Are you sure you want to archive this product?',
368
383
  unarchive: 'Unarchive product',
369
384
  unarchiveTip:
370
- 'Unarchiving will enable this product from new purchases. Are you sure you want to unarchive this product?',
385
+ 'Unarchiving will enable this product for new purchases. Are you sure you want to unarchive this product?',
371
386
  remove: 'Remove product',
372
387
  removeTip: 'Removing will hide this product from new purchases. Are you sure you want to remove this product?',
373
388
  archived: 'This product has been archived',
374
389
  archivedTip:
375
390
  "This product can't be added to new invoices, subscriptions, payment links, or pricing tables. Any existing subscriptions with this product remain active until canceled and any existing payment links or pricing tables are deactivated.",
376
391
  locked: 'This product is locked because at least one of its prices is used by a subscription or a payment.',
377
- currencyNotAligned: 'all prices must have the same currency settings',
392
+ currencyNotAligned: 'All prices must have the same currency settings',
378
393
  image: {
379
394
  label: 'Image',
380
395
  add: 'Add image',
@@ -431,7 +446,7 @@ export default flat({
431
446
  vendorConfig: {
432
447
  title: 'Vendor Configuration',
433
448
  add: 'Add Vendor',
434
- empty: 'No vendors configured. Click "Add Vendor" to configure vendor services.',
449
+ empty: 'No vendors configured. Click "Add Vendor" to configure vendor services',
435
450
  vendor: 'Vendor',
436
451
  vendorRequired: 'Vendor is required',
437
452
  productCode: 'Product Code',
@@ -508,7 +523,7 @@ export default flat({
508
523
  packageDesc: 'Price by number of units',
509
524
  graduated: 'Graduated Pricing',
510
525
  volume: 'Volume pricing',
511
- custom: 'Customer choose price',
526
+ custom: 'Customer chooses price',
512
527
  usageBased: 'Usage-based',
513
528
  creditMetered: 'Credit metered',
514
529
  },
@@ -520,7 +535,7 @@ export default flat({
520
535
  selectMeter: 'Select meter',
521
536
  pricingNote: 'For metered products, pricing is automatically based on usage tracked by the selected meter.',
522
537
  description:
523
- 'Credit metered billing requires a corresponding Credit consumption. If the Credit is consumed, the corresponding service will stop.',
538
+ 'Credit metered billing requires corresponding credit consumption. If credits are consumed, the corresponding service will stop.',
524
539
  },
525
540
  credit: {
526
541
  saveAsBasePrice: 'Set as Top-up Package',
@@ -557,7 +572,7 @@ export default flat({
557
572
  tip: '',
558
573
  },
559
574
  quantity: {
560
- tip: 'Quantity must be equal or greater than 0',
575
+ tip: 'Quantity must be equal to or greater than 0',
561
576
  },
562
577
  quantityAvailable: {
563
578
  label: 'Available quantity',
@@ -583,6 +598,210 @@ export default flat({
583
598
  coupon: {
584
599
  create: 'Create Coupon',
585
600
  view: 'View coupon',
601
+ description: 'Coupons can be used to discount invoices, subscriptions, or entire customer accounts.',
602
+ listTitle: 'Coupon',
603
+ terms: 'Terms',
604
+ tab: 'Coupons',
605
+ redemptions: 'Redemptions',
606
+ expires: 'Expires',
607
+ noDiscount: 'No discount',
608
+ name: 'Name',
609
+ nameHelp: "This will appear on customers' receipts and invoices.",
610
+ desc: 'Description',
611
+ descriptionInternal: 'This description is for internal use only and will not be shown to customers.',
612
+ id: 'ID',
613
+ idOptional: 'ID (Optional)',
614
+ idHelp:
615
+ 'This will identify this coupon in the API. We recommend leaving this blank so we can generate an ID for you.',
616
+ type: 'Type',
617
+ percentageOff: 'Percentage off',
618
+ fixedAmountOff: 'Fixed amount off',
619
+ percentageDiscount: 'Percentage discount',
620
+ fixedAmount: 'Discount amount',
621
+ currency: 'Currency',
622
+ applyToProducts: 'Apply to specific products',
623
+ duration: 'Duration',
624
+ once: 'Once',
625
+ forever: 'Forever',
626
+ repeating: 'Repeating',
627
+ durationHelp:
628
+ 'For subscriptions and customers, this determines how long this coupon will apply once redeemed. One-time invoices accept both "once" and "forever" coupons.',
629
+ durationInMonths: 'Duration in months',
630
+ redemptionLimits: 'Redemption limits',
631
+ limitDateRange: 'Limit the date range when customers can redeem this coupon',
632
+ limitTotalNumber: 'Limit the total number of times this coupon can be redeemed',
633
+ codes: 'Codes',
634
+ useCustomerFacingCodes: 'Use customer-facing coupon codes',
635
+ promotionCodes: 'Promotion Codes',
636
+ promotionCodesHelp: 'Promotion codes will be created after the coupon is saved.',
637
+ addPromotionCode: 'Add promotion code',
638
+ eligibleFirstTime: 'Eligible for first-time order only(each user can only enjoy one coupon discount)',
639
+ limitNumberRedemptions: 'Limit the number of times this code can be redeemed',
640
+ addExpirationDate: 'Add an expiration date',
641
+ requireMinimumOrder: 'Require minimum order value',
642
+ addAnotherCode: 'Add another code',
643
+ saved: 'Coupon saved successfully',
644
+ // Promotion Code Form
645
+ codeOptional: 'Code (Optional)',
646
+ codeHelp: 'Leave blank to auto-generate upon creation',
647
+ generate: 'Generate',
648
+ verificationType: 'Verification Type',
649
+ codeOnly: 'Code Only',
650
+ nftVerification: 'NFT Verification',
651
+ vcVerification: 'Passport Verification',
652
+ userWhitelist: 'Specific Users',
653
+ nftSettings: 'NFT Verification Settings',
654
+ vcSettings: 'Passport Verification Settings',
655
+ userWhitelistSettings: 'Specific Users Settings',
656
+ nftAddresses: 'NFT Addresses',
657
+ nftAddressesPlaceholder: 'Enter NFT contract addresses',
658
+ nftTags: 'NFT Tags',
659
+ nftTagsPlaceholder: 'Enter NFT tags',
660
+ trustedIssuers: 'Trusted Issuers',
661
+ trustedIssuersPlaceholder: 'Enter trusted issuers',
662
+ trustedParents: 'Trusted Parents',
663
+ trustedParentsPlaceholder: 'Enter trusted parents',
664
+ minBalance: 'NFT Required Quantity',
665
+ requiredRoles: 'Required Roles',
666
+ requiredRolesPlaceholder: 'Enter required roles',
667
+ trustedVcIssuers: 'Trusted VC Issuers',
668
+ trustedVcIssuersPlaceholder: 'Enter trusted VC issuer DIDs',
669
+ customerDids: 'Customer DIDs',
670
+ customerDidsPlaceholder: 'Enter customer DIDs',
671
+ customerDidsHelp: 'You can select existing customers or enter DID manually',
672
+ maxRedemptions: 'Max Redemptions',
673
+ expiresAt: 'Expires At',
674
+ pressEnterToAdd: 'Press Enter to add',
675
+ // Updated section names
676
+ couponConfiguration: 'Coupon Configuration',
677
+ selectProducts: 'Select Products',
678
+ noProductsSelected: 'No products selected',
679
+ newCode: 'New Code',
680
+ createPromotionCode: 'Create Promotion Code',
681
+ promotionCodeDescription: 'Create a promotion code for this coupon to allow customers to redeem the discount.',
682
+ minimumAmount: 'Minimum Amount',
683
+ minimumAmountHelp: 'Set minimum order amounts for different currencies',
684
+ discountAmount: 'Discount Amount',
685
+ currencies: 'Currencies',
686
+ times: 'times',
687
+ months: 'months',
688
+ addProduct: 'Add another product',
689
+ unlimited: 'Unlimited',
690
+ inactive: 'Coupon is inactive',
691
+ inactiveTip: 'This coupon is currently inactive and cannot be used.',
692
+ discount: 'Discount',
693
+ updated: 'Updated',
694
+ timesRedeemed: 'Times Redeemed',
695
+ deletedSuccessfully: 'Coupon deleted successfully',
696
+ deleteConfirmTitle: 'Delete Coupon',
697
+ deleteConfirmMessage: 'Are you sure you want to delete this coupon? This action cannot be undone.',
698
+ cannotDeleteWithPromotionCodes: 'Cannot delete coupon with existing promotion codes',
699
+ couponTermsPercentage: '{percent}% off',
700
+ couponTermsFixedAmount: '{amount} {symbol} off',
701
+ couponTerms: {
702
+ forever: '{couponOff} forever',
703
+ once: '{couponOff} once',
704
+ repeating: '{couponOff} for {months} months',
705
+ },
706
+ couponTermsDuration: {
707
+ forever: 'Forever',
708
+ once: 'Once',
709
+ repeating: 'For {months} months',
710
+ },
711
+ applicableProducts: 'Applicable Products',
712
+ noApplicableProducts: 'This coupon applies to all products',
713
+ activeRedemptions: 'Active redemptions',
714
+ customers: 'Customers',
715
+ subscriptions: 'Subscriptions',
716
+ noCustomersFound: 'No customers found',
717
+ noCustomersRedeem: 'No customers currently redeem this coupon',
718
+ noSubscriptionsFound: 'No subscriptions found',
719
+ noSubscriptionsRedeem: 'No subscriptions currently redeem this coupon',
720
+ rename: 'Rename',
721
+ renameCoupon: 'Rename coupon',
722
+ updateCouponDetails: 'Update coupon details',
723
+ nameWillAppear: "This will appear on customers' receipts and invoices.",
724
+ updateCouponButton: 'Update coupon',
725
+ discountStart: 'Discount Start',
726
+ // Additional fields for active-redemptions
727
+ usageStats: 'Usage Statistics',
728
+ totalDiscounts: 'Total Discounts',
729
+ uniqueSessions: 'Unique Sessions',
730
+ uniqueSubscriptions: 'Unique Subscriptions',
731
+ promotionCodesUsed: 'Promotion Codes Used',
732
+ noExpiration: 'No Expiration',
733
+ usagePeriod: 'Usage Period',
734
+ firstUsed: 'First Used',
735
+ lastUsed: 'Last Used',
736
+ promotionCodeInfo: 'Promotion Code Info',
737
+ directCouponUsage: 'Direct Coupon Usage',
738
+ usageLimit: 'Usage Limit',
739
+ discountInfo: 'Discount Info',
740
+ discountPeriod: 'Discount Period',
741
+ couponExpires: 'Coupon Expires',
742
+ totalSavings: 'Total Discounts',
743
+ viewPromotionCode: 'View Promotion Code',
744
+ },
745
+ discount: {
746
+ totalSaved: 'Total Saved',
747
+ timesUsed: 'Times Used',
748
+ appliedDiscounts: 'Applied Discounts',
749
+ },
750
+ promotionCode: {
751
+ code: 'Code',
752
+ status: 'Status',
753
+ redemptions: 'Redemptions',
754
+ expires: 'Expires',
755
+ created: 'Created',
756
+ actions: 'Actions',
757
+ active: 'Active',
758
+ inactive: 'Inactive',
759
+ expired: 'Expired',
760
+ maxedOut: 'Maxed Out',
761
+ viewDetails: 'View Details',
762
+ edit: 'Edit Promotion Code',
763
+ delete: 'Delete Promotion Code',
764
+ archive: 'Archive Promotion Code',
765
+ archiveTip:
766
+ 'Archiving will prevent this promotion code from being used. Are you sure you want to archive this promotion code?',
767
+ deleteTip:
768
+ 'Deleting will permanently delete this promotion code. Are you sure you want to delete this promotion code?',
769
+ title: 'Promotion Code',
770
+ id: 'ID',
771
+ type: 'Type',
772
+ couponId: 'Coupon ID',
773
+ maxRedemptions: 'Max Redemptions',
774
+ timesRedeemed: 'Times Redeemed',
775
+ verificationType: 'Verification Type',
776
+ updated: 'Updated',
777
+ activate: 'Activate',
778
+ deactivate: 'Deactivate',
779
+ inactiveTitle: 'Promotion code is inactive',
780
+ inactiveTip: 'This promotion code is currently inactive and cannot be used.',
781
+ deleteSuccess: 'Promotion code deleted successfully',
782
+ activateSuccess: 'Promotion code activated successfully',
783
+ deactivateSuccess: 'Promotion code deactivated successfully',
784
+ verificationConfig: 'Verification Configuration',
785
+ nftAddresses: 'NFT Addresses',
786
+ nftTags: 'NFT Tags',
787
+ minBalance: 'Min Balance',
788
+ requiredRoles: 'Required Roles',
789
+ trustedIssuers: 'Trusted Issuers',
790
+ allowedUsers: 'Allowed Users',
791
+ noNftConfig: 'No NFT configuration',
792
+ noVcConfig: 'No VC configuration',
793
+ noUsersSpecified: 'No users specified',
794
+ codeVerificationOnly: 'Code verification only',
795
+ unlimited: 'Unlimited',
796
+ never: 'Never',
797
+ yes: 'Yes',
798
+ no: 'No',
799
+ verificationTypeMap: {
800
+ code: 'Code Only',
801
+ nft: 'NFT Verification',
802
+ vc: 'Passport Verification',
803
+ user_restricted: 'User Whitelist',
804
+ },
586
805
  },
587
806
  paymentLink: {
588
807
  view: 'View payment link',
@@ -597,10 +816,16 @@ export default flat({
597
816
  afterPay: 'After payment',
598
817
  products: 'Products',
599
818
  addProduct: 'Add another product',
600
- requireBillingAddress: 'Collect customers billing addresses',
601
- requirePhoneNumber: 'Collect customers phone numbers',
819
+ requireBillingAddress: 'Collect customer billing addresses',
820
+ requirePhoneNumber: 'Collect customer phone numbers',
602
821
  allowPromotionCodes: 'Allow promotion codes',
603
- requireCrossSell: 'Require cross sell products selected if eligible',
822
+ enablePromotionCodes: 'Enable promotion codes',
823
+ disablePromotionCodes: 'Disable promotion codes',
824
+ enablePromotionCodesTip:
825
+ 'Enable promotion codes for this payment link. Customers will be able to apply discount codes during checkout.',
826
+ disablePromotionCodesTip:
827
+ 'Disable promotion codes for this payment link. Customers will not be able to apply discount codes during checkout.',
828
+ requireCrossSell: 'Require cross-sell products to be selected if eligible',
604
829
  includeFreeTrial: 'Include a free trial',
605
830
  noStakeRequired: 'No stake required',
606
831
  showProductFeatures: 'Show product features',
@@ -684,7 +909,7 @@ export default flat({
684
909
  expiredUncapturedCharge: 'Expired uncaptured charge',
685
910
  amountRange: 'Refund amount must be between {min} and {max} {symbol}',
686
911
  amountHelper: 'Refund amount must be less than or equal to {max} {symbol}',
687
- required: 'please fill in the refund information',
912
+ required: 'Please fill in the refund information',
688
913
  empty: 'The current order has been fully refunded',
689
914
  },
690
915
  },
@@ -718,11 +943,11 @@ export default flat({
718
943
  },
719
944
  name: {
720
945
  label: 'Name',
721
- tip: 'Consumer facing',
946
+ tip: 'Customer-facing',
722
947
  },
723
948
  description: {
724
949
  label: 'Description',
725
- tip: 'Not consumer facing',
950
+ tip: 'Not customer-facing',
726
951
  },
727
952
  stripe: {
728
953
  dashboard: {
@@ -749,11 +974,11 @@ export default flat({
749
974
  },
750
975
  api_host: {
751
976
  label: 'API Host',
752
- tip: 'The graphql endpoint to send transaction to',
977
+ tip: 'The GraphQL endpoint to send transactions to',
753
978
  },
754
979
  explorer_host: {
755
980
  label: 'Explorer Host',
756
- tip: 'The webapp endpoint to view transaction details',
981
+ tip: 'The web app endpoint to view transaction details',
757
982
  },
758
983
  },
759
984
  ethereum: {
@@ -763,11 +988,11 @@ export default flat({
763
988
  },
764
989
  api_host: {
765
990
  label: 'RPC Endpoint',
766
- tip: 'The RPC endpoint to send transaction to',
991
+ tip: 'The RPC endpoint to send transactions to',
767
992
  },
768
993
  explorer_host: {
769
994
  label: 'Explorer Host',
770
- tip: 'The webapp endpoint to view transaction details',
995
+ tip: 'The web app endpoint to view transaction details',
771
996
  },
772
997
  native_symbol: {
773
998
  label: 'Native Symbol',
@@ -775,7 +1000,7 @@ export default flat({
775
1000
  },
776
1001
  confirmation: {
777
1002
  label: 'Confirmation Count',
778
- tip: 'How many blocks since transaction execution',
1003
+ tip: 'Number of blocks required since transaction execution',
779
1004
  },
780
1005
  },
781
1006
  evm: {
@@ -792,11 +1017,11 @@ export default flat({
792
1017
  },
793
1018
  api_host: {
794
1019
  label: 'RPC Endpoint',
795
- tip: 'The RPC endpoint to send transaction to',
1020
+ tip: 'The RPC endpoint to send transactions to',
796
1021
  },
797
1022
  explorer_host: {
798
1023
  label: 'Explorer Host',
799
- tip: 'The webapp endpoint to view transaction details',
1024
+ tip: 'The web app endpoint to view transaction details',
800
1025
  },
801
1026
  native_symbol: {
802
1027
  label: 'Native Symbol',
@@ -804,7 +1029,7 @@ export default flat({
804
1029
  },
805
1030
  confirmation: {
806
1031
  label: 'Confirmation Count',
807
- tip: 'How many blocks since transaction execution',
1032
+ tip: 'Number of blocks required since transaction execution',
808
1033
  },
809
1034
  },
810
1035
  },
@@ -953,6 +1178,7 @@ export default flat({
953
1178
  ended: 'Ended {prefix} {date}',
954
1179
  renew: 'Renew {prefix} {date}',
955
1180
  discount: 'Discount',
1181
+ activeDiscount: 'Active Discount',
956
1182
  startedAt: 'Started',
957
1183
  nextInvoice: 'Next Invoice',
958
1184
  nextInvoiceAmount: 'Next Invoice Amount',
@@ -1408,6 +1634,7 @@ export default flat({
1408
1634
  relatedInvoice: 'Related Invoice',
1409
1635
  donation: 'Donation',
1410
1636
  creditsInfo: 'Total {amount} {currency} included',
1637
+ appliedDiscounts: 'Applied Discounts',
1411
1638
  },
1412
1639
  payout: {
1413
1640
  empty: 'No Revenues',