import { Contract } from "@ethersproject/contracts"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { DiamondLoupeFacet, OwnershipFacet } from "../typechain"; import { LedgerSigner } from "@anders-t/ethers-ledger"; export const gasPrice = 100000000000; export async function impersonate( address: string, contract: any, ethers: any, network: any ) { await network.provider.request({ method: "hardhat_impersonateAccount", params: [address], }); let signer = await ethers.getSigner(address); contract = contract.connect(signer); return contract; } export async function resetChain(hre: any) { await hre.network.provider.request({ method: "hardhat_reset", params: [ { forking: { jsonRpcUrl: process.env.MATIC_URL, }, }, ], }); } export function getSelectors(contract: Contract) { const signatures = Object.keys(contract.interface.functions); const selectors = signatures.reduce((acc: string[], val: string) => { if (val !== "init(bytes)") { acc.push(contract.interface.getSighash(val)); } return acc; }, []); return selectors; } export function getSighashes(selectors: string[], ethers: any): string[] { if (selectors.length === 0) return []; const sighashes: string[] = []; selectors.forEach((selector) => { if (selector !== "") sighashes.push(getSelector(selector, ethers)); }); return sighashes; } export function getSelector(func: string, ethers: any) { const abiInterface = new ethers.utils.Interface([func]); return abiInterface.getSighash(ethers.utils.Fragment.from(func)); } export const maticDiamondAddress = "0x86935F11C86623deC8a25696E1C19a8659CbF95d"; export const maticStakingAddress = "0xA02d547512Bb90002807499F05495Fe9C4C3943f"; export const stakingDiamondUpgrader = "0x258cC4C495Aef8D809944aD94C6722ef41216ef3"; export async function diamondOwner(address: string, ethers: any) { return await (await ethers.getContractAt("OwnershipFacet", address)).owner(); } export async function getFunctionsForFacet(facetAddress: string, ethers: any) { const Loupe = (await ethers.getContractAt( "DiamondLoupeFacet", maticDiamondAddress )) as DiamondLoupeFacet; const functions = await Loupe.facetFunctionSelectors(facetAddress); return functions; } export async function getDiamondSigner( ethers: any, network: any, override?: string, useLedger?: boolean ) { //Instantiate the Signer const owner = await ( (await ethers.getContractAt( "OwnershipFacet", maticDiamondAddress )) as OwnershipFacet ).owner(); const testing = ["hardhat", "localhost"].includes(network.name); if (testing) { await network.provider.request({ method: "hardhat_impersonateAccount", params: [override ? override : owner], }); return await ethers.getSigner(override ? override : owner); } else if (network.name === "matic") { if (useLedger) { return new LedgerSigner(ethers.provider); //, "m/44'/60'/2'/0/0"); } else { return (await ethers.getSigners())[0]; } } else { throw Error("Incorrect network selected"); } }