@p2pdotme/sdk 1.2.17 → 1.2.19

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 (58) hide show
  1. package/README.md +2 -2
  2. package/dist/country.cjs +116 -49
  3. package/dist/country.cjs.map +1 -1
  4. package/dist/country.d.cts +15 -1
  5. package/dist/country.d.ts +15 -1
  6. package/dist/country.mjs +114 -49
  7. package/dist/country.mjs.map +1 -1
  8. package/dist/fraud-engine.cjs +1 -0
  9. package/dist/fraud-engine.cjs.map +1 -1
  10. package/dist/fraud-engine.mjs +1 -0
  11. package/dist/fraud-engine.mjs.map +1 -1
  12. package/dist/index.cjs +2 -1
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.mjs +2 -1
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/orders.cjs +114 -0
  19. package/dist/orders.cjs.map +1 -1
  20. package/dist/orders.d.cts +53 -2
  21. package/dist/orders.d.ts +53 -2
  22. package/dist/orders.mjs +114 -0
  23. package/dist/orders.mjs.map +1 -1
  24. package/dist/prices.cjs +7 -0
  25. package/dist/prices.cjs.map +1 -1
  26. package/dist/prices.d.cts +1 -0
  27. package/dist/prices.d.ts +1 -0
  28. package/dist/prices.mjs +7 -0
  29. package/dist/prices.mjs.map +1 -1
  30. package/dist/profile.cjs +7 -0
  31. package/dist/profile.cjs.map +1 -1
  32. package/dist/profile.d.cts +2 -0
  33. package/dist/profile.d.ts +2 -0
  34. package/dist/profile.mjs +7 -0
  35. package/dist/profile.mjs.map +1 -1
  36. package/dist/qr-parsers.cjs +133 -52
  37. package/dist/qr-parsers.cjs.map +1 -1
  38. package/dist/qr-parsers.d.cts +1 -0
  39. package/dist/qr-parsers.d.ts +1 -0
  40. package/dist/qr-parsers.mjs +133 -52
  41. package/dist/qr-parsers.mjs.map +1 -1
  42. package/dist/react.cjs +194 -22
  43. package/dist/react.cjs.map +1 -1
  44. package/dist/react.d.cts +78 -2
  45. package/dist/react.d.ts +78 -2
  46. package/dist/react.mjs +180 -9
  47. package/dist/react.mjs.map +1 -1
  48. package/dist/stake.cjs +1 -0
  49. package/dist/stake.cjs.map +1 -1
  50. package/dist/stake.d.cts +1 -0
  51. package/dist/stake.d.ts +1 -0
  52. package/dist/stake.mjs +1 -0
  53. package/dist/stake.mjs.map +1 -1
  54. package/dist/zkkyc.cjs +1 -0
  55. package/dist/zkkyc.cjs.map +1 -1
  56. package/dist/zkkyc.mjs +1 -0
  57. package/dist/zkkyc.mjs.map +1 -1
  58. package/package.json +1 -1
package/dist/react.cjs CHANGED
@@ -34,6 +34,7 @@ __export(react_exports, {
34
34
  useFingerprint: () => useFingerprint,
35
35
  useFraudEngine: () => useFraudEngine,
36
36
  useOrders: () => useOrders,
37
+ usePlacementLimits: () => usePlacementLimits,
37
38
  usePrices: () => usePrices,
38
39
  useProfile: () => useProfile,
39
40
  useSdk: () => useSdk,
@@ -110,6 +111,7 @@ var CURRENCY = {
110
111
  ARS: "ARS",
111
112
  MEX: "MEX",
112
113
  VEN: "VEN",
114
+ BOB: "BOB",
113
115
  EUR: "EUR",
114
116
  NGN: "NGN",
115
117
  USD: "USD",
@@ -1723,6 +1725,9 @@ var ZodGetOrderParamsSchema = import_zod3.z.object({
1723
1725
  var ZodGetFeeConfigParamsSchema = import_zod3.z.object({
1724
1726
  currency: ZodCurrencySchema
1725
1727
  });
1728
+ var ZodGetPlacementLimitsParamsSchema = import_zod3.z.object({
1729
+ userAddress: ZodAddressSchema
1730
+ });
1726
1731
  var ZodGetOrdersParamsSchema = import_zod3.z.object({
1727
1732
  userAddress: ZodAddressSchema,
1728
1733
  skip: import_zod3.z.number().int().min(0).default(0),
@@ -1783,6 +1788,19 @@ var ZodSubgraphOrderSchema = import_zod3.z.object({
1783
1788
  var ZodSubgraphOrdersResponseSchema = import_zod3.z.object({
1784
1789
  orders_collection: import_zod3.z.array(ZodSubgraphOrderSchema)
1785
1790
  });
1791
+ var ZodSubgraphPlacementLimitsResponseSchema = import_zod3.z.object({
1792
+ userDailyPlacements: import_zod3.z.object({
1793
+ dayIndex: import_zod3.z.string(),
1794
+ buyPlacements: import_zod3.z.string(),
1795
+ sellPlacements: import_zod3.z.string()
1796
+ }).nullish(),
1797
+ orderPlacementLimitConfig: import_zod3.z.object({
1798
+ dailyBuyOrderPlacementLimit: import_zod3.z.string(),
1799
+ buyLimitConfigured: import_zod3.z.boolean(),
1800
+ dailySellOrderPlacementLimit: import_zod3.z.string(),
1801
+ sellLimitConfigured: import_zod3.z.boolean()
1802
+ }).nullish()
1803
+ });
1786
1804
 
1787
1805
  // src/orders/actions/approve-usdc.ts
1788
1806
  function createApproveUsdcAction(input) {
@@ -5156,6 +5174,10 @@ var contractErrors = {
5156
5174
  // Order limits
5157
5175
  DailyBuyOrderLimitExceeded: "DAILY_BUY_ORDER_LIMIT_EXCEEDED",
5158
5176
  MonthlyBuyOrderLimitExceeded: "MONTHLY_BUY_ORDER_LIMIT_EXCEEDED",
5177
+ // Gross placement caps: counted when the order is placed and never given
5178
+ // back when it is cancelled, unlike the volume limits above.
5179
+ DailyBuyOrderPlacementLimitExceeded: "DAILY_BUY_ORDER_PLACEMENT_LIMIT_EXCEEDED",
5180
+ DailySellOrderPlacementLimitExceeded: "DAILY_SELL_ORDER_PLACEMENT_LIMIT_EXCEEDED",
5159
5181
  SellOrderAmountLimitExceeded: "SELL_ORDER_AMOUNT_LIMIT_EXCEEDED",
5160
5182
  BuyOrderAmountExceedsLimit: "BUY_ORDER_AMOUNT_EXCEEDS_LIMIT",
5161
5183
  SellOrderAmountExceedsLimit: "SELL_ORDER_AMOUNT_EXCEEDS_LIMIT",
@@ -5367,6 +5389,8 @@ var hexContractErrors = {
5367
5389
  // Order limits
5368
5390
  "0xe595a7bf": contractErrors.DailyBuyOrderLimitExceeded,
5369
5391
  "0x675dbc86": contractErrors.MonthlyBuyOrderLimitExceeded,
5392
+ "0x917c7aef": contractErrors.DailyBuyOrderPlacementLimitExceeded,
5393
+ "0x4688ce73": contractErrors.DailySellOrderPlacementLimitExceeded,
5370
5394
  "0x64301cb8": contractErrors.SellOrderAmountLimitExceeded,
5371
5395
  "0x91da284f": contractErrors.BuyOrderAmountExceedsLimit,
5372
5396
  "0xb407b9ec": contractErrors.SellOrderAmountExceedsLimit,
@@ -6568,6 +6592,7 @@ function normalizeSubgraphOrder(raw) {
6568
6592
 
6569
6593
  // src/orders/subgraph/index.ts
6570
6594
  var import_neverthrow17 = require("neverthrow");
6595
+ var import_viem19 = require("viem");
6571
6596
 
6572
6597
  // src/orders/subgraph/queries.ts
6573
6598
  var ORDERS_BY_USER_QUERY = (
@@ -6604,8 +6629,35 @@ var ORDERS_BY_USER_QUERY = (
6604
6629
  }
6605
6630
  `
6606
6631
  );
6632
+ var PLACEMENT_LIMITS_QUERY = (
6633
+ /* GraphQL */
6634
+ `
6635
+ query PlacementLimits($placementsId: ID!, $configId: ID!) {
6636
+ userDailyPlacements(id: $placementsId) {
6637
+ dayIndex
6638
+ buyPlacements
6639
+ sellPlacements
6640
+ }
6641
+ orderPlacementLimitConfig(id: $configId) {
6642
+ dailyBuyOrderPlacementLimit
6643
+ buyLimitConfigured
6644
+ dailySellOrderPlacementLimit
6645
+ sellLimitConfigured
6646
+ }
6647
+ }
6648
+ `
6649
+ );
6607
6650
 
6608
6651
  // src/orders/subgraph/index.ts
6652
+ var SECONDS_PER_DAY = 86400;
6653
+ var PLACEMENT_LIMIT_CONFIG_ID = (0, import_viem19.stringToHex)("placement-limits");
6654
+ function bucket(used, limit, configured, zeroMeansUnlimited) {
6655
+ if (!configured) return { used, limit: null, remaining: null, state: "unknown" };
6656
+ if (limit === 0 && zeroMeansUnlimited) {
6657
+ return { used, limit: null, remaining: null, state: "unlimited" };
6658
+ }
6659
+ return { used, limit, remaining: Math.max(0, limit - used), state: "enforced" };
6660
+ }
6609
6661
  function getOrdersForUser(subgraphUrl, userAddress, skip, limit, logger = noopLogger) {
6610
6662
  const user = userAddress.toLowerCase();
6611
6663
  logger.debug("fetching orders from subgraph", { subgraphUrl, user, skip, limit });
@@ -6632,6 +6684,54 @@ function getOrdersForUser(subgraphUrl, userAddress, skip, limit, logger = noopLo
6632
6684
  )
6633
6685
  );
6634
6686
  }
6687
+ function getPlacementLimitsForUser(subgraphUrl, userAddress, nowSeconds, logger = noopLogger) {
6688
+ const user = userAddress.toLowerCase();
6689
+ const dayIndex = Math.floor(nowSeconds / SECONDS_PER_DAY);
6690
+ const placementsId = (0, import_viem19.stringToHex)(`${user}-${dayIndex}`);
6691
+ logger.debug("fetching placement limits from subgraph", { subgraphUrl, user, dayIndex });
6692
+ return querySubgraph(subgraphUrl, {
6693
+ query: PLACEMENT_LIMITS_QUERY,
6694
+ variables: { placementsId, configId: PLACEMENT_LIMIT_CONFIG_ID }
6695
+ }).mapErr(
6696
+ (e) => new OrdersError(e.message, {
6697
+ code: "SUBGRAPH_REQUEST_FAILED",
6698
+ cause: e.cause ?? e,
6699
+ context: { user, dayIndex, ...e.context ?? {} }
6700
+ })
6701
+ ).andThen(
6702
+ (data) => validate(
6703
+ ZodSubgraphPlacementLimitsResponseSchema,
6704
+ data,
6705
+ (message, cause, d) => new OrdersError(message, {
6706
+ code: "SUBGRAPH_VALIDATION_FAILED",
6707
+ cause,
6708
+ context: { data: d }
6709
+ })
6710
+ )
6711
+ ).map((validated) => {
6712
+ const placements = validated.userDailyPlacements;
6713
+ const config = validated.orderPlacementLimitConfig;
6714
+ const buyUsed = placements ? Number(placements.buyPlacements) : 0;
6715
+ const sellUsed = placements ? Number(placements.sellPlacements) : 0;
6716
+ return {
6717
+ dayIndex,
6718
+ resetsAt: (dayIndex + 1) * SECONDS_PER_DAY,
6719
+ // A zero BUY cap is a hard block on-chain, not "unlimited".
6720
+ buy: bucket(
6721
+ buyUsed,
6722
+ config ? Number(config.dailyBuyOrderPlacementLimit) : 0,
6723
+ config?.buyLimitConfigured ?? false,
6724
+ false
6725
+ ),
6726
+ sellPay: bucket(
6727
+ sellUsed,
6728
+ config ? Number(config.dailySellOrderPlacementLimit) : 0,
6729
+ config?.sellLimitConfigured ?? false,
6730
+ true
6731
+ )
6732
+ };
6733
+ });
6734
+ }
6635
6735
 
6636
6736
  // src/orders/watch-events.ts
6637
6737
  var PLACED_CONFIG = {
@@ -6807,6 +6907,19 @@ function createOrders(config) {
6807
6907
  ({ userAddress, skip, limit }) => getOrdersForUser(subgraphUrl, userAddress, skip, limit, logger)
6808
6908
  );
6809
6909
  },
6910
+ getPlacementLimits(params) {
6911
+ return validate(
6912
+ ZodGetPlacementLimitsParamsSchema,
6913
+ params,
6914
+ (message, cause, d) => new OrdersError(message, {
6915
+ code: "INVALID_PLACEMENT_LIMITS_PARAMS",
6916
+ cause,
6917
+ context: { params: d }
6918
+ })
6919
+ ).asyncAndThen(
6920
+ ({ userAddress }) => getPlacementLimitsForUser(subgraphUrl, userAddress, Math.floor(Date.now() / 1e3), logger)
6921
+ );
6922
+ },
6810
6923
  getFeeConfig(params) {
6811
6924
  return validate(
6812
6925
  ZodGetFeeConfigParamsSchema,
@@ -6877,7 +6990,7 @@ function createPrices(config) {
6877
6990
 
6878
6991
  // src/profile/contracts/actions.ts
6879
6992
  var import_neverthrow19 = require("neverthrow");
6880
- var import_viem19 = require("viem");
6993
+ var import_viem20 = require("viem");
6881
6994
  function getBalances(publicClient, usdcAddress, diamondAddress, params) {
6882
6995
  return validate(
6883
6996
  ZodGetBalancesParamsSchema,
@@ -6902,8 +7015,8 @@ function getBalances(publicClient, usdcAddress, diamondAddress, params) {
6902
7015
  })
6903
7016
  )
6904
7017
  ]).map(([usdc, priceConfig]) => {
6905
- const usdcFormatted = Number((0, import_viem19.formatUnits)(usdc, 6));
6906
- const sellPriceFormatted = Number((0, import_viem19.formatUnits)(priceConfig.sellPrice, 6));
7018
+ const usdcFormatted = Number((0, import_viem20.formatUnits)(usdc, 6));
7019
+ const sellPriceFormatted = Number((0, import_viem20.formatUnits)(priceConfig.sellPrice, 6));
6907
7020
  return {
6908
7021
  usdc: usdcFormatted,
6909
7022
  fiat: usdcFormatted * sellPriceFormatted,
@@ -6926,7 +7039,7 @@ function createProfile(config) {
6926
7039
 
6927
7040
  // src/stake/actions/cancel-unstake.ts
6928
7041
  var import_neverthrow21 = require("neverthrow");
6929
- var import_viem20 = require("viem");
7042
+ var import_viem21 = require("viem");
6930
7043
 
6931
7044
  // src/stake/tx.ts
6932
7045
  var import_neverthrow20 = require("neverthrow");
@@ -6982,7 +7095,7 @@ function createCancelUnstakeAction(input) {
6982
7095
  const { publicClient, diamondAddress } = input;
6983
7096
  const prepareFn = () => (0, import_neverthrow21.okAsync)({
6984
7097
  to: diamondAddress,
6985
- data: (0, import_viem20.encodeFunctionData)({
7098
+ data: (0, import_viem21.encodeFunctionData)({
6986
7099
  abi: ABIS.FACETS.STAKE,
6987
7100
  functionName: "p2pBoostCancelUnstake",
6988
7101
  args: []
@@ -7003,12 +7116,12 @@ function createCancelUnstakeAction(input) {
7003
7116
 
7004
7117
  // src/stake/actions/claim-unstake.ts
7005
7118
  var import_neverthrow22 = require("neverthrow");
7006
- var import_viem21 = require("viem");
7119
+ var import_viem22 = require("viem");
7007
7120
  function createClaimUnstakeAction(input) {
7008
7121
  const { publicClient, diamondAddress } = input;
7009
7122
  const prepareFn = () => (0, import_neverthrow22.okAsync)({
7010
7123
  to: diamondAddress,
7011
- data: (0, import_viem21.encodeFunctionData)({
7124
+ data: (0, import_viem22.encodeFunctionData)({
7012
7125
  abi: ABIS.FACETS.STAKE,
7013
7126
  functionName: "p2pBoostClaimUnstake",
7014
7127
  args: []
@@ -7029,12 +7142,12 @@ function createClaimUnstakeAction(input) {
7029
7142
 
7030
7143
  // src/stake/actions/request-unstake.ts
7031
7144
  var import_neverthrow23 = require("neverthrow");
7032
- var import_viem22 = require("viem");
7145
+ var import_viem23 = require("viem");
7033
7146
  function createRequestUnstakeAction(input) {
7034
7147
  const { publicClient, diamondAddress } = input;
7035
7148
  const prepareFn = () => (0, import_neverthrow23.okAsync)({
7036
7149
  to: diamondAddress,
7037
- data: (0, import_viem22.encodeFunctionData)({
7150
+ data: (0, import_viem23.encodeFunctionData)({
7038
7151
  abi: ABIS.FACETS.STAKE,
7039
7152
  functionName: "p2pBoostRequestUnstake",
7040
7153
  args: []
@@ -7054,7 +7167,7 @@ function createRequestUnstakeAction(input) {
7054
7167
  }
7055
7168
 
7056
7169
  // src/stake/actions/stake.ts
7057
- var import_viem23 = require("viem");
7170
+ var import_viem24 = require("viem");
7058
7171
  function createStakeAction(input) {
7059
7172
  const { publicClient, diamondAddress } = input;
7060
7173
  const prepareFn = (params) => validate(
@@ -7067,7 +7180,7 @@ function createStakeAction(input) {
7067
7180
  })
7068
7181
  ).map(({ tokens }) => ({
7069
7182
  to: diamondAddress,
7070
- data: (0, import_viem23.encodeFunctionData)({
7183
+ data: (0, import_viem24.encodeFunctionData)({
7071
7184
  abi: ABIS.FACETS.STAKE,
7072
7185
  functionName: "p2pBoostStake",
7073
7186
  args: [tokens]
@@ -7087,7 +7200,7 @@ function createStakeAction(input) {
7087
7200
  }
7088
7201
 
7089
7202
  // src/stake/actions/top-up.ts
7090
- var import_viem24 = require("viem");
7203
+ var import_viem25 = require("viem");
7091
7204
  function createTopUpAction(input) {
7092
7205
  const { publicClient, diamondAddress } = input;
7093
7206
  const prepareFn = (params) => validate(
@@ -7100,7 +7213,7 @@ function createTopUpAction(input) {
7100
7213
  })
7101
7214
  ).map(({ tokens }) => ({
7102
7215
  to: diamondAddress,
7103
- data: (0, import_viem24.encodeFunctionData)({
7216
+ data: (0, import_viem25.encodeFunctionData)({
7104
7217
  abi: ABIS.FACETS.STAKE,
7105
7218
  functionName: "p2pBoostTopUp",
7106
7219
  args: [tokens]
@@ -7290,16 +7403,74 @@ function useFraudEngine() {
7290
7403
  return fraudEngine;
7291
7404
  }
7292
7405
 
7293
- // src/react/use-watch-orders.ts
7406
+ // src/react/use-placement-limits.ts
7294
7407
  var import_react2 = require("react");
7408
+ function usePlacementLimits(params) {
7409
+ const orders = useOrders();
7410
+ const { userAddress, pollMs } = params;
7411
+ const [limits, setLimits] = (0, import_react2.useState)(null);
7412
+ const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
7413
+ const [error, setError] = (0, import_react2.useState)(null);
7414
+ const requestIdRef = (0, import_react2.useRef)(0);
7415
+ const mountedRef = (0, import_react2.useRef)(true);
7416
+ (0, import_react2.useEffect)(() => {
7417
+ mountedRef.current = true;
7418
+ return () => {
7419
+ mountedRef.current = false;
7420
+ };
7421
+ }, []);
7422
+ const refresh = (0, import_react2.useCallback)(() => {
7423
+ if (!userAddress) {
7424
+ requestIdRef.current++;
7425
+ setLimits(null);
7426
+ setError(null);
7427
+ setIsLoading(false);
7428
+ return;
7429
+ }
7430
+ const requestId = ++requestIdRef.current;
7431
+ setIsLoading(true);
7432
+ orders.getPlacementLimits({ userAddress }).match(
7433
+ (next) => {
7434
+ if (!mountedRef.current || requestId !== requestIdRef.current) return;
7435
+ setLimits(next);
7436
+ setError(null);
7437
+ setIsLoading(false);
7438
+ },
7439
+ (cause) => {
7440
+ if (!mountedRef.current || requestId !== requestIdRef.current) return;
7441
+ setError(cause);
7442
+ setIsLoading(false);
7443
+ }
7444
+ );
7445
+ }, [orders, userAddress]);
7446
+ (0, import_react2.useEffect)(() => {
7447
+ refresh();
7448
+ }, [refresh]);
7449
+ (0, import_react2.useEffect)(() => {
7450
+ if (!pollMs || !userAddress) return;
7451
+ const timer = setInterval(refresh, pollMs);
7452
+ return () => clearInterval(timer);
7453
+ }, [pollMs, userAddress, refresh]);
7454
+ (0, import_react2.useEffect)(() => {
7455
+ if (!limits || !userAddress) return;
7456
+ const msUntilReset = limits.resetsAt * 1e3 - Date.now();
7457
+ if (msUntilReset <= 0) return;
7458
+ const timer = setTimeout(refresh, msUntilReset + 1e3);
7459
+ return () => clearTimeout(timer);
7460
+ }, [limits, userAddress, refresh]);
7461
+ return { limits, isLoading, error, refresh };
7462
+ }
7463
+
7464
+ // src/react/use-watch-orders.ts
7465
+ var import_react3 = require("react");
7295
7466
  function useWatchOrders(params) {
7296
7467
  const orders = useOrders();
7297
7468
  const { user, onEvent, onError } = params;
7298
- const onEventRef = (0, import_react2.useRef)(onEvent);
7299
- const onErrorRef = (0, import_react2.useRef)(onError);
7469
+ const onEventRef = (0, import_react3.useRef)(onEvent);
7470
+ const onErrorRef = (0, import_react3.useRef)(onError);
7300
7471
  onEventRef.current = onEvent;
7301
7472
  onErrorRef.current = onError;
7302
- (0, import_react2.useEffect)(() => {
7473
+ (0, import_react3.useEffect)(() => {
7303
7474
  const unsubscribe = orders.watchEvents({
7304
7475
  user,
7305
7476
  onEvent: (event) => onEventRef.current(event),
@@ -7310,12 +7481,12 @@ function useWatchOrders(params) {
7310
7481
  }
7311
7482
 
7312
7483
  // src/fraud-engine/react/use-fingerprint.ts
7313
- var import_react3 = require("react");
7484
+ var import_react4 = require("react");
7314
7485
  function useFingerprint(enabled) {
7315
- const [data, setData] = (0, import_react3.useState)(null);
7316
- const [error, setError] = (0, import_react3.useState)(null);
7317
- const [isLoading, setIsLoading] = (0, import_react3.useState)(false);
7318
- (0, import_react3.useEffect)(() => {
7486
+ const [data, setData] = (0, import_react4.useState)(null);
7487
+ const [error, setError] = (0, import_react4.useState)(null);
7488
+ const [isLoading, setIsLoading] = (0, import_react4.useState)(false);
7489
+ (0, import_react4.useEffect)(() => {
7319
7490
  if (!enabled) return;
7320
7491
  let cancelled = false;
7321
7492
  setIsLoading(true);
@@ -7348,6 +7519,7 @@ function useFingerprint(enabled) {
7348
7519
  useFingerprint,
7349
7520
  useFraudEngine,
7350
7521
  useOrders,
7522
+ usePlacementLimits,
7351
7523
  usePrices,
7352
7524
  useProfile,
7353
7525
  useSdk,