@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.
- package/README.md +2 -2
- 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 +114 -0
- package/dist/orders.cjs.map +1 -1
- package/dist/orders.d.cts +53 -2
- package/dist/orders.d.ts +53 -2
- package/dist/orders.mjs +114 -0
- package/dist/orders.mjs.map +1 -1
- package/dist/prices.cjs +7 -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 +7 -0
- package/dist/prices.mjs.map +1 -1
- package/dist/profile.cjs +7 -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 +7 -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 +194 -22
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +78 -2
- package/dist/react.d.ts +78 -2
- package/dist/react.mjs +180 -9
- 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.cjs
CHANGED
|
@@ -48,6 +48,7 @@ var CURRENCY = {
|
|
|
48
48
|
ARS: "ARS",
|
|
49
49
|
MEX: "MEX",
|
|
50
50
|
VEN: "VEN",
|
|
51
|
+
BOB: "BOB",
|
|
51
52
|
EUR: "EUR",
|
|
52
53
|
NGN: "NGN",
|
|
53
54
|
USD: "USD",
|
|
@@ -81,6 +82,98 @@ var ARS_COUNTRY_OPTION = {
|
|
|
81
82
|
disabledPaymentTypes: []
|
|
82
83
|
};
|
|
83
84
|
|
|
85
|
+
// src/country/types.ts
|
|
86
|
+
var PACKED_PAYMENT_ID_SEP = "||";
|
|
87
|
+
|
|
88
|
+
// src/country/qr-validator.ts
|
|
89
|
+
function crc16ccitt(s) {
|
|
90
|
+
let crc = 65535;
|
|
91
|
+
for (let i = 0; i < s.length; i++) {
|
|
92
|
+
crc ^= s.charCodeAt(i) << 8;
|
|
93
|
+
for (let j = 0; j < 8; j++) {
|
|
94
|
+
crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
|
|
95
|
+
crc &= 65535;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return crc.toString(16).toUpperCase().padStart(4, "0");
|
|
99
|
+
}
|
|
100
|
+
function validateEmvcoQr(payload, country, currency) {
|
|
101
|
+
if (!payload || payload.trim().length === 0) return false;
|
|
102
|
+
const data = payload.trim();
|
|
103
|
+
const tags = {};
|
|
104
|
+
let pos = 0;
|
|
105
|
+
while (pos + 4 <= data.length) {
|
|
106
|
+
const tag = data.substring(pos, pos + 2);
|
|
107
|
+
const lengthStr = data.substring(pos + 2, pos + 4);
|
|
108
|
+
if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
|
|
109
|
+
const length = Number.parseInt(lengthStr, 10);
|
|
110
|
+
if (pos + 4 + length > data.length) break;
|
|
111
|
+
tags[tag] = data.substring(pos + 4, pos + 4 + length);
|
|
112
|
+
pos += 4 + length;
|
|
113
|
+
}
|
|
114
|
+
if (tags["58"] !== country) return false;
|
|
115
|
+
if (tags["53"] !== currency) return false;
|
|
116
|
+
const crcTag = tags["63"];
|
|
117
|
+
if (!crcTag) return false;
|
|
118
|
+
const marker = data.lastIndexOf("6304");
|
|
119
|
+
if (marker === -1) return false;
|
|
120
|
+
const expected = crc16ccitt(data.substring(0, marker + 4));
|
|
121
|
+
return expected.toUpperCase() === crcTag.toUpperCase();
|
|
122
|
+
}
|
|
123
|
+
function validatePeruvianQr(payload) {
|
|
124
|
+
return validateEmvcoQr(payload, "PE", "604");
|
|
125
|
+
}
|
|
126
|
+
function isBolivianEncryptedQr(payload) {
|
|
127
|
+
const trimmed = payload.trim();
|
|
128
|
+
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
129
|
+
const sep = trimmed.lastIndexOf("|");
|
|
130
|
+
if (sep < 40) return false;
|
|
131
|
+
const blob = trimmed.slice(0, sep);
|
|
132
|
+
const tag = trimmed.slice(sep + 1);
|
|
133
|
+
if (blob.length % 4 !== 0) return false;
|
|
134
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
|
|
135
|
+
return /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);
|
|
136
|
+
}
|
|
137
|
+
function validateBolivianQr(payload) {
|
|
138
|
+
if (!payload || payload.trim().length === 0) return false;
|
|
139
|
+
return isBolivianEncryptedQr(payload) || validateEmvcoQr(payload, "BO", "068");
|
|
140
|
+
}
|
|
141
|
+
function validateVenezuelanQr(payload) {
|
|
142
|
+
if (!payload || typeof payload !== "string") return false;
|
|
143
|
+
const trimmed = payload.trim();
|
|
144
|
+
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
145
|
+
const qIdx = trimmed.indexOf("?");
|
|
146
|
+
if (qIdx < 40) return false;
|
|
147
|
+
const blob = trimmed.substring(0, qIdx);
|
|
148
|
+
if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
|
|
149
|
+
return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/country/currencies/bob.ts
|
|
153
|
+
var BOB_COUNTRY_OPTION = {
|
|
154
|
+
country: "Bolivia",
|
|
155
|
+
currency: CURRENCY.BOB,
|
|
156
|
+
internationalFormat: "BOB",
|
|
157
|
+
symbolNative: "Bs.",
|
|
158
|
+
locale: "es-BO",
|
|
159
|
+
paymentMethod: "QR_SIMPLE",
|
|
160
|
+
paymentAddressName: "QR_SIMPLE_DETAILS",
|
|
161
|
+
timezone: "America/La_Paz",
|
|
162
|
+
timezone_name: "BOT",
|
|
163
|
+
flag: "\u{1F1E7}\u{1F1F4}",
|
|
164
|
+
flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f4.png",
|
|
165
|
+
phoneCode: "+591",
|
|
166
|
+
telegramSupportChannel: "https://t.me/p2pmebolivia",
|
|
167
|
+
twitterUsername: "p2pmebolivia",
|
|
168
|
+
smsCountryCodes: ["BO"],
|
|
169
|
+
precision: 2,
|
|
170
|
+
isAlpha: true,
|
|
171
|
+
disabled: false,
|
|
172
|
+
disabledPaymentTypes: [],
|
|
173
|
+
uploadPaymentQR: true,
|
|
174
|
+
validateQr: validateBolivianQr
|
|
175
|
+
};
|
|
176
|
+
|
|
84
177
|
// src/country/currencies/brl.ts
|
|
85
178
|
var BRL_COUNTRY_OPTION = {
|
|
86
179
|
country: "Brazil",
|
|
@@ -281,55 +374,6 @@ var NGN_COUNTRY_OPTION = {
|
|
|
281
374
|
disabledPaymentTypes: []
|
|
282
375
|
};
|
|
283
376
|
|
|
284
|
-
// src/country/types.ts
|
|
285
|
-
var PACKED_PAYMENT_ID_SEP = "||";
|
|
286
|
-
|
|
287
|
-
// src/country/qr-validator.ts
|
|
288
|
-
function crc16ccitt(s) {
|
|
289
|
-
let crc = 65535;
|
|
290
|
-
for (let i = 0; i < s.length; i++) {
|
|
291
|
-
crc ^= s.charCodeAt(i) << 8;
|
|
292
|
-
for (let j = 0; j < 8; j++) {
|
|
293
|
-
crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
|
|
294
|
-
crc &= 65535;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return crc.toString(16).toUpperCase().padStart(4, "0");
|
|
298
|
-
}
|
|
299
|
-
function validatePeruvianQr(payload) {
|
|
300
|
-
if (!payload || payload.trim().length === 0) return false;
|
|
301
|
-
const data = payload.trim();
|
|
302
|
-
const tags = {};
|
|
303
|
-
let pos = 0;
|
|
304
|
-
while (pos + 4 <= data.length) {
|
|
305
|
-
const tag = data.substring(pos, pos + 2);
|
|
306
|
-
const lengthStr = data.substring(pos + 2, pos + 4);
|
|
307
|
-
if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
|
|
308
|
-
const length = Number.parseInt(lengthStr, 10);
|
|
309
|
-
if (pos + 4 + length > data.length) break;
|
|
310
|
-
tags[tag] = data.substring(pos + 4, pos + 4 + length);
|
|
311
|
-
pos += 4 + length;
|
|
312
|
-
}
|
|
313
|
-
if (tags["58"] !== "PE") return false;
|
|
314
|
-
if (tags["53"] !== "604") return false;
|
|
315
|
-
const crcTag = tags["63"];
|
|
316
|
-
if (!crcTag) return false;
|
|
317
|
-
const marker = data.lastIndexOf("6304");
|
|
318
|
-
if (marker === -1) return false;
|
|
319
|
-
const expected = crc16ccitt(data.substring(0, marker + 4));
|
|
320
|
-
return expected.toUpperCase() === crcTag.toUpperCase();
|
|
321
|
-
}
|
|
322
|
-
function validateVenezuelanQr(payload) {
|
|
323
|
-
if (!payload || typeof payload !== "string") return false;
|
|
324
|
-
const trimmed = payload.trim();
|
|
325
|
-
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
326
|
-
const qIdx = trimmed.indexOf("?");
|
|
327
|
-
if (qIdx < 40) return false;
|
|
328
|
-
const blob = trimmed.substring(0, qIdx);
|
|
329
|
-
if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
|
|
330
|
-
return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
|
|
331
|
-
}
|
|
332
|
-
|
|
333
377
|
// src/country/currencies/pen.ts
|
|
334
378
|
function validatePeruvianPhone(value) {
|
|
335
379
|
if (!value || value.trim().length === 0) return false;
|
|
@@ -484,6 +528,7 @@ var COUNTRY_OPTIONS = [
|
|
|
484
528
|
ARS_COUNTRY_OPTION,
|
|
485
529
|
MEX_COUNTRY_OPTION,
|
|
486
530
|
VEN_COUNTRY_OPTION,
|
|
531
|
+
BOB_COUNTRY_OPTION,
|
|
487
532
|
NGN_COUNTRY_OPTION,
|
|
488
533
|
COP_COUNTRY_OPTION,
|
|
489
534
|
CUP_COUNTRY_OPTION,
|
|
@@ -599,9 +644,6 @@ function parseMercadoPago(qrData, _sellPrice) {
|
|
|
599
644
|
return success({ paymentAddress: merchantName });
|
|
600
645
|
}
|
|
601
646
|
|
|
602
|
-
// src/qr-parsers/parsers/brl.ts
|
|
603
|
-
var import_neverthrow2 = require("neverthrow");
|
|
604
|
-
|
|
605
647
|
// src/qr-parsers/utils/amount.ts
|
|
606
648
|
var DECIMAL_AMOUNT = /^\d+(\.\d+)?$/;
|
|
607
649
|
function parseAmount(amountStr, sellPrice) {
|
|
@@ -614,7 +656,44 @@ function parseAmount(amountStr, sellPrice) {
|
|
|
614
656
|
return { usdc: fiat / sellPrice, fiat };
|
|
615
657
|
}
|
|
616
658
|
|
|
659
|
+
// src/qr-parsers/parsers/bob.ts
|
|
660
|
+
var BOB_TAGS = { AMOUNT: "54", CURRENCY: "53", COUNTRY: "58" };
|
|
661
|
+
function isBolivianEncryptedQr2(payload) {
|
|
662
|
+
if (payload.includes("||")) return false;
|
|
663
|
+
const sep = payload.lastIndexOf("|");
|
|
664
|
+
if (sep < 40) return false;
|
|
665
|
+
const blob = payload.slice(0, sep);
|
|
666
|
+
const tag = payload.slice(sep + 1);
|
|
667
|
+
if (blob.length % 4 !== 0) return false;
|
|
668
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
|
|
669
|
+
return /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);
|
|
670
|
+
}
|
|
671
|
+
function parseBolivia(qrData, sellPrice) {
|
|
672
|
+
if (!qrData || typeof qrData !== "string" || qrData.trim().length === 0) {
|
|
673
|
+
return failure("INVALID_QR", "QR data is empty or invalid");
|
|
674
|
+
}
|
|
675
|
+
const trimmed = qrData.trim();
|
|
676
|
+
if (isBolivianEncryptedQr2(trimmed)) {
|
|
677
|
+
return success({ paymentAddress: trimmed });
|
|
678
|
+
}
|
|
679
|
+
const tags = extractTags(trimmed, [BOB_TAGS.AMOUNT, BOB_TAGS.CURRENCY, BOB_TAGS.COUNTRY]);
|
|
680
|
+
if (tags[BOB_TAGS.COUNTRY] !== "BO" || tags[BOB_TAGS.CURRENCY] !== "068") {
|
|
681
|
+
return failure("INVALID_QR", "Not a valid Bolivia QR Simple QR");
|
|
682
|
+
}
|
|
683
|
+
const result = { paymentAddress: trimmed };
|
|
684
|
+
const amountStr = tags[BOB_TAGS.AMOUNT];
|
|
685
|
+
if (amountStr) {
|
|
686
|
+
const amount = parseAmount(amountStr, sellPrice);
|
|
687
|
+
if (!amount) {
|
|
688
|
+
return failure("INVALID_AMOUNT", "Invalid amount in QR");
|
|
689
|
+
}
|
|
690
|
+
result.amount = amount;
|
|
691
|
+
}
|
|
692
|
+
return success(result);
|
|
693
|
+
}
|
|
694
|
+
|
|
617
695
|
// src/qr-parsers/parsers/brl.ts
|
|
696
|
+
var import_neverthrow2 = require("neverthrow");
|
|
618
697
|
var PIX_TAGS = {
|
|
619
698
|
PAYLOAD_FORMAT: "00",
|
|
620
699
|
PIX_KEY_INFO: "26",
|
|
@@ -1072,6 +1151,8 @@ async function parseQR(params) {
|
|
|
1072
1151
|
return parseMercadoPago(qrData, sellPrice);
|
|
1073
1152
|
case CURRENCY.VEN:
|
|
1074
1153
|
return parsePagoMovil(qrData, sellPrice);
|
|
1154
|
+
case CURRENCY.BOB:
|
|
1155
|
+
return parseBolivia(qrData, sellPrice);
|
|
1075
1156
|
case CURRENCY.NGN:
|
|
1076
1157
|
return parseNGN(qrData, sellPrice);
|
|
1077
1158
|
case CURRENCY.COP:
|