import { ReadWriteContract, ReadWriteAdapter, Drift, TransactionOptions, FunctionReturn, FunctionArgs } from "@delvtech/drift";
import { ReadFactory, AirlockABI } from "./ReadFactory";
import { BundlerAbi } from "../../abis";
import { Address, Hex } from "viem";
import { BeneficiaryData, V4MigratorData } from "../../types";
export declare const ONE_YEAR_IN_SECONDS: number;
export declare const DEFAULT_START_TICK = 175000;
export declare const DEFAULT_END_TICK = 225000;
export declare const DEFAULT_NUM_POSITIONS = 15;
export declare const DEFAULT_FEE = 10000;
export declare const DEFAULT_VESTING_DURATION: bigint;
export declare const DEFAULT_INITIAL_SUPPLY_WAD: bigint;
export declare const DEFAULT_NUM_TOKENS_TO_SELL_WAD: bigint;
export declare const DEFAULT_YEARLY_MINT_RATE_WAD: bigint;
export declare const DEFAULT_PRE_MINT_WAD: bigint;
export declare const DEFAULT_MAX_SHARE_TO_BE_SOLD: bigint;
export declare const DEFAULT_INITIAL_VOTING_DELAY = 172800;
export declare const DEFAULT_INITIAL_VOTING_PERIOD = 1209600;
export declare const DEFAULT_INITIAL_PROPOSAL_THRESHOLD: bigint;
export declare const WAD: bigint;
export declare const DEAD_ADDRESS: Address;
/**
 * Parameters required for creating a new Doppler V3 pool
 * @property initialSupply Initial token supply
 * @property numTokensToSell Number of tokens to sell
 * @property numeraire Address of the numeraire token
 * @property tokenFactory Address of token factory contract
 * @property tokenFactoryData Encoded token factory initialization data
 * @property governanceFactory Address of governance factory contract
 * @property governanceFactoryData Encoded governance factory initialization data
 * @property poolInitializer Address of pool initializer contract
 * @property poolInitializerData Encoded pool initialization data
 * @property liquidityMigrator Address of liquidity migrator contract
 * @property liquidityMigratorData Encoded liquidity migration data
 * @property integrator Integrator address
 * @property salt Unique salt for deployment
 */
export interface CreateParams {
    initialSupply: bigint;
    numTokensToSell: bigint;
    numeraire: Address;
    tokenFactory: Address;
    tokenFactoryData: Hex;
    governanceFactory: Address;
    governanceFactoryData: Hex;
    poolInitializer: Address;
    poolInitializerData: Hex;
    liquidityMigrator: Address;
    liquidityMigratorData: Hex;
    integrator: Address;
    salt: Hex;
}
/**
 * Configuration for a Doppler V3 liquidity pool
 * @property startTick Initial tick position
 * @property endTick Final tick position
 * @property numPositions Number of positions
 * @property maxShareToBeSold Maximum percentage of shares to sell
 * @property maxShareToBond Maximum percentage of shares to bond
 * @property fee Pool fee percentage (in basis points)
 * @property beneficiaries Array of beneficiaries (only for fee streaming pools)
 */
export interface V3PoolConfig {
    startTick: number;
    endTick: number;
    numPositions: number;
    maxShareToBeSold: bigint;
    fee: number;
    beneficiaries?: BeneficiaryData[];
}
/**
 * Token sale configuration parameters
 * @property initialSupply Initial token supply
 * @property numTokensToSell Number of tokens available for sale
 */
export interface SaleConfig {
    initialSupply: bigint;
    numTokensToSell: bigint;
}
/**
 * Vesting schedule configuration
 * @property yearlyMintCap Annual minting cap
 * @property vestingDuration Duration of vesting period
 * @property recipients Array of recipient addresses
 * @property amounts Corresponding vesting amounts
 */
export interface VestingConfig {
    yearlyMintRate: bigint;
    vestingDuration: bigint;
    recipients: Address[];
    amounts: bigint[];
}
/**
 * Basic token metadata configuration
 * @property name Token name
 * @property symbol Token symbol
 * @property tokenURI URI for token metadata
 */
