UNPKG

@factorial-finance/blueprint-node

Version:

blueprint-node-plugin

175 lines (174 loc) 7.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AliasService = void 0; const logger_1 = require("../utils/logger"); const aliases_1 = require("../utils/aliases"); const predefinedAliases_1 = require("../config/predefinedAliases"); class AliasService { constructor() { this.aliases = null; // Cache for contract code hash to name mapping this.contractCache = new Map(); } async initialize() { try { logger_1.Logger.info('📝 Loading contract aliases...'); // Generate aliases from local contracts (and start background updates) const generatedAliases = await (0, aliases_1.generateAliases)(this); // Merge predefined and generated aliases this.aliases = { CODES: { ...predefinedAliases_1.predefinedAliases.CODES, ...generatedAliases.CODES }, ADDRESSES: { ...predefinedAliases_1.predefinedAliases.ADDRESSES, ...generatedAliases.ADDRESSES }, OP_ALIASES: { ...predefinedAliases_1.predefinedAliases.OP_ALIASES, ...generatedAliases.OP_ALIASES }, ERROR_ALIASES: { ...predefinedAliases_1.predefinedAliases.ERROR_ALIASES, ...generatedAliases.ERROR_ALIASES } }; // Add common ops to all contracts for (const contractName of Object.keys(this.aliases.OP_ALIASES)) { this.aliases.OP_ALIASES[contractName] = { ...predefinedAliases_1.commonOps, ...this.aliases.OP_ALIASES[contractName] }; } // Add common errors to all contracts for (const contractName of Object.keys(this.aliases.ERROR_ALIASES)) { this.aliases.ERROR_ALIASES[contractName] = { ...predefinedAliases_1.commonErrors, ...this.aliases.ERROR_ALIASES[contractName] }; } // Preload address aliases into cache for (const [address, contractName] of Object.entries(this.aliases.ADDRESSES)) { // Use a special hash value to indicate this is an address alias this.cacheContractInfo(address, 'ADDRESS_ALIAS', contractName); } const totalContracts = Object.keys(this.aliases.CODES).length; const predefinedCount = Object.keys(predefinedAliases_1.predefinedAliases.CODES).length; const generatedCount = Object.keys(generatedAliases.CODES).length; const addressAliasCount = Object.keys(this.aliases.ADDRESSES).length; logger_1.Logger.info(`✅ Loaded aliases for ${totalContracts} contracts (${predefinedCount} predefined, ${generatedCount} generated) and ${addressAliasCount} address aliases`); } catch (error) { logger_1.Logger.warn('⚠️ Failed to load aliases:', error); // Initialize with predefined aliases if loading fails this.aliases = { CODES: predefinedAliases_1.predefinedAliases.CODES, ADDRESSES: predefinedAliases_1.predefinedAliases.ADDRESSES, OP_ALIASES: predefinedAliases_1.predefinedAliases.OP_ALIASES, ERROR_ALIASES: predefinedAliases_1.predefinedAliases.ERROR_ALIASES }; } } getAliases() { return this.aliases; } findActionAlias(action, contractName) { if (!this.aliases) return null; // If contractName is provided, look only in that contract if (contractName && this.aliases.OP_ALIASES[contractName]) { const ops = this.aliases.OP_ALIASES[contractName]; for (const [aliasName, opValue] of Object.entries(ops)) { if (opValue === action) { return { contract: contractName, alias: aliasName }; } } } // Check common ops if not found in specific contract for (const [aliasName, opValue] of Object.entries(predefinedAliases_1.commonOps)) { if (opValue === action) { return { contract: 'Common', alias: aliasName }; } } // If not found in specific contract or common ops, search all return (0, aliases_1.findActionAlias)(action, this.aliases.OP_ALIASES); } findErrorAlias(errorCode, contractName) { if (!this.aliases) return null; // If contractName is provided, look only in that contract if (contractName && this.aliases.ERROR_ALIASES[contractName]) { const errors = this.aliases.ERROR_ALIASES[contractName]; for (const [aliasName, errorValue] of Object.entries(errors)) { if (errorValue === errorCode) { return { contract: contractName, alias: aliasName }; } } } // Check common errors if not found in specific contract for (const [aliasName, errorValue] of Object.entries(predefinedAliases_1.commonErrors)) { if (errorValue === errorCode) { return { contract: 'Common', alias: aliasName }; } } // If not found in specific contract or common errors, search all return (0, aliases_1.findErrorAlias)(errorCode, this.aliases.ERROR_ALIASES); } getContractCodeHash(contractName) { if (!this.aliases) return undefined; return this.aliases.CODES[contractName]; } // Update aliases from background compilation updateAliases(freshAliases) { if (!this.aliases) return; // Update CODES Object.assign(this.aliases.CODES, freshAliases.CODES); // Update ADDRESSES Object.assign(this.aliases.ADDRESSES, freshAliases.ADDRESSES); // Update OP_ALIASES with common ops for (const [contractName, ops] of Object.entries(freshAliases.OP_ALIASES)) { this.aliases.OP_ALIASES[contractName] = { ...predefinedAliases_1.commonOps, ...ops }; } // Update ERROR_ALIASES with common errors for (const [contractName, errors] of Object.entries(freshAliases.ERROR_ALIASES)) { this.aliases.ERROR_ALIASES[contractName] = { ...predefinedAliases_1.commonErrors, ...errors }; } // Update address cache for (const [address, contractName] of Object.entries(freshAliases.ADDRESSES)) { this.cacheContractInfo(address, 'ADDRESS_ALIAS', contractName); } logger_1.Logger.info('✅ Contract aliases updated in memory'); } // Cache operations getCachedContractName(address) { return this.contractCache.get(address)?.name || null; } cacheContractInfo(address, codeHash, name) { this.contractCache.set(address, { hash: codeHash, name }); } // Pure find function - only searches without side effects findContractNameByCodeHash(codeHash) { if (!this.aliases) return null; for (const [name, hash] of Object.entries(this.aliases.CODES)) { if (hash === codeHash) { return name; } } return null; } // Clear cache (useful for testing or when contracts are updated) clearCache() { this.contractCache.clear(); } } exports.AliasService = AliasService;