/* eslint-disable @typescript-eslint/no-explicit-any */ import 'hardhat/types/runtime'; import 'hardhat/types/config'; import { LinkReferences, Artifact, HardhatRuntimeEnvironment, } from 'hardhat/types'; import type {BigNumber} from '@ethersproject/bignumber'; import {Signer} from '@ethersproject/abstract-signer'; export type ExtendedArtifact = { abi: any[]; bytecode: string; // "0x"-prefixed hex string deployedBytecode?: string; // "0x"-prefixed hex string metadata?: string; linkReferences?: LinkReferences; deployedLinkReferences?: LinkReferences; solcInput?: string; solcInputHash?: string; userdoc?: any; devdoc?: any; methodIdentifiers?: any; storageLayout?: any; evm?: any; }; export interface DeployFunction { (env: HardhatRuntimeEnvironment): Promise; skip?: (env: HardhatRuntimeEnvironment) => Promise; tags?: string[]; dependencies?: string[]; runAtTheEnd?: boolean; id?: string; } export type Address = string; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ABI = any[]; // TODO abi export type Log = { blockNumber: number; blockHash: string; transactionHash: string; transactionIndex: number; logIndex: number; removed: boolean; address: string; topics: string[]; data: string; }; export type Receipt = { from: Address; transactionHash: string; blockHash: string; blockNumber: number; transactionIndex: number; cumulativeGasUsed: BigNumber | string | number; gasUsed: BigNumber | string | number; contractAddress?: string; to?: Address; logs?: Log[]; events?: any[]; logsBloom?: string; byzantium?: boolean; status?: number; confirmations?: number; }; export type FacetOptions = { name?: string; contract?: string | ArtifactData; args?: any[]; linkedData?: any; // JSONable ? libraries?: Libraries; deterministic?: boolean | string; }; export type DiamondFacets = Array | Array; export interface DiamondOptions extends TxOptions { diamondContract?: string | ArtifactData; // TODO diamondContractArgs?: any[]; owner?: Address; defaultLoupeFacetContract?: | boolean | string | { name: string; artifact?: string | ArtifactData; }; defaultOwnershipFacetContract?: | boolean | string | { name: string; artifact?: string | ArtifactData; }; defaultCutFacetContract?: | boolean | string | { name: string; artifact?: string | ArtifactData; }; defaultERC165InitContract?: | string | { name: string; artifact?: string | ArtifactData; }; facets: DiamondFacets; log?: boolean; libraries?: Libraries; linkedData?: any; // JSONable ? upgradeIndex?: number; execute?: { contract?: | string | {name: string; artifact: string | ArtifactData; args?: any[]}; methodName: string; args: any[]; }; excludeSelectors?: { [facetName: string]: string[]; }; deterministicSalt?: string; facetsArgs?: any[]; } type ProxyOptionsBase = { owner?: Address; upgradeIndex?: number; proxyContract?: // default to EIP173Proxy string | ArtifactData; proxyArgs?: any[]; // default to ["{implementation}", "{admin}", "{data}"] viaAdminContract?: | string | { name: string; artifact?: string | ArtifactData; }; implementationName?: string; checkABIConflict?: boolean; checkProxyAdmin?: boolean; upgradeFunction?: { methodName: string; upgradeArgs: any[]; }; }; export type ProxyOptions = | (ProxyOptionsBase & { methodName?: string; }) | (ProxyOptionsBase & { execute?: | { methodName: string; args: any[]; } | { init: { methodName: string; args: any[]; }; onUpgrade?: { methodName: string; args: any[]; }; }; }); export type ArtifactData = { abi: ABI; bytecode: string; deployedBytecode?: string; metadata?: string; methodIdentifiers?: any; storageLayout?: any; userdoc?: any; devdoc?: any; gasEstimates?: any; }; export interface DeployOptionsBase extends TxOptions { contract?: string | ArtifactData; args?: any[]; skipIfAlreadyDeployed?: boolean; linkedData?: any; // JSONable ? libraries?: Libraries; proxy?: boolean | string | ProxyOptions; // TODO support different type of proxies ? } export interface DeployOptions extends DeployOptionsBase { deterministicDeployment?: boolean | string; } export interface Create2DeployOptions extends DeployOptionsBase { salt?: string; } export interface CallOptions { from?: string; gasLimit?: string | number | BigNumber; gasPrice?: string | BigNumber; maxFeePerGas?: string | BigNumber; maxPriorityFeePerGas?: string | BigNumber; value?: string | BigNumber; nonce?: string | number | BigNumber; to?: string; // TODO make to and data part of a `SimpleCallOptions` interface data?: string; } export interface TxOptions extends CallOptions { from: string; log?: boolean; // TODO string (for comment in log) autoMine?: boolean; estimatedGasLimit?: string | number | BigNumber; estimateGasExtra?: string | number | BigNumber; waitConfirmations?: number; } export interface Execute extends TxOptions { name: string; methodName: string; args?: any[]; } export interface SimpleTx extends TxOptions { to: string; } export interface DeployedContract { address: Address; abi: ABI; } export interface DeployResult extends Deployment { newlyDeployed: boolean; } export type FixtureFunc = ( env: HardhatRuntimeEnvironment, options?: O ) => Promise; export interface DeploymentsExtension { deploy(name: string, options: DeployOptions): Promise; // deploy a contract diamond: { // deploy diamond based contract (see section below) deploy(name: string, options: DiamondOptions): Promise; }; deterministic( // return the determinsitic address as well as a function to deploy the contract, can pass the `salt` field in the option to use different salt name: string, options: Create2DeployOptions ): Promise<{ address: Address; implementationAddress?: Address; deploy(): Promise; }>; fetchIfDifferent( // return true if new compiled code is different than deployed contract name: string, options: DeployOptions ): Promise<{differences: boolean; address?: string}>; readDotFile(name: string): Promise; saveDotFile(name: string, content: string): Promise; deleteDotFile(name: string): Promise; save(name: string, deployment: DeploymentSubmission): Promise; // low level save of deployment delete(name: string): Promise; get(name: string): Promise; // fetch a deployment by name, throw if not existing getOrNull(name: string): Promise; // fetch deployment by name, return null if not existing getDeploymentsFromAddress(address: string): Promise; all(): Promise<{[name: string]: Deployment}>; // return all deployments getArtifact(name: string): Promise; // return a hardhat artifact (compiled contract without deployment) getExtendedArtifact(name: string): Promise; // return a extended artifact (with more info) (compiled contract without deployment) run( // execute deployment scripts tags?: string | string[], options?: { resetMemory?: boolean; deletePreviousDeployments?: boolean; writeDeploymentsToFiles?: boolean; export?: string; exportAll?: string; } ): Promise<{[name: string]: Deployment}>; fixture( // execute deployment as fixture for test // use evm_snapshot to revert back tags?: string | string[], options?: {fallbackToGlobal?: boolean; keepExistingDeployments?: boolean} ): Promise<{[name: string]: Deployment}>; createFixture( // execute a function as fixture using evm_snaphost to revert back each time func: FixtureFunc, id?: string ): (options?: O) => Promise; log(...args: any[]): void; // log data only if log enabled (disabled in test fixture) getNetworkName(): string; getGasUsed(): number; execute( // execute function call on contract name: string, options: TxOptions, methodName: string, ...args: any[] ): Promise; rawTx(tx: SimpleTx): Promise; // execute a simple transaction catchUnknownSigner( // you can wrap other function with this function and it will catch failure due to missing signer with the details of the tx to be executed action: Promise | (() => Promise), options?: {log?: boolean} ): Promise; read( // make a read-only call to a contract name: string, options: CallOptions, methodName: string, ...args: any[] ): Promise; read(name: string, methodName: string, ...args: any[]): Promise; getSigner(address: string): Promise; // rawCall(to: Address, data: string): Promise; // TODO ? } export interface ContractExport { address: string; abi: any[]; linkedData?: any; } export interface Export { chainId: string; name: string; contracts: {[name: string]: ContractExport}; } export type MultiExport = { [chainId: string]: Export[]; }; export type Libraries = {[libraryName: string]: Address}; export enum FacetCutAction { Add, Replace, Remove, } export type FacetCut = Facet & { action: FacetCutAction; }; export type Facet = { facetAddress: string; functionSelectors: string[]; }; export interface DeploymentSubmission { abi: ABI; address: Address; // used to override receipt.contractAddress (useful for proxies) receipt?: Receipt; transactionHash?: string; history?: Deployment[]; implementation?: string; args?: any[]; linkedData?: any; solcInput?: string; solcInputHash?: string; metadata?: string; bytecode?: string; deployedBytecode?: string; userdoc?: any; devdoc?: any; methodIdentifiers?: any; facets?: Facet[]; execute?: { methodName: string; args: any[]; }; storageLayout?: any; libraries?: Libraries; gasEstimates?: any; factoryDeps?: string[]; } // export type LibraryReferences = { // [filepath: string]: { [name: string]: { length: number; start: number }[] }; // }; export interface Deployment { address: Address; abi: ABI; receipt?: Receipt; transactionHash?: string; history?: Deployment[]; numDeployments?: number; implementation?: string; args?: any[]; linkedData?: any; solcInputHash?: string; metadata?: string; bytecode?: string; deployedBytecode?: string; libraries?: Libraries; userdoc?: any; devdoc?: any; methodIdentifiers?: any; facets?: Facet[]; storageLayout?: any; gasEstimates?: any; factoryDeps?: string[]; } export interface DeterministicDeploymentInfo { factory: string; deployer: string; funding: string; signedTx: string; }