export interface TokenConfig {
    name: string;
    symbol: string;
    tokenURI: string;
}
/**
 * Governance configuration parameters
 * @property initialVotingDelay Initial voting delay in seconds
 * @property initialVotingPeriod Initial voting period in seconds
 * @property initialProposalThreshold Initial proposal threshold
 */
export interface GovernanceConfig {
    initialVotingDelay: number;
    initialVotingPeriod: number;
    initialProposalThreshold: bigint;
}
/**
 * Contract dependencies for pool initialization
 * @property tokenFactory Address of token factory
 * @property governanceFactory Address of governance factory
 * @property v3Initializer Address of V3 initializer
 * @property liquidityMigrator Address of liquidity migrator
 */
export interface InitializerContractDependencies {
    tokenFactory: Address;
    governanceFactory: Address;
    v3Initializer: Address;
    liquidityMigrator: Address;
}
/**
 * Parameters for creating a Doppler V3 pool
 * @property integrator Integrator address
 * @property userAddress User address for salt generation
 * @property numeraire Address of numeraire token
 * @property contracts Contract dependencies
 * @property tokenConfig Token metadata configuration
 * @property saleConfig Optional sale configuration overrides
 * @property v3PoolConfig Optional pool configuration overrides
 * @property vestingConfig Vesting configuration or "default" preset
 * @property liquidityMigratorData Optional encoded V4 migrator data for future migration
 */
export interface CreateV3PoolParams {
    integrator: Address;
    userAddress: Address;
    numeraire: Address;
    contracts: InitializerContractDependencies;
    tokenConfig: TokenConfig;
    saleConfig?: Partial<SaleConfig>;
    v3PoolConfig?: Partial<V3PoolConfig>;
    vestingConfig: VestingConfig | "default";
    governanceConfig?: Partial<GovernanceConfig>;
    liquidityMigratorData?: Hex;
}
/**
 * Default configuration presets
 * @property defaultV3PoolConfig Default pool configuration
 * @property defaultVestingConfig Default vesting schedule
 * @property defaultSaleConfig Default sale parameters
 * @property defaultGovernanceConfig Default governance parameters
 */
export interface DefaultConfigs {
    defaultV3PoolConfig?: V3PoolConfig;
    defaultVestingConfig?: VestingConfig;
    defaultSaleConfig?: SaleConfig;
    defaultGovernanceConfig?: GovernanceConfig;
}
export type BundlerABI = typeof BundlerAbi;
/**
 * Factory class for creating and managing Doppler V3 pools with read/write capabilities
 */
