UNPKG

@etherspot/modular-sdk

Version:

Etherspot Modular SDK - build with ERC-7579 smart accounts modules

123 lines 7.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Pulse = void 0; const index_js_1 = require("../common/index.js"); const index_js_2 = require("../network/index.js"); const errorHandler_service_js_1 = require("../errorHandler/errorHandler.service.js"); const viem_1 = require("viem"); const abis_js_1 = require("../common/abis.js"); const utils_js_1 = require("./utils.js"); class Pulse { constructor(modularSdk) { this.modularSdk = modularSdk; } async installPulseModules(config) { const { credibleAccountModuleAddress, resourceLockValidatorAddress, uninstallOldHookMultiplexer = false } = config; const chainId = this.modularSdk['chainId']; const networkConfig = index_js_2.Networks[chainId]; if (!networkConfig) { throw new errorHandler_service_js_1.ErrorHandler('Network configuration not found for chain ID: ' + chainId); } const HOOK_MULTIPLEXER_ADDRESS_V2 = networkConfig.contracts.hookMultiPlexerV2; const CREDIBLE_ACCOUNT_MODULE_ADDRESS = credibleAccountModuleAddress; const RESOURCE_LOCK_VALIDATOR_ADDRESS = resourceLockValidatorAddress; const HOOK_MULTIPLEXER_ADDRESS = networkConfig.contracts.hookMultiPlexer; if (!HOOK_MULTIPLEXER_ADDRESS_V2 || !CREDIBLE_ACCOUNT_MODULE_ADDRESS || !RESOURCE_LOCK_VALIDATOR_ADDRESS) { throw new errorHandler_service_js_1.ErrorHandler('Required contract addresses not found in network configuration'); } const address = (await this.modularSdk.getCounterFactualAddress()); await this.modularSdk.clearUserOpsFromBatch(); if (uninstallOldHookMultiplexer && HOOK_MULTIPLEXER_ADDRESS) { await this.uninstallOldHookMultiplexer(address, HOOK_MULTIPLEXER_ADDRESS); } await this.installHookMultiplexer(address, HOOK_MULTIPLEXER_ADDRESS_V2, CREDIBLE_ACCOUNT_MODULE_ADDRESS); await this.installCredibleAccountValidator(address, CREDIBLE_ACCOUNT_MODULE_ADDRESS); await this.installResourceLockValidator(address, RESOURCE_LOCK_VALIDATOR_ADDRESS); const op = await this.modularSdk.estimate(); const uoHash = await this.modularSdk.send(op); return uoHash; } async isPulseModulesInstalled(config) { const chainId = this.modularSdk['chainId']; const networkConfig = index_js_2.Networks[chainId]; const HOOK_MULTIPLEXER_ADDRESS_V2 = networkConfig.contracts.hookMultiPlexerV2; const CREDIBLE_ACCOUNT_MODULE_ADDRESS = config.credibleAccountModuleAddress; const RESOURCE_LOCK_VALIDATOR_ADDRESS = config.resourceLockValidatorAddress; const [hookMultiPlexer, credibleAccountValidator, resourceLockValidator] = await Promise.all([ this.modularSdk.isModuleInstalled(index_js_1.MODULE_TYPE.HOOK, HOOK_MULTIPLEXER_ADDRESS_V2), this.modularSdk.isModuleInstalled(index_js_1.MODULE_TYPE.VALIDATOR, CREDIBLE_ACCOUNT_MODULE_ADDRESS), this.modularSdk.isModuleInstalled(index_js_1.MODULE_TYPE.VALIDATOR, RESOURCE_LOCK_VALIDATOR_ADDRESS), ]); return { hookMultiPlexer, credibleAccountValidator, resourceLockValidator, }; } async uninstallOldHookMultiplexer(address, oldHookMultiplexerAddress) { const isOldModuleInstalled = await this.modularSdk.isModuleInstalled(index_js_1.MODULE_TYPE.HOOK, oldHookMultiplexerAddress); if (isOldModuleInstalled) { const hmpDeinitData = (0, viem_1.encodeAbiParameters)([{ type: 'uint256' }], [BigInt(index_js_1.MODULE_TYPE.HOOK)]); const oldHmpUninstallCalldata = (0, viem_1.encodeFunctionData)({ abi: (0, viem_1.parseAbi)(abis_js_1.accountAbi), functionName: 'uninstallModule', args: [BigInt(index_js_1.MODULE_TYPE.HOOK), oldHookMultiplexerAddress, hmpDeinitData], }); await this.modularSdk.addUserOpsToBatch({ to: address, data: oldHmpUninstallCalldata }); } } async installHookMultiplexer(address, hookMultiplexerAddress, credibleAccountModuleAddress) { const hmpInitData = (0, utils_js_1.getHookMultiPlexerInitData)([credibleAccountModuleAddress]); const hmpInstallCalldata = (0, viem_1.encodeFunctionData)({ abi: (0, viem_1.parseAbi)(abis_js_1.accountAbi), functionName: 'installModule', args: [BigInt(index_js_1.MODULE_TYPE.HOOK), hookMultiplexerAddress, hmpInitData], }); await this.modularSdk.addUserOpsToBatch({ to: address, data: hmpInstallCalldata }); } async installCredibleAccountValidator(address, credibleAccountModuleAddress) { const cavInitData = (0, viem_1.encodeAbiParameters)([{ type: 'uint256' }], [BigInt(index_js_1.MODULE_TYPE.VALIDATOR)]); const cavInstallCalldata = (0, viem_1.encodeFunctionData)({ abi: (0, viem_1.parseAbi)(abis_js_1.accountAbi), functionName: 'installModule', args: [BigInt(index_js_1.MODULE_TYPE.VALIDATOR), credibleAccountModuleAddress, cavInitData], }); await this.modularSdk.addUserOpsToBatch({ to: address, data: cavInstallCalldata }); } async installResourceLockValidator(address, resourceLockValidatorAddress) { const rlvInitData = (0, viem_1.encodeAbiParameters)([{ type: 'address' }], [this.modularSdk.getEOAAddress()]); const rlvInstallCalldata = (0, viem_1.encodeFunctionData)({ abi: (0, viem_1.parseAbi)(abis_js_1.accountAbi), functionName: 'installModule', args: [BigInt(index_js_1.MODULE_TYPE.VALIDATOR), resourceLockValidatorAddress, rlvInitData], }); await this.modularSdk.addUserOpsToBatch({ to: address, data: rlvInstallCalldata }); } async addHook(hookAddress, hookType, hookMultiplexerAddress) { const chainId = this.modularSdk['chainId']; const networkConfig = index_js_2.Networks[chainId]; if (!networkConfig) { throw new errorHandler_service_js_1.ErrorHandler('Network configuration not found for chain ID: ' + chainId); } const HOOK_MULTIPLEXER_ADDRESS = (hookMultiplexerAddress || networkConfig.contracts.hookMultiPlexer); if (!HOOK_MULTIPLEXER_ADDRESS) { throw new errorHandler_service_js_1.ErrorHandler('Hook Multiplexer address not found in network configuration'); } const address = (await this.modularSdk.getCounterFactualAddress()); await this.modularSdk.clearUserOpsFromBatch(); const addHookCalldata = (0, viem_1.encodeFunctionData)({ abi: utils_js_1.HookMultiplexer, functionName: 'addHook', args: [hookAddress, hookType], }); await this.modularSdk.addUserOpsToBatch({ to: HOOK_MULTIPLEXER_ADDRESS, data: addHookCalldata, }); const op = await this.modularSdk.estimate(); const uoHash = await this.modularSdk.send(op); return uoHash; } } exports.Pulse = Pulse; //# sourceMappingURL=pulse.js.map