import { Contract, Locklift, Signer, WalletTypes } from "locklift";
import { FactoryType } from "locklift/internal/factory";
import { Account } from "locklift/everscale-client";
import { Transaction } from "locklift/everscale-provider";
export type CreateAccountParams<T extends FactoryType> = Parameters<Locklift<T>["factory"]["accounts"]["addNewAccount"]>[0];
export type _CreateAccountParamsWithoutPk<E extends FactoryType, T extends CreateAccountParams<E>> = T extends Extract<T, {
    type: WalletTypes.EverWallet | WalletTypes.WalletV3 | WalletTypes.HighLoadWalletV2;
}> ? Omit<T, "publicKey"> : T extends Extract<T, {
    type: WalletTypes.MsigAccount;
}> ? Omit<T, "publicKey"> : never;
export type DeployContractParams<T extends FactoryType = FactoryType> = Parameters<Locklift<T>["factory"]["deployContract"]>[0];
export type CreateAccountParamsWithoutPk<T extends FactoryType> = _CreateAccountParamsWithoutPk<T, CreateAccountParams<T>>;
export type AddExistingAccountParams = Parameters<Locklift<any>["factory"]["accounts"]["addExistingAccount"]>[0];
export type SaveAccount<T extends AddExistingAccountParams> = T extends Extract<AddExistingAccountParams, {
    type: WalletTypes.HighLoadWalletV2 | WalletTypes.WalletV3;
}> ? Omit<T, "publicKey" | "address"> : T extends Extract<AddExistingAccountParams, {
    type: WalletTypes.MsigAccount;
}> ? Omit<T, "publicKey" | "address"> : T extends Extract<AddExistingAccountParams, {
    type: WalletTypes.EverWallet;
}> ? Omit<T, "address"> : never;
export type LogStruct<T extends FactoryType> = {
    accounts: Record<string, CreateAccountParams<any> & {
        signerId: string;
        address: string;
    }>;
    contracts: Record<string, {
        deployContractParams: DeployContractParams<T>;
        address: string;
    }>;
};
export type TagFile = {
    default: () => Promise<any>;
    tag: string;
    dependencies?: Array<string>;
};
export type AccountWithSigner = {
    account: Account;
    signer: Signer;
};
export type WriteDeployInfo = WriteDeployContractInfo | WriteDeployAccountInfo;
export type WriteDeployAccountInfo = {
    type: "Account";
    deploymentName: string;
    address: string;
    publicKey?: string;
    createAccountParams?: CreateAccountParams<FactoryType>;
    saveAccountParams?: SaveAccount<AddExistingAccountParams>;
    signerId?: string;
};
export type WriteDeployContractInfo = {
    type: "Contract";
    deploymentName: string;
    contractName: string;
    address: string;
    abi: any;
    codeHash?: string;
    transaction?: any;
    deployContractParams?: DeployContractParams;
};
export declare enum DeployType {
    FIXTURE = "FIXTURE",
    DEPLOY = "DEPLOY"
}
export type DeployContractResponse<T extends FactoryType> = {
    contract: Contract<T[keyof T]>;
} & ({
    tx: {
        transaction: Transaction;
        output?: Record<string, unknown> | undefined;
    };
    newlyDeployed: true;
} | {
    tx: undefined;
    newlyDeployed: false;
});
