UNPKG

@citizenwallet/sdk

Version:

An sdk to easily work with citizen wallet.

91 lines 4.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.verifyConnectedUrl = exports.verifyConnectedHeaders = exports.createConnectedUrl = exports.generateConnectedHeaders = exports.generateConnectionMessage = void 0; const ethers_1 = require("ethers"); const accounts_1 = require("../accounts"); const generateConnectionMessage = (accountAddress, expiryTimeStamp, redirectUrl) => { let message = `Signature auth for ${(0, ethers_1.getAddress)(accountAddress)} with expiry ${expiryTimeStamp}`; if (redirectUrl) { message += ` and redirect ${encodeURIComponent(redirectUrl)}`; } return (0, ethers_1.id)(message); }; exports.generateConnectionMessage = generateConnectionMessage; const generateConnectedHeaders = async (signer, accountAddress, expiryTimeStamp, redirectUrl) => { const message = (0, exports.generateConnectionMessage)(accountAddress, expiryTimeStamp, redirectUrl); const signature = await signer.signMessage((0, ethers_1.getBytes)(message)); return { "x-sigauth-account": accountAddress, "x-sigauth-expiry": expiryTimeStamp, "x-sigauth-signature": signature, "x-sigauth-redirect": redirectUrl, }; }; exports.generateConnectedHeaders = generateConnectedHeaders; const createConnectedUrl = async (url, signer, accountAddress, expiryTimeStamp, redirectUrl) => { const message = (0, exports.generateConnectionMessage)(accountAddress, expiryTimeStamp, redirectUrl); const signature = await signer.signMessage((0, ethers_1.getBytes)(message)); const params = new URLSearchParams({ sigAuthAccount: accountAddress, sigAuthExpiry: expiryTimeStamp, sigAuthSignature: signature, }); if (redirectUrl) { params.set("sigAuthRedirect", redirectUrl); } return url.includes("?") ? `${url}&${params.toString()}` : `${url}?${params.toString()}`; }; exports.createConnectedUrl = createConnectedUrl; const verifyConnectedHeaders = async (config, headers) => { const account = headers.get("x-sigauth-account"); const expiry = headers.get("x-sigauth-expiry"); const signature = headers.get("x-sigauth-signature"); const redirect = headers.get("x-sigauth-redirect") || undefined; if (!account || !expiry || !signature) { const missingHeaders = [ !account && "x-sigauth-account", !expiry && "x-sigauth-expiry", !signature && "x-sigauth-signature", ].filter(Boolean); throw new Error(`Invalid connection request: missing ${missingHeaders.join(", ")}`); } if (new Date(expiry).getTime() < Date.now()) { throw new Error("Connection request expired"); } const message = (0, exports.generateConnectionMessage)(account, expiry, redirect); const verified = await (0, accounts_1.verifyAccountOwnership)(config, account, message, signature); if (!verified) { throw new Error("Invalid signature or account ownership verification failed"); } return verified ? account : null; }; exports.verifyConnectedHeaders = verifyConnectedHeaders; const verifyConnectedUrl = async (config, options) => { if (!options.url && !options.params) { throw new Error("Either url or params must be provided"); } const params = options.params || new URLSearchParams(options.url?.split("?")[1]); const sigAuthAccount = params.get("sigAuthAccount"); const sigAuthExpiry = params.get("sigAuthExpiry"); const sigAuthSignature = params.get("sigAuthSignature"); const sigAuthRedirect = params.get("sigAuthRedirect") || undefined; if (!sigAuthAccount || !sigAuthExpiry || !sigAuthSignature) { const missingParams = [ !sigAuthAccount && "sigAuthAccount", !sigAuthExpiry && "sigAuthExpiry", !sigAuthSignature && "sigAuthSignature", ].filter(Boolean); throw new Error(`Invalid connection request: missing ${missingParams.join(", ")}`); } // Check the expiry time if (new Date(sigAuthExpiry).getTime() < Date.now()) { throw new Error("Connection request expired"); } const message = (0, exports.generateConnectionMessage)(sigAuthAccount, sigAuthExpiry, sigAuthRedirect); const verified = await (0, accounts_1.verifyAccountOwnership)(config, sigAuthAccount, message, sigAuthSignature); return verified ? sigAuthAccount : null; }; exports.verifyConnectedUrl = verifyConnectedUrl; //# sourceMappingURL=index.js.map