const FacetCutAction = { Add: 0, Replace: 1, Remove: 2 } // get function selectors from ABI function getSelectors(contract) { const signatures = Object.keys(contract.interface.functions) const selectors = signatures.reduce((acc, val) => { if (val !== 'init(bytes)') { acc.push(contract.interface.getSighash(val)) } return acc }, []) // selectors.contract = contract // selectors.remove = remove // selectors.get = get return selectors } // get function selector from function signature function getSelector(func) { const abiInterface = new ethers.utils.Interface([func]) return abiInterface.getSighash(ethers.utils.Fragment.from(func)) } // used with getSelectors to remove selectors from an array of selectors // functionNames argument is an array of function signatures function remove(functionNames) { const selectors = this.filter((v) => { for (const functionName of functionNames) { if (v === this.contract.interface.getSighash(functionName)) { return false } } return true }) // selectors.contract = this.contract // selectors.remove = this.remove // selectors.get = this.get return selectors } // used with getSelectors to get selectors from an array of selectors // functionNames argument is an array of function signatures function get(functionNames) { const selectors = this.filter((v) => { for (const functionName of functionNames) { if (v === this.contract.interface.getSighash(functionName)) { return true } } return false }) // selectors.contract = this.contract // selectors.remove = this.remove // selectors.get = this.get return selectors } // remove selectors using an array of signatures function removeSelectors(selectors, signatures) { const iface = new ethers.utils.Interface( signatures.map((v) => 'function ' + v), ) const removeSelectors = signatures.map((v) => iface.getSighash(v)) selectors = selectors.filter((v) => !removeSelectors.includes(v)) return selectors } // find a particular address position in the return value of diamondLoupeFacet.facets() function findAddressPositionInFacets(facetAddress, facets) { for (let i = 0; i < facets.length; i++) { if (facets[i].facetAddress === facetAddress) { return i } } } exports.getSelectors = getSelectors exports.getSelector = getSelector exports.FacetCutAction = FacetCutAction exports.remove = remove exports.removeSelectors = removeSelectors exports.findAddressPositionInFacets = findAddressPositionInFacets