import { ethers } from 'ethers'; import { Interface } from 'ethers/lib/utils'; import { IDiamondCut } from 'src/config/abi/diamond'; import { FacetCutAction, FacetId } from './constants'; import { ContractInitializer } from './ContractInitializer'; import { DiamondFacetsRegistry } from './DiamondFacetsRegistry'; export abstract class DiamondContractInitializer< T = ethers.Contract, D = Record > extends ContractInitializer { private _diamondContractInstances?: D; initializeDiamond(contracts: { [key in keyof D]: Interface; }) { if (!this.address) { throw new Error('Contract address is not set'); } this._diamondContractInstances = Object.keys(contracts).reduce( (prev, current) => { prev[current] = new ethers.Contract( this.address, contracts[current], this.provider ); return prev; }, {} ) as D; } get facets(): D { if (!this._diamondContractInstances) { throw new Error('Diamond contract instances are not initialized'); } return this._diamondContractInstances; } async getFacetCuts( facetId: FacetId, action: FacetCutAction = FacetCutAction.Add ) { const response = await DiamondFacetsRegistry.getFacetCutData( this.chainConfig.chainId, facetId ); const [, facetCuts] = response; const diamondCuts: IDiamondCut.FacetCutStruct[] = facetCuts.map((v) => { return { action, facetAddress: v.facetAddress, functionSelectors: v.functionSelectors, }; }); this.logCall('getFacetCuts - result', { facetId, action, diamondCuts }); return diamondCuts; } }