import { type ContractFactory, type Signer, type BaseContract, type BigNumberish } from "ethers";
import { type TAbi } from "../tasks/helpers/types";
import { type FreeForAllPolicy, type MockToken, type TokenPolicy, type GitcoinPassportPolicy, type SemaphorePolicy, type AnonAadhaarPolicy, type FreeForAllPolicyFactory as FreeForAllPolicyFactoryContract, type FreeForAllCheckerFactory as FreeForAllCheckerFactoryContract, type ZupassCheckerFactory as ZupassCheckerFactoryContract, type ZupassPolicyFactory as ZupassPolicyFactoryContract, type AnonAadhaarCheckerFactory as AnonAadhaarCheckerFactoryContract, type AnonAadhaarPolicyFactory as AnonAadhaarPolicyFactoryContract, type EASPolicyFactory as EASPolicyFactoryContract, type EASCheckerFactory as EASCheckerFactoryContract, type ERC20VotesPolicyFactory as ERC20VotesPolicyFactoryContract, type ERC20VotesCheckerFactory as ERC20VotesCheckerFactoryContract, type ERC20PolicyFactory as ERC20PolicyFactoryContract, type ERC20CheckerFactory as ERC20CheckerFactoryContract, type GitcoinPassportCheckerFactory as GitcoinPassportCheckerFactoryContract, type GitcoinPassportPolicyFactory as GitcoinPassportPolicyFactoryContract, type MerkleProofCheckerFactory as MerkleProofCheckerFactoryContract, type MerkleProofPolicyFactory as MerkleProofPolicyFactoryContract, type SemaphorePolicyFactory as SemaphorePolicyFactoryContract, type SemaphoreCheckerFactory as SemaphoreCheckerFactoryContract, type HatsPolicyFactory as HatsPolicyFactoryContract, type HatsCheckerFactory as HatsCheckerFactoryContract, type TokenPolicyFactory as TokenPolicyFactoryContract, type TokenCheckerFactory as TokenCheckerFactoryContract, type FreeForAllChecker, type ZupassChecker, type ZupassPolicy, type AnonAadhaarChecker, type EASPolicy, type EASChecker, type GitcoinPassportChecker, type MerkleProofPolicy, type MerkleProofChecker, type SemaphoreChecker, type TokenChecker, type HatsPolicy, type HatsChecker, type ConstantInitialVoiceCreditProxy, type ERC20VotesInitialVoiceCreditProxy, type MockVerifier, type PollFactory, type Verifier, type VerifyingKeysRegistry, type ERC20VotesChecker, type ERC20VotesPolicy, type ERC20Checker, type ERC20Policy, PollFactory__factory as PollFactoryFactory, type ConstantInitialVoiceCreditProxyFactory as ConstantInitialVoiceCreditProxyFactoryContract, type ERC20VotesInitialVoiceCreditProxyFactory as ERC20VotesInitialVoiceCreditProxyFactoryContract, type MockERC20Votes, type Factory } from "../typechain-types";
import { type IDeployMaciArgs, type IDeployedMaci, type IDeployedPoseidonContracts, type IGetDeployedPolicyProxyFactoriesArgs, type TDeployedProxyFactories } from "./types";
/**
 * Creates contract factory from abi and bytecode
 *
 * @param abi - Contract abi
 * @param bytecode - Contract bytecode
 * @param signer - the signer to use to deploy the contract
 * @returns a contract factory with the libraries linked
 */
export declare const createContractFactory: (abi: TAbi, bytecode: string, signer?: Signer) => Promise<ContractFactory>;
/**
 * Deploy a Smart Contract given a name and some arguments
 * @param contractName - the name of the contract
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @param args - the constructor arguments of the contract
 */
export declare const deployContract: <T extends BaseContract>(contractName: string, signer?: Signer, quiet?: boolean, ...args: unknown[]) => Promise<T>;
/**
 * Deploy a VerifyingKeysRegistry contract
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed VerifyingKeysRegistry contract
 */
export declare const deployVerifyingKeysRegistry: (signer?: Signer, quiet?: boolean) => Promise<VerifyingKeysRegistry>;
/**
 * Deploy a MockVerifier contract (testing only)
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed MockVerifier contract
 */
export declare const deployMockVerifier: (signer?: Signer, quiet?: boolean) => Promise<MockVerifier>;
/**
 * Deploy a Verifier contract
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed Verifier contract
 */
export declare const deployVerifier: (signer?: Signer, quiet?: boolean) => Promise<Verifier>;
/**
 * Deploy a constant initial voice credit proxy factory contract
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed ConstantInitialVoiceCreditProxyFactory contract
 */
