@factorial-finance/blueprint-node
Version:
blueprint-node-plugin
175 lines (174 loc) • 7.68 kB
JavaScript
"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;