{"version":3,"file":"index.cjs","sources":["../../src/types/deploy-config.ts"],"sourcesContent":["/**\n * @escapehub/token-creator-core\n * Framework-agnostic types for deploying LaunchERC20 tokens\n */\n\n// ============================================\n// Primitive Types\n// ============================================\n\n/**\n * Ethereum address type (0x-prefixed 40-character hex string).\n * @example \"0x742d35Cc6634C0532925a3b844Bc9e7595f1E6aB\"\n */\nexport type Address = `0x${string}`;\n\n/**\n * Transaction hash type (0x-prefixed 64-character hex string).\n * @example \"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b\"\n */\nexport type TxHash = `0x${string}`;\n\n/**\n * The zero address, used to represent \"no address\" or burned tokens.\n */\nexport const ZERO_ADDRESS: Address = '0x0000000000000000000000000000000000000000';\n\n// ============================================\n// Chain Configuration\n// ============================================\n\n/**\n * Configuration for a blockchain network.\n * Contains all necessary information to interact with a specific chain.\n */\nexport interface ChainConfig {\n  /** Unique chain identifier (e.g., 1 for Ethereum mainnet, 11155111 for Sepolia) */\n  readonly chainId: number;\n  /** JSON-RPC endpoint URL for the chain */\n  readonly rpcUrl?: string;\n  /**\n   * Multicall3 contract address for batching read calls.\n   * Set to `false` if the chain doesn't have Multicall3 deployed.\n   * Standard address on most chains: 0xcA11bde05977b3631167028862bE2a173976CA11\n   */\n  readonly multicall3Address?: string | false;\n  /** LaunchERC20Factory contract address on this chain */\n  readonly factoryAddress: string;\n  /** Optional human-readable chain name */\n  readonly name?: string;\n  /** Optional chain icon URL */\n  readonly icon?: string;\n  /** Whether this chain is a testnet */\n  readonly isTestnet?: boolean;\n}\n\n// ============================================\n// Enums\n// ============================================\n\n/**\n * Deadblock protection mode.\n * Determines which transaction types are blocked during the deadblock period.\n */\nexport enum DeadblockMode {\n  /** Block buy transactions only */\n  BUYS = 0,\n  /** Block sell transactions only */\n  SELLS = 1,\n  /** Block both buy and sell transactions */\n  BOTH = 2,\n}\n\n/**\n * Whitelist operating mode.\n * Controls when whitelist restrictions are applied.\n */\nexport enum WhitelistMode {\n  /** Whitelist is disabled, no restrictions */\n  DISABLED = 0,\n  /** Whitelist active until trading enabled, then auto-disables */\n  PRE_TRADING = 1,\n  /** Whitelist always active, only whitelisted addresses can transact */\n  ALWAYS = 2,\n}\n\n/**\n * Anti-dump limit type.\n * Determines how the anti-dump limit is calculated.\n */\nexport enum AntiDumpType {\n  /** Fixed token amount limit per period */\n  ABSOLUTE = 0,\n  /** Percentage of holder's balance limit per period */\n  PERCENTAGE = 1,\n}\n\n/**\n * Batch transfer access control.\n * Determines who can use the batch transfer function.\n */\nexport enum BatchTransferAccess {\n  /** Only the contract owner can batch transfer */\n  OWNER_ONLY = 0,\n  /** Anyone can batch transfer */\n  ANYONE = 1,\n}\n\n/**\n * Batch transfer fee mode.\n * Determines how fees are applied to batch transfers.\n */\nexport enum BatchTransferFees {\n  /** Batch transfers are exempt from fees */\n  NO_FEES = 0,\n  /** One fee for the entire batch */\n  SINGLE_FEE = 1,\n  /** Fee applied to each individual transfer in the batch */\n  PER_TRANSFER_FEE = 2,\n}\n\n// ============================================\n// Fee Configuration\n// ============================================\n\n/**\n * Fee recipient share configuration.\n * Used when distributing fees to multiple recipients.\n */\nexport interface FeeRecipientShare {\n  /** Recipient address */\n  readonly address: Address;\n  /** Share in basis points (total of all shares must equal 10000) */\n  readonly share: number;\n}\n\n// ============================================\n// Distribution Configuration\n// ============================================\n\n/**\n * Initial token distribution entry.\n * Tokens are transferred to these addresses on deployment.\n */\nexport interface DistributionConfig {\n  /** Recipient address */\n  readonly address: Address;\n  /** Amount to distribute (in wei/smallest unit) */\n  readonly amount: bigint;\n}\n\n// ============================================\n// Main Token Configuration\n// ============================================\n\n/**\n * Complete configuration for deploying a LaunchERC20 token.\n * This interface matches the CreateParams struct expected by the factory contract.\n */\nexport interface TokenConfig {\n  // ============================================\n  // Core Token Properties (Required)\n  // ============================================\n\n  /** Token name (e.g., \"My Token\") - max 32 characters */\n  readonly name: string;\n  /** Token symbol (e.g., \"MTK\") - max 8 characters */\n  readonly symbol: string;\n  /** Number of decimal places (typically 18) */\n  readonly decimals: number;\n  /** Total token supply in human-readable format (e.g., \"1000000\") */\n  readonly totalSupplyHuman: string;\n  /** Address that will own the token after deployment */\n  readonly finalOwner: Address;\n\n  // ============================================\n  // Token Capabilities\n  // ============================================\n\n  /** Enable minting capability (default: false) */\n  readonly mintable?: boolean;\n  /** Hard cap for minting in human-readable format (0 = unlimited if minting enabled) */\n  readonly hardCapHuman?: string;\n  /** Enable burning capability (default: false) */\n  readonly burnEnabled?: boolean;\n  /** Enable pause capability (default: false) */\n  readonly pausable?: boolean;\n  /** Enable rescue of stuck tokens (default: false) */\n  readonly rescueEnabled?: boolean;\n  /** Whether token metadata (name, symbol) can be changed */\n  readonly metadataMutable?: boolean;\n  /** Whether social links can be changed */\n  readonly socialsMutable?: boolean;\n\n  // ============================================\n  // Social Links\n  // ============================================\n\n  /** Website URL */\n  readonly website?: string;\n  /** Telegram link */\n  readonly telegram?: string;\n  /** Twitter/X handle */\n  readonly xHandle?: string;\n  /** Discord invite link */\n  readonly discord?: string;\n\n  // ============================================\n  // Module Flags\n  // ============================================\n\n  /** Enable fees module (default: false) */\n  readonly feesModuleEnabled?: boolean;\n  /** Enable limits module (default: false) */\n  readonly limitsModuleEnabled?: boolean;\n  /** Enable cooldown module (default: false) */\n  readonly cooldownModuleEnabled?: boolean;\n  /** Enable blacklist module (default: false) */\n  readonly blacklistModuleEnabled?: boolean;\n  /** Enable whitelist module (default: false) */\n  readonly whitelistModuleEnabled?: boolean;\n  /** Enable anti-dump module (default: false) */\n  readonly antiDumpModuleEnabled?: boolean;\n\n  // ============================================\n  // Fee Configuration\n  // ============================================\n\n  /** Enable fee collection (default: false) */\n  readonly feesEnabled?: boolean;\n  /** Maximum buy fee in basis points (immutable cap) */\n  readonly maxBuyFeeBps?: number;\n  /** Maximum sell fee in basis points (immutable cap) */\n  readonly maxSellFeeBps?: number;\n  /** Maximum transfer fee in basis points (immutable cap) */\n  readonly maxTransferFeeBps?: number;\n  /** Current buy fee in basis points */\n  readonly buyFeeBps?: number;\n  /** Current sell fee in basis points */\n  readonly sellFeeBps?: number;\n  /** Current transfer fee in basis points */\n  readonly transferFeeBps?: number;\n  /** Percentage of fees to burn (basis points) */\n  readonly feeBurnShareBps?: number;\n  /** Address to receive collected fees */\n  readonly feeRecipient?: Address;\n  /** Freeze fees after deployment */\n  readonly freezeFeesAfterDeploy?: boolean;\n\n  // ============================================\n  // Limit Configuration\n  // ============================================\n\n  /** Maximum tokens a wallet can hold (string, in smallest units) */\n  readonly maxWalletAmount?: string;\n  /** Maximum tokens per transaction (string, in smallest units) */\n  readonly maxTxAmount?: string;\n  /** Unix timestamp when limits expire (0 = never) */\n  readonly limitsEndTime?: number;\n  /** Exempt initial distribution recipients from limits */\n  readonly exemptRecipientsFromLimits?: boolean;\n  /** Additional addresses exempt from limits */\n  readonly additionalLimitExempt?: readonly Address[];\n  /** Freeze limits after deployment */\n  readonly freezeLimitsAfterDeploy?: boolean;\n\n  // ============================================\n  // Cooldown Configuration\n  // ============================================\n\n  /** Maximum cooldown in seconds (immutable cap) */\n  readonly maxCooldownSeconds?: number;\n  /** Current cooldown period in seconds */\n  readonly cooldownSeconds?: number;\n  /** Freeze cooldown after deployment */\n  readonly freezeCooldownAfterDeploy?: boolean;\n\n  // ============================================\n  // Initial Distribution\n  // ============================================\n\n  /** Recipient addresses for initial distribution */\n  readonly initialRecipients?: readonly Address[];\n  /** Amounts for initial distribution (strings, in smallest units) */\n  readonly initialAmounts?: readonly string[];\n  /** Labels for initial distribution entries */\n  readonly initialLabels?: readonly string[];\n\n  // ============================================\n  // Trading Configuration\n  // ============================================\n\n  /** Unix timestamp for scheduled trading start (0 = manual) */\n  readonly tradingSchedule?: number;\n  /** Enable trading immediately after deployment */\n  readonly enableTradingImmediately?: boolean;\n  /** DEX router address for router protection */\n  readonly router?: Address;\n  /** Enable router-only trading protection */\n  readonly routerProtectionEnabled?: boolean;\n\n  // ============================================\n  // Blacklist Configuration\n  // ============================================\n\n  /** Initial addresses to blacklist */\n  readonly initialBlacklist?: readonly Address[];\n  /** Freeze blacklist after deployment (no new additions) */\n  readonly freezeBlacklistAfterDeploy?: boolean;\n\n  // ============================================\n  // Ownership Configuration\n  // ============================================\n\n  /** Renounce ownership after deployment */\n  readonly renounceOwnership?: boolean;\n  /** Block ownership transfers after deployment */\n  readonly blockOwnershipTransferAfterDeploy?: boolean;\n\n  // ============================================\n  // Deadblock (Anti-Sniper) Configuration\n  // ============================================\n\n  /** Enable deadblock protection (default: false) */\n  readonly deadblocksEnabled?: boolean;\n  /** Number of blocks to protect after trading enabled */\n  readonly deadBlocks?: number;\n  /** Deadblock protection mode (0=buys, 1=sells, 2=both) */\n  readonly deadblockMode?: number;\n  /** Exempt limit-exempt addresses from deadblock protection */\n  readonly deadblockExemptLimitExempt?: boolean;\n\n  // ============================================\n  // Whitelist Configuration\n  // ============================================\n\n  /** Whitelist mode (0=disabled, 1=pre-trading, 2=always) */\n  readonly whitelistMode?: number;\n  /** Auto-disable whitelist when trading starts */\n  readonly whitelistAutoDisable?: boolean;\n  /** Whitelist bypasses router protection */\n  readonly whitelistBypassesRouter?: boolean;\n  /** Whitelist can be modified */\n  readonly whitelistMutable?: boolean;\n  /** Initial addresses to whitelist */\n  readonly initialWhitelist?: readonly Address[];\n  /** Freeze whitelist after deployment */\n  readonly freezeWhitelistAfterDeploy?: boolean;\n\n  // ============================================\n  // Anti-Dump Configuration\n  // ============================================\n\n  /** Anti-dump type (0=absolute, 1=percentage) */\n  readonly antiDumpType?: number;\n  /** Maximum anti-dump limit (string, tokens or bps depending on type) */\n  readonly maxAntiDumpLimit?: string;\n  /** Maximum anti-dump period in seconds */\n  readonly maxAntiDumpPeriod?: number;\n  /** Current anti-dump limit (string, tokens or bps depending on type) */\n  readonly antiDumpLimit?: string;\n  /** Current anti-dump period in seconds */\n  readonly antiDumpPeriod?: number;\n  /** Unix timestamp when anti-dump expires (0 = never) */\n  readonly antiDumpEndTime?: number;\n  /** Freeze anti-dump after deployment */\n  readonly freezeAntiDumpAfterDeploy?: boolean;\n\n  // ============================================\n  // Batch Transfer Configuration\n  // ============================================\n\n  /** Batch transfer access (0=anyone, 1=owner only) */\n  readonly batchTransferAccess?: number;\n  /** Batch transfer fee mode (0=normal, 1=none, 2=owner-none) */\n  readonly batchTransferFees?: number;\n  /** Maximum recipients per batch */\n  readonly maxBatchSize?: number;\n\n  // ============================================\n  // Permit Configuration\n  // ============================================\n\n  /** Enable EIP-2612 permit (default: true) */\n  readonly permitEnabled?: boolean;\n}\n\n// ============================================\n// Deployment Result Types\n// ============================================\n\n/**\n * Result of a successful token deployment.\n */\nexport interface DeploymentResult {\n  /** Transaction hash of the deployment */\n  readonly txHash: TxHash;\n  /** Deployed token contract address */\n  readonly tokenAddress: Address;\n}\n\n/**\n * Gas estimation for a token deployment.\n */\nexport interface GasEstimation {\n  /** Estimated gas limit */\n  readonly gasLimit: bigint;\n  /** Factory creation fee in wei */\n  readonly creationFee: bigint;\n}\n\n/**\n * Deployment status for tracking multi-step deployments.\n */\nexport interface DeploymentStatus {\n  /** Current deployment step */\n  readonly step: 'preparing' | 'signing' | 'broadcasting' | 'confirming' | 'complete' | 'failed';\n  /** Transaction hash (available after broadcasting) */\n  readonly txHash?: TxHash;\n  /** Error message (if failed) */\n  readonly error?: string;\n  /** Number of confirmations received */\n  readonly confirmations?: number;\n}\n\n// ============================================\n// Validation Types\n// ============================================\n\n/**\n * Validation error for token configuration.\n */\nexport interface ValidationError {\n  /** Field that failed validation */\n  readonly field: keyof TokenConfig;\n  /** Error message */\n  readonly message: string;\n  /** Error code for programmatic handling */\n  readonly code: string;\n}\n\n/**\n * Result of validating a token configuration.\n */\nexport interface ValidationResult {\n  /** Whether the configuration is valid */\n  readonly valid: boolean;\n  /** List of validation errors (empty if valid) */\n  readonly errors: readonly ValidationError[];\n  /** List of warnings (non-blocking issues) */\n  readonly warnings: readonly ValidationError[];\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Creates a default token configuration with sensible defaults.\n * Override specific fields as needed.\n *\n * @param name - Token name\n * @param symbol - Token symbol\n * @param totalSupplyHuman - Total supply in human-readable format (e.g., \"1000000\")\n * @param finalOwner - Address that will own the token\n * @param overrides - Optional partial configuration to override defaults\n * @returns Complete token configuration with defaults applied\n *\n * @example\n * ```typescript\n * const config = createDefaultConfig(\n *   'My Token',\n *   'MTK',\n *   '1000000',\n *   '0x742d35Cc6634C0532925a3b844Bc9e7595f1E6aB'\n * );\n * ```\n */\nexport function createDefaultConfig(\n  name: string,\n  symbol: string,\n  totalSupplyHuman: string,\n  finalOwner: Address,\n  overrides?: Partial<TokenConfig>\n): TokenConfig {\n  return {\n    // Core properties (required)\n    name,\n    symbol,\n    decimals: overrides?.decimals ?? 18,\n    totalSupplyHuman,\n    finalOwner,\n\n    // Token capabilities (all disabled by default for safety)\n    mintable: overrides?.mintable ?? false,\n    hardCapHuman: overrides?.hardCapHuman,\n    burnEnabled: overrides?.burnEnabled ?? false,\n    pausable: overrides?.pausable ?? false,\n    rescueEnabled: overrides?.rescueEnabled ?? false,\n    metadataMutable: overrides?.metadataMutable ?? false,\n    socialsMutable: overrides?.socialsMutable ?? false,\n\n    // Social links\n    website: overrides?.website ?? '',\n    telegram: overrides?.telegram ?? '',\n    xHandle: overrides?.xHandle ?? '',\n    discord: overrides?.discord ?? '',\n\n    // Module flags (all disabled by default)\n    feesModuleEnabled: overrides?.feesModuleEnabled ?? false,\n    limitsModuleEnabled: overrides?.limitsModuleEnabled ?? false,\n    cooldownModuleEnabled: overrides?.cooldownModuleEnabled ?? false,\n    blacklistModuleEnabled: overrides?.blacklistModuleEnabled ?? false,\n    whitelistModuleEnabled: overrides?.whitelistModuleEnabled ?? false,\n    antiDumpModuleEnabled: overrides?.antiDumpModuleEnabled ?? false,\n\n    // Fees (disabled by default)\n    feesEnabled: overrides?.feesEnabled ?? false,\n    maxBuyFeeBps: overrides?.maxBuyFeeBps ?? 0,\n    maxSellFeeBps: overrides?.maxSellFeeBps ?? 0,\n    maxTransferFeeBps: overrides?.maxTransferFeeBps ?? 0,\n    buyFeeBps: overrides?.buyFeeBps ?? 0,\n    sellFeeBps: overrides?.sellFeeBps ?? 0,\n    transferFeeBps: overrides?.transferFeeBps ?? 0,\n    feeBurnShareBps: overrides?.feeBurnShareBps ?? 0,\n    feeRecipient: overrides?.feeRecipient ?? ZERO_ADDRESS,\n    freezeFeesAfterDeploy: overrides?.freezeFeesAfterDeploy ?? false,\n\n    // Limits (disabled by default)\n    maxWalletAmount: overrides?.maxWalletAmount ?? '0',\n    maxTxAmount: overrides?.maxTxAmount ?? '0',\n    limitsEndTime: overrides?.limitsEndTime ?? 0,\n    exemptRecipientsFromLimits: overrides?.exemptRecipientsFromLimits ?? false,\n    additionalLimitExempt: overrides?.additionalLimitExempt ?? [],\n    freezeLimitsAfterDeploy: overrides?.freezeLimitsAfterDeploy ?? false,\n\n    // Cooldown (disabled by default)\n    maxCooldownSeconds: overrides?.maxCooldownSeconds ?? 0,\n    cooldownSeconds: overrides?.cooldownSeconds ?? 0,\n    freezeCooldownAfterDeploy: overrides?.freezeCooldownAfterDeploy ?? false,\n\n    // Initial distribution\n    initialRecipients: overrides?.initialRecipients ?? [],\n    initialAmounts: overrides?.initialAmounts ?? [],\n    initialLabels: overrides?.initialLabels ?? [],\n\n    // Trading\n    tradingSchedule: overrides?.tradingSchedule ?? 0,\n    enableTradingImmediately: overrides?.enableTradingImmediately ?? false,\n    router: overrides?.router ?? ZERO_ADDRESS,\n    routerProtectionEnabled: overrides?.routerProtectionEnabled ?? false,\n\n    // Blacklist (disabled by default)\n    initialBlacklist: overrides?.initialBlacklist ?? [],\n    freezeBlacklistAfterDeploy: overrides?.freezeBlacklistAfterDeploy ?? false,\n\n    // Ownership\n    renounceOwnership: overrides?.renounceOwnership ?? false,\n    blockOwnershipTransferAfterDeploy: overrides?.blockOwnershipTransferAfterDeploy ?? false,\n\n    // Deadblock (disabled by default)\n    deadblocksEnabled: overrides?.deadblocksEnabled ?? false,\n    deadBlocks: overrides?.deadBlocks ?? 0,\n    deadblockMode: overrides?.deadblockMode ?? 2, // BOTH\n    deadblockExemptLimitExempt: overrides?.deadblockExemptLimitExempt ?? false,\n\n    // Whitelist (disabled by default)\n    whitelistMode: overrides?.whitelistMode ?? 0, // DISABLED\n    whitelistAutoDisable: overrides?.whitelistAutoDisable ?? false,\n    whitelistBypassesRouter: overrides?.whitelistBypassesRouter ?? false,\n    whitelistMutable: overrides?.whitelistMutable ?? false,\n    initialWhitelist: overrides?.initialWhitelist ?? [],\n    freezeWhitelistAfterDeploy: overrides?.freezeWhitelistAfterDeploy ?? false,\n\n    // Anti-dump (disabled by default)\n    antiDumpType: overrides?.antiDumpType ?? 1, // PERCENTAGE\n    maxAntiDumpLimit: overrides?.maxAntiDumpLimit ?? '0',\n    maxAntiDumpPeriod: overrides?.maxAntiDumpPeriod ?? 0,\n    antiDumpLimit: overrides?.antiDumpLimit ?? '0',\n    antiDumpPeriod: overrides?.antiDumpPeriod ?? 86400, // 24 hours\n    antiDumpEndTime: overrides?.antiDumpEndTime ?? 0,\n    freezeAntiDumpAfterDeploy: overrides?.freezeAntiDumpAfterDeploy ?? false,\n\n    // Batch transfer (owner only by default)\n    batchTransferAccess: overrides?.batchTransferAccess ?? 1, // OWNER_ONLY\n    batchTransferFees: overrides?.batchTransferFees ?? 0, // NO_FEES\n    maxBatchSize: overrides?.maxBatchSize ?? 100,\n\n    // Permit (enabled by default)\n    permitEnabled: overrides?.permitEnabled ?? true,\n  };\n}\n\n/**\n * Type guard to check if a string is a valid Ethereum address.\n *\n * @param value - String to check\n * @returns True if the value is a valid address\n */\nexport function isAddress(value: string): value is Address {\n  return /^0x[a-fA-F0-9]{40}$/.test(value);\n}\n\n/**\n * Type guard to check if a string is a valid transaction hash.\n *\n * @param value - String to check\n * @returns True if the value is a valid transaction hash\n */\nexport function isTxHash(value: string): value is TxHash {\n  return /^0x[a-fA-F0-9]{64}$/.test(value);\n}\n"],"names":["DeadblockMode","WhitelistMode","AntiDumpType","BatchTransferAccess","BatchTransferFees"],"mappings":"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"}