export declare const deployConstantInitialVoiceCreditProxyFactory: (signer?: Signer, quiet?: boolean) => Promise<ConstantInitialVoiceCreditProxyFactoryContract>;
/**
 * Deploy a constant initial voice credit proxy contract
 * @param args - the deploy constant initial voice credit proxy arguments
 * @param signer - the signer to use to deploy the contract
 * @param proxyFactory - the optional proxy factory to reuse for deployment
 * @returns the deployed ConstantInitialVoiceCreditProxy contract
 */
export declare const deployConstantInitialVoiceCreditProxy: (args: {
    amount: number;
}, proxyFactory: ConstantInitialVoiceCreditProxyFactoryContract, signer?: Signer) => Promise<ConstantInitialVoiceCreditProxy>;
/**
 * Deploy a ERC20VotesInitialVoiceCreditProxyFactory contract
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed ERC20VotesInitialVoiceCreditProxyFactory contract
 */
export declare const deployERC20VotesInitialVoiceCreditProxyFactory: (signer?: Signer, quiet?: boolean) => Promise<ERC20VotesInitialVoiceCreditProxyFactoryContract>;
/**
 * Deploy a ERC20VotesInitialVoiceCreditProxy contract
 * @param args - the deploy ERC20VotesInitialVoiceCreditProxy arguments
 * @param signer - the signer to use to deploy the contract
 * @param proxyFactory - the optional proxy factory to reuse for deployment
 * @param quiet- whether to suppress console output
 * @returns the deployed ERC20VotesInitialVoiceCreditProxy contract
 */
export declare const deployERC20VotesInitialVoiceCreditProxy: (args: {
    token: string;
    snapshotBlock: bigint;
    factor: bigint;
}, proxyFactory: ERC20VotesInitialVoiceCreditProxyFactoryContract, signer?: Signer) => Promise<ERC20VotesInitialVoiceCreditProxy>;
/**
 * Deploy a MockToken contract
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed MockToken contract
 */
export declare const deploySignupToken: (signer?: Signer, quiet?: boolean) => Promise<MockToken>;
/**
 * Deploy a MockERC20Votes contract
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed MockERC20Votes contract
 */
export declare const deployMockERC20Votes: (signer?: Signer, quiet?: boolean) => Promise<MockERC20Votes>;
/**
 * Get deployed proxy factories for policy contracts to reuse them.
 *
 * @param args - the argument to get deployed policy proxy factories
 * @returns reusable policy proxy factories or undefined if not deployed
 */
export declare const getDeployedPolicyProxyFactories: <C extends Factory, P extends Factory>({ policy, checker, signer, network, }: IGetDeployedPolicyProxyFactoriesArgs) => Promise<TDeployedProxyFactories<C, P>>;
/**
 * Deploy a FreeForAllPolicy contract
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed FreeForAllPolicy contracts
 */
