dop-stick
Version:
Source control tooling for versionable-upgradeable smart contracts
86 lines • 4.14 kB
JavaScript
"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