@p2pdotme/sdk 1.2.5 → 1.2.7

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/zkkyc.cjs CHANGED
@@ -30,12 +30,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/zkkyc/index.ts
31
31
  var zkkyc_exports = {};
32
32
  __export(zkkyc_exports, {
33
+ BVN_OTP_METHODS: () => BVN_OTP_METHODS,
33
34
  DEFAULT_RECLAIM_PROVIDER_IDS: () => DEFAULT_RECLAIM_PROVIDER_IDS,
34
35
  RECLAIM_APP_LINKS: () => RECLAIM_APP_LINKS,
35
36
  SIMPLE_KYC_DEFAULT_TENANT: () => SIMPLE_KYC_DEFAULT_TENANT,
36
37
  SOCIAL_PLATFORM_NAMES: () => SOCIAL_PLATFORM_NAMES,
37
38
  ZK_PASSPORT_APP_LINKS: () => ZK_PASSPORT_APP_LINKS,
38
39
  ZkkycError: () => ZkkycError,
40
+ createBvnFlow: () => createBvnFlow,
39
41
  createReclaimFlow: () => createReclaimFlow,
40
42
  createSimpleKycFlow: () => createSimpleKycFlow,
41
43
  createZkPassportFlow: () => createZkPassportFlow,
@@ -188,6 +190,20 @@ var ZodSimpleKycSubmitParamsSchema = import_zod2.z.object({
188
190
  message: "signature must be a hex string"
189
191
  })
190
192
  });
193
+ var ZodBvnSubmitParamsSchema = import_zod2.z.object({
194
+ /** Per-(tenant, identity) Sybil nullifier (bytes32 hex). */
195
+ nullifier: import_zod2.z.string().refine((v) => /^0x[a-fA-F0-9]{64}$/.test(v), {
196
+ message: "nullifier must be a bytes32 hex string"
197
+ }),
198
+ /** Remaining limit in micro-USDC (part of the signed struct). */
199
+ limit: import_zod2.z.bigint(),
200
+ /** Attestation expiry (unix seconds). */
201
+ expiry: import_zod2.z.bigint(),
202
+ /** 65-byte secp256k1 signature (hex). */
203
+ signature: import_zod2.z.string().refine((v) => /^0x[a-fA-F0-9]+$/.test(v), {
204
+ message: "signature must be a hex string"
205
+ })
206
+ });
191
207
 
192
208
  // src/contracts/abis/index.ts
193
209
  var import_viem2 = require("viem");
@@ -992,6 +1008,38 @@ var reputationManagerAbi = [
992
1008
  outputs: [{ internalType: "bool", name: "", type: "bool" }],
993
1009
  stateMutability: "view",
994
1010
  type: "function"
1011
+ },
1012
+ // ── BVN (Nigerian Bank Verification Number) attestation ─────────────────
1013
+ { inputs: [], name: "BvnSignerNotSet", type: "error" },
1014
+ { inputs: [], name: "BvnAttestationExpired", type: "error" },
1015
+ { inputs: [], name: "BvnNullifierAlreadySpent", type: "error" },
1016
+ { inputs: [], name: "BvnAlreadyVerified", type: "error" },
1017
+ { inputs: [], name: "BvnInvalidSignature", type: "error" },
1018
+ {
1019
+ inputs: [
1020
+ { internalType: "bytes32", name: "nullifier", type: "bytes32" },
1021
+ { internalType: "uint256", name: "limit", type: "uint256" },
1022
+ { internalType: "uint256", name: "expiry", type: "uint256" },
1023
+ { internalType: "bytes", name: "signature", type: "bytes" }
1024
+ ],
1025
+ name: "submitBvnAttestation",
1026
+ outputs: [],
1027
+ stateMutability: "nonpayable",
1028
+ type: "function"
1029
+ },
1030
+ {
1031
+ inputs: [],
1032
+ name: "bvnRp",
1033
+ outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
1034
+ stateMutability: "view",
1035
+ type: "function"
1036
+ },
1037
+ {
1038
+ inputs: [{ internalType: "address", name: "", type: "address" }],
1039
+ name: "bvnVerified",
1040
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
1041
+ stateMutability: "view",
1042
+ type: "function"
995
1043
  }
996
1044
  ];
997
1045
 
@@ -1108,6 +1156,33 @@ function prepareSubmitKycAttestation(reputationManagerAddress, params) {
1108
1156
  )()
1109
1157
  );
