@citizenwallet/sdk
Version:
An sdk to easily work with citizen wallet.
129 lines • 4.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseMessageFromReceiveLink = exports.parseAliasFromReceiveLink = exports.parseQRCode = exports.parseQRFormat = exports.QRFormat = exports.generateLegacyReceiveLink = void 0;
const gzip_1 = require("../utils/gzip");
const generateLegacyReceiveLink = (baseUrl, config, account, amount, description) => {
const alias = config.community.alias;
let receiveParams = `?address=${account}&alias=${alias}`;
if (amount) {
receiveParams += `&amount=${amount}`;
}
if (description) {
receiveParams += `&message=${description}`;
}
const compressedParams = (0, gzip_1.compress)(receiveParams);
return `${baseUrl}/#/?alias=${alias}&receiveParams=${compressedParams}`;
};
exports.generateLegacyReceiveLink = generateLegacyReceiveLink;
// enum that represents the different qr code formats
var QRFormat;
(function (QRFormat) {
QRFormat[QRFormat["address"] = 0] = "address";
QRFormat[QRFormat["voucher"] = 1] = "voucher";
QRFormat[QRFormat["eip681"] = 2] = "eip681";
QRFormat[QRFormat["eip681Transfer"] = 3] = "eip681Transfer";
QRFormat[QRFormat["receiveUrl"] = 4] = "receiveUrl";
QRFormat[QRFormat["unsupported"] = 5] = "unsupported";
QRFormat[QRFormat["walletConnectPairing"] = 6] = "walletConnectPairing";
})(QRFormat || (exports.QRFormat = QRFormat = {}));
const isWalletConnectURI = (uri) => {
// WalletConnect URI format pattern
const wcPattern = /^wc:[a-f0-9]{64}@\d+\?((?!&)[^&]*&)*relay-protocol=irn(&(?!&)[^&]*)*&symKey=[a-f0-9]{64}(&(?!&)[^&]*)*$/;
return wcPattern.test(uri);
};
const parseQRFormat = (raw) => {
if (raw.startsWith("ethereum:") && !raw.includes("/")) {
return QRFormat.eip681;
}
else if (raw.startsWith("ethereum:") && raw.includes("/transfer")) {
return QRFormat.eip681Transfer;
}
else if (raw.startsWith("0x")) {
return QRFormat.address;
}
else if (raw.includes("receiveParams=")) {
return QRFormat.receiveUrl;
}
else if (raw.includes("voucher=")) {
return QRFormat.voucher;
}
else if (isWalletConnectURI(raw)) {
return QRFormat.walletConnectPairing;
}
else {
return QRFormat.unsupported;
}
};
exports.parseQRFormat = parseQRFormat;
function parseEIP681(raw) {
const url = new URL(raw);
let address = url.pathname.split("/")[1];
if (address.includes("@")) {
// includes chain id, remove
address = address.split("@")[0];
}
const value = url.searchParams.get("value");
return [address, value];
}
function parseEIP681Transfer(raw) {
const url = new URL(raw);
const address = url.searchParams.get("address");
const value = url.searchParams.get("uint256");
return [address || "", value];
}
function parseReceiveLink(raw) {
const receiveUrl = new URL(raw.replace("#/", ""));
const encodedParams = receiveUrl.searchParams.get("receiveParams");
if (encodedParams === null) {
return ["", null];
}
const decodedParams = (0, gzip_1.decompress)(encodedParams);
const params = new URLSearchParams(decodedParams);
const address = params.get("address");
const amount = params.get("amount");
return [address || "", amount];
}
const parseQRCode = (raw) => {
const format = (0, exports.parseQRFormat)(raw);
switch (format) {
case QRFormat.address:
return [raw, null];
case QRFormat.eip681:
return parseEIP681(raw);
case QRFormat.eip681Transfer:
return parseEIP681Transfer(raw);
case QRFormat.receiveUrl:
return parseReceiveLink(raw);
case QRFormat.voucher:
// vouchers are invalid for a transfer
default:
return ["", null];
}
};
exports.parseQRCode = parseQRCode;
const parseAliasFromReceiveLink = (raw) => {
console.log('raw.replace("#/", "")', raw.replace("#/", ""));
const receiveUrl = new URL(raw.replace("#/", ""));
const encodedParams = receiveUrl.searchParams.get("receiveParams");
if (encodedParams === null) {
return null;
}
const decodedParams = (0, gzip_1.decompress)(encodedParams);
const params = new URLSearchParams(decodedParams);
const alias = params.get("alias");
return alias;
};
exports.parseAliasFromReceiveLink = parseAliasFromReceiveLink;
const parseMessageFromReceiveLink = (raw) => {
const receiveUrl = new URL(raw.replace("#/", ""));
const encodedParams = receiveUrl.searchParams.get("receiveParams");
if (encodedParams === null) {
return null;
}
const decodedParams = (0, gzip_1.decompress)(encodedParams);
const params = new URLSearchParams(decodedParams);
const message = params.get("message");
return message;
};
exports.parseMessageFromReceiveLink = parseMessageFromReceiveLink;
//# sourceMappingURL=index.js.map