@p2pdotme/sdk 1.2.17 → 1.2.18
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 +1 -1
- package/dist/country.cjs +116 -49
- package/dist/country.cjs.map +1 -1
- package/dist/country.d.cts +15 -1
- package/dist/country.d.ts +15 -1
- package/dist/country.mjs +114 -49
- package/dist/country.mjs.map +1 -1
- package/dist/fraud-engine.cjs +1 -0
- package/dist/fraud-engine.cjs.map +1 -1
- package/dist/fraud-engine.mjs +1 -0
- package/dist/fraud-engine.mjs.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/dist/orders.cjs +1 -0
- package/dist/orders.cjs.map +1 -1
- package/dist/orders.d.cts +2 -0
- package/dist/orders.d.ts +2 -0
- package/dist/orders.mjs +1 -0
- package/dist/orders.mjs.map +1 -1
- package/dist/prices.cjs +1 -0
- package/dist/prices.cjs.map +1 -1
- package/dist/prices.d.cts +1 -0
- package/dist/prices.d.ts +1 -0
- package/dist/prices.mjs +1 -0
- package/dist/prices.mjs.map +1 -1
- package/dist/profile.cjs +1 -0
- package/dist/profile.cjs.map +1 -1
- package/dist/profile.d.cts +2 -0
- package/dist/profile.d.ts +2 -0
- package/dist/profile.mjs +1 -0
- package/dist/profile.mjs.map +1 -1
- package/dist/qr-parsers.cjs +133 -52
- package/dist/qr-parsers.cjs.map +1 -1
- package/dist/qr-parsers.d.cts +1 -0
- package/dist/qr-parsers.d.ts +1 -0
- package/dist/qr-parsers.mjs +133 -52
- package/dist/qr-parsers.mjs.map +1 -1
- package/dist/react.cjs +1 -0
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -0
- package/dist/react.d.ts +6 -0
- package/dist/react.mjs +1 -0
- package/dist/react.mjs.map +1 -1
- package/dist/stake.cjs +1 -0
- package/dist/stake.cjs.map +1 -1
- package/dist/stake.d.cts +1 -0
- package/dist/stake.d.ts +1 -0
- package/dist/stake.mjs +1 -0
- package/dist/stake.mjs.map +1 -1
- package/dist/zkkyc.cjs +1 -0
- package/dist/zkkyc.cjs.map +1 -1
- package/dist/zkkyc.mjs +1 -0
- package/dist/zkkyc.mjs.map +1 -1
- package/package.json +1 -1
package/dist/qr-parsers.mjs
CHANGED
|
@@ -20,6 +20,7 @@ var CURRENCY = {
|
|
|
20
20
|
ARS: "ARS",
|
|
21
21
|
MEX: "MEX",
|
|
22
22
|
VEN: "VEN",
|
|
23
|
+
BOB: "BOB",
|
|
23
24
|
EUR: "EUR",
|
|
24
25
|
NGN: "NGN",
|
|
25
26
|
USD: "USD",
|
|
@@ -53,6 +54,98 @@ var ARS_COUNTRY_OPTION = {
|
|
|
53
54
|
disabledPaymentTypes: []
|
|
54
55
|
};
|
|
55
56
|
|
|
57
|
+
// src/country/types.ts
|
|
58
|
+
var PACKED_PAYMENT_ID_SEP = "||";
|
|
59
|
+
|
|
60
|
+
// src/country/qr-validator.ts
|
|
61
|
+
function crc16ccitt(s) {
|
|
62
|
+
let crc = 65535;
|
|
63
|
+
for (let i = 0; i < s.length; i++) {
|
|
64
|
+
crc ^= s.charCodeAt(i) << 8;
|
|
65
|
+
for (let j = 0; j < 8; j++) {
|
|
66
|
+
crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
|
|
67
|
+
crc &= 65535;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return crc.toString(16).toUpperCase().padStart(4, "0");
|
|
71
|
+
}
|
|
72
|
+
function validateEmvcoQr(payload, country, currency) {
|
|
73
|
+
if (!payload || payload.trim().length === 0) return false;
|
|
74
|
+
const data = payload.trim();
|
|
75
|
+
const tags = {};
|
|
76
|
+
let pos = 0;
|
|
77
|
+
while (pos + 4 <= data.length) {
|
|
78
|
+
const tag = data.substring(pos, pos + 2);
|
|
79
|
+
const lengthStr = data.substring(pos + 2, pos + 4);
|
|
80
|
+
if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
|
|
81
|
+
const length = Number.parseInt(lengthStr, 10);
|
|
82
|
+
if (pos + 4 + length > data.length) break;
|
|
83
|
+
tags[tag] = data.substring(pos + 4, pos + 4 + length);
|
|
84
|
+
pos += 4 + length;
|
|
85
|
+
}
|
|
86
|
+
if (tags["58"] !== country) return false;
|
|
87
|
+
if (tags["53"] !== currency) return false;
|
|
88
|
+
const crcTag = tags["63"];
|
|
89
|
+
if (!crcTag) return false;
|
|
90
|
+
const marker = data.lastIndexOf("6304");
|
|
91
|
+
if (marker === -1) return false;
|
|
92
|
+
const expected = crc16ccitt(data.substring(0, marker + 4));
|
|
93
|
+
return expected.toUpperCase() === crcTag.toUpperCase();
|
|
94
|
+
}
|
|
95
|
+
function validatePeruvianQr(payload) {
|
|
96
|
+
return validateEmvcoQr(payload, "PE", "604");
|
|
97
|
+
}
|
|
98
|
+
function isBolivianEncryptedQr(payload) {
|
|
99
|
+
const trimmed = payload.trim();
|
|
100
|
+
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
101
|
+
const sep = trimmed.lastIndexOf("|");
|
|
102
|
+
if (sep < 40) return false;
|
|
103
|
+
const blob = trimmed.slice(0, sep);
|
|
104
|
+
const tag = trimmed.slice(sep + 1);
|
|
105
|
+
if (blob.length % 4 !== 0) return false;
|
|
106
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
|
|
107
|
+
return /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);
|
|
108
|
+
}
|
|
109
|
+
function validateBolivianQr(payload) {
|
|
110
|
+
if (!payload || payload.trim().length === 0) return false;
|
|
111
|
+
return isBolivianEncryptedQr(payload) || validateEmvcoQr(payload, "BO", "068");
|
|
112
|
+
}
|
|
113
|
+
function validateVenezuelanQr(payload) {
|
|
114
|
+
if (!payload || typeof payload !== "string") return false;
|
|
115
|
+
const trimmed = payload.trim();
|
|
116
|
+
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
117
|
+
const qIdx = trimmed.indexOf("?");
|
|
118
|
+
if (qIdx < 40) return false;
|
|
119
|
+
const blob = trimmed.substring(0, qIdx);
|
|
120
|
+
if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
|
|
121
|
+
return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// src/country/currencies/bob.ts
|
|
125
|
+
var BOB_COUNTRY_OPTION = {
|
|
126
|
+
country: "Bolivia",
|
|
127
|
+
currency: CURRENCY.BOB,
|
|
128
|
+
internationalFormat: "BOB",
|
|
129
|
+
symbolNative: "Bs.",
|
|
130
|
+
locale: "es-BO",
|
|
131
|
+
paymentMethod: "QR_SIMPLE",
|
|
132
|
+
paymentAddressName: "QR_SIMPLE_DETAILS",
|
|
133
|
+
timezone: "America/La_Paz",
|
|
134
|
+
timezone_name: "BOT",
|
|
135
|
+
flag: "\u{1F1E7}\u{1F1F4}",
|
|
136
|
+
flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f4.png",
|
|
137
|
+
phoneCode: "+591",
|
|
138
|
+
telegramSupportChannel: "https://t.me/p2pmebolivia",
|
|
139
|
+
twitterUsername: "p2pmebolivia",
|
|
140
|
+
smsCountryCodes: ["BO"],
|
|
141
|
+
precision: 2,
|
|
142
|
+
isAlpha: true,
|
|
143
|
+
disabled: false,
|
|
144
|
+
disabledPaymentTypes: [],
|
|
145
|
+
uploadPaymentQR: true,
|
|
146
|
+
validateQr: validateBolivianQr
|
|
147
|
+
};
|
|
148
|
+
|
|
56
149
|
// src/country/currencies/brl.ts
|
|
57
150
|
var BRL_COUNTRY_OPTION = {
|
|
58
151
|
country: "Brazil",
|
|
@@ -253,55 +346,6 @@ var NGN_COUNTRY_OPTION = {
|
|
|
253
346
|
disabledPaymentTypes: []
|
|
254
347
|
};
|
|
255
348
|
|
|
256
|
-
// src/country/types.ts
|
|
257
|
-
var PACKED_PAYMENT_ID_SEP = "||";
|
|
258
|
-
|
|
259
|
-
// src/country/qr-validator.ts
|
|
260
|
-
function crc16ccitt(s) {
|
|
261
|
-
let crc = 65535;
|
|
262
|
-
for (let i = 0; i < s.length; i++) {
|
|
263
|
-
crc ^= s.charCodeAt(i) << 8;
|
|
264
|
-
for (let j = 0; j < 8; j++) {
|
|
265
|
-
crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
|
|
266
|
-
crc &= 65535;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return crc.toString(16).toUpperCase().padStart(4, "0");
|
|
270
|
-
}
|
|
271
|
-
function validatePeruvianQr(payload) {
|
|
272
|
-
if (!payload || payload.trim().length === 0) return false;
|
|
273
|
-
const data = payload.trim();
|
|
274
|
-
const tags = {};
|
|
275
|
-
let pos = 0;
|
|
276
|
-
while (pos + 4 <= data.length) {
|
|
277
|
-
const tag = data.substring(pos, pos + 2);
|
|
278
|
-
const lengthStr = data.substring(pos + 2, pos + 4);
|
|
279
|
-
if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
|
|
280
|
-
const length = Number.parseInt(lengthStr, 10);
|
|
281
|
-
if (pos + 4 + length > data.length) break;
|
|
282
|
-
tags[tag] = data.substring(pos + 4, pos + 4 + length);
|
|
283
|
-
pos += 4 + length;
|
|
284
|
-
}
|
|
285
|
-
if (tags["58"] !== "PE") return false;
|
|
286
|
-
if (tags["53"] !== "604") return false;
|
|
287
|
-
const crcTag = tags["63"];
|
|
288
|
-
if (!crcTag) return false;
|
|
289
|
-
const marker = data.lastIndexOf("6304");
|
|
290
|
-
if (marker === -1) return false;
|
|
291
|
-
const expected = crc16ccitt(data.substring(0, marker + 4));
|
|
292
|
-
return expected.toUpperCase() === crcTag.toUpperCase();
|
|
293
|
-
}
|
|
294
|
-
function validateVenezuelanQr(payload) {
|
|
295
|
-
if (!payload || typeof payload !== "string") return false;
|
|
296
|
-
const trimmed = payload.trim();
|
|
297
|
-
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
298
|
-
const qIdx = trimmed.indexOf("?");
|
|
299
|
-
if (qIdx < 40) return false;
|
|
300
|
-
const blob = trimmed.substring(0, qIdx);
|
|
301
|
-
if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
|
|
302
|
-
return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
|
|
303
|
-
}
|
|
304
|
-
|
|
305
349
|
// src/country/currencies/pen.ts
|
|
306
350
|
function validatePeruvianPhone(value) {
|
|
307
351
|
if (!value || value.trim().length === 0) return false;
|
|
@@ -456,6 +500,7 @@ var COUNTRY_OPTIONS = [
|
|
|
456
500
|
ARS_COUNTRY_OPTION,
|
|
457
501
|
MEX_COUNTRY_OPTION,
|
|
458
502
|
VEN_COUNTRY_OPTION,
|
|
503
|
+
BOB_COUNTRY_OPTION,
|
|
459
504
|
NGN_COUNTRY_OPTION,
|
|
460
505
|
COP_COUNTRY_OPTION,
|
|
461
506
|
CUP_COUNTRY_OPTION,
|
|
@@ -571,9 +616,6 @@ function parseMercadoPago(qrData, _sellPrice) {
|
|
|
571
616
|
return success({ paymentAddress: merchantName });
|
|
572
617
|
}
|
|
573
618
|
|
|
574
|
-
// src/qr-parsers/parsers/brl.ts
|
|
575
|
-
import { err as err2, ok as ok2 } from "neverthrow";
|
|
576
|
-
|
|
577
619
|
// src/qr-parsers/utils/amount.ts
|
|
578
620
|
var DECIMAL_AMOUNT = /^\d+(\.\d+)?$/;
|
|
579
621
|
function parseAmount(amountStr, sellPrice) {
|
|
@@ -586,7 +628,44 @@ function parseAmount(amountStr, sellPrice) {
|
|
|
586
628
|
return { usdc: fiat / sellPrice, fiat };
|
|
587
629
|
}
|
|
588
630
|
|
|
631
|
+
// src/qr-parsers/parsers/bob.ts
|
|
632
|
+
var BOB_TAGS = { AMOUNT: "54", CURRENCY: "53", COUNTRY: "58" };
|
|
633
|
+
function isBolivianEncryptedQr2(payload) {
|
|
634
|
+
if (payload.includes("||")) return false;
|
|
635
|
+
const sep = payload.lastIndexOf("|");
|
|
636
|
+
if (sep < 40) return false;
|
|
637
|
+
const blob = payload.slice(0, sep);
|
|
638
|
+
const tag = payload.slice(sep + 1);
|
|
639
|
+
if (blob.length % 4 !== 0) return false;
|
|
640
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
|
|
641
|
+
return /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);
|
|
642
|
+
}
|
|
643
|
+
function parseBolivia(qrData, sellPrice) {
|
|
644
|
+
if (!qrData || typeof qrData !== "string" || qrData.trim().length === 0) {
|
|
645
|
+
return failure("INVALID_QR", "QR data is empty or invalid");
|
|
646
|
+
}
|
|
647
|
+
const trimmed = qrData.trim();
|
|
648
|
+
if (isBolivianEncryptedQr2(trimmed)) {
|
|
649
|
+
return success({ paymentAddress: trimmed });
|
|
650
|
+
}
|
|
651
|
+
const tags = extractTags(trimmed, [BOB_TAGS.AMOUNT, BOB_TAGS.CURRENCY, BOB_TAGS.COUNTRY]);
|
|
652
|
+
if (tags[BOB_TAGS.COUNTRY] !== "BO" || tags[BOB_TAGS.CURRENCY] !== "068") {
|
|
653
|
+
return failure("INVALID_QR", "Not a valid Bolivia QR Simple QR");
|
|
654
|
+
}
|
|
655
|
+
const result = { paymentAddress: trimmed };
|
|
656
|
+
const amountStr = tags[BOB_TAGS.AMOUNT];
|
|
657
|
+
if (amountStr) {
|
|
658
|
+
const amount = parseAmount(amountStr, sellPrice);
|
|
659
|
+
if (!amount) {
|
|
660
|
+
return failure("INVALID_AMOUNT", "Invalid amount in QR");
|
|
661
|
+
}
|
|
662
|
+
result.amount = amount;
|
|
663
|
+
}
|
|
664
|
+
return success(result);
|
|
665
|
+
}
|
|
666
|
+
|
|
589
667
|
// src/qr-parsers/parsers/brl.ts
|
|
668
|
+
import { err as err2, ok as ok2 } from "neverthrow";
|
|
590
669
|
var PIX_TAGS = {
|
|
591
670
|
PAYLOAD_FORMAT: "00",
|
|
592
671
|
PIX_KEY_INFO: "26",
|
|
@@ -1044,6 +1123,8 @@ async function parseQR(params) {
|
|
|
1044
1123
|
return parseMercadoPago(qrData, sellPrice);
|
|
1045
1124
|
case CURRENCY.VEN:
|
|
1046
1125
|
return parsePagoMovil(qrData, sellPrice);
|
|
1126
|
+
case CURRENCY.BOB:
|
|
1127
|
+
return parseBolivia(qrData, sellPrice);
|
|
1047
1128
|
case CURRENCY.NGN:
|
|
1048
1129
|
return parseNGN(qrData, sellPrice);
|
|
1049
1130
|
case CURRENCY.COP:
|