UNPKG

dop-stick

Version:

Source control tooling for versionable-upgradeable smart contracts

86 lines 4.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LoupeFunctionManager = void 0; const ethers_1 = require("ethers"); const loupeConfigAdapter_1 = require("./adapters/loupeConfigAdapter"); class LoupeFunctionManager { constructor(config) { this.defaultFunctions = { facets: 'facets', facetSelectors: 'facetFunctionSelectors', facetAddresses: 'facetAddresses', facetAddress: 'facetAddress', owner: 'owner', version: 'version' }; this.defaultAbis = { facets: 'function facets() external view returns (tuple(address facetAddress, bytes4[] functionSelectors)[])', facetSelectors: 'function facetFunctionSelectors(address facet) external view returns (bytes4[])', facetAddresses: 'function facetAddresses() external view returns (address[])', facetAddress: 'function facetAddress(bytes4 selector) external view returns (address)', owner: 'function owner() external view returns (address)', version: 'function version() external view returns (string)' }; this.config = loupeConfigAdapter_1.LoupeConfigAdapter.adapt(config); this.functions = new Map(); this.setupFunctions(); } createFunctionConfig(configValue, defaultName, defaultAbi) { var _a; if (!configValue) { return { name: defaultName, abi: defaultAbi, params: [] }; } if (typeof configValue === 'string') { return { name: configValue, abi: defaultAbi.replace(defaultName, configValue), params: [] }; } // Handle DiamondLoupeFunctionConfig const params = ((_a = configValue.additionalParams) === null || _a === void 0 ? void 0 : _a.map(p => ({ name: p.name, type: p.type, value: process.env[p.envKey] }))) || []; // If custom ABI is provided, use it; otherwise, modify default ABI with new name const abi = configValue.abi || defaultAbi.replace(defaultName, configValue.name); return { name: configValue.name, abi, params }; } setupFunctions() { const loupeConfig = this.config.functions || {}; // Setup each function with potential custom config this.functions.set('facets', this.createFunctionConfig(loupeConfig.facets, this.defaultFunctions.facets, this.defaultAbis.facets)); this.functions.set('facetSelectors', this.createFunctionConfig(loupeConfig.facetSelectors, this.defaultFunctions.facetSelectors, this.defaultAbis.facetSelectors)); this.functions.set('facetAddresses', this.createFunctionConfig(loupeConfig.facetAddresses, this.defaultFunctions.facetAddresses, this.defaultAbis.facetAddresses)); this.functions.set('facetAddress', this.createFunctionConfig(loupeConfig.facetAddress, this.defaultFunctions.facetAddress, this.defaultAbis.facetAddress)); this.functions.set('owner', this.createFunctionConfig(loupeConfig.owner, this.defaultFunctions.owner, this.defaultAbis.owner)); this.functions.set('version', this.createFunctionConfig(loupeConfig.version, this.defaultFunctions.version, this.defaultAbis.version)); } getFunctionConfig(key) { const config = this.functions.get(key); if (!config) { throw new Error(`Function configuration not found for: ${key}`); } return config; } getInterface() { const fragments = Array.from(this.functions.values()).map(f => f.abi); return new ethers_1.ethers.utils.Interface(fragments); } async callFunction(contract, key, ...args) { const config = this.getFunctionConfig(key); const allArgs = [...args, ...config.params.map(p => p.value)]; return await contract[config.name](...allArgs); } } exports.LoupeFunctionManager = LoupeFunctionManager; //# sourceMappingURL=loupeFunctionManager.js.map