@etherspot/modular-sdk
Version:
Etherspot Modular SDK - build with ERC-7579 smart accounts modules
123 lines • 7.11 kB
JavaScript
;
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