@biconomy-devx/modules
Version:
This package provides different validation modules/plugins for ERC4337 compatible modular account
199 lines • 9.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BatchedSessionRouterModule = void 0;
const Constants_js_1 = require("./utils/Constants.js");
const BaseValidationModule_js_1 = require("./BaseValidationModule.js");
const SessionKeyManagerModule_js_1 = require("./SessionKeyManagerModule.js");
const viem_1 = require("viem");
const common_1 = require("@biconomy-devx/common");
const abi_1 = require("@ethersproject/abi");
class BatchedSessionRouterModule extends BaseValidationModule_js_1.BaseValidationModule {
constructor(moduleConfig) {
super(moduleConfig);
Object.defineProperty(this, "version", {
enumerable: true,
configurable: true,
writable: true,
value: "V1_0_0"
});
Object.defineProperty(this, "moduleAddress", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "sessionManagerModuleAddress", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "sessionKeyManagerModule", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "mockEcdsaSessionKeySig", {
enumerable: true,
configurable: true,
writable: true,
value: "0x73c3ac716c487ca34bb858247b5ccf1dc354fbaabdd089af3b2ac8e78ba85a4959a2d76250325bd67c11771c31fccda87c33ceec17cc0de912690521bb95ffcb1b"
});
Object.defineProperty(this, "createSessionData", {
enumerable: true,
configurable: true,
writable: true,
value: async (leavesData) => {
return this.sessionKeyManagerModule.createSessionData(leavesData);
}
});
}
static async create(moduleConfig) {
const instance = new BatchedSessionRouterModule(moduleConfig);
if (moduleConfig.moduleAddress) {
instance.moduleAddress = moduleConfig.moduleAddress;
}
else if (moduleConfig.version) {
const moduleAddr = Constants_js_1.BATCHED_SESSION_ROUTER_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version];
if (!moduleAddr) {
throw new Error(`Invalid version ${moduleConfig.version}`);
}
instance.moduleAddress = moduleAddr;
instance.version = moduleConfig.version;
}
else {
instance.moduleAddress = Constants_js_1.DEFAULT_BATCHED_SESSION_ROUTER_MODULE;
}
instance.sessionManagerModuleAddress = moduleConfig.sessionManagerModuleAddress ?? Constants_js_1.DEFAULT_SESSION_KEY_MANAGER_MODULE;
if (!moduleConfig.sessionKeyManagerModule) {
const sessionModule = await SessionKeyManagerModule_js_1.SessionKeyManagerModule.create({
moduleAddress: instance.sessionManagerModuleAddress,
smartAccountAddress: moduleConfig.smartAccountAddress,
nodeClientUrl: moduleConfig.nodeClientUrl,
storageType: moduleConfig.storageType,
});
instance.sessionKeyManagerModule = sessionModule;
}
else {
instance.sessionKeyManagerModule = moduleConfig.sessionKeyManagerModule;
instance.sessionManagerModuleAddress = moduleConfig.sessionKeyManagerModule.getAddress();
}
return instance;
}
async signUserOpHash(userOpHash, params) {
const sessionParams = params?.batchSessionParams;
if (!sessionParams || sessionParams.length === 0) {
throw new Error("Session parameters are not provided");
}
const sessionDataTupleArray = [];
const { signer: sessionSigner } = await (0, common_1.convertSigner)(sessionParams[0].sessionSigner);
const signature = await sessionSigner.signMessage({ raw: (0, viem_1.toBytes)(userOpHash) });
for (const sessionParam of sessionParams) {
if (!sessionParam.sessionSigner) {
throw new Error("Session signer is not provided.");
}
const sessionDataTuple = [];
let sessionSignerData;
if (sessionParam.sessionID) {
sessionSignerData = await this.sessionKeyManagerModule.sessionStorageClient.getSessionData({
sessionID: sessionParam.sessionID,
});
}
else if (sessionParam.sessionValidationModule) {
sessionSignerData = await this.sessionKeyManagerModule.sessionStorageClient.getSessionData({
sessionValidationModule: sessionParam.sessionValidationModule,
sessionPublicKey: await sessionSigner.getAddress(),
});
}
else {
throw new Error("sessionID or sessionValidationModule should be provided.");
}
sessionDataTuple.push(sessionSignerData.validUntil);
sessionDataTuple.push(sessionSignerData.validAfter);
sessionDataTuple.push(sessionSignerData.sessionValidationModule);
sessionDataTuple.push(sessionSignerData.sessionKeyData);
const leafDataHex = (0, viem_1.concat)([
(0, viem_1.pad)((0, viem_1.toHex)(sessionSignerData.validUntil), { size: 6 }),
(0, viem_1.pad)((0, viem_1.toHex)(sessionSignerData.validAfter), { size: 6 }),
(0, viem_1.pad)(sessionSignerData.sessionValidationModule, { size: 20 }),
sessionSignerData.sessionKeyData,
]);
const proof = this.sessionKeyManagerModule.merkleTree.getHexProof((0, viem_1.keccak256)(leafDataHex));
sessionDataTuple.push(proof);
sessionDataTuple.push(sessionParam.additionalSessionData ?? "0x");
sessionDataTupleArray.push(sessionDataTuple);
}
const paddedSignature = abi_1.defaultAbiCoder.encode(["address", "tuple(uint48,uint48,address,bytes,bytes32[],bytes)[]", "bytes"], [this.getSessionKeyManagerAddress(), sessionDataTupleArray, signature]);
return paddedSignature;
}
async updateSessionStatus(param, status) {
this.sessionKeyManagerModule.sessionStorageClient.updateSessionStatus(param, status);
}
async clearPendingSessions() {
this.sessionKeyManagerModule.sessionStorageClient.clearPendingSessions();
}
getAddress() {
return this.moduleAddress;
}
getSessionKeyManagerAddress() {
return this.sessionManagerModuleAddress;
}
async getSigner() {
throw new Error("Method not implemented.");
}
async getDummySignature(params) {
const sessionParams = params?.batchSessionParams;
if (!sessionParams || sessionParams.length === 0) {
throw new Error("Session parameters are not provided");
}
const sessionDataTupleArray = [];
const { signer: sessionSigner } = await (0, common_1.convertSigner)(sessionParams[0].sessionSigner);
for (const sessionParam of sessionParams) {
if (!sessionParam.sessionSigner) {
throw new Error("Session signer is not provided.");
}
const sessionDataTuple = [];
let sessionSignerData;
if (sessionParam.sessionID) {
sessionSignerData = await this.sessionKeyManagerModule.sessionStorageClient.getSessionData({
sessionID: sessionParam.sessionID,
});
}
else if (sessionParam.sessionValidationModule) {
sessionSignerData = await this.sessionKeyManagerModule.sessionStorageClient.getSessionData({
sessionValidationModule: sessionParam.sessionValidationModule,
sessionPublicKey: await sessionSigner.getAddress(),
});
}
else {
throw new Error("sessionID or sessionValidationModule should be provided.");
}
sessionDataTuple.push(BigInt(sessionSignerData.validUntil));
sessionDataTuple.push(BigInt(sessionSignerData.validAfter));
sessionDataTuple.push(sessionSignerData.sessionValidationModule);
sessionDataTuple.push(sessionSignerData.sessionKeyData);
const leafDataHex = (0, viem_1.concat)([
(0, viem_1.pad)((0, viem_1.toHex)(sessionSignerData.validUntil), { size: 6 }),
(0, viem_1.pad)((0, viem_1.toHex)(sessionSignerData.validAfter), { size: 6 }),
(0, viem_1.pad)(sessionSignerData.sessionValidationModule, { size: 20 }),
sessionSignerData.sessionKeyData,
]);
const proof = this.sessionKeyManagerModule.merkleTree.getHexProof((0, viem_1.keccak256)(leafDataHex));
sessionDataTuple.push(proof);
sessionDataTuple.push(sessionParam.additionalSessionData ?? "0x");
sessionDataTupleArray.push(sessionDataTuple);
}
const paddedSignature = abi_1.defaultAbiCoder.encode(["address", "tuple(uint48,uint48,address,bytes,bytes32[],bytes)[]", "bytes"], [this.getSessionKeyManagerAddress(), sessionDataTupleArray, this.mockEcdsaSessionKeySig]);
const dummySig = (0, viem_1.encodeAbiParameters)((0, viem_1.parseAbiParameters)("bytes, address"), [paddedSignature, this.getAddress()]);
return dummySig;
}
async getInitData() {
throw new Error("Method not implemented.");
}
async signMessage(_message) {
throw new Error("Method not implemented.");
}
}
exports.BatchedSessionRouterModule = BatchedSessionRouterModule;
//# sourceMappingURL=BatchedSessionRouterModule.js.map