import { ethers } from 'ethers'; import { OmniteContractFactory__factory } from '../config/abi/factories/OmniteContractFactory__factory'; import { OmniteContractFactory as BaseContract } from '../config/abi/OmniteContractFactory'; import { normalizeChainId } from '.././utils/chainUtils'; import { ContractInitializer } from './ContractInitializer'; import { DeployBlueprintName } from '../types'; const iface = OmniteContractFactory__factory.createInterface(); export class ContractFactory extends ContractInitializer { className = ContractFactory.name; static async create(signer: ethers.providers.JsonRpcSigner) { const chainId = normalizeChainId(await signer.getChainId()); if (!chainId) { throw new Error('chainId is not defined'); } const instance = new ContractFactory(chainId, iface, signer); instance.address = instance.contractAddress.contractFactory; instance.initialize(); return instance; } static _newInstance = (chainId: string) => { const selfInstance = new ContractFactory(chainId, iface); selfInstance.address = selfInstance.contractAddress.contractFactory; selfInstance.initialize(); return selfInstance; }; createSimpleContractInstanceByName = async ( blueprintName: DeployBlueprintName, ctorParams: string, salt: string ) => { this.logCall('createSimpleContractInstanceByName', { blueprintName, ctorParams, salt, }); return this.contractInstance.createSimpleContractInstanceByName( blueprintName, ctorParams, salt ); }; static getLatestBlueprint = async ( chainId: string, blueprintName: DeployBlueprintName ): Promise => { const selfInstance = ContractFactory._newInstance(chainId); selfInstance.logCall('getLatestBlueprint', { chainId, blueprintName, }); return selfInstance.contractInstance.getLatestBlueprint(blueprintName); }; static beacons = async (chainId: string, blueprintName: string) => { const selfInstance = ContractFactory._newInstance(chainId); return selfInstance.contractInstance.beacons(blueprintName); }; static getBeaconProxyCreationCode = async (chainId: string) => { const selfInstance = ContractFactory._newInstance(chainId); return selfInstance.contractInstance.getBeaconProxyCreationCode(); }; }