export declare const deployFreeForAllSignUpPolicy: (factories?: TDeployedProxyFactories<FreeForAllCheckerFactoryContract, FreeForAllPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[FreeForAllPolicy, FreeForAllChecker, FreeForAllPolicyFactoryContract, FreeForAllCheckerFactoryContract]>;
/**
 * Deploy a EASPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed EASPolicy contracts
 */
export declare const deployEASSignUpPolicy: (args: {
    eas: string;
    attester: string;
    schema: Uint8Array | string;
}, factories?: TDeployedProxyFactories<EASCheckerFactoryContract, EASPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[EASPolicy, EASChecker, EASPolicyFactoryContract, EASCheckerFactoryContract]>;
/**
 * Deploy a ZupassPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed ZupassPolicy contracts
 */
export declare const deployZupassSignUpPolicy: (args: {
    eventId: BigNumberish;
    signer1: BigNumberish;
    signer2: BigNumberish;
    verifier: string;
}, factories?: TDeployedProxyFactories<ZupassCheckerFactoryContract, ZupassPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[ZupassPolicy, ZupassChecker, ZupassPolicyFactoryContract, ZupassCheckerFactoryContract]>;
/**
 * Deploy a GitcoinPassportPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed GitcoinPassportPolicy contracts
 */
export declare const deployGitcoinPassportPolicy: (args: {
    decoderAddress: string;
    minimumScore: number;
}, factories?: TDeployedProxyFactories<GitcoinPassportCheckerFactoryContract, GitcoinPassportPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[GitcoinPassportPolicy, GitcoinPassportChecker, GitcoinPassportPolicyFactoryContract, GitcoinPassportCheckerFactoryContract]>;
/**
 * Deploy a MerkleProofPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed MerkleProofPolicy contracts
 */
export declare const deployMerkleProofPolicy: (args: {
    root: Uint8Array | string;
}, factories?: TDeployedProxyFactories<MerkleProofCheckerFactoryContract, MerkleProofPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[MerkleProofPolicy, MerkleProofChecker, MerkleProofPolicyFactoryContract, MerkleProofCheckerFactoryContract]>;
/**
 * Deploy a SemaphorePolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed SemaphorePolicy contracts
 */
export declare const deploySemaphoreSignupPolicy: (args: {
    semaphore: string;
    groupId: BigNumberish;
}, factories?: TDeployedProxyFactories<SemaphoreCheckerFactoryContract, SemaphorePolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[SemaphorePolicy, SemaphoreChecker, SemaphorePolicyFactoryContract, SemaphoreCheckerFactoryContract]>;
/**
 * Deploy a HatsPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed HatsPolicy contracts
 */
export declare const deployHatsSignupPolicy: (args: {
    hats: string;
    criterionHats: BigNumberish[];
}, factories?: TDeployedProxyFactories<HatsCheckerFactoryContract, HatsPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[HatsPolicy, HatsChecker, HatsPolicyFactoryContract, HatsCheckerFactoryContract]>;
/**
 * Deploy a TokenPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed SignupTokenPolicy contract
 */
export declare const deploySignupTokenPolicy: (args: {
    token: string;
}, factories?: TDeployedProxyFactories<TokenCheckerFactoryContract, TokenPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[TokenPolicy, TokenChecker, TokenPolicyFactoryContract, TokenCheckerFactoryContract]>;
/**
 * Deploy a ERC20VotesPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed ERC20VotesPolicy contracts
 */
export declare const deployERC20VotesPolicy: (args: {
    snapshotBlock: bigint;
    token: string;
    threshold: bigint;
}, factories?: TDeployedProxyFactories<ERC20VotesCheckerFactoryContract, ERC20VotesPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[ERC20VotesPolicy, ERC20VotesChecker, ERC20VotesPolicyFactoryContract, ERC20VotesCheckerFactoryContract]>;
/**
 * Deploy a ERC20Policy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed ERC20Policy contracts
 */
export declare const deployERC20Policy: (args: {
    token: string;
    threshold: bigint;
}, factories?: TDeployedProxyFactories<ERC20CheckerFactoryContract, ERC20PolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[ERC20Policy, ERC20Checker, ERC20PolicyFactoryContract, ERC20CheckerFactoryContract]>;
/**
 * Deploy an AnonAadhaarPolicy contract
 * @param args - the arguments to deploy policy
 * @param factories - the optional proxy factories to reuse for deployment
 * @param signer - the signer to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed AnonAadhaarPolicy contracts
 */
export declare const deployAnonAadhaarPolicy: (args: {
    verifierAddress: string;
    nullifierSeed: string;
}, factories?: TDeployedProxyFactories<AnonAadhaarCheckerFactoryContract, AnonAadhaarPolicyFactoryContract>, signer?: Signer, quiet?: boolean) => Promise<[AnonAadhaarPolicy, AnonAadhaarChecker, AnonAadhaarPolicyFactoryContract, AnonAadhaarCheckerFactoryContract]>;
/**
 * Deploy Poseidon contracts
 * @param signer - the signer to use to deploy the contracts
 * @param quiet - whether to suppress console output
 * @returns the deployed Poseidon contracts
 */
export declare const deployPoseidonContracts: (signer?: Signer, { poseidonT3, poseidonT4, poseidonT5, poseidonT6 }?: IDeployMaciArgs["poseidonAddresses"], quiet?: boolean) => Promise<IDeployedPoseidonContracts>;
/**
 * Deploy a contract with linked libraries
 * @param contractFactory - the contract factory to use
 * @param signer - the signer to use for deployment (optional)
 * @param args - the constructor arguments of the contract
 * @returns the deployed contract instance
 */
export declare const deployContractWithLinkedLibraries: <T extends BaseContract>(contractFactory: ContractFactory, signer?: Signer, ...args: unknown[]) => Promise<T>;
/**
 * Deploy a Poll Factory contract
 * @param signer - the signer object to use to deploy the contract
 * @param quiet - whether to suppress console output
 * @returns the deployed Poll Factory contract
 */
export declare const deployPollFactory: (signer: Signer, factory: typeof PollFactoryFactory | undefined, quiet?: boolean) => Promise<PollFactory>;
/**
 * Deploy a MACI contract
 * @param {IDeployMaciArgs} args - deploy arguments
 * @dev used in packages/contract tests (there is another deploy maci in tasks/runner and another in packages/sdk)
 * @returns {IDeployedMaci} the deployed MACI contract
 */
export declare const deployMaci: ({ policyContractAddress, signer, poseidonAddresses, stateTreeDepth, factories, quiet, verifier, }: IDeployMaciArgs) => Promise<IDeployedMaci>;
//# sourceMappingURL=deploy.d.ts.map