@citizenwallet/sdk
Version:
An sdk to easily work with citizen wallet.
91 lines • 4.5 kB
JavaScript
;
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