@p2pdotme/sdk 1.2.1 → 1.2.3

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 (60) hide show
  1. package/README.md +1 -1
  2. package/dist/country.cjs +117 -2
  3. package/dist/country.cjs.map +1 -1
  4. package/dist/country.d.cts +13 -1
  5. package/dist/country.d.ts +13 -1
  6. package/dist/country.mjs +114 -2
  7. package/dist/country.mjs.map +1 -1
  8. package/dist/fraud-engine.cjs +2 -1
  9. package/dist/fraud-engine.cjs.map +1 -1
  10. package/dist/fraud-engine.mjs +2 -1
  11. package/dist/fraud-engine.mjs.map +1 -1
  12. package/dist/index.cjs +3 -2
  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 +3 -2
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/orders.cjs +42 -1
  19. package/dist/orders.cjs.map +1 -1
  20. package/dist/orders.d.cts +2 -0
  21. package/dist/orders.d.ts +2 -0
  22. package/dist/orders.mjs +42 -1
  23. package/dist/orders.mjs.map +1 -1
  24. package/dist/prices.cjs +42 -1
  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 +42 -1
  29. package/dist/prices.mjs.map +1 -1
  30. package/dist/profile.cjs +42 -1
  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 +42 -1
  35. package/dist/profile.mjs.map +1 -1
  36. package/dist/qr-parsers.cjs +50 -1
  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 +50 -1
  41. package/dist/qr-parsers.mjs.map +1 -1
  42. package/dist/react.cjs +71 -2
  43. package/dist/react.cjs.map +1 -1
  44. package/dist/react.d.cts +18 -1
  45. package/dist/react.d.ts +18 -1
  46. package/dist/react.mjs +71 -2
  47. package/dist/react.mjs.map +1 -1
  48. package/dist/stake.cjs +28 -1
  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 +28 -1
  53. package/dist/stake.mjs.map +1 -1
  54. package/dist/zkkyc.cjs +234 -51
  55. package/dist/zkkyc.cjs.map +1 -1
  56. package/dist/zkkyc.d.cts +106 -5
  57. package/dist/zkkyc.d.ts +106 -5
  58. package/dist/zkkyc.mjs +230 -50
  59. package/dist/zkkyc.mjs.map +1 -1
  60. package/package.json +32 -12
package/dist/zkkyc.mjs CHANGED
@@ -32,7 +32,8 @@ var CURRENCY = {
32
32
  EUR: "EUR",
33
33
  NGN: "NGN",
34
34
  USD: "USD",
35
- COP: "COP"
35
+ COP: "COP",
36
+ ECU: "ECU"
36
37
  };
37
38
  var CURRENCY_CODES = Object.values(CURRENCY);
38
39
 
@@ -126,6 +127,20 @@ var ZodZkPassportRegisterParamsSchema = z2.object({
126
127
  params: ZodSolidityVerifierParametersSchema,
127
128
  isIDCard: z2.boolean()
128
129
  });
130
+ var ZodSimpleKycSubmitParamsSchema = z2.object({
131
+ /** Per-(tenant, identity) Sybil nullifier (bytes32 hex). */
132
+ nullifier: z2.string().refine((v) => /^0x[a-fA-F0-9]{64}$/.test(v), {
133
+ message: "nullifier must be a bytes32 hex string"
134
+ }),
135
+ /** Remaining limit in micro-USDC (part of the signed struct). */
136
+ limit: z2.bigint(),
137
+ /** Attestation expiry (unix seconds). */
138
+ expiry: z2.bigint(),
139
+ /** 65-byte secp256k1 signature (hex). */
140
+ signature: z2.string().refine((v) => /^0x[a-fA-F0-9]+$/.test(v), {
141
+ message: "signature must be a hex string"
142
+ })
143
+ });
129
144
 
130
145
  // src/contracts/abis/index.ts
131
146
  import { erc20Abi } from "viem";