1110
1158
  }
1159
+ function prepareSubmitBvnAttestation(reputationManagerAddress, params) {
1160
+ return validate(
1161
+ ZodBvnSubmitParamsSchema,
1162
+ params,
1163
+ (message, cause, data) => new ZkkycError(message, { code: "VALIDATION_ERROR", cause, context: { params: data } })
1164
+ ).andThen(
1165
+ (validated) => import_neverthrow2.Result.fromThrowable(
1166
+ () => ({
1167
+ to: reputationManagerAddress,
1168
+ data: (0, import_viem3.encodeFunctionData)({
1169
+ abi: ABIS.EXTERNAL.REPUTATION_MANAGER,
1170
+ functionName: "submitBvnAttestation",
1171
+ args: [
1172
+ validated.nullifier,
1173
+ validated.limit,
1174
+ validated.expiry,
1175
+ validated.signature
1176
+ ]
1177
+ })
1178
+ }),
1179
+ (error) => new ZkkycError("Failed to encode submitBvnAttestation", {
1180
+ code: "ENCODE_ERROR",
1181
+ cause: error
1182
+ })
1183
+ )()
1184
+ );
1185
+ }
1111
1186
  function prepareZkPassportRegister(reputationManagerAddress, params) {
1112
1187
  return validate(
1113
1188
  ZodZkPassportRegisterParamsSchema,
@@ -1156,7 +1231,8 @@ function createZkkyc(config) {
1156
1231
  prepareSocialVerify: (params) => prepareSocialVerify(reputationManagerAddress, params),
1157
1232
  prepareSubmitAnonAadharProof: (params) => prepareSubmitAnonAadharProof(reputationManagerAddress, params),
1158
1233
  prepareZkPassportRegister: (params) => prepareZkPassportRegister(reputationManagerAddress, params),
1159
- prepareSubmitKycAttestation: (params) => prepareSubmitKycAttestation(reputationManagerAddress, params)
1234
+ prepareSubmitKycAttestation: (params) => prepareSubmitKycAttestation(reputationManagerAddress, params),
1235
+ prepareSubmitBvnAttestation: (params) => prepareSubmitBvnAttestation(reputationManagerAddress, params)
1160
1236
  };
1161
1237
  }
1162
1238
 
@@ -1177,9 +1253,149 @@ var RECLAIM_APP_LINKS = {
1177
1253
  ANDROID: "https://play.google.com/store/apps/details?id=org.reclaimprotocol.app"
1178
1254
  };
1179
1255
  var SIMPLE_KYC_DEFAULT_TENANT = "p2p-reputation";
1256
+ var BVN_OTP_METHODS = ["email", "phone", "phone_1", "alternate_phone"];
1180
1257
 
1181
- // src/zkkyc/orchestrators/reclaim.ts
1258
+ // src/zkkyc/orchestrators/bvn.ts
1182
1259
  var import_neverthrow3 = require("neverthrow");
1260
+ function createBvnFlow(config) {
1261
+ const { baseUrl, tenant } = config;
1262
+ async function request(path, failureCode, init, parse) {
1263
+ const response = await fetch(`${baseUrl}${path}`, init);
1264
+ const body = await response.json().catch(() => null);
1265
+ const envelope = body && typeof body === "object" ? body : {};
1266
+ if (!response.ok || envelope.ok === false) {
1267
+ const code = typeof envelope.error === "string" ? envelope.error : "request_failed";
1268
+ const message = typeof envelope.message === "string" ? envelope.message : `BVN request failed (${response.status})`;
1269
+ const isSessionExpired = response.status === 401 || code === "unauthorized";
1270
+ throw new ZkkycError(message, {
1271
+ code: isSessionExpired ? "BVN_SESSION_EXPIRED" : failureCode,
1272
+ context: { status: response.status, backendError: code, path }
1273
+ });
1274
+ }
1275
+ return parse(envelope.data);
1276
+ }
1277
+ function run(failureCode, fn) {
1278
+ return import_neverthrow3.ResultAsync.fromPromise(fn(), (error) => {
1279
+ if (error instanceof ZkkycError) return error;
1280
+ return new ZkkycError("BVN request failed", { code: failureCode, cause: error });
1281
+ });
1282
+ }
1283
+ function authHeaders(token) {
1284
+ return { "content-type": "application/json", "x-session-token": token };
1285
+ }
1286
+ return {
1287
+ onboard(params) {
1288
+ return run(
1289
+ "BVN_ONBOARD_FAILED",
1290
+ () => request(
1291
+ "/v1/onboard",
1292
+ "BVN_ONBOARD_FAILED",
1293
+ {
1294
+ method: "POST",
1295
+ headers: { "content-type": "application/json" },
1296
+ body: JSON.stringify({
1297
+ tenant,
1298
+ wallet: params.walletAddress,
1299
+ scope: params.scope ?? "identity"
1300
+ })
1301
+ },
1302
+ (data) => {
1303
+ const d = data;
1304
+ return { sessionId: d.session_id, sessionToken: d.session_token };
1305
+ }
1306
+ )
1307
+ );
1308
+ },
1309
+ submitBvn(session, bvn) {
1310
+ return run(
1311
+ "BVN_SUBMIT_FAILED",
1312
+ () => request(
1313
+ `/v1/sessions/${session.sessionId}/bvn`,
1314
+ "BVN_SUBMIT_FAILED",
1315
+ {
1316
+ method: "POST",
1317
+ headers: authHeaders(session.sessionToken),
1318
+ body: JSON.stringify({ bvn })
1319
+ },
1320
+ (data) => data.methods
1321
+ )
1322
+ );
1323
+ },
1324
+ sendOtp(session, params) {
1325
+ return run(
1326
+ "BVN_OTP_SEND_FAILED",
1327
+ () => request(
1328
+ `/v1/sessions/${session.sessionId}/otp`,
1329
+ "BVN_OTP_SEND_FAILED",
1330
+ {
1331
+ method: "POST",
1332
+ headers: authHeaders(session.sessionToken),
1333
+ body: JSON.stringify({
1334
+ method: params.method,
1335
+ ...params.method === "alternate_phone" && params.phoneNumber ? { phone_number: params.phoneNumber } : {}
1336
+ })
1337
+ },
1338
+ (data) => data.sent
1339
+ )
1340
+ );
1341
+ },
1342
+ confirmOtp(session, otp) {
1343
+ return run(
1344
+ "BVN_OTP_CONFIRM_FAILED",
1345
+ () => request(
1346
+ `/v1/sessions/${session.sessionId}/otp/confirm`,
1347
+ "BVN_OTP_CONFIRM_FAILED",
1348
+ {
1349
+ method: "POST",
1350
+ headers: authHeaders(session.sessionToken),
1351
+ body: JSON.stringify({ otp })
1352
+ },
1353
+ (data) => {
1354
+ const d = data;
1355
+ return { decision: d.decision, reason: d.reason };
1356
+ }
1357
+ )
1358
+ );
1359
+ },
1360
+ getAttestation(session) {
1361
+ return run(
1362
+ "BVN_ATTESTATION_FAILED",
1363
+ () => request(
1364
+ `/v1/sessions/${session.sessionId}/attestation`,
1365
+ "BVN_ATTESTATION_FAILED",
1366
+ {
1367
+ method: "POST",
1368
+ headers: { "x-session-token": session.sessionToken }
1369
+ },
1370
+ (data) => {
1371
+ const d = data;
1372
+ return {
1373
+ nullifier: d.message.nullifier,
1374
+ limit: BigInt(d.message.limit),
1375
+ expiry: BigInt(d.message.expiry),
1376
+ signature: d.signature,
1377
+ wallet: d.message.wallet
1378
+ };
1379
+ }
1380
+ )
1381
+ );
1382
+ },
1383
+ getAttestor() {
1384
+ return run(
1385
+ "BVN_ATTESTATION_FAILED",
1386
+ () => request(
1387
+ "/v1/attestor",
1388
+ "BVN_ATTESTATION_FAILED",
1389
+ void 0,
1390
+ (data) => data
1391
+ )
1392
+ );
1393
+ }
1394
+ };
1395
+ }
1396
+
1397
+ // src/zkkyc/orchestrators/reclaim.ts
1398
+ var import_neverthrow4 = require("neverthrow");
1183
1399
 
1184
1400
  // src/zkkyc/orchestrators/types.ts
1185
1401
  var SOCIAL_PLATFORM_NAMES = {
@@ -1194,7 +1410,7 @@ var SOCIAL_PLATFORM_NAMES = {
1194
1410
  // src/zkkyc/orchestrators/reclaim.ts
1195
1411
  var RECLAIM_SESSION_API = "https://api.reclaimprotocol.org/api/sdk/session";
1196
1412
  function createReclaimFlow(params) {
1197
- return import_neverthrow3.ResultAsync.fromPromise(
1413
+ return import_neverthrow4.ResultAsync.fromPromise(
1198
1414
  (async () => {
1199
1415
  const mod = await import("@reclaimprotocol/js-sdk").catch(() => {
1200
1416
  throw new ZkkycError(
@@ -1298,7 +1514,7 @@ function createReclaimFlow(params) {
1298
1514
  const session = {
1299
1515
  sessionId,
1300
1516
  requestUrl,
1301
- start: () => import_neverthrow3.ResultAsync.fromPromise(pollForProof(), (error) => {
1517
+ start: () => import_neverthrow4.ResultAsync.fromPromise(pollForProof(), (error) => {
1302
1518
  if (error instanceof ZkkycError) return error;
1303
1519
  return new ZkkycError("Reclaim verification flow failed", {
1304
1520
  code: "RECLAIM_INIT_FAILED",
@@ -1322,10 +1538,10 @@ function createReclaimFlow(params) {
1322
1538
  }
1323
1539
 
1324
1540
  // src/zkkyc/orchestrators/simple-kyc.ts
1325
- var import_neverthrow4 = require("neverthrow");
1541
+ var import_neverthrow5 = require("neverthrow");
1326
1542
  function createSimpleKycFlow(params) {
1327
1543
  const { baseUrl, walletAddress, tenant, redirectUrl, country, state, onStatus } = params;
1328
- return import_neverthrow4.ResultAsync.fromPromise(
1544
+ return import_neverthrow5.ResultAsync.fromPromise(
1329
1545
  (async () => {
1330
1546
  const res = await fetch(`${baseUrl}/v1/widget/public-sessions`, {
1331
1547
  method: "POST",
@@ -1368,7 +1584,7 @@ function createSimpleKycFlow(params) {
1368
1584
  );
1369
1585
  }
1370
1586
  function resumeSimpleKycFlow(args) {
1371
- return import_neverthrow4.ResultAsync.fromPromise(
1587
+ return import_neverthrow5.ResultAsync.fromPromise(
1372
1588
  (async () => {
1373
1589
  const res = await fetch(`${args.baseUrl}/v1/widget/attestation`, {
1374
1590
  method: "POST",
@@ -1402,9 +1618,9 @@ function resumeSimpleKycFlow(args) {
1402
1618
  }
1403
1619
 
1404
1620
  // src/zkkyc/orchestrators/zk-passport.ts
1405
- var import_neverthrow5 = require("neverthrow");
1621
+ var import_neverthrow6 = require("neverthrow");
1406
1622
  function createZkPassportFlow(params) {
1407
- return import_neverthrow5.ResultAsync.fromPromise(
1623
+ return import_neverthrow6.ResultAsync.fromPromise(
1408
1624
  (async () => {
1409
1625
  const mod = await import("@zkpassport/sdk").catch(() => {
1410
1626
  throw new ZkkycError(
@@ -1500,7 +1716,7 @@ function createZkPassportFlow(params) {
1500
1716
  });
1501
1717
  const session = {
1502
1718
  url,
1503
- result: import_neverthrow5.ResultAsync.fromPromise(resultPromise, (error) => {
1719
+ result: import_neverthrow6.ResultAsync.fromPromise(resultPromise, (error) => {
1504
1720
  if (error instanceof ZkkycError) return error;
1505
1721
  return new ZkkycError("ZK Passport flow failed", {
1506
1722
  code: "ZK_PASSPORT_VERIFICATION_FAILED",
@@ -1524,12 +1740,14 @@ function createZkPassportFlow(params) {
1524
1740
  }
1525
1741
  // Annotate the CommonJS export names for ESM import in node:
1526
1742
  0 && (module.exports = {
1743
+ BVN_OTP_METHODS,
1527
1744
  DEFAULT_RECLAIM_PROVIDER_IDS,
1528
1745
  RECLAIM_APP_LINKS,
1529
1746
  SIMPLE_KYC_DEFAULT_TENANT,
1530
1747
  SOCIAL_PLATFORM_NAMES,
1531
1748
  ZK_PASSPORT_APP_LINKS,
1532
1749
  ZkkycError,
1750
+ createBvnFlow,
1533
1751
  createReclaimFlow,
1534
1752
  createSimpleKycFlow,
1535
1753
  createZkPassportFlow,