export declare class ReadWriteFactory extends ReadFactory {
    airlock: ReadWriteContract<AirlockABI>;
    bundler: ReadWriteContract<BundlerABI>;
    defaultV3PoolConfig: V3PoolConfig;
    defaultVestingConfig: VestingConfig;
    defaultSaleConfig: SaleConfig;
    defaultGovernanceConfig: GovernanceConfig;
    private drift;
    /**
     * Create a new ReadWriteFactory instance
     * @param address Contract address
     * @param drift Drift instance for blockchain interaction
     * @param defaultConfigs Optional default configurations
     */
    constructor(address: Address, bundlerAddress: Address, drift?: Drift<ReadWriteAdapter>, defaultConfigs?: DefaultConfigs);
    /**
     * Merge user configuration with defaults
     * @param config User-provided partial configuration
     * @param defaults Full default configuration
     * @returns Merged configuration object
     */
    private mergeWithDefaults;
    /**
     * Get merged sale configuration
     * @param saleConfig Optional partial sale config
     * @returns Complete SaleConfig
     */
    private getMergedSaleConfig;
    /**
     * Get merged pool configuration
     * @param v3PoolConfig Optional partial pool config
     * @returns Complete V3PoolConfig
     */
    private getMergedV3PoolConfig;
    /**
     * Get merged governance configuration
     * @param governanceConfig Optional partial governance config
     * @returns Complete GovernanceConfig
     */
    private getMergedGovernanceConfig;
    /**
     * Get merged vesting configuration
     * @param config Vesting config or "default" preset
     * @param userAddress User address for default recipient
     * @returns Complete VestingConfig
     */
    private getMergedVestingConfig;
    /**
     * Generate a random salt
     * @param account User address to incorporate into salt
     * @returns Hex string of generated salt
     */
    private generateRandomSalt;
    /**
     * Encode lockable pool initializer data
     * @param v3PoolConfig Complete pool configuration
     * @returns ABI-encoded initialization data
     */
    private encodeLockablePoolInitializerData;
    /**
     * Encode pool initialization data for contract calls
     * @param v3PoolConfig Complete pool configuration
     * @returns ABI-encoded initialization data
     */
    private encodePoolInitializerData;
    /**
     * Encode token factory initialization data
     * @param tokenConfig Token metadata
     * @param vestingConfig Vesting schedule
     * @returns ABI-encoded token factory data
     */
    private encodeTokenFactoryData;
    /**
     * Encode governance factory initialization data
     * @param tokenConfig Token metadata
     * @returns ABI-encoded governance data
     */
    private encodeGovernanceFactoryData;
    /**
     * Encode all parameters for pool creation
     * @param params CreateV3PoolParams input parameters
     * @returns Object containing create parameters and final pool config
     * @throws Error if user address is missing or invalid tick range
     */
    encode(params: CreateV3PoolParams): {
        createParams: CreateParams;
        v3PoolConfig: V3PoolConfig;
    };
    /**
     * Encode creation data with token order validation
     * @param params CreateV3PoolParams input parameters
     * @returns Finalized create parameters with adjusted ticks if needed
     */
    encodeCreateData(params: CreateV3PoolParams): Promise<CreateParams>;
    /**
     * Execute pool creation transaction
     * @param params Finalized create parameters
     * @param options Write options and mined handlers
     * @returns Transaction hash
     */
    create(params: CreateParams, options?: TransactionOptions): Promise<Hex>;
    /**
     * Simulate pool creation transaction
     * @param params Create parameters
     * @returns Simulation results
     */
    simulateCreate(params: CreateParams): Promise<FunctionReturn<AirlockABI, "create">>;
    simulateBundleExactOutput(createData: CreateParams, params: FunctionArgs<BundlerABI, "simulateBundleExactOut">["params"]): Promise<FunctionReturn<BundlerABI, "simulateBundleExactOut">>;
    simulateBundleExactInput(createData: CreateParams, params: FunctionArgs<BundlerABI, "simulateBundleExactIn">["params"]): Promise<FunctionReturn<BundlerABI, "simulateBundleExactIn">>;
    bundle(createData: CreateParams, commands: FunctionArgs<BundlerABI, "bundle">["commands"], inputs: FunctionArgs<BundlerABI, "bundle">["inputs"], options?: TransactionOptions): Promise<Hex>;
    /**
     * Update default configurations
     * @param configs Partial configuration overrides
     */
    updateDefaultConfigs(configs: {
        defaultV3PoolConfig?: Partial<V3PoolConfig>;
        defaultVestingConfig?: Partial<VestingConfig>;
        defaultSaleConfig?: Partial<SaleConfig>;
        defaultGovernanceConfig?: Partial<GovernanceConfig>;
    }): void;
    /**
     * Sort beneficiaries by address in ascending order
     * @param beneficiaries Array of beneficiary data
     * @returns Sorted array of beneficiaries
     */
    sortBeneficiaries(beneficiaries: BeneficiaryData[]): BeneficiaryData[];
    /**
     * Validate beneficiary data
     * @param beneficiaries Array of beneficiary data to validate
     * @throws Error if validation fails
     */
    private validateBeneficiaries;
    /**
     * Encode V4 migrator data for Uniswap V4 migration with StreamableFeesLocker
     * @param data V4 migrator configuration
     * @param includeDefaultBeneficiary Whether to include the airlock owner as a default 5% beneficiary
     * @returns Encoded hex data
     */
    encodeV4MigratorData(data: V4MigratorData, includeDefaultBeneficiary?: boolean): Promise<Hex>;
}
//# sourceMappingURL=ReadWriteFactory.d.ts.map