@@ -904,6 +919,32 @@ var reputationManagerAbi = [
904
919
  outputs: [],
905
920
  stateMutability: "nonpayable",
906
921
  type: "function"
922
+ },
923
+ {
924
+ inputs: [
925
+ { internalType: "bytes32", name: "nullifier", type: "bytes32" },
926
+ { internalType: "uint256", name: "limit", type: "uint256" },
927
+ { internalType: "uint256", name: "expiry", type: "uint256" },
928
+ { internalType: "bytes", name: "signature", type: "bytes" }
929
+ ],
930
+ name: "submitKycAttestation",
931
+ outputs: [],
932
+ stateMutability: "nonpayable",
933
+ type: "function"
934
+ },
935
+ {
936
+ inputs: [],
937
+ name: "kycRp",
938
+ outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
939
+ stateMutability: "view",
940
+ type: "function"
941
+ },
942
+ {
943
+ inputs: [{ internalType: "address", name: "", type: "address" }],
944
+ name: "kycVerified",
945
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
946
+ stateMutability: "view",
947
+ type: "function"
907
948
  }
908
949
  ];
909
950
 
@@ -993,6 +1034,33 @@ function prepareSubmitAnonAadharProof(reputationManagerAddress, params) {
993
1034
  )()
994
1035
  );
995
1036
  }
1037
+ function prepareSubmitKycAttestation(reputationManagerAddress, params) {
1038
+ return validate(
1039
+ ZodSimpleKycSubmitParamsSchema,
1040
+ params,
1041
+ (message, cause, data) => new ZkkycError(message, { code: "VALIDATION_ERROR", cause, context: { params: data } })
1042
+ ).andThen(
1043
+ (validated) => Result.fromThrowable(
1044
+ () => ({
1045
+ to: reputationManagerAddress,
1046
+ data: encodeFunctionData({
1047
+ abi: ABIS.EXTERNAL.REPUTATION_MANAGER,
1048
+ functionName: "submitKycAttestation",
1049
+ args: [
1050
+ validated.nullifier,
1051
+ validated.limit,
1052
+ validated.expiry,
1053
+ validated.signature
1054
+ ]
1055
+ })
1056
+ }),
1057
+ (error) => new ZkkycError("Failed to encode submitKycAttestation", {
1058
+ code: "ENCODE_ERROR",
1059
+ cause: error
1060
+ })
1061
+ )()
1062
+ );
1063
+ }
996
1064
  function prepareZkPassportRegister(reputationManagerAddress, params) {
997
1065
  return validate(
998
1066
  ZodZkPassportRegisterParamsSchema,
@@ -1040,7 +1108,8 @@ function createZkkyc(config) {
1040
1108
  return {
1041
1109
  prepareSocialVerify: (params) => prepareSocialVerify(reputationManagerAddress, params),
1042
1110
  prepareSubmitAnonAadharProof: (params) => prepareSubmitAnonAadharProof(reputationManagerAddress, params),
1043
- prepareZkPassportRegister: (params) => prepareZkPassportRegister(reputationManagerAddress, params)
1111
+ prepareZkPassportRegister: (params) => prepareZkPassportRegister(reputationManagerAddress, params),
1112
+ prepareSubmitKycAttestation: (params) => prepareSubmitKycAttestation(reputationManagerAddress, params)
1044
1113
  };
1045
1114
  }
1046
1115
 
@@ -1050,7 +1119,8 @@ var DEFAULT_RECLAIM_PROVIDER_IDS = {
1050
1119
  github: "033f0c06-2eb3-48c8-894c-5599c3356d1c",
1051
1120
  x: "aad95818-f726-4a34-be97-8d1f47631b03",
1052
1121
  instagram: "7e5b59a9-56c5-490c-a169-82a443f9b507",
1053
- facebook: "2701510b-c835-4820-84f0-d9e74569656b"
1122
+ facebook: "2701510b-c835-4820-84f0-d9e74569656b",
1123
+ binance: "7e40c007-f432-4d47-ac00-3e0762f8a7a0"
1054
1124
  };
1055
1125
  var ZK_PASSPORT_APP_LINKS = {
1056
1126
  IOS: "https://apps.apple.com/us/app/zkpassport/id6477371975",
@@ -1059,6 +1129,7 @@ var ZK_PASSPORT_APP_LINKS = {
1059
1129
  var RECLAIM_APP_LINKS = {
1060
1130
  ANDROID: "https://play.google.com/store/apps/details?id=org.reclaimprotocol.app"
1061
1131
  };
1132
+ var SIMPLE_KYC_DEFAULT_TENANT = "p2p-reputation";
1062
1133
 
1063
1134
  // src/zkkyc/orchestrators/reclaim.ts
1064
1135
  import { ResultAsync } from "neverthrow";
@@ -1069,7 +1140,8 @@ var SOCIAL_PLATFORM_NAMES = {
1069
1140
  github: "GitHub",
1070
1141
  x: "X",
1071
1142
  instagram: "Instagram",
1072
- facebook: "Facebook"
1143
+ facebook: "Facebook",
1144
+ binance: "Binance"
1073
1145
  };
1074
1146
 
1075
1147
  // src/zkkyc/orchestrators/reclaim.ts
@@ -1099,12 +1171,19 @@ function createReclaimFlow(params) {
1099
1171
  } = params;
1100
1172
  const socialName = SOCIAL_PLATFORM_NAMES[platform];
1101
1173
  const providerId = providerIds[platform];
1174
+ let reclaimProofRequest = null;
1102
1175
  let sessionId;
1176
+ let requestUrl = "";
1103
1177
  if (existingSessionId) {
1104
1178
  sessionId = existingSessionId;
1105
1179
  } else {
1106
- const reclaimProofRequest = await ReclaimProofRequest.init(appId, appSecret, providerId, {
1107
- launchOptions: { canUseDeferredDeepLinksFlow: true }
1180
+ reclaimProofRequest = await ReclaimProofRequest.init(appId, appSecret, providerId, {
1181
+ launchOptions: {
1182
+ canUseDeferredDeepLinksFlow: true,
1183
+ verificationMode: "app"
1184
+ },
1185
+ useAppClip: true,
1186
+ log: true
1108
1187
  });
1109
1188
  const statusUrl = reclaimProofRequest.getStatusUrl();
1110
1189
  sessionId = statusUrl.split("/").pop() || "";
@@ -1118,54 +1197,72 @@ function createReclaimFlow(params) {
1118
1197
  walletAddress,
1119
1198
  contextDescription ?? `Social verification for ${socialName}`
1120
1199
  );
1121
- const requestUrl = await reclaimProofRequest.getRequestUrl();
1200
+ requestUrl = await reclaimProofRequest.getRequestUrl();
1122
1201
  onStatus?.({ type: "session_created", sessionId, requestUrl });
1123
- if (typeof window !== "undefined") {
1124
- reclaimProofRequest.triggerReclaimFlow();
1125
- }
1126
1202
  }
1127
- onStatus?.({ type: "polling_started", sessionId });
1128
- while (true) {
1129
- if (signal?.aborted) {
1130
- throw new ZkkycError("Reclaim polling aborted", {
1131
- code: "RECLAIM_POLLING_ABORTED"
1132
- });
1203
+ let aborted = false;
1204
+ const pollForProof = async () => {
1205
+ if (reclaimProofRequest && typeof window !== "undefined") {
1206
+ reclaimProofRequest.triggerReclaimFlow({ verificationMode: "app" });
1133
1207
  }
1134
- const response = await fetch(`${RECLAIM_SESSION_API}/${sessionId}`);
1135
- const data = await response.json();
1136
- if (data?.session?.proofs?.length > 0) {
1137
- const proofs = data.session.proofs;
1138
- onStatus?.({ type: "proof_received" });
1139
- if (platform === "github" && proofs.length > 0) {
1140
- const first = proofs[0];
1141
- if (first?.publicData && Object.keys(first.publicData).length === 0) {
1142
- throw new ZkkycError("GitHub verification eligibility criteria not met", {
1143
- code: "RECLAIM_PROOF_INVALID"
1144
- });
1208
+ onStatus?.({ type: "polling_started", sessionId });
1209
+ while (true) {
1210
+ if (aborted || signal?.aborted) {
1211
+ throw new ZkkycError("Reclaim polling aborted", {
1212
+ code: "RECLAIM_POLLING_ABORTED"
1213
+ });
1214
+ }
1215
+ const response = await fetch(`${RECLAIM_SESSION_API}/${sessionId}`);
1216
+ const data = await response.json();
1217
+ if (data?.session?.proofs?.length > 0) {
1218
+ const proofs = data.session.proofs;
1219
+ onStatus?.({ type: "proof_received" });
1220
+ if (platform === "github" && proofs.length > 0) {
1221
+ const first = proofs[0];
1222
+ if (first?.publicData && Object.keys(first.publicData).length === 0) {
1223
+ throw new ZkkycError("GitHub verification eligibility criteria not met", {
1224
+ code: "RECLAIM_PROOF_INVALID"
1225
+ });
1226
+ }
1145
1227
  }
1228
+ const transformedProofs = proofs.map((proof) => transformForOnchain(proof));
1229
+ onStatus?.({ type: "proof_transformed" });
1230
+ return {
1231
+ _socialName: socialName,
1232
+ proofs: transformedProofs,
1233
+ sessionId
1234
+ };
1146
1235
  }
1147
- const transformedProofs = proofs.map((proof) => transformForOnchain(proof));
1148
- onStatus?.({ type: "proof_transformed" });
1149
- return {
1150
- _socialName: socialName,
1151
- proofs: transformedProofs,
1152
- sessionId
1153
- };
1154
- }
1155
- if (data?.message?.includes("Session not found")) {
1156
- throw new ZkkycError("Reclaim session not found", {
1157
- code: "RECLAIM_SESSION_NOT_FOUND",
1158
- context: { sessionId }
1159
- });
1236
+ if (data?.message?.includes("Session not found")) {
1237
+ throw new ZkkycError("Reclaim session not found", {
1238
+ code: "RECLAIM_SESSION_NOT_FOUND",
1239
+ context: { sessionId }
1240
+ });
1241
+ }
1242
+ if (data?.session?.statusV2 === "PROOF_GENERATION_FAILED") {
1243
+ throw new ZkkycError("Reclaim proof generation failed", {
1244
+ code: "RECLAIM_PROOF_GENERATION_FAILED",
1245
+ context: { sessionId }
1246
+ });
1247
+ }
1248
+ await new Promise((resolve) => setTimeout(resolve, pollingIntervalMs));
1160
1249
  }
1161
- if (data?.session?.statusV2 === "PROOF_GENERATION_FAILED") {
1162
- throw new ZkkycError("Reclaim proof generation failed", {
1163
- code: "RECLAIM_PROOF_GENERATION_FAILED",
1164
- context: { sessionId }
1250
+ };
1251
+ const session = {
1252
+ sessionId,
1253
+ requestUrl,
1254
+ start: () => ResultAsync.fromPromise(pollForProof(), (error) => {
1255
+ if (error instanceof ZkkycError) return error;
1256
+ return new ZkkycError("Reclaim verification flow failed", {
1257
+ code: "RECLAIM_INIT_FAILED",
1258
+ cause: error
1165
1259
  });
1260
+ }),
1261
+ abort: () => {
1262
+ aborted = true;
1166
1263
  }
1167
- await new Promise((resolve) => setTimeout(resolve, pollingIntervalMs));
1168
- }
1264
+ };
1265
+ return session;
1169
1266
  })(),
1170
1267
  (error) => {
1171
1268
  if (error instanceof ZkkycError) return error;
@@ -1177,10 +1274,90 @@ function createReclaimFlow(params) {
1177
1274
  );
1178
1275
  }
1179
1276
 
1180
- // src/zkkyc/orchestrators/zk-passport.ts
1277
+ // src/zkkyc/orchestrators/simple-kyc.ts
1181
1278
  import { ResultAsync as ResultAsync2 } from "neverthrow";
1182
- function createZkPassportFlow(params) {
1279
+ function createSimpleKycFlow(params) {
1280
+ const { baseUrl, walletAddress, tenant, redirectUrl, country, state, onStatus } = params;
1183
1281
  return ResultAsync2.fromPromise(
1282
+ (async () => {
1283
+ const res = await fetch(`${baseUrl}/v1/widget/public-sessions`, {
1284
+ method: "POST",
1285
+ headers: { "Content-Type": "application/json" },
1286
+ body: JSON.stringify({
1287
+ wallet_pubkey: walletAddress,
1288
+ redirect_uri: redirectUrl,
1289
+ tenant,
1290
+ country,
1291
+ state
1292
+ })
1293
+ });
1294
+ if (!res.ok) {
1295
+ const body = await res.text();
1296
+ throw new ZkkycError(`simple-kyc session creation failed: ${res.status} ${body}`, {
1297
+ code: "SIMPLE_KYC_SESSION_FAILED",
1298
+ context: { status: res.status }
1299
+ });
1300
+ }
1301
+ const data = await res.json();
1302
+ const widgetUrl = data.widget_url;
1303
+ onStatus?.({ type: "session_created", widgetUrl });
1304
+ return {
1305
+ widgetUrl,
1306
+ redirect: () => {
1307
+ if (typeof window !== "undefined") {
1308
+ onStatus?.({ type: "redirecting", widgetUrl });
1309
+ window.location.href = widgetUrl;
1310
+ }
1311
+ }
1312
+ };
1313
+ })(),
1314
+ (error) => {
1315
+ if (error instanceof ZkkycError) return error;
1316
+ return new ZkkycError("simple-kyc flow failed to start", {
1317
+ code: "SIMPLE_KYC_SESSION_FAILED",
1318
+ cause: error
1319
+ });
1320
+ }
1321
+ );
1322
+ }
1323
+ function resumeSimpleKycFlow(args) {
1324
+ return ResultAsync2.fromPromise(
1325
+ (async () => {
1326
+ const res = await fetch(`${args.baseUrl}/v1/widget/attestation`, {
1327
+ method: "POST",
1328
+ headers: { "Content-Type": "application/json" },
1329
+ body: JSON.stringify({ code: args.code })
1330
+ });
1331
+ if (!res.ok) {
1332
+ const body = await res.text();
1333
+ throw new ZkkycError(`simple-kyc attestation redemption failed: ${res.status} ${body}`, {
1334
+ code: "SIMPLE_KYC_REDEEM_FAILED",
1335
+ context: { status: res.status }
1336
+ });
1337
+ }
1338
+ const d = await res.json();
1339
+ return {
1340
+ nullifier: d.nullifier,
1341
+ limit: BigInt(d.limit),
1342
+ expiry: BigInt(d.expiry),
1343
+ signature: d.signature,
1344
+ identityHash: d.identity_hash
1345
+ };
1346
+ })(),
1347
+ (error) => {
1348
+ if (error instanceof ZkkycError) return error;
1349
+ return new ZkkycError("simple-kyc attestation redemption failed", {
1350
+ code: "SIMPLE_KYC_REDEEM_FAILED",
1351
+ cause: error
1352
+ });
1353
+ }
1354
+ );
1355
+ }
1356
+
1357
+ // src/zkkyc/orchestrators/zk-passport.ts
1358
+ import { ResultAsync as ResultAsync3 } from "neverthrow";
1359
+ function createZkPassportFlow(params) {
1360
+ return ResultAsync3.fromPromise(
1184
1361
  (async () => {
1185
1362
  const mod = await import("@zkpassport/sdk").catch(() => {
1186
1363
  throw new ZkkycError(
@@ -1276,7 +1453,7 @@ function createZkPassportFlow(params) {
1276
1453
  });
1277
1454
  const session = {
1278
1455
  url,
1279
- result: ResultAsync2.fromPromise(resultPromise, (error) => {
1456
+ result: ResultAsync3.fromPromise(resultPromise, (error) => {
1280
1457
  if (error instanceof ZkkycError) return error;
1281
1458
  return new ZkkycError("ZK Passport flow failed", {
1282
1459
  code: "ZK_PASSPORT_VERIFICATION_FAILED",
@@ -1301,11 +1478,14 @@ function createZkPassportFlow(params) {
1301
1478
  export {
1302
1479
  DEFAULT_RECLAIM_PROVIDER_IDS,
1303
1480
  RECLAIM_APP_LINKS,
1481
+ SIMPLE_KYC_DEFAULT_TENANT,
1304
1482
  SOCIAL_PLATFORM_NAMES,
1305
1483
  ZK_PASSPORT_APP_LINKS,
1306
1484
  ZkkycError,
1307
1485
  createReclaimFlow,
1486
+ createSimpleKycFlow,
1308
1487
  createZkPassportFlow,
1309
- createZkkyc
1488
+ createZkkyc,
1489
+ resumeSimpleKycFlow
1310
1490
  };
1311
1491
  //# sourceMappingURL=zkkyc.mjs.map