@citizenwallet/sdk
Version:
An sdk to easily work with citizen wallet.
183 lines • 7.16 kB
JavaScript
"use strict";
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[QRFormat["sendtoUrl"] = 7] = "sendtoUrl";
QRFormat[QRFormat["calldataUrl"] = 8] = "calldataUrl";
})(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("http://") || raw.startsWith("https://")) &&
raw.includes("sendto=")) {
return QRFormat.sendtoUrl;
}
else if ((raw.startsWith("http://") || raw.startsWith("https://")) &&
raw.includes("calldata=")) {
return QRFormat.calldataUrl;
}
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("/")[0];
if (address.includes("@")) {
// includes chain id, remove
address = address.split("@")[0];
}
const value = url.searchParams.get("value");
return [address, value, null, null];
}
function parseEIP681Transfer(raw) {
const url = new URL(raw);
const address = url.searchParams.get("address");
const value = url.searchParams.get("uint256");
return [address || "", value, null, null];
}
function parseReceiveLink(raw) {
const receiveUrl = new URL(raw.replace("#/", ""));
const encodedParams = receiveUrl.searchParams.get("receiveParams");
if (encodedParams === null) {
return ["", null, null, null];
}
const decodedParams = (0, gzip_1.decompress)(encodedParams);
const params = new URLSearchParams(decodedParams);
const address = params.get("address");
const amount = params.get("amount");
const description = params.get("description");
const alias = params.get("alias");
return [address || "", amount, description, alias];
}
function parseSendtoUrl(raw) {
// Replace '/#/' with '/' in the URL
const cleanRaw = raw.replace("/#/", "/");
// Decode URL components
const decodedRaw = decodeURIComponent(cleanRaw);
// Parse URL and get query parameters
const receiveUrl = new URL(decodedRaw);
const params = receiveUrl.searchParams;
const sendToParam = params.get("sendto");
const amountParam = params.get("amount");
const descriptionParam = params.get("description");
// Return early if no sendto parameter
if (!sendToParam) {
return ["", null, null, null];
}
// Split sendto parameter into address and alias
const [address, alias] = sendToParam.split("@");
// Return parsed data
return [address, amountParam, descriptionParam, alias];
}
function parseCalldataUrl(raw) {
// Replace '/#/' with '/' in the URL
const cleanRaw = raw.replace("/#/", "/");
// Decode URL components
const decodedRaw = decodeURIComponent(cleanRaw);
// Parse URL and get query parameters
const receiveUrl = new URL(decodedRaw);
const params = receiveUrl.searchParams;
const addressParam = params.get("address");
const calldataParam = params.get("calldata");
const valueParam = params.get("value");
// Return early if no sendto parameter
if (!calldataParam || !addressParam) {
return ["", null, null, null];
}
// Return parsed data
return [addressParam, valueParam ?? "0", null, calldataParam];
}
const parseQRCode = (raw) => {
const format = (0, exports.parseQRFormat)(raw);
switch (format) {
case QRFormat.address:
return [raw, null, null, null];
case QRFormat.eip681:
return parseEIP681(raw);
case QRFormat.eip681Transfer:
return parseEIP681Transfer(raw);
case QRFormat.receiveUrl:
return parseReceiveLink(raw);
case QRFormat.sendtoUrl:
return parseSendtoUrl(raw);
case QRFormat.calldataUrl:
return parseCalldataUrl(raw);
case QRFormat.voucher:
// vouchers are invalid for a transfer
default:
return ["", null, null, 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