UNPKG

@citizenwallet/sdk

Version:

An sdk to easily work with citizen wallet.

183 lines 7.16 kB
"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