@p2pdotme/sdk 1.2.18 → 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.
package/README.md CHANGED
@@ -25,7 +25,7 @@ bun add @zkpassport/sdk # only for zkkyc ZK Passport flow
25
25
  | Import | Description |
26
26
  |--------|-------------|
27
27
  | `@p2pdotme/sdk` | Shared types, `SdkError`, `VERSION` |
28
- | `@p2pdotme/sdk/orders` | [Order reads + writes](./src/orders/README.md) — `getOrder`, `getOrders`, `getFeeConfig`, and `prepare`/`execute` pairs for `placeOrder`, `cancelOrder`, `setSellOrderUpi`, `raiseDispute`, `approveUsdc` |
28
+ | `@p2pdotme/sdk/orders` | [Order reads + writes](./src/orders/README.md) — `getOrder`, `getOrders`, `getFeeConfig`, `getPlacementLimits`, and `prepare`/`execute` pairs for `placeOrder`, `cancelOrder`, `setSellOrderUpi`, `raiseDispute`, `approveUsdc` |
29
29
  | `@p2pdotme/sdk/prices` | [Currency price config](./src/prices/README.md) — `getPriceConfig`, `getReputationPerUsdcLimit` |
30
30
  | `@p2pdotme/sdk/profile` | [User-scoped reads](./src/profile/README.md) — USDC balance, USDC allowance, fiat conversion, tx limits |
31
31
  | `@p2pdotme/sdk/qr-parsers` | [QR code parsers](./src/qr-parsers/README.md) for UPI, QRIS, PIX, MercadoPago, Pago Movil |
package/dist/index.cjs CHANGED
@@ -69,7 +69,7 @@ var ZodAddressSchema = import_zod.z.string().refine((s) => (0, import_viem.isAdd
69
69
  var ZodCurrencySchema = import_zod.z.enum(CURRENCY_CODES);
70
70
 
71
71
  // src/index.ts
72
- var VERSION = "1.2.18";
72
+ var VERSION = "1.2.19";
73
73
  // Annotate the CommonJS export names for ESM import in node:
74
74
  0 && (module.exports = {
75
75
  SdkError,
package/dist/index.mjs CHANGED
@@ -42,7 +42,7 @@ var ZodAddressSchema = z.string().refine((s) => isAddress(s), { message: "Invali
42
42
  var ZodCurrencySchema = z.enum(CURRENCY_CODES);
43
43
 
44
44
  // src/index.ts
45
- var VERSION = "1.2.18";
45
+ var VERSION = "1.2.19";
46
46
  export {
47
47
  SdkError,
48
48
  VERSION
package/dist/orders.cjs CHANGED
@@ -1231,6 +1231,9 @@ var ZodGetOrderParamsSchema = import_zod2.z.object({
1231
1231
  var ZodGetFeeConfigParamsSchema = import_zod2.z.object({
1232
1232
  currency: ZodCurrencySchema
1233
1233
  });
1234
+ var ZodGetPlacementLimitsParamsSchema = import_zod2.z.object({
1235
+ userAddress: ZodAddressSchema
1236
+ });
1234
1237
  var ZodGetOrdersParamsSchema = import_zod2.z.object({
1235
1238
  userAddress: ZodAddressSchema,
1236
1239
  skip: import_zod2.z.number().int().min(0).default(0),
@@ -1291,6 +1294,19 @@ var ZodSubgraphOrderSchema = import_zod2.z.object({
1291
1294
  var ZodSubgraphOrdersResponseSchema = import_zod2.z.object({
1292
1295
  orders_collection: import_zod2.z.array(ZodSubgraphOrderSchema)
1293
1296
  });
1297
+ var ZodSubgraphPlacementLimitsResponseSchema = import_zod2.z.object({
1298
+ userDailyPlacements: import_zod2.z.object({
1299
+ dayIndex: import_zod2.z.string(),
1300
+ buyPlacements: import_zod2.z.string(),
1301
+ sellPlacements: import_zod2.z.string()
1302
+ }).nullish(),
1303
+ orderPlacementLimitConfig: import_zod2.z.object({
1304
+ dailyBuyOrderPlacementLimit: import_zod2.z.string(),
1305
+ buyLimitConfigured: import_zod2.z.boolean(),
1306
+ dailySellOrderPlacementLimit: import_zod2.z.string(),
1307
+ sellLimitConfigured: import_zod2.z.boolean()
1308
+ }).nullish()
1309
+ });
1294
1310
 
1295
1311
  // src/orders/actions/approve-usdc.ts
1296
1312
  function createApproveUsdcAction(input) {
@@ -4681,6 +4697,8 @@ var contractErrorMessages = {
4681
4697
  CASHBACK_TRANSFER_FAILED: "Cashback transfer failed",
4682
4698
  // Order limits
4683
4699
  DAILY_BUY_ORDER_LIMIT_EXCEEDED: "Daily buy order count limit exceeded",
4700
+ DAILY_BUY_ORDER_PLACEMENT_LIMIT_EXCEEDED: "You've reached today's buy order limit. Cancelled orders still count towards it \u2014 try again tomorrow.",
4701
+ DAILY_SELL_ORDER_PLACEMENT_LIMIT_EXCEEDED: "You've reached today's sell and pay order limit. Cancelled orders still count towards it \u2014 try again tomorrow.",
4684
4702
  MONTHLY_BUY_ORDER_LIMIT_EXCEEDED: "Monthly buy order count limit exceeded",
4685
4703
  SELL_ORDER_AMOUNT_LIMIT_EXCEEDED: "Sell order amount limit exceeded",
4686
4704
  BUY_ORDER_AMOUNT_EXCEEDS_LIMIT: "Buy order amount exceeds limit",
@@ -4899,6 +4917,10 @@ var contractErrors = {
4899
4917
  // Order limits
4900
4918
  DailyBuyOrderLimitExceeded: "DAILY_BUY_ORDER_LIMIT_EXCEEDED",
4901
4919
  MonthlyBuyOrderLimitExceeded: "MONTHLY_BUY_ORDER_LIMIT_EXCEEDED",
4920
+ // Gross placement caps: counted when the order is placed and never given
4921
+ // back when it is cancelled, unlike the volume limits above.
4922
+ DailyBuyOrderPlacementLimitExceeded: "DAILY_BUY_ORDER_PLACEMENT_LIMIT_EXCEEDED",
4923
+ DailySellOrderPlacementLimitExceeded: "DAILY_SELL_ORDER_PLACEMENT_LIMIT_EXCEEDED",
4902
4924
  SellOrderAmountLimitExceeded: "SELL_ORDER_AMOUNT_LIMIT_EXCEEDED",
4903
4925
  BuyOrderAmountExceedsLimit: "BUY_ORDER_AMOUNT_EXCEEDS_LIMIT",
4904
4926
  SellOrderAmountExceedsLimit: "SELL_ORDER_AMOUNT_EXCEEDS_LIMIT",
@@ -5110,6 +5132,8 @@ var hexContractErrors = {
5110
5132
  // Order limits
5111
5133
  "0xe595a7bf": contractErrors.DailyBuyOrderLimitExceeded,
5112
5134
  "0x675dbc86": contractErrors.MonthlyBuyOrderLimitExceeded,
5135
+ "0x917c7aef": contractErrors.DailyBuyOrderPlacementLimitExceeded,
5136
+ "0x4688ce73": contractErrors.DailySellOrderPlacementLimitExceeded,
5113
5137
  "0x64301cb8": contractErrors.SellOrderAmountLimitExceeded,
5114
5138
  "0x91da284f": contractErrors.BuyOrderAmountExceedsLimit,
5115
5139
  "0xb407b9ec": contractErrors.SellOrderAmountExceedsLimit,
@@ -5902,6 +5926,7 @@ function normalizeSubgraphOrder(raw) {
5902
5926
 
5903
5927
  // src/orders/subgraph/index.ts
5904
5928
  var import_neverthrow15 = require("neverthrow");
5929
+ var import_viem19 = require("viem");
5905
5930
 
5906
5931
  // src/orders/subgraph/queries.ts
5907
5932
  var ORDERS_BY_USER_QUERY = (
@@ -5938,8 +5963,35 @@ var ORDERS_BY_USER_QUERY = (
5938
5963
  }
5939
5964
  `
5940
5965
  );
5966
+ var PLACEMENT_LIMITS_QUERY = (
5967
+ /* GraphQL */
5968
+ `
5969
+ query PlacementLimits($placementsId: ID!, $configId: ID!) {
5970
+ userDailyPlacements(id: $placementsId) {
5971
+ dayIndex
5972
+ buyPlacements
5973
+ sellPlacements
5974
+ }
5975
+ orderPlacementLimitConfig(id: $configId) {
5976
+ dailyBuyOrderPlacementLimit
5977
+ buyLimitConfigured
5978
+ dailySellOrderPlacementLimit
5979
+ sellLimitConfigured
5980
+ }
5981
+ }
5982
+ `
5983
+ );
5941
5984
 
5942
5985
  // src/orders/subgraph/index.ts
5986
+ var SECONDS_PER_DAY = 86400;
5987
+ var PLACEMENT_LIMIT_CONFIG_ID = (0, import_viem19.stringToHex)("placement-limits");
5988
+ function bucket(used, limit, configured, zeroMeansUnlimited) {
5989
+ if (!configured) return { used, limit: null, remaining: null, state: "unknown" };
5990
+ if (limit === 0 && zeroMeansUnlimited) {
5991
+ return { used, limit: null, remaining: null, state: "unlimited" };
5992
+ }
5993
+ return { used, limit, remaining: Math.max(0, limit - used), state: "enforced" };
5994
+ }
5943
5995
  function getOrdersForUser(subgraphUrl, userAddress, skip, limit, logger = noopLogger) {
5944
5996
  const user = userAddress.toLowerCase();
5945
5997
  logger.debug("fetching orders from subgraph", { subgraphUrl, user, skip, limit });
@@ -5966,6 +6018,54 @@ function getOrdersForUser(subgraphUrl, userAddress, skip, limit, logger = noopLo
5966
6018
  )
5967
6019
  );
5968
6020
  }
6021
+ function getPlacementLimitsForUser(subgraphUrl, userAddress, nowSeconds, logger = noopLogger) {
6022
+ const user = userAddress.toLowerCase();
6023
+ const dayIndex = Math.floor(nowSeconds / SECONDS_PER_DAY);
6024
+ const placementsId = (0, import_viem19.stringToHex)(`${user}-${dayIndex}`);
6025
+ logger.debug("fetching placement limits from subgraph", { subgraphUrl, user, dayIndex });
6026
+ return querySubgraph(subgraphUrl, {
6027
+ query: PLACEMENT_LIMITS_QUERY,
6028
+ variables: { placementsId, configId: PLACEMENT_LIMIT_CONFIG_ID }
6029
+ }).mapErr(
6030
+ (e) => new OrdersError(e.message, {
6031
+ code: "SUBGRAPH_REQUEST_FAILED",
6032
+ cause: e.cause ?? e,
6033
+ context: { user, dayIndex, ...e.context ?? {} }
6034
+ })
6035
+ ).andThen(
6036
+ (data) => validate(
6037
+ ZodSubgraphPlacementLimitsResponseSchema,
6038
+ data,
6039
+ (message, cause, d) => new OrdersError(message, {
6040
+ code: "SUBGRAPH_VALIDATION_FAILED",
6041
+ cause,
6042
+ context: { data: d }
6043
+ })
6044
+ )
6045
+ ).map((validated) => {
6046
+ const placements = validated.userDailyPlacements;
6047
+ const config = validated.orderPlacementLimitConfig;
6048
+ const buyUsed = placements ? Number(placements.buyPlacements) : 0;
6049
+ const sellUsed = placements ? Number(placements.sellPlacements) : 0;
6050
+ return {
6051
+ dayIndex,
6052
+ resetsAt: (dayIndex + 1) * SECONDS_PER_DAY,
6053
+ // A zero BUY cap is a hard block on-chain, not "unlimited".
6054
+ buy: bucket(
6055
+ buyUsed,
6056
+ config ? Number(config.dailyBuyOrderPlacementLimit) : 0,
6057
+ config?.buyLimitConfigured ?? false,
6058
+ false
6059
+ ),
6060
+ sellPay: bucket(
6061
+ sellUsed,
6062
+ config ? Number(config.dailySellOrderPlacementLimit) : 0,
6063
+ config?.sellLimitConfigured ?? false,
6064
+ true
6065
+ )
6066
+ };
6067
+ });
6068
+ }
5969
6069
 
5970
6070
  // src/orders/watch-events.ts
5971
6071
  var PLACED_CONFIG = {
@@ -6141,6 +6241,19 @@ function createOrders(config) {
6141
6241
  ({ userAddress, skip, limit }) => getOrdersForUser(subgraphUrl, userAddress, skip, limit, logger)
6142
6242
  );
6143
6243
  },
6244
+ getPlacementLimits(params) {
6245
+ return validate(
6246
+ ZodGetPlacementLimitsParamsSchema,
6247
+ params,
6248
+ (message, cause, d) => new OrdersError(message, {
6249
+ code: "INVALID_PLACEMENT_LIMITS_PARAMS",
6250
+ cause,
6251
+ context: { params: d }
6252
+ })
6253
+ ).asyncAndThen(
6254
+ ({ userAddress }) => getPlacementLimitsForUser(subgraphUrl, userAddress, Math.floor(Date.now() / 1e3), logger)
6255
+ );
6256
+ },
6144
6257
  getFeeConfig(params) {
6145
6258
  return validate(
6146
6259
  ZodGetFeeConfigParamsSchema,