{"version":3,"sources":["../src/constants/chains.ts","../src/abis/bridge.ts","../src/constants/addresses.ts","../src/contracts/factory.ts","../src/contracts/pair.ts","../src/contracts/router.ts","../src/contracts/masterchef.ts","../src/contracts/launchtoken.ts","../src/contracts/pondertoken.ts","../src/contracts/launcher.ts","../src/contracts/oracle.ts","../src/contracts/kkubunwrapper.ts","../src/contracts/staking.ts","../src/contracts/feedistributor.ts","../src/contracts/bridge.ts","../src/context/PonderContext.tsx","../src/hooks/token/useTokenInfo.ts","../src/hooks/token/useTokenBalance.ts","../src/hooks/token/useTokenApproval.ts","../src/hooks/token/useTokenAllowance.ts","../src/utils/fees.ts","../src/hooks/trade/usePairFees.ts","../src/hooks/trade/useSwapAmounts.ts","../src/hooks/pair/useSwap.ts","../src/hooks/pair/useSwapCallback.ts","../src/hooks/pair/useSwapRoute.ts","../src/hooks/token/useSwapApproval.ts","../src/hooks/pair/usePairInfo.ts","../src/hooks/pair/usePairExists.ts","../src/hooks/pair/usePairCreation.ts","../src/hooks/pair/usePairQuote.ts","../src/hooks/pair/usePairLiquidity.ts","../src/hooks/liquidity/useAddLiquidity.ts","../src/hooks/liquidity/useRemoveLiquidity.ts","../src/hooks/pair/usePositionValue.ts","../src/hooks/pair/useLPTokenBalance.ts","../src/hooks/pair/useAllPairs.ts","../src/hooks/farm/usePoolInfo.ts","../src/hooks/farm/useStakeInfo.ts","../src/hooks/farm/useStake.ts","../src/hooks/farm/useUnstake.ts","../src/hooks/farm/useHarvest.ts","../src/hooks/farm/useBoost.ts","../src/hooks/farm/usePendingRewards.ts","../src/hooks/farm/useFarmMetrics.ts","../src/hooks/launch/useLaunchInfo.ts","../src/hooks/launch/useCreateLaunch.ts","../src/hooks/launch/useContribute.ts","../src/hooks/launch/useVestingInfo.ts","../src/hooks/launch/useClaimTokens.ts","../src/hooks/launch/useLPWithdraw.ts","../src/hooks/launch/useRemainingToRaise.ts","../src/hooks/oracle/usePriceInfo.ts","../src/hooks/oracle/usePriceHistory.ts","../src/hooks/oracle/useOracleUpdates.ts","../src/hooks/oracle/usePriceFeeds.ts","../src/hooks/analytics/useYieldAnalytics.ts","../src/hooks/pair/useRecentSwaps.ts","../src/hooks/token/useTransaction.ts","../src/hooks/trade/useGasEstimate.ts","../src/hooks/trade/useTradeInfo.ts","../src/hooks/staking/useStakingInfo.ts","../src/hooks/staking/useStakePonder.ts","../src/hooks/staking/useUnstakePonder.ts","../src/hooks/staking/useStakingStats.ts","../src/hooks/staking/useClaimFees.ts","../src/hooks/fees/useFeeDistributorInfo.ts","../src/hooks/fees/useDistributeFees.ts","../src/hooks/fees/useCollectFees.ts","../src/hooks/fees/useFeeMetrics.ts","../src/index.ts"],"names":["launchtokenAbi","fivefivefivelauncherAbi","ponderrouterAbi","ponderfactoryAbi","ponderpriceoracleAbi","ponderstakingAbi","DEST_TOKEN_TYPE","FEE_TYPE","TOKEN_STRATEGY","useQuery","token","spender","extendedErc20Abi","erc20Abi","ContractFunctionExecutionError","useMutation","request","decodeEventLog","data","calculatePriceImpact","totalSupply"],"mappings":"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","file":"index.mjs","sourcesContent":["import { type Chain } from \"viem\";\nimport { mainnet } from \"viem/chains\";\n\nexport const bitkubChain = {\n  id: 96,\n  name: \"Bitkub\",\n  nativeCurrency: {\n    decimals: 18,\n    name: \"KUB\",\n    symbol: \"KUB\",\n  },\n  rpcUrls: {\n    default: { http: [\"https://rpc.bitkubchain.io\"] },\n    public: { http: [\"https://rpc.bitkubchain.io\"] },\n  },\n  blockExplorers: {\n    default: { name: \"Bkcscan\", url: \"https://bkcscan.com\" },\n  },\n  testnet: false,\n} as const satisfies Chain;\n\nexport const bitkubTestnetChain = {\n  id: 25925,\n  name: \"Bitkub Testnet\",\n  nativeCurrency: {\n    decimals: 18,\n    name: \"KUB\",\n    symbol: \"KUB\",\n  },\n  rpcUrls: {\n    default: { http: [\"https://rpc-testnet.bitkubchain.io\"] },\n    public: { http: [\"https://rpc-testnet.bitkubchain.io\"] },\n  },\n  blockExplorers: {\n    default: { name: \"Bkcscan Testnet\", url: \"https://testnet.bkcscan.com\" },\n  },\n  testnet: true,\n} as const satisfies Chain;\n\n// Map our ChainIds to chains\nexport const SUPPORTED_CHAINS = {\n  96: bitkubChain,\n  25925: bitkubTestnetChain,\n  1: mainnet,\n} as const;\n\nexport type SupportedChainId = keyof typeof SUPPORTED_CHAINS;\n\n// Helper to get chain from ChainId\nexport function getChainFromId(chainId: SupportedChainId) {\n  const chain = SUPPORTED_CHAINS[chainId];\n  if (!chain) throw new Error(`Chain ${chainId} not supported`);\n  return chain;\n}\n\n// Helper to check if a chain is supported\nexport function isSupportedChain(chainId: number): chainId is SupportedChainId {\n  return chainId in SUPPORTED_CHAINS;\n}\n","// src/abis/bridge.ts\nexport const bridgeAbi = [\n  {\n    inputs: [],\n    name: \"NATIVE_REPRESENTATION\",\n    outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n  {\n    inputs: [\n      { internalType: \"address\", name: \"token_\", type: \"address\" },\n      { internalType: \"uint256\", name: \"amount_\", type: \"uint256\" },\n      { internalType: \"uint64\", name: \"destChainID_\", type: \"uint64\" },\n      {\n        internalType: \"enum BridgeERC20V3.DEST_TOKEN_TYPE\",\n        name: \"destTokenType_\",\n        type: \"uint8\",\n      },\n    ],\n    name: \"bridge\",\n    outputs: [],\n    stateMutability: \"nonpayable\",\n    type: \"function\",\n  },\n  {\n    inputs: [\n      { internalType: \"uint64\", name: \"destChainID_\", type: \"uint64\" },\n      {\n        internalType: \"enum BridgeERC20V3.DEST_TOKEN_TYPE\",\n        name: \"destTokenType_\",\n        type: \"uint8\",\n      },\n    ],\n    name: \"bridge\",\n    outputs: [],\n    stateMutability: \"payable\",\n    type: \"function\",\n  },\n  {\n    inputs: [\n      { internalType: \"address\", name: \"\", type: \"address\" },\n      { internalType: \"uint64\", name: \"\", type: \"uint64\" },\n    ],\n    name: \"bridgeMap\",\n    outputs: [\n      { internalType: \"bool\", name: \"enabled\", type: \"bool\" },\n      { internalType: \"address\", name: \"token\", type: \"address\" },\n      { internalType: \"uint64\", name: \"chainID\", type: \"uint64\" },\n      {\n        internalType: \"enum BridgeERC20V3.DEST_TOKEN_TYPE\",\n        name: \"allowedDestTokenTypes\",\n        type: \"uint8\",\n      },\n      { internalType: \"address\", name: \"feeReceiver\", type: \"address\" },\n      { internalType: \"uint256\", name: \"fee\", type: \"uint256\" },\n      {\n        internalType: \"enum BridgeERC20V3.FEE_TYPE\",\n        name: \"feeType\",\n        type: \"uint8\",\n      },\n      {\n        internalType: \"enum BridgeERC20V3.TOKEN_STRATEGY\",\n        name: \"strategy\",\n        type: \"uint8\",\n      },\n      { internalType: \"address\", name: \"receiver\", type: \"address\" },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n  {\n    inputs: [],\n    name: \"committee\",\n    outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n  {\n    inputs: [\n      { internalType: \"address\", name: \"token_\", type: \"address\" },\n      { internalType: \"uint64\", name: \"chainID_\", type: \"uint64\" },\n      { internalType: \"uint256\", name: \"amount_\", type: \"uint256\" },\n    ],\n    name: \"computeFeeByFeeType\",\n    outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n  {\n    inputs: [{ internalType: \"address\", name: \"token_\", type: \"address\" }],\n    name: \"getDestChainIDsAndAllowedTokenTypes\",\n    outputs: [\n      {\n        components: [\n          { internalType: \"uint248\", name: \"chainID\", type: \"uint248\" },\n          {\n            internalType: \"enum BridgeERC20V3.DEST_TOKEN_TYPE\",\n            name: \"allowedDestTokenTypes\",\n            type: \"uint8\",\n          },\n        ],\n        internalType: \"struct BridgeERC20V3.ChainIDAndAllowedDestTokenTypes[]\",\n        name: \"\",\n        type: \"tuple[]\",\n      },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n  {\n    inputs: [],\n    name: \"pause\",\n    outputs: [],\n    stateMutability: \"nonpayable\",\n    type: \"function\",\n  },\n  {\n    inputs: [],\n    name: \"paused\",\n    outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n] as const;\n\nexport default bridgeAbi;\n","import { type Address } from \"viem\";\nimport { type ChainId } from \"@/types/common\";\n\nexport interface PonderAddresses {\n  factory: Address;\n  router: Address;\n  masterChef: Address;\n  launcher: Address;\n  oracle: Address;\n  kkubUnwrapper: Address;\n  ponderToken: Address;\n  staking: Address;\n  feeDistributor: Address;\n}\n\nimport { type SupportedChainId } from \"./chains\";\n\ninterface BridgeAddresses {\n  bridge: `0x${string}`;\n}\n\nexport const BRIDGE_ADDRESSES: Record<SupportedChainId, BridgeAddresses> = {\n  1: {\n    bridge: \"0x89943b2499d678fb2d382c66b7baed00b732e753\" as `0x${string}`,\n  },\n  96: {\n    bridge: \"0x89943b2499d678fb2d382C66b7BaeD00b732e753\" as `0x${string}`,\n  },\n  25925: {\n    bridge: \"0x0000000000000000000000000000000000000000\" as `0x${string}`,\n  },\n} as const;\n\n// Contract addresses for each supported chain\nexport const PONDER_ADDRESSES: Record<ChainId, PonderAddresses> = {\n  25925: {\n    factory: \"0x4a0aB14A75eB5F1E07aC8467DCE811687cFa35B3\",\n    router: \"0xAD17b142bD4AcFB4441e6586B9aBdfD40d1C2a29\",\n    masterChef: \"0x65e358F9C9e3B9F0832f001cC4Cb058931fC7D7c\",\n    launcher: \"0x0B83ecDBB4d52fb8661c0374eB20021Ef59Bfc95\",\n    oracle: \"0xce1fdA5AC44f495321C163103B11916933851B83\",\n    kkubUnwrapper: \"0x4B3C50378221080f1DA0768E7b848987c0A7412F\",\n    ponderToken: \"0x33C9B02596d7b1CB4066cC2CeEdd37f3A7c7Aa07\",\n    staking: \"0x0f9b00Cc79dFAAF3818d6219246033b4951Fb584\",\n    feeDistributor: \"0xAf7d796A6589369AB56c423a1086CB604f8b7EFD\",\n  },\n  96: {\n    factory: \"0x20b17e92dd1866ec647acaa38fe1f7075e4b359e\",\n    router: \"0xd19c5cebfa9a8919cc3db2f19163089febd9604e\",\n    masterChef: \"0x6f2b10fa6d88a0c2013d08ef9655a07356e8d53c\",\n    launcher: \"0x2a610b695e21fe6560343c003b0dd4c26ef8790d\",\n    oracle: \"0xcf814870800a3bcac4a6b858424a9370a64c75ad\",\n    kkubUnwrapper: \"0xea1b8372b2ae06e905957f82969da8e8a3ba47c4\",\n    ponderToken: \"0xe0432224871917fb5a137f4a153a51ecf9f74f57\",\n    staking: \"0x6c8119d33fd43f6b254d041cd5d2675586731dd5\",\n    feeDistributor: \"0x37196731cdf654e0572881176cb256d99c7fdc2d\",\n  },\n} as const;\n\n\n// KKUB addresses for each chain\nexport const KKUB_ADDRESS: Record<ChainId, Address> = {\n  25925: \"0xBa71efd94be63bD47B78eF458DE982fE29f552f7\",\n  96: \"0x67eBD850304c70d983B2d1b93ea79c7CD6c3F6b5\",\n} as const;\n","import { type PublicClient, type WalletClient, type Address, type Hash, type WriteContractParameters } from 'viem'\nimport { type Chain } from 'viem/chains'\nimport { FACTORY_ABI } from '../abis'\nimport { PONDER_ADDRESSES } from '@/constants/addresses'\nimport { type SupportedChainId } from '@/constants/chains'\nimport { getChainFromId } from '@/constants/chains'\n\nexport type CreatePairArgs = {\n    tokenA: Address\n    tokenB: Address\n}\n\nexport type CreatePairResult = {\n    hash: Hash\n    wait: () => Promise<{\n        pairAddress: Address,\n        token0: Address,\n        token1: Address\n    }>\n}\n\nexport class Factory {\n    public readonly chainId: SupportedChainId\n    public readonly address: Address\n    public readonly chain: Chain\n    private readonly publicClient: PublicClient\n    private readonly walletClient?: WalletClient\n\n    constructor(\n        chainId: SupportedChainId,\n        publicClient: PublicClient,\n        walletClient?: WalletClient\n    ) {\n        this.chainId = chainId\n        this.chain = getChainFromId(chainId)\n        this.address = PONDER_ADDRESSES[chainId].factory\n        this.publicClient = publicClient\n        this.walletClient = walletClient\n    }\n\n    // Read Methods\n\n    async getPair(tokenA: Address, tokenB: Address): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'getPair',\n            args: [tokenA, tokenB]\n        })\n    }\n\n    async allPairs(index: number): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'allPairs',\n            args: [BigInt(index)]\n        })\n    }\n\n    async allPairsLength(): Promise<bigint> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'allPairsLength'\n        })\n    }\n\n    async feeTo(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'feeTo'\n        })\n    }\n\n    async feeToSetter(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'feeToSetter'\n        })\n    }\n\n\n    // Write Methods\n\n    async createPair({ tokenA, tokenB }: CreatePairArgs): Promise<CreatePairResult> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        const hash = await this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'createPair',\n            args: [tokenA, tokenB]\n        } as unknown as WriteContractParameters)\n\n        const wait = async () => {\n            const receipt = await this.publicClient.waitForTransactionReceipt({ hash })\n            // Get pair address from PairCreated event\n            const pairCreatedLog = receipt.logs.find(log =>\n                log.topics[0] === '0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9' // PairCreated event signature\n            )\n            if (!pairCreatedLog || pairCreatedLog.topics.length < 4) {\n                throw new Error('Pair creation failed')\n            }\n\n            // Safely access topics after check\n            const topics = pairCreatedLog.topics\n            return {\n                pairAddress: `0x${topics?.[3]?.slice(26)}` as Address,\n                token0: `0x${topics?.[1]?.slice(26)}` as Address,\n                token1: `0x${topics?.[2]?.slice(26)}` as Address\n            }\n        }\n\n        return { hash, wait }\n    }\n\n    async setFeeTo(newFeeTo: Address): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'setFeeTo',\n            args: [newFeeTo]\n       } as unknown as WriteContractParameters)\n    }\n\n    async setFeeToSetter(newFeeToSetter: Address): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'setFeeToSetter',\n            args: [newFeeToSetter]\n       } as unknown as WriteContractParameters)\n    }\n\n    async setMigrator(newMigrator: Address): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: FACTORY_ABI,\n            functionName: 'setMigrator',\n            args: [newMigrator]\n       } as unknown as WriteContractParameters)\n    }\n\n    // Helper Methods\n\n    /**\n     * Get all pairs created by the factory\n     * @returns Array of pair addresses\n     */\n    async getAllPairs(): Promise<Address[]> {\n        const length = await this.allPairsLength()\n        const pairs: Address[] = []\n\n        for (let i = 0; i < Number(length); i++) {\n            pairs.push(await this.allPairs(i))\n        }\n\n        return pairs\n    }\n}\n\n// Export the type separately to avoid declaration conflicts\nexport type PonderFactory = Factory\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport { PAIR_ABI } from \"../abis\";\nimport { type SupportedChainId } from \"@/constants/chains\";\nimport { getChainFromId } from \"@/constants/chains\";\n\nexport interface Reserves {\n  reserve0: bigint;\n  reserve1: bigint;\n  blockTimestampLast: number;\n}\n\nexport type SwapArgs = {\n  amount0Out: bigint;\n  amount1Out: bigint;\n  to: Address;\n  data: string;\n};\n\nexport type MintResult = {\n  hash: Hash;\n  wait: () => Promise<{\n    liquidity: bigint;\n  }>;\n};\n\nexport type BurnResult = {\n  hash: Hash;\n  wait: () => Promise<{\n    amount0: bigint;\n    amount1: bigint;\n  }>;\n};\n\nexport class Pair {\n  public readonly chainId: SupportedChainId;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  constructor(\n    chainId: SupportedChainId,\n    pairAddress: Address,\n    publicClient: PublicClient,\n    walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n    this.address = pairAddress;\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Read Methods\n\n  async MINIMUM_LIQUIDITY(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"minimumLiquidity\",\n    });\n  }\n\n  async factory(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"factory\",\n    });\n  }\n\n  async token0(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"token0\",\n    });\n  }\n\n  async token1(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"token1\",\n    });\n  }\n\n  async getReserves(): Promise<Reserves> {\n    const [reserve0, reserve1, blockTimestampLast] =\n      await this.publicClient.readContract({\n        address: this.address,\n        abi: PAIR_ABI,\n        functionName: \"getReserves\",\n      });\n\n    return {\n      reserve0,\n      reserve1,\n      blockTimestampLast,\n    };\n  }\n\n  async price0CumulativeLast(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"price0CumulativeLast\",\n    });\n  }\n\n  async price1CumulativeLast(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"price1CumulativeLast\",\n    });\n  }\n\n  async kLast(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"kLast\",\n    });\n  }\n\n  async launcher(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"launcher\",\n    });\n  }\n\n  // ERC20 Read Methods\n  async name(): Promise<string> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"name\",\n    });\n  }\n\n  async symbol(): Promise<string> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"symbol\",\n    });\n  }\n\n  async decimals(): Promise<number> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"decimals\",\n    });\n  }\n\n  async totalSupply(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"totalSupply\",\n    });\n  }\n\n  async balanceOf(account: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"balanceOf\",\n      args: [account],\n    });\n  }\n\n  async allowance(owner: Address, spender: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"allowance\",\n      args: [owner, spender],\n    });\n  }\n\n  // Write Methods\n\n  async mint(to: Address): Promise<MintResult> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    const hash = await this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"mint\",\n      args: [to],\n    } as unknown as WriteContractParameters);\n\n    const wait = async () => {\n      const receipt = await this.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n      const mintLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0x4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f\" // Mint event signature\n      );\n      if (!mintLog || !mintLog.data) {\n        throw new Error(\"Mint failed\");\n      }\n\n      return {\n        liquidity: BigInt(mintLog.data),\n      };\n    };\n\n    return { hash, wait };\n  }\n\n  async burn(to: Address): Promise<BurnResult> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    const hash = await this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"burn\",\n      args: [to],\n    } as unknown as WriteContractParameters);\n\n    const wait = async () => {\n      const receipt = await this.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n      const burnLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0xdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496\" // Burn event signature\n      );\n      if (!burnLog || !burnLog.data) {\n        throw new Error(\"Burn failed\");\n      }\n\n      // Decode the burn event data\n      const data = burnLog.data.slice(2); // Remove '0x' prefix\n      return {\n        amount0: BigInt(\"0x\" + data.slice(0, 64)),\n        amount1: BigInt(\"0x\" + data.slice(64, 128)),\n      };\n    };\n\n    return { hash, wait };\n  }\n\n  async swap({ amount0Out, amount1Out, to, data }: SwapArgs): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"swap\",\n      args: [amount0Out, amount1Out, to, data],\n    } as unknown as WriteContractParameters);\n  }\n\n  async sync(): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"sync\",\n    } as unknown as WriteContractParameters);\n  }\n\n  async skim(to: Address): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"skim\",\n      args: [to],\n    } as unknown as WriteContractParameters);\n  }\n\n  // Standard ERC20 write methods\n  async approve(spender: Address, value: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"approve\",\n      args: [spender, value],\n    } as unknown as WriteContractParameters);\n  }\n\n  async transfer(to: Address, value: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"transfer\",\n      args: [to, value],\n    } as unknown as WriteContractParameters);\n  }\n\n  async transferFrom(from: Address, to: Address, value: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: PAIR_ABI,\n      functionName: \"transferFrom\",\n      args: [from, to, value],\n    } as unknown as WriteContractParameters);\n  }\n}\n\nexport type PonderPair = Pair;\n","import { type PublicClient, type WalletClient, type Address, type Hash, type WriteContractParameters } from 'viem'\nimport { type Chain } from 'viem/chains'\nimport { ROUTER_ABI } from '../abis'\nimport { type SupportedChainId } from '@/constants/chains'\nimport { getChainFromId } from '@/constants/chains'\nimport { PONDER_ADDRESSES } from '@/constants/addresses'\n\nexport type AddLiquidityParams = {\n    tokenA: Address\n    tokenB: Address\n    amountADesired: bigint\n    amountBDesired: bigint\n    amountAMin: bigint\n    amountBMin: bigint\n    to: Address\n    deadline: bigint\n}\n\nexport type AddLiquidityETHParams = {\n    token: Address\n    amountTokenDesired: bigint\n    amountTokenMin: bigint\n    amountETHMin: bigint\n    to: Address\n    deadline: bigint\n}\n\nexport type RemoveLiquidityParams = {\n    tokenA: Address\n    tokenB: Address\n    liquidity: bigint\n    amountAMin: bigint\n    amountBMin: bigint\n    to: Address\n    deadline: bigint\n}\n\nexport type RemoveLiquidityETHParams = {\n    token: Address\n    liquidity: bigint\n    amountTokenMin: bigint\n    amountETHMin: bigint\n    to: Address\n    deadline: bigint\n}\n\nexport type SwapExactTokensForTokensParams = {\n    amountIn: bigint\n    amountOutMin: bigint\n    path: Address[]\n    to: Address\n    deadline: bigint\n}\n\nexport type SwapTokensForExactTokensParams = {\n    amountOut: bigint\n    amountInMax: bigint\n    path: Address[]\n    to: Address\n    deadline: bigint\n}\n\nexport class Router {\n    public readonly chainId: SupportedChainId\n    public readonly address: Address\n    public readonly chain: Chain\n    private readonly publicClient: PublicClient\n    private readonly walletClient?: WalletClient\n\n    constructor(\n        chainId: SupportedChainId,\n        publicClient: PublicClient,\n        walletClient?: WalletClient\n    ) {\n        this.chainId = chainId\n        this.chain = getChainFromId(chainId)\n        this.address = PONDER_ADDRESSES[chainId].router\n        this.publicClient = publicClient\n        this.walletClient = walletClient\n    }\n\n    // Read Methods\n    async factory(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'FACTORY'\n        })\n    }\n\n    async KKUB(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'kkub'\n        })\n    }\n\n    async getAmountOut(amountIn: bigint, path: readonly `0x${string}`[]): Promise<readonly bigint[]> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'getAmountsOut',\n            args: [amountIn, path]\n        })\n    }\n\n    async getAmountIn(amountOut: bigint, path: readonly `0x${string}`[]): Promise<readonly bigint[]> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'getAmountsIn',\n            args: [amountOut, path]\n        })\n    }\n\n    async getAmountsOut(amountIn: bigint, path: Address[]): Promise<readonly bigint[]> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'getAmountsOut',\n            args: [amountIn, path]\n        })\n    }\n\n    async getAmountsIn(amountOut: bigint, path: Address[]): Promise<readonly bigint[]> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'getAmountsIn',\n            args: [amountOut, path]\n        })\n    }\n\n    // Write Methods - Liquidity\n    async addLiquidity(params: AddLiquidityParams): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'addLiquidity',\n            args: [\n                params.tokenA,\n                params.tokenB,\n                params.amountADesired,\n                params.amountBDesired,\n                params.amountAMin,\n                params.amountBMin,\n                params.to,\n                params.deadline\n            ]\n        } as unknown as WriteContractParameters)\n    }\n\n    async addLiquidityETH(params: AddLiquidityETHParams, value: bigint): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'addLiquidityETH',\n            args: [\n                params.token,\n                params.amountTokenDesired,\n                params.amountTokenMin,\n                params.amountETHMin,\n                params.to,\n                params.deadline\n            ],\n            value\n        } as unknown as WriteContractParameters)\n    }\n\n    async removeLiquidity(params: RemoveLiquidityParams): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'removeLiquidity',\n            args: [\n                params.tokenA,\n                params.tokenB,\n                params.liquidity,\n                params.amountAMin,\n                params.amountBMin,\n                params.to,\n                params.deadline\n            ]\n        } as unknown as WriteContractParameters)\n    }\n\n    async removeLiquidityETH(params: RemoveLiquidityETHParams): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'removeLiquidityETH',\n            args: [\n                params.token,\n                params.liquidity,\n                params.amountTokenMin,\n                params.amountETHMin,\n                params.to,\n                params.deadline\n            ]\n        } as unknown as WriteContractParameters)\n    }\n\n    // Write Methods - Swaps\n    async swapExactTokensForTokens(params: SwapExactTokensForTokensParams): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'swapExactTokensForTokens',\n            args: [\n                params.amountIn,\n                params.amountOutMin,\n                params.path,\n                params.to,\n                params.deadline\n            ]\n        } as unknown as WriteContractParameters)\n    }\n\n    async swapTokensForExactTokens(params: SwapTokensForExactTokensParams): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: ROUTER_ABI,\n            functionName: 'swapTokensForExactTokens',\n            args: [\n                params.amountOut,\n                params.amountInMax,\n                params.path,\n                params.to,\n                params.deadline\n            ]\n        } as unknown as WriteContractParameters)\n    }\n}\n\nexport type PonderRouter = Router\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport { MASTERCHEF_ABI } from \"../abis\";\nimport { type SupportedChainId } from \"@/constants/chains\";\nimport { getChainFromId } from \"@/constants/chains\";\nimport { PONDER_ADDRESSES } from \"@/constants/addresses\";\n\nexport interface PoolInfo {\n  lpToken: Address;\n  allocPoint: bigint;\n  lastRewardTime: bigint;\n  accPonderPerShare: bigint;\n  totalStaked: bigint;\n  totalWeightedShares: bigint;\n  depositFeeBP: number;\n  boostMultiplier: number;\n}\n\nexport interface UserInfo {\n  amount: bigint;\n  rewardDebt: bigint;\n  ponderStaked: bigint;\n}\n\nexport interface AddPoolParams {\n  allocPoint: bigint;\n  lpToken: Address;\n  depositFeeBP: number;\n  boostMultiplier: number;\n  withUpdate: boolean;\n}\n\nexport class MasterChef {\n  public readonly chainId: SupportedChainId;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  constructor(\n    chainId: SupportedChainId,\n    publicClient: PublicClient,\n    walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n    this.address = PONDER_ADDRESSES[chainId].masterChef;\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Read Methods\n  async ponder(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"PONDER\",\n    });\n  }\n\n  async factory(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"FACTORY\",\n    });\n  }\n\n  async ponderPerSecond(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"ponderPerSecond\",\n    });\n  }\n\n  async poolLength(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"poolLength\",\n    });\n  }\n\n  async poolInfo(pid: bigint): Promise<PoolInfo> {\n    const [\n      lpToken,\n      allocPoint,\n      lastRewardTime,\n      accPonderPerShare,\n      totalStaked,\n      totalWeightedShares,\n      depositFeeBP,\n      boostMultiplier,\n    ] = (await this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"poolInfo\",\n      args: [pid],\n    })) as [Address, bigint, bigint, bigint, bigint, bigint, number, number];\n\n    return {\n      lpToken,\n      allocPoint,\n      lastRewardTime,\n      accPonderPerShare,\n      totalStaked,\n      totalWeightedShares,\n      depositFeeBP,\n      boostMultiplier,\n    };\n  }\n\n  async userInfo(pid: bigint, user: Address): Promise<UserInfo> {\n    const [amount, rewardDebt, ponderStaked] =\n      (await this.publicClient.readContract({\n        address: this.address,\n        abi: MASTERCHEF_ABI,\n        functionName: \"userInfo\",\n        args: [pid, user],\n      })) as readonly [bigint, bigint, bigint, bigint];\n\n    return {\n      amount,\n      rewardDebt,\n      ponderStaked,\n    };\n  }\n\n  async pendingPonder(pid: bigint, user: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"pendingPonder\",\n      args: [pid, user],\n    });\n  }\n\n  async totalAllocPoint(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"totalAllocPoint\",\n    });\n  }\n\n  async startTime(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"startTime\",\n    });\n  }\n\n  async owner(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"owner\",\n    });\n  }\n\n  // Write Methods\n  async add(params: AddPoolParams): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"add\",\n      args: [\n        params.allocPoint,\n        params.lpToken,\n        params.depositFeeBP,\n        params.boostMultiplier,\n        params.withUpdate,\n      ],\n    } as unknown as WriteContractParameters);\n  }\n\n  async set(\n    pid: bigint,\n    allocPoint: bigint,\n    withUpdate: boolean\n  ): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"set\",\n      args: [pid, allocPoint, withUpdate],\n    } as unknown as WriteContractParameters);\n  }\n\n  async deposit(pid: bigint, amount: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"deposit\",\n      args: [pid, amount],\n    } as unknown as WriteContractParameters);\n  }\n\n  async withdraw(pid: bigint, amount: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"withdraw\",\n      args: [pid, amount],\n    } as unknown as WriteContractParameters);\n  }\n\n  async emergencyWithdraw(pid: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"emergencyWithdraw\",\n      args: [pid],\n    } as unknown as WriteContractParameters);\n  }\n\n  async boostStake(pid: bigint, amount: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"boostStake\",\n      args: [pid, amount],\n    } as unknown as WriteContractParameters);\n  }\n\n  async boostUnstake(pid: bigint, amount: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: MASTERCHEF_ABI,\n      functionName: \"boostUnstake\",\n      args: [pid, amount],\n    } as unknown as WriteContractParameters);\n  }\n\n  // Helper Methods\n  async getAllPools(): Promise<PoolInfo[]> {\n    const length = await this.poolLength();\n    const pools: PoolInfo[] = [];\n\n    for (let i = 0n; i < length; i++) {\n      pools.push(await this.poolInfo(i));\n    }\n\n    return pools;\n  }\n\n  async getUserInfoForPools(\n    user: Address,\n    pids: bigint[]\n  ): Promise<UserInfo[]> {\n    return Promise.all(pids.map((pid) => this.userInfo(pid, user)));\n  }\n}\n\nexport type PonderMasterChef = MasterChef;\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport { launchtokenAbi } from \"@ponderfinance/dex\";\nimport { type SupportedChainId } from \"@/constants/chains\";\nimport { getChainFromId } from \"@/constants/chains\";\n\nexport interface VestingInfo {\n  total: bigint;\n  claimed: bigint;\n  available: bigint;\n  start: bigint;\n  end: bigint;\n}\n\nexport class LaunchToken {\n  public readonly chainId: SupportedChainId;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  constructor(\n    chainId: SupportedChainId,\n    tokenAddress: Address,\n    publicClient: PublicClient,\n    walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n    this.address = tokenAddress;\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Read Methods\n  async name(): Promise<string> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"name\",\n    });\n  }\n\n  async symbol(): Promise<string> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"symbol\",\n    });\n  }\n\n  async decimals(): Promise<number> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"decimals\",\n    });\n  }\n\n  async totalSupply(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"totalSupply\",\n    });\n  }\n\n  async balanceOf(account: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"balanceOf\",\n      args: [account],\n    });\n  }\n\n  async allowance(owner: Address, spender: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"allowance\",\n      args: [owner, spender],\n    });\n  }\n\n  // Launch Token specific read methods\n  async launcher(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"launcher\",\n    });\n  }\n\n  async factory(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"FACTORY\",\n    });\n  }\n\n  async router(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"ROUTER\",\n    });\n  }\n\n  async creator(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"creator\",\n    });\n  }\n\n  async vestingStart(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"vestingStart\",\n    });\n  }\n\n  async vestingEnd(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"vestingEnd\",\n    });\n  }\n\n  async totalVestedAmount(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"totalVestedAmount\",\n    });\n  }\n\n  async vestedClaimed(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"vestedClaimed\",\n    });\n  }\n\n  async TOTAL_SUPPLY(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"totalSupply\",\n    });\n  }\n\n  async getVestingInfo(): Promise<VestingInfo> {\n    const [total, claimed, available, start, end] =\n      (await this.publicClient.readContract({\n        address: this.address,\n        abi: launchtokenAbi,\n        functionName: \"getVestingInfo\",\n      })) as readonly [bigint, bigint, bigint, bigint, bigint];\n\n    return {\n      total,\n      claimed,\n      available,\n      start,\n      end,\n    };\n  }\n\n  // Write Methods\n  async approve(spender: Address, value: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"approve\",\n      args: [spender, value],\n    } as unknown as WriteContractParameters);\n  }\n\n  async transfer(to: Address, value: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"transfer\",\n      args: [to, value],\n    } as unknown as WriteContractParameters);\n  }\n\n  async transferFrom(from: Address, to: Address, value: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"transferFrom\",\n      args: [from, to, value],\n    } as unknown as WriteContractParameters);\n  }\n\n  async setupVesting(creator: Address, amount: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"setupVesting\",\n      args: [creator, amount],\n    } as unknown as WriteContractParameters);\n  }\n\n  async enableTransfers(): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"enableTransfers\",\n    } as unknown as WriteContractParameters);\n  }\n\n  async claimVestedTokens(): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: launchtokenAbi,\n      functionName: \"claimVestedTokens\",\n    } as unknown as WriteContractParameters);\n  }\n}\n\nexport type PonderLaunchToken = LaunchToken;\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport { type SupportedChainId, getChainFromId } from \"@/constants/chains\";\n\nexport class Pondertoken {\n  public readonly chainId: SupportedChainId;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  // Contract constants from PonderToken.sol\n  public readonly MAXIMUM_SUPPLY = 1_000_000_000n * 10n ** 18n; // 1 billion PONDER\n  public readonly MINTING_END = 4n * 365n * 24n * 60n * 60n; // 4 years in seconds\n  public readonly TEAM_ALLOCATION = 150_000_000n * 10n ** 18n; // 15%\n  public readonly VESTING_DURATION = 365n * 24n * 60n * 60n; // 1 year\n\n  constructor(\n    chainId: SupportedChainId,\n    tokenAddress: Address,\n    publicClient: PublicClient,\n    walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n    this.address = tokenAddress;\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Standard ERC20 Read Methods\n  async name(): Promise<string> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"name\",\n          outputs: [{ internalType: \"string\", name: \"\", type: \"string\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"name\",\n    });\n  }\n\n  async symbol(): Promise<string> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"symbol\",\n          outputs: [{ internalType: \"string\", name: \"\", type: \"string\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"symbol\",\n    });\n  }\n\n  async decimals(): Promise<number> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"decimals\",\n          outputs: [{ internalType: \"uint8\", name: \"\", type: \"uint8\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"decimals\",\n    });\n  }\n\n  async totalSupply(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"totalSupply\",\n          outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"totalSupply\",\n    });\n  }\n\n  async balanceOf(account: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [\n            { internalType: \"address\", name: \"account\", type: \"address\" },\n          ],\n          name: \"balanceOf\",\n          outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"balanceOf\",\n      args: [account],\n    });\n  }\n\n  async allowance(owner: Address, spender: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [\n            { internalType: \"address\", name: \"owner\", type: \"address\" },\n            { internalType: \"address\", name: \"spender\", type: \"address\" },\n          ],\n          name: \"allowance\",\n          outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"allowance\",\n      args: [owner, spender],\n    });\n  }\n\n  // PonderToken Specific Read Methods\n  async launcher(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"launcher\",\n          outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"launcher\",\n    });\n  }\n\n  async totalBurned(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"totalBurned\",\n          outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"totalBurned\",\n    });\n  }\n\n  async minter(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"minter\",\n          outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"minter\",\n    });\n  }\n\n  async deploymentTime(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"deploymentTime\",\n          outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"deploymentTime\",\n    });\n  }\n\n  async owner(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"owner\",\n          outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"owner\",\n    });\n  }\n\n  async pendingOwner(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"pendingOwner\",\n          outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"pendingOwner\",\n    });\n  }\n\n  async teamTokensClaimed(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"teamTokensClaimed\",\n          outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"teamTokensClaimed\",\n    });\n  }\n\n  // Write Methods\n  async approve(spender: Address, amount: bigint): Promise<Hash> {\n    if (!this.walletClient?.account?.address) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [\n            { internalType: \"address\", name: \"spender\", type: \"address\" },\n            { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n          ],\n          name: \"approve\",\n          outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n          stateMutability: \"nonpayable\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"approve\",\n      args: [spender, amount],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async transfer(to: Address, amount: bigint): Promise<Hash> {\n    if (!this.walletClient?.account?.address) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [\n            { internalType: \"address\", name: \"to\", type: \"address\" },\n            { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n          ],\n          name: \"transfer\",\n          outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n          stateMutability: \"nonpayable\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"transfer\",\n      args: [to, amount],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async transferFrom(\n    from: Address,\n    to: Address,\n    amount: bigint\n  ): Promise<Hash> {\n    if (!this.walletClient?.account?.address) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [\n            { internalType: \"address\", name: \"from\", type: \"address\" },\n            { internalType: \"address\", name: \"to\", type: \"address\" },\n            { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n          ],\n          name: \"transferFrom\",\n          outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n          stateMutability: \"nonpayable\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"transferFrom\",\n      args: [from, to, amount],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async burn(amount: bigint): Promise<Hash> {\n    if (!this.walletClient?.account?.address) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [\n            { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n          ],\n          name: \"burn\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"burn\",\n      args: [amount],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async claimTeamTokens(): Promise<Hash> {\n    if (!this.walletClient?.account?.address) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: [\n        {\n          inputs: [],\n          name: \"claimTeamTokens\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\",\n        },\n      ],\n      functionName: \"claimTeamTokens\",\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n}\n\nexport type PonderToken = Pondertoken;\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport {\n  fivefivefivelauncherAbi,\n  ponderfactoryAbi,\n  ponderrouterAbi,\n  ponderpriceoracleAbi,\n} from \"@ponderfinance/dex\";\nimport { type SupportedChainId } from \"@/constants/chains\";\nimport { getChainFromId } from \"@/constants/chains\";\nimport { PONDER_ADDRESSES } from \"@/constants/addresses\";\n\nexport interface LaunchInfo {\n  tokenAddress: Address;\n  name: string;\n  symbol: string;\n  imageURI: string;\n  totalRaised: bigint;\n  launched: boolean;\n  creator: Address;\n  lpUnlockTime: bigint;\n  tokenPrice: bigint;\n  tokensForSale: bigint;\n  tokensSold: bigint;\n  ponderRequired: bigint;\n  ponderCollected: bigint;\n}\n\nexport interface SaleInfo {\n  tokenPrice: bigint;\n  tokensForSale: bigint;\n  tokensSold: bigint;\n  totalRaised: bigint;\n  launched: boolean;\n  remainingTokens: bigint;\n}\n\nexport interface CreateLaunchParams {\n  name: string;\n  symbol: string;\n  imageURI: string;\n}\n\nexport interface PonderMetrics {\n  lpAllocation: bigint; // 50% to launch token/PONDER LP\n  protocolLPAllocation: bigint; // 30% to PONDER/KUB LP\n  burnAmount: bigint; // 20% burned\n  requiredAmount: bigint; // Total PONDER needed\n}\n\ninterface PoolInfo {\n  memeKubPair: `0x${string}`;\n  memePonderPair: `0x${string}`;\n  hasSecondaryPool: boolean;\n}\n\ninterface ContributionInfo {\n  kubCollected: bigint;\n  ponderCollected: bigint;\n  ponderValueCollected: bigint;\n  totalValue: bigint;\n}\n\nexport class FiveFiveFiveLauncher {\n  public readonly chainId: SupportedChainId;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  // Protocol constants from contract\n  public readonly TARGET_RAISE = 5555n * 10n ** 18n; // 5,555 KUB\n  public readonly TOTAL_SUPPLY = 555_555_555n * 10n ** 18n; // 555,555,555 tokens\n  public readonly LP_ALLOCATION = 10n; // 10% of launch tokens for LP\n  public readonly CREATOR_ALLOCATION = 10n; // 10% to creator\n  public readonly CONTRIBUTOR_ALLOCATION = 80n; // 80% for sale\n  public readonly LP_LOCK_PERIOD = 180n * 24n * 60n * 60n; // 180 days in seconds\n\n  // PONDER distribution ratios\n  public readonly PONDER_LP_ALLOCATION = 50n; // 50% to launch token/PONDER LP\n  public readonly PONDER_PROTOCOL_LP = 30n; // 30% to PONDER/KUB LP\n  public readonly PONDER_BURN = 20n; // 20% burned\n\n  public readonly BASIS_POINTS = 10000n;\n  public readonly KUB_TO_MEME_KUB_LP = 6000n;\n  public readonly KUB_TO_MEME_PONDER_LP = 2000n;\n  public readonly KUB_TO_PONDER_KUB_LP = 2000n;\n  public readonly PONDER_TO_BURN = 2000n;\n  public readonly PONDER_TO_MEME_PONDER = 8000n;\n  public readonly PRICE_STALENESS_THRESHOLD = 7200n;\n\n  constructor(\n    chainId: SupportedChainId,\n    publicClient: PublicClient,\n    walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n    this.address = PONDER_ADDRESSES[chainId].launcher;\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Read Methods\n  async factory(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"FACTORY\",\n    });\n  }\n\n  async router(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"ROUTER\",\n    });\n  }\n\n  async owner(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"OWNER\",\n    });\n  }\n\n  async feeCollector(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"FEE_COLLECTOR\",\n    });\n  }\n\n  async launchCount(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"launchCount\",\n    });\n  }\n\n  async getLaunchInfo(launchId: bigint): Promise<LaunchInfo> {\n    const info = (await this.publicClient.readContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"getLaunchInfo\",\n      args: [launchId],\n    })) as any;\n\n    return {\n      tokenAddress: info[0],\n      name: info[1],\n      symbol: info[2],\n      imageURI: info[3],\n      totalRaised: info[4],\n      launched: info[5],\n      creator: info[6],\n      lpUnlockTime: info[7],\n      tokenPrice: info[8],\n      tokensForSale: info[9],\n      tokensSold: info[10],\n      ponderRequired: info[11],\n      ponderCollected: info[12],\n    };\n  }\n\n  // Add new method for getting pool info\n  async getPoolInfo(launchId: bigint): Promise<PoolInfo> {\n    const [memeKubPair, memePonderPair, hasSecondaryPool] =\n      (await this.publicClient.readContract({\n        address: this.address,\n        abi: fivefivefivelauncherAbi,\n        functionName: \"getPoolInfo\",\n        args: [launchId],\n      })) as readonly [`0x${string}`, `0x${string}`, boolean];\n\n    return {\n      memeKubPair,\n      memePonderPair,\n      hasSecondaryPool,\n    };\n  }\n\n  // Add method for getting contribution info\n\n  async getContributionInfo(launchId: bigint): Promise<ContributionInfo> {\n    const [kubCollected, ponderCollected, ponderValueCollected, totalValue] =\n      (await this.publicClient.readContract({\n        address: this.address,\n        abi: fivefivefivelauncherAbi,\n        functionName: \"getContributionInfo\",\n        args: [launchId],\n      })) as readonly [bigint, bigint, bigint, bigint];\n\n    return {\n      kubCollected,\n      ponderCollected,\n      ponderValueCollected,\n      totalValue,\n    };\n  }\n\n  async getRemainingToRaise(launchId: bigint): Promise<[bigint, bigint]> {\n    return (await this.publicClient.readContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"getRemainingToRaise\",\n      args: [launchId],\n    })) as [bigint, bigint];\n  }\n\n  async calculatePonderRequirements(): Promise<PonderMetrics> {\n    const [factoryAddress, routerAddress] = await Promise.all([\n      this.factory(),\n      this.router(),\n    ]);\n\n    try {\n      const KKUB = (await this.publicClient.readContract({\n        address: routerAddress,\n        abi: ponderrouterAbi,\n        functionName: \"KKUB\",\n      })) as Address;\n\n      const ponderPair = (await this.publicClient.readContract({\n        address: factoryAddress,\n        abi: ponderfactoryAbi,\n        functionName: \"getPair\",\n        args: [PONDER_ADDRESSES[this.chainId].ponderToken, KKUB],\n      })) as Address;\n\n      // Use TARGET_RAISE constant from the class\n      const requiredAmount = (await this.publicClient.readContract({\n        address: PONDER_ADDRESSES[this.chainId].oracle,\n        abi: ponderpriceoracleAbi,\n        functionName: \"consult\",\n        args: [ponderPair, KKUB, this.TARGET_RAISE, Number(15 * 60)]\n      })) as bigint;\n\n      return {\n        lpAllocation: (requiredAmount * this.PONDER_LP_ALLOCATION) / 100n,\n        protocolLPAllocation: (requiredAmount * this.PONDER_PROTOCOL_LP) / 100n,\n        burnAmount: (requiredAmount * this.PONDER_BURN) / 100n,\n        requiredAmount,\n      };\n    } catch (error) {\n      console.error(\"Failed to get PONDER requirement:\", error);\n      // Return a default or minimum value if oracle fails\n      const defaultRequired = this.TARGET_RAISE;\n      return {\n        lpAllocation: (defaultRequired * this.PONDER_LP_ALLOCATION) / 100n,\n        protocolLPAllocation:\n          (defaultRequired * this.PONDER_PROTOCOL_LP) / 100n,\n        burnAmount: (defaultRequired * this.PONDER_BURN) / 100n,\n        requiredAmount: defaultRequired,\n      };\n    }\n  }\n  // Write Methods\n  async createLaunch(params: CreateLaunchParams): Promise<Hash> {\n    if (!this.walletClient?.account?.address)\n      throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"createLaunch\",\n      args: [\n        { name: params.name, symbol: params.symbol, imageURI: params.imageURI },\n      ],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  // Update method name to match contract\n  async contributeKUB(launchId: bigint, amount: bigint): Promise<Hash> {\n    if (!this.walletClient?.account?.address)\n      throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"contributeKUB\",\n      args: [launchId],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n      value: amount, // Now amount is defined\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  // Add new method for PONDER contribution\n  async contributePONDER(launchId: bigint, amount: bigint): Promise<Hash> {\n    if (!this.walletClient?.account?.address)\n      throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"contributePONDER\",\n      args: [launchId, amount],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async withdrawLP(launchId: bigint): Promise<Hash> {\n    if (!this.walletClient?.account?.address)\n      throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: fivefivefivelauncherAbi,\n      functionName: \"withdrawLP\",\n      args: [launchId],\n      account: this.walletClient.account.address,\n      chain: this.chain,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n}\n\nexport type PonderLauncher = FiveFiveFiveLauncher;\n","import { type PublicClient, type WalletClient, type Address, type Hash, type WriteContractParameters } from 'viem'\nimport { type Chain } from 'viem/chains'\nimport { ponderpriceoracleAbi } from '@ponderfinance/dex'\nimport { type SupportedChainId } from '@/constants/chains'\nimport { getChainFromId } from '@/constants/chains'\nimport { PONDER_ADDRESSES } from '@/constants/addresses'\n\nexport interface Observation {\n    timestamp: number\n    price0Cumulative: bigint\n    price1Cumulative: bigint\n}\n\nexport class PriceOracle {\n    public readonly chainId: SupportedChainId\n    public readonly address: Address\n    public readonly chain: Chain\n    private readonly publicClient: PublicClient\n    private readonly walletClient?: WalletClient\n    public readonly PERIOD = 86400n // 24 hours in seconds\n\n    constructor(\n        chainId: SupportedChainId,\n        publicClient: PublicClient,\n        walletClient?: WalletClient\n    ) {\n        this.chainId = chainId\n        this.chain = getChainFromId(chainId)\n        this.address = PONDER_ADDRESSES[chainId].oracle\n        this.publicClient = publicClient\n        this.walletClient = walletClient\n    }\n\n    // Read Methods\n    async factory(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ponderpriceoracleAbi,\n            functionName: 'factory'\n        })\n    }\n\n    async observationLength(pair: Address): Promise<bigint> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ponderpriceoracleAbi,\n            functionName: 'observationLength',\n            args: [pair]\n        })\n    }\n\n    async observations(pair: Address, index: bigint): Promise<Observation> {\n        const [timestamp, price0Cumulative, price1Cumulative] = await this.publicClient.readContract({\n            address: this.address,\n            abi: ponderpriceoracleAbi,\n            functionName: 'observations',\n            args: [pair, index]\n        }) as readonly  [number, bigint, bigint]\n\n        return {\n            timestamp,\n            price0Cumulative,\n            price1Cumulative,\n        }\n    }\n\n    async consult(\n        pair: Address,\n        tokenIn: Address,\n        amountIn: bigint,\n        periodInSeconds: number\n    ): Promise<bigint> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: ponderpriceoracleAbi,\n            functionName: 'consult',\n            args: [pair, tokenIn, amountIn, periodInSeconds]\n        })\n    }\n\n    // Write Methods\n    async update(pair: Address): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: ponderpriceoracleAbi,\n            functionName: 'update',\n            args: [pair]\n        } as unknown as WriteContractParameters)\n    }\n\n    // Helper Methods\n    async getAveragePrice(\n        pair: Address,\n        tokenIn: Address,\n        amountIn: bigint,\n        period: number = 3600 // 1 hour default\n    ): Promise<{\n        amountOut: bigint\n        pricePerToken: number\n    }> {\n        if (period > Number(this.PERIOD)) {\n            throw new Error('Period cannot exceed 24 hours')\n        }\n\n        const amountOut = await this.consult(pair, tokenIn, amountIn, period)\n        const pricePerToken = Number((amountOut * 1000000000000000000n) / amountIn) / 1e18\n\n        return {\n            amountOut,\n            pricePerToken\n        }\n    }\n\n    async getLatestObservation(pair: Address): Promise<Observation | null> {\n        const length = await this.observationLength(pair)\n        if (length === 0n) return null\n\n        return this.observations(pair, length - 1n)\n    }\n\n    async getPriceHistory(\n        pair: Address,\n        fromIndex?: bigint,\n        toIndex?: bigint\n    ): Promise<Observation[]> {\n        const length = await this.observationLength(pair)\n        if (length === 0n) return []\n\n        const start = fromIndex ?? 0n\n        const end = toIndex ?? length\n        const history: Observation[] = []\n\n        for (let i = start; i < end; i++) {\n            const observation = await this.observations(pair, i)\n            history.push(observation)\n        }\n\n        return history\n    }\n\n    async getPriceChange(\n        pair: Address,\n        tokenIn: Address,\n        period: number = 3600 // 1 hour default\n    ): Promise<{\n        absoluteChange: number\n        percentageChange: number\n    }> {\n        // Get current and historical prices using 1e18 as base amount\n        const baseAmount = 1000000000000000000n\n\n        const currentPrice = await this.getAveragePrice(pair, tokenIn, baseAmount, 300) // 5 min average\n        const historicalPrice = await this.getAveragePrice(pair, tokenIn, baseAmount, period)\n\n        const absoluteChange = currentPrice.pricePerToken - historicalPrice.pricePerToken\n        const percentageChange = ((currentPrice.pricePerToken - historicalPrice.pricePerToken) /\n            historicalPrice.pricePerToken) * 100\n\n        return {\n            absoluteChange,\n            percentageChange\n        }\n    }\n}\n\nexport type PonderPriceOracle = PriceOracle\n","import { type PublicClient, type WalletClient, type Address, type Hash, type WriteContractParameters } from 'viem'\nimport { type Chain } from 'viem/chains'\nimport { kkubunwrapperAbi } from '@ponderfinance/dex'\nimport { type SupportedChainId } from '@/constants/chains'\nimport { getChainFromId } from '@/constants/chains'\nimport { PONDER_ADDRESSES } from '@/constants/addresses'\n\nexport class KKUBUnwrapper {\n    public readonly chainId: SupportedChainId\n    public readonly address: Address\n    public readonly chain: Chain\n    private readonly publicClient: PublicClient\n    private readonly walletClient?: WalletClient\n\n    constructor(\n        chainId: SupportedChainId,\n        publicClient: PublicClient,\n        walletClient?: WalletClient\n    ) {\n        this.chainId = chainId\n        this.chain = getChainFromId(chainId)\n        this.address = PONDER_ADDRESSES[chainId].kkubUnwrapper\n        this.publicClient = publicClient\n        this.walletClient = walletClient\n    }\n\n    // Read Methods\n    async KKUB(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'KKUB'\n        })\n    }\n\n    async owner(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'owner'\n        })\n    }\n\n    async pendingOwner(): Promise<Address> {\n        return this.publicClient.readContract({\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'pendingOwner'\n        })\n    }\n\n    // Write Methods\n    async unwrapKKUB(amount: bigint, recipient: Address): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'unwrapKKUB',\n            args: [amount, recipient]\n        } as unknown as WriteContractParameters)\n    }\n\n    async transferOwnership(newOwner: Address): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'transferOwnership',\n            args: [newOwner]\n        } as unknown as WriteContractParameters)\n    }\n\n    async acceptOwnership(): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'acceptOwnership'\n        } as unknown as WriteContractParameters)\n    }\n\n    async emergencyWithdraw(): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'emergencyWithdraw'\n        } as unknown as WriteContractParameters)\n    }\n\n    async emergencyWithdrawTokens(token: Address): Promise<Hash> {\n        if (!this.walletClient) throw new Error('Wallet client required')\n\n        return this.walletClient.writeContract({\n            chain: this.chain,\n            address: this.address,\n            abi: kkubunwrapperAbi,\n            functionName: 'emergencyWithdrawTokens',\n            args: [token]\n        } as unknown as WriteContractParameters)\n    }\n}\n\nexport type PonderKKUBUnwrapper = KKUBUnwrapper\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport { ponderstakingAbi } from \"@ponderfinance/dex\";\nimport { type SupportedChainId } from \"@/constants/chains\";\nimport { getChainFromId } from \"@/constants/chains\";\nimport { PONDER_ADDRESSES } from \"@/constants/addresses\";\n\nexport class Staking {\n  public readonly chainId: SupportedChainId;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  public readonly abi = ponderstakingAbi;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  constructor(\n    chainId: SupportedChainId,\n    publicClient: PublicClient,\n    walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n    this.address = PONDER_ADDRESSES[chainId].staking;\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Read Methods\n  async PONDER(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"PONDER\",\n    });\n  }\n\n  async minimumFirstStake(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"minimumFirstStake\",\n    });\n  }\n\n  async totalSupply(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"totalSupply\",\n    });\n  }\n\n  async balanceOf(account: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"balanceOf\",\n      args: [account],\n    });\n  }\n\n  async lastRebaseTime(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"lastRebaseTime\",\n    });\n  }\n\n  async owner(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"owner\",\n    });\n  }\n\n  async pendingOwner(): Promise<Address> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"pendingOwner\",\n    });\n  }\n\n  async getPonderAmount(shares: bigint): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"getPonderAmount\",\n      args: [shares],\n    });\n  }\n\n  async getSharesAmount(amount: bigint): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"getSharesAmount\",\n      args: [amount],\n    });\n  }\n\n  async getPendingFees(user: Address): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"getPendingFees\",\n      args: [user],\n    });\n  }\n\n  // Write Methods\n  async enter(amount: bigint, recipient: Address): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"enter\",\n      args: [amount, recipient],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async leave(shares: bigint): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"leave\",\n      args: [shares],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async rebase(): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"rebase\",\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async claimFees(): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"claimFees\",\n      args: [],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async transferOwnership(newOwner: Address): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"transferOwnership\",\n      args: [newOwner],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async acceptOwnership(): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"acceptOwnership\",\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n}\n\nexport type PonderStaking = Staking;\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport { feedistributorAbi } from \"@ponderfinance/dex\";\nimport { type SupportedChainId } from \"@/constants/chains\";\nimport { getChainFromId } from \"@/constants/chains\";\nimport { PONDER_ADDRESSES } from \"@/constants/addresses\";\n\nexport class FeeDistributor {\n  public readonly chainId: SupportedChainId;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  public readonly abi = feedistributorAbi;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  constructor(\n      chainId: SupportedChainId,\n      publicClient: PublicClient,\n      walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n    this.address = PONDER_ADDRESSES[chainId].feeDistributor;\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Read Methods\n  async minimumAmount(): Promise<bigint> {\n    const result = await this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"minimumAmount\",\n    });\n    return result as bigint;\n  }\n\n  async lastDistributionTimestamp(): Promise<bigint> {\n    const result = await this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"lastDistributionTimestamp\",\n    });\n    return result as bigint;\n  }\n\n  async owner(): Promise<Address> {\n    const result = await this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"owner\",\n    });\n    return result as Address;\n  }\n\n  async pendingOwner(): Promise<Address> {\n    const result = await this.publicClient.readContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"pendingOwner\",\n    });\n    return result as Address;\n  }\n\n  // Write Methods\n  async distribute(): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"distribute\",\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async distributePairFees(pairs: Address[]): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"distributePairFees\",\n      args: [pairs],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async convertFees(token: Address): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"convertFees\",\n      args: [token],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async collectFeesFromPair(pair: Address): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"collectFeesFromPair\",\n      args: [pair],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async emergencyTokenRecover(\n      token: Address,\n      to: Address,\n      amount: bigint\n  ): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"emergencyTokenRecover\",\n      args: [token, to, amount],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async transferOwnership(newOwner: Address): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"transferOwnership\",\n      args: [newOwner],\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n\n  async acceptOwnership(): Promise<Hash> {\n    if (!this.walletClient?.account) throw new Error(\"Wallet client required\");\n\n    const { request } = await this.publicClient.simulateContract({\n      address: this.address,\n      abi: this.abi,\n      functionName: \"acceptOwnership\",\n      account: this.walletClient.account.address,\n    });\n\n    return this.walletClient.writeContract(request as WriteContractParameters);\n  }\n}\n\nexport type PonderFeeDistributor = FeeDistributor;\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { type Chain } from \"viem/chains\";\nimport { BRIDGE_ABI } from \"../abis\";\nimport { getChainFromId } from \"@/constants/chains\";\nimport bridgeAbi from \"@/abis/bridge\";\n\nexport enum DEST_TOKEN_TYPE {\n  INVALID_0,\n  NATIVE,\n  ERC20,\n  NATIVE_ERC20,\n}\n\nexport enum FEE_TYPE {\n  NO_FEE,\n  FIX,\n  PERCENTAGE,\n}\n\nexport enum TOKEN_STRATEGY {\n  LOCK,\n  BURN,\n}\n\nexport type BridgeInfo = {\n  enabled: boolean;\n  token: Address;\n  chainID: bigint;\n  allowedDestTokenTypes: DEST_TOKEN_TYPE;\n  feeReceiver: Address;\n  fee: bigint;\n  feeType: FEE_TYPE;\n  strategy: TOKEN_STRATEGY;\n  receiver: Address;\n};\n\nexport type ChainIDAndAllowedDestTokenTypes = {\n  chainID: bigint;\n  allowedDestTokenTypes: DEST_TOKEN_TYPE;\n};\n\nexport type BridgeResult = {\n  hash: Hash;\n  info: BridgeInfo;\n  events?: {\n    bridge?: {\n      token: Address;\n      from: Address;\n      amount: bigint;\n      destChainID: bigint;\n      destTokenType: DEST_TOKEN_TYPE;\n    };\n  };\n};\n\nexport interface BridgeParams {\n  token: Address;\n  amount: bigint;\n  destChainID: bigint;\n  destTokenType: DEST_TOKEN_TYPE;\n}\n\nexport interface NativeBridgeParams {\n  destChainID: bigint;\n  destTokenType: DEST_TOKEN_TYPE;\n}\n\nexport class Bridge {\n  public readonly chainId: number;\n  public readonly address: Address;\n  public readonly chain: Chain;\n  private readonly publicClient: PublicClient;\n  private readonly walletClient?: WalletClient;\n\n  constructor(\n    chainId: 96 | 25925 | 1,\n    address: Address,\n    publicClient: PublicClient,\n    walletClient?: WalletClient\n  ) {\n    this.chainId = chainId;\n    this.address = address;\n    this.chain = getChainFromId(chainId);\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n  }\n\n  // Read Methods\n  async getBridgeInfo(token: Address, chainId: bigint): Promise<BridgeInfo> {\n    const result = await this.publicClient.readContract({\n      address: this.address,\n      abi: bridgeAbi,\n      functionName: \"bridgeMap\",\n      args: [token, chainId],\n    });\n\n    return {\n      enabled: result[0],\n      token: result[1],\n      chainID: result[2],\n      allowedDestTokenTypes: Number(result[3]) as DEST_TOKEN_TYPE,\n      feeReceiver: result[4],\n      fee: result[5],\n      feeType: Number(result[6]) as FEE_TYPE,\n      strategy: Number(result[7]) as TOKEN_STRATEGY,\n      receiver: result[8],\n    };\n  }\n  async computeFee(\n    token: Address,\n    destChainId: bigint,\n    amount: bigint\n  ): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: BRIDGE_ABI,\n      functionName: \"computeFeeByFeeType\",\n      args: [token, destChainId, amount],\n    });\n  }\n\n  async getDestChainIDs(\n    token: Address\n  ): Promise<ChainIDAndAllowedDestTokenTypes[]> {\n    const result = await this.publicClient.readContract({\n      address: this.address,\n      abi: bridgeAbi,\n      functionName: \"getDestChainIDsAndAllowedTokenTypes\",\n      args: [token],\n    });\n\n    return result.map((item) => ({\n      chainID: item.chainID,\n      allowedDestTokenTypes: Number(\n        item.allowedDestTokenTypes\n      ) as DEST_TOKEN_TYPE,\n    }));\n  }\n\n  async isPaused(): Promise<boolean> {\n    return this.publicClient.readContract({\n      address: this.address,\n      abi: BRIDGE_ABI,\n      functionName: \"paused\",\n    });\n  }\n\n  // Write Methods\n  async bridgeTokens(params: BridgeParams): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: BRIDGE_ABI,\n      functionName: \"bridge\",\n      args: [\n        params.token,\n        params.amount,\n        params.destChainID,\n        params.destTokenType,\n      ],\n    } as unknown as WriteContractParameters);\n  }\n\n  async bridgeNative(params: NativeBridgeParams, value: bigint): Promise<Hash> {\n    if (!this.walletClient) throw new Error(\"Wallet client required\");\n\n    return this.walletClient.writeContract({\n      chain: this.chain,\n      address: this.address,\n      abi: BRIDGE_ABI,\n      functionName: \"bridge\",\n      args: [params.destChainID, params.destTokenType],\n      value,\n    } as unknown as WriteContractParameters);\n  }\n}\n\nexport type PonderBridge = Bridge;\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { type PonderSDK } from \"@/index\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\nconst PonderContext = createContext<PonderSDK | undefined>(undefined);\n\nexport function PonderProvider({\n  sdk,\n  children,\n  queryClient,\n}: {\n  sdk: PonderSDK | undefined;\n  children: ReactNode;\n  queryClient: QueryClient;\n}) {\n  return (\n    <QueryClientProvider client={queryClient}>\n      <PonderContext.Provider value={sdk}>{children}</PonderContext.Provider>\n    </QueryClientProvider>\n  );\n}\n\nexport function usePonderSDK() {\n  const context = useContext(PonderContext);\n  if (!context) {\n    throw new Error(\"usePonderSDK must be used within a PonderProvider\");\n  }\n  return context;\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface TokenInfo {\n  name: string;\n  symbol: string;\n  decimals: number;\n  totalSupply: bigint;\n}\n\nexport function useTokenInfo(\n  tokenAddress: Address,\n  enabled = true\n): UseQueryResult<TokenInfo> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"token\", \"info\", tokenAddress],\n    queryFn: async () => {\n      const token = sdk.getLaunchToken(tokenAddress);\n      const [name, symbol, decimals, totalSupply] = await Promise.all([\n        token.name(),\n        token.symbol(),\n        token.decimals(),\n        token.totalSupply(),\n      ]);\n\n      return {\n        name,\n        symbol,\n        decimals,\n        totalSupply,\n      };\n    },\n    enabled,\n    staleTime: 5 * 60 * 1000, // 5 minutes\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport function useTokenBalance(\n  tokenAddress: Address,\n  account: Address | undefined,\n  enabled = true\n): UseQueryResult<bigint> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"token\", \"balance\", tokenAddress, account],\n    queryFn: async () => {\n      if (!account) throw new Error(\"No account provided\");\n      const token = sdk.getLaunchToken(tokenAddress);\n      return token.balanceOf(account);\n    },\n    enabled: enabled && !!account,\n    staleTime: 10_000, // 10 seconds\n  });\n}\n","import {\n  useMutation,\n  useQuery,\n  type UseMutationResult,\n  type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport { type Address, type Hash, ContractFunctionExecutionError } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { erc20Abi } from \"viem\";\n\ninterface ApprovalParams {\n  token: Address;\n  spender: Address;\n  amount: bigint;\n  useUnlimited?: boolean;\n}\n\ninterface ApprovalResult {\n  hash: Hash;\n  spender: Address;\n  amount: bigint;\n}\n\n// Extended ABI with both allowance and allowances functions\nconst extendedErc20Abi = [\n  ...erc20Abi,\n  {\n    name: \"allowances\",\n    type: \"function\",\n    stateMutability: \"view\",\n    inputs: [\n      { name: \"owner\", type: \"address\" },\n      { name: \"spender\", type: \"address\" },\n    ],\n    outputs: [{ name: \"\", type: \"uint256\" }],\n  },\n] as const;\n\nexport function useTokenApproval(\n  token: Address | undefined,\n  spender: Address | undefined,\n  options = {},\n  enabled = true\n): {\n  allowance: UseQueryResult<bigint>;\n  approve: UseMutationResult<ApprovalResult, Error, ApprovalParams>;\n  isApproved: (amount: bigint) => boolean;\n} {\n  const sdk = usePonderSDK();\n\n  // Get current allowance with fallback to allowances\n  const allowance = useQuery({\n    queryKey: [\"ponder\", \"token\", \"allowance\", token, spender],\n    queryFn: async () => {\n      if (!token || !spender || !sdk.walletClient?.account) {\n        throw new Error(\"Token, spender and connected wallet required\");\n      }\n\n      try {\n        // Try standard allowance first\n        return (await sdk.publicClient.readContract({\n          address: token,\n          abi: erc20Abi,\n          functionName: \"allowance\",\n          args: [sdk.walletClient.account.address, spender],\n        })) as bigint;\n      } catch (err) {\n        if (err instanceof ContractFunctionExecutionError) {\n          console.log(\"Trying allowances function as fallback\");\n\n          // Try allowances as fallback\n          return (await sdk.publicClient.readContract({\n            address: token,\n            abi: extendedErc20Abi,\n            functionName: \"allowances\",\n            args: [sdk.walletClient.account.address, spender],\n          })) as bigint;\n        }\n        throw err;\n      }\n    },\n    enabled: enabled && !!token && !!spender && !!sdk.walletClient?.account,\n    staleTime: 5_000, // 5 seconds\n  });\n\n  // Helper for getting appropriate approval amount\n  const getApprovalAmount = async (\n    requestedAmount: bigint,\n    useUnlimited = false\n  ) => {\n    if (!useUnlimited) return requestedAmount;\n\n    try {\n      // Get token decimals\n      const decimals = (await sdk.publicClient.readContract({\n        address: token as Address,\n        abi: erc20Abi,\n        functionName: \"decimals\",\n      })) as number;\n\n      // For 6 decimal tokens, use a safer max value\n      if (decimals <= 6) {\n        return 2n ** 64n - 1n;\n      } else {\n        return 2n ** 256n - 1n;\n      }\n    } catch (err) {\n      console.error(\"Error determining token decimals:\", err);\n      return requestedAmount;\n    }\n  };\n\n  // Approve spending with fallback\n  const approve = useMutation({\n    mutationFn: async ({\n      token,\n      spender,\n      amount,\n      useUnlimited = false,\n    }: ApprovalParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Try to check allowance with fallback\n      let currentAllowance: bigint;\n      try {\n        currentAllowance = (await sdk.publicClient.readContract({\n          address: token,\n          abi: erc20Abi,\n          functionName: \"allowance\",\n          args: [sdk.walletClient.account.address, spender],\n        })) as bigint;\n      } catch (err) {\n        if (err instanceof ContractFunctionExecutionError) {\n          console.log(\"Checking allowances as fallback\");\n          try {\n            currentAllowance = (await sdk.publicClient.readContract({\n              address: token,\n              abi: extendedErc20Abi,\n              functionName: \"allowances\",\n              args: [sdk.walletClient.account.address, spender],\n            })) as bigint;\n          } catch (innerErr) {\n            console.error(\n              \"Both allowance checks failed, assuming zero allowance\",\n              innerErr\n            );\n            currentAllowance = 0n;\n          }\n        } else {\n          console.error(\"Unknown error checking allowance, assuming zero\", err);\n          currentAllowance = 0n;\n        }\n      }\n\n      // Determine approval amount (unlimited or specific)\n      const approvalAmount = await getApprovalAmount(amount, useUnlimited);\n\n      if (currentAllowance >= approvalAmount) {\n        throw new Error(\"Already approved\");\n      }\n\n      let hash: Hash;\n\n      // Try to reset allowance if needed\n      if (currentAllowance > 0n) {\n        try {\n          console.log(\"Resetting allowance to zero first\");\n          const resetHash = await sdk.walletClient.writeContract({\n            address: token,\n            abi: erc20Abi,\n            functionName: \"approve\",\n            args: [spender, BigInt(0)],\n            chain: sdk.walletClient.chain,\n            account: sdk.walletClient.account,\n          });\n          await sdk.publicClient.waitForTransactionReceipt({ hash: resetHash });\n        } catch (err) {\n          console.warn(\n            \"Failed to reset approval, continuing with new approval anyway\",\n            err\n          );\n        }\n      }\n\n      // Approve new amount\n      hash = await sdk.walletClient.writeContract({\n        address: token,\n        abi: erc20Abi,\n        functionName: \"approve\",\n        args: [spender, approvalAmount],\n        chain: sdk.walletClient.chain,\n        account: sdk.walletClient.account,\n      });\n\n      await sdk.publicClient.waitForTransactionReceipt({ hash });\n\n      return {\n        hash,\n        spender,\n        amount: approvalAmount,\n      };\n    },\n  });\n\n  // Helper to check if an amount is approved\n  const isApproved = (amount: bigint): boolean => {\n    if (!allowance.data) return false;\n    return allowance.data >= amount;\n  };\n\n  return {\n    allowance,\n    approve,\n    isApproved,\n  };\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address, ContractFunctionExecutionError } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { erc20Abi } from \"viem\";\n\nexport interface AllowanceData {\n  amount: bigint;\n  isUnlimited: boolean;\n  isZero: boolean;\n  hasAllowance: (required: bigint) => boolean;\n}\n\n// Modified ABI with both allowance and allowances functions\nconst extendedErc20Abi = [\n  ...erc20Abi,\n  {\n    name: \"allowances\",\n    type: \"function\",\n    stateMutability: \"view\",\n    inputs: [\n      { name: \"owner\", type: \"address\" },\n      { name: \"spender\", type: \"address\" },\n    ],\n    outputs: [{ name: \"\", type: \"uint256\" }],\n  },\n] as const;\n\nexport function useTokenAllowance(\n  token: Address | undefined,\n  spender: Address | undefined,\n  owner: Address | undefined,\n  enabled = true\n): UseQueryResult<AllowanceData> {\n  const sdk = usePonderSDK();\n  const MAX_UINT256 = 2n ** 256n - 1n;\n\n  return useQuery({\n    queryKey: [\"ponder\", \"token\", \"allowance\", token, spender, owner],\n    queryFn: async () => {\n      if (!token || !spender || !owner) {\n        throw new Error(\"Token, spender and owner addresses required\");\n      }\n\n      // Try the standard allowance function first\n      try {\n        const allowance = (await sdk.publicClient.readContract({\n          address: token,\n          abi: erc20Abi,\n          functionName: \"allowance\",\n          args: [owner, spender],\n        })) as bigint;\n\n        return {\n          amount: allowance,\n          isUnlimited: allowance === MAX_UINT256,\n          isZero: allowance === 0n,\n          hasAllowance: (required: bigint) => allowance >= required,\n        };\n      } catch (err) {\n        // Check if this is a function not found error or similar contract error\n        if (err instanceof ContractFunctionExecutionError) {\n          console.log(\n            \"Standard allowance function failed, trying 'allowances'\"\n          );\n\n          // Try the non-standard \"allowances\" function\n          try {\n            const allowance = (await sdk.publicClient.readContract({\n              address: token,\n              abi: extendedErc20Abi,\n              functionName: \"allowances\",\n              args: [owner, spender],\n            })) as bigint;\n\n            return {\n              amount: allowance,\n              isUnlimited: allowance === MAX_UINT256,\n              isZero: allowance === 0n,\n              hasAllowance: (required: bigint) => allowance >= required,\n            };\n          } catch (allowancesErr) {\n            console.error(\n              \"Both allowance and allowances functions failed\",\n              allowancesErr\n            );\n            // Rethrow original error if both attempts fail\n            throw err;\n          }\n        }\n\n        // If it's a different type of error, just rethrow it\n        throw err;\n      }\n    },\n    enabled: enabled && !!token && !!spender && !!owner,\n    staleTime: 5_000, // 5 seconds\n    refetchInterval: 5_000, // Poll every 5 seconds when active\n  });\n}\n","import { type Address, type PublicClient } from \"viem\";\nimport { type PonderPair } from \"@/contracts/pair\";\nimport { launchtokenAbi } from \"@ponderfinance/dex\";\n\nexport interface FeeInfo {\n  lpFee: bigint;\n  creatorFee: bigint;\n  protocolFee: bigint;\n  recipient: `0x${string}`;\n  ponderRequired?: bigint;\n  ponderBurn?: bigint;\n}\n\nexport class FeeCalculator {\n  // Base fee constants\n  private static LP_FEE_BASE = 30n;  // 0.3%\n  private static LP_FEE_WITH_CREATOR = 20n; // 0.2% when creator fee applies\n  private static CREATOR_FEE = 10n; // 0.1% creator fee\n  private static PROTOCOL_FEE = 20n; // 0.2% protocol fee for PONDER\n  private static FEE_DENOMINATOR = 1000n;\n  private static ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as `0x${string}`;\n\n  // PONDER distribution constants\n  private static PONDER_LP_ALLOCATION = 50n; // 50% to launch token/PONDER LP\n  private static PONDER_PROTOCOL_LP = 30n; // 30% to PONDER/KUB LP\n  private static PONDER_BURN = 20n; // 20% burned\n\n  /**\n   * Get fee information for a swap\n   * @param pair The trading pair\n   * @param tokenIn The input token address\n   * @param publicClient The public client for contract reads\n   * @returns Fee information including LP, creator, and protocol fees\n   */\n  static async getFeeInfo(\n      pair: PonderPair,\n      tokenIn: Address,\n      publicClient: PublicClient\n  ): Promise<FeeInfo> {\n    try {\n      // Check if input token is a launch token\n      const [tokenLauncher, factoryLauncher] = await Promise.all([\n        publicClient.readContract({\n          address: tokenIn,\n          abi: launchtokenAbi,\n          functionName: \"launcher\",\n        }).catch(() => this.ZERO_ADDRESS),\n        pair.launcher(),\n      ]);\n\n      // If token is a launch token from our factory\n      if (tokenLauncher === factoryLauncher) {\n        const creator = await publicClient.readContract({\n          address: tokenIn,\n          abi: launchtokenAbi,\n          functionName: \"creator\",\n        }) as `0x${string}`;\n\n        // Calculate PONDER requirements if it's a launch token trade\n        const ponderMetrics = await this.calculatePonderRequirements(\n            pair,\n            tokenIn,\n            publicClient\n        );\n\n        return {\n          lpFee: this.LP_FEE_WITH_CREATOR,\n          creatorFee: this.CREATOR_FEE,\n          protocolFee: this.PROTOCOL_FEE,\n          recipient: creator,\n          ponderRequired: ponderMetrics?.required,\n          ponderBurn: ponderMetrics?.burn\n        };\n      }\n    } catch {\n      // Not a LaunchToken or call failed - use standard fees\n    }\n\n    return {\n      lpFee: this.LP_FEE_BASE,\n      creatorFee: 0n,\n      protocolFee: 0n,\n      recipient: this.ZERO_ADDRESS\n    };\n  }\n\n  /**\n   * Calculate the output amount for a given input\n   * @param amountIn Input amount\n   * @param reserveIn Input token reserve\n   * @param reserveOut Output token reserve\n   * @param feeInfo Fee information for the pair\n   * @returns Output amount after fees\n   */\n  static getAmountOut(\n      amountIn: bigint,\n      reserveIn: bigint,\n      reserveOut: bigint,\n      feeInfo: FeeInfo\n  ): bigint {\n    if (amountIn <= 0n || reserveIn <= 0n || reserveOut <= 0n) return 0n;\n\n    const totalFee = feeInfo.lpFee + feeInfo.creatorFee + feeInfo.protocolFee;\n    const amountInWithFee = amountIn * (this.FEE_DENOMINATOR - totalFee);\n    const numerator = amountInWithFee * reserveOut;\n    const denominator = reserveIn * this.FEE_DENOMINATOR + amountInWithFee;\n    return numerator / denominator;\n  }\n\n  /**\n   * Calculate the required input amount for a desired output\n   * @param amountOut Desired output amount\n   * @param reserveIn Input token reserve\n   * @param reserveOut Output token reserve\n   * @param feeInfo Fee information for the pair\n   * @returns Required input amount including fees\n   */\n  static getAmountIn(\n      amountOut: bigint,\n      reserveIn: bigint,\n      reserveOut: bigint,\n      feeInfo: FeeInfo\n  ): bigint {\n    if (amountOut <= 0n || reserveIn <= 0n || reserveOut <= 0n) return 0n;\n\n    const totalFee = feeInfo.lpFee + feeInfo.creatorFee + feeInfo.protocolFee;\n    const numerator = reserveIn * amountOut * this.FEE_DENOMINATOR;\n    const denominator = (reserveOut - amountOut) * (this.FEE_DENOMINATOR - totalFee);\n    return numerator / denominator + 1n;\n  }\n\n  /**\n   * Calculate PONDER token requirements for launch token operations\n   * @param pair The trading pair\n   * @param launchToken The launch token address\n   * @param publicClient The public client for contract reads\n   * @returns PONDER requirements including required amount and burn amount\n   */\n  private static async calculatePonderRequirements(\n      pair: PonderPair,\n      launchToken: Address,\n      publicClient: PublicClient\n  ): Promise<{ required: bigint; burn: bigint } | undefined> {\n    try {\n      // Implementation would calculate PONDER requirements based on:\n      // - Trade size\n      // - Launch token price\n      // - PONDER allocation ratios\n      // For now returning undefined as placeholder\n      return undefined;\n    } catch {\n      return undefined;\n    }\n  }\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { type PonderPair } from \"@/contracts/pair\";\nimport { type FeeInfo, FeeCalculator } from \"@/utils/fees\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport function usePairFees(\n  pair: PonderPair,\n  tokenIn: Address,\n  enabled = true\n): UseQueryResult<FeeInfo> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"fees\", pair.address, tokenIn],\n    queryFn: async () => {\n      return FeeCalculator.getFeeInfo(pair, tokenIn, sdk.publicClient);\n    },\n    enabled,\n    staleTime: 30_000, // 30s\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { type PonderPair } from \"@/contracts/pair\";\nimport { FeeCalculator } from \"@/utils/fees\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { usePairFees } from \"./usePairFees\";\n\nexport function useAmountOut(\n  pair: PonderPair,\n  tokenIn: Address,\n  amountIn: bigint,\n  enabled = true\n): UseQueryResult<bigint> {\n  const sdk = usePonderSDK();\n  const { data: feeInfo, isLoading: isLoadingFees } = usePairFees(\n    pair,\n    tokenIn\n  );\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"amountOut\",\n      pair.address,\n      tokenIn,\n      amountIn.toString(),\n    ],\n    queryFn: async () => {\n      if (!feeInfo) throw new Error(\"Fee info not loaded\");\n\n      const reserves = await pair.getReserves();\n      const token0 = await pair.token0();\n      const [reserveIn, reserveOut] =\n        tokenIn === token0\n          ? [reserves.reserve0, reserves.reserve1]\n          : [reserves.reserve1, reserves.reserve0];\n\n      return FeeCalculator.getAmountOut(\n        amountIn,\n        reserveIn,\n        reserveOut,\n        feeInfo\n      );\n    },\n    enabled: enabled && !isLoadingFees && !!feeInfo && amountIn > 0n,\n    staleTime: 5_000, // 5s\n  });\n}\n\nexport function useAmountIn(\n  pair: PonderPair,\n  tokenOut: Address,\n  amountOut: bigint,\n  enabled = true\n): UseQueryResult<bigint> {\n  const sdk = usePonderSDK();\n  const { data: feeInfo, isLoading: isLoadingFees } = usePairFees(\n    pair,\n    tokenOut\n  );\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"amountIn\",\n      pair.address,\n      tokenOut,\n      amountOut.toString(),\n    ],\n    queryFn: async () => {\n      if (!feeInfo) throw new Error(\"Fee info not loaded\");\n\n      const reserves = await pair.getReserves();\n      const token0 = await pair.token0();\n      const [reserveOut, reserveIn] =\n        tokenOut === token0\n          ? [reserves.reserve0, reserves.reserve1]\n          : [reserves.reserve1, reserves.reserve0];\n\n      return FeeCalculator.getAmountIn(\n        amountOut,\n        reserveIn,\n        reserveOut,\n        feeInfo\n      );\n    },\n    enabled: enabled && !isLoadingFees && !!feeInfo && amountOut > 0n,\n    staleTime: 5_000,\n  });\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  decodeEventLog,\n  type WriteContractParameters,\n  type SimulateContractParameters,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { PAIR_ABI, ROUTER_ABI } from \"@/abis\";\n\ntype RouterFunctionName =\n  | \"swapExactTokensForTokens\"\n  | \"swapTokensForExactTokens\"\n  | \"swapExactETHForTokens\"\n  | \"swapETHForExactTokens\"\n  | \"swapExactTokensForETH\"\n  | \"swapTokensForExactETH\";\n\ntype SwapFunctionArgs = {\n  swapExactTokensForTokens: readonly [\n    bigint,\n    bigint,\n    readonly `0x${string}`[],\n    `0x${string}`,\n    bigint\n  ];\n  swapTokensForExactTokens: readonly [\n    bigint,\n    bigint,\n    readonly `0x${string}`[],\n    `0x${string}`,\n    bigint\n  ];\n  swapExactETHForTokens: readonly [\n    bigint,\n    readonly `0x${string}`[],\n    `0x${string}`,\n    bigint\n  ];\n  swapETHForExactTokens: readonly [\n    bigint,\n    readonly `0x${string}`[],\n    `0x${string}`,\n    bigint\n  ];\n  swapExactTokensForETH: readonly [\n    bigint,\n    bigint,\n    readonly `0x${string}`[],\n    `0x${string}`,\n    bigint\n  ];\n  swapTokensForExactETH: readonly [\n    bigint,\n    bigint,\n    readonly `0x${string}`[],\n    `0x${string}`,\n    bigint\n  ];\n};\n\ninterface BaseSwapParams {\n  path: Address[];\n  to: Address;\n  deadline: bigint;\n}\n\ninterface SwapExactTokensForTokensParams extends BaseSwapParams {\n  amountIn: bigint;\n  amountOutMin: bigint;\n}\n\ninterface SwapTokensForExactTokensParams extends BaseSwapParams {\n  amountOut: bigint;\n  amountInMax: bigint;\n}\n\ninterface SwapExactETHForTokensParams extends BaseSwapParams {\n  amountOutMin: bigint;\n}\n\ninterface SwapTokensForExactETHParams extends BaseSwapParams {\n  amountOut: bigint;\n  amountInMax: bigint;\n}\n\ninterface SwapExactTokensForETHParams extends BaseSwapParams {\n  amountIn: bigint;\n  amountOutMin: bigint;\n}\n\ninterface SwapETHForExactTokensParams extends BaseSwapParams {\n  amountOut: bigint;\n  value: bigint;\n}\n\ntype SwapParams =\n  | { type: \"exactTokensForTokens\"; params: SwapExactTokensForTokensParams }\n  | { type: \"tokensForExactTokens\"; params: SwapTokensForExactTokensParams }\n  | {\n      type: \"exactETHForTokens\";\n      params: SwapExactETHForTokensParams;\n      value: bigint;\n    }\n  | { type: \"ETHForExactTokens\"; params: SwapETHForExactTokensParams }\n  | { type: \"exactTokensForETH\"; params: SwapExactTokensForETHParams }\n  | { type: \"tokensForExactETH\"; params: SwapTokensForExactETHParams };\n\n// Response types\nexport interface SwapResult {\n  hash: Hash;\n  amounts: {\n    amountIn: bigint;\n    amountOut: bigint;\n  };\n  fees: {\n    lp: bigint;\n    creator?: bigint;\n    recipient?: Address;\n  };\n  events: {\n    swap?: {\n      sender: Address;\n      amount0In: bigint;\n      amount1In: bigint;\n      amount0Out: bigint;\n      amount1Out: bigint;\n      to: Address;\n    };\n    transfers: Array<{\n      from: Address;\n      to: Address;\n      value: bigint;\n    }>;\n  };\n}\n\nfunction getFunctionName(type: SwapParams[\"type\"]): RouterFunctionName {\n  switch (type) {\n    case \"exactTokensForTokens\":\n      return \"swapExactTokensForTokens\";\n    case \"tokensForExactTokens\":\n      return \"swapTokensForExactTokens\";\n    case \"exactETHForTokens\":\n      return \"swapExactETHForTokens\";\n    case \"ETHForExactTokens\":\n      return \"swapETHForExactTokens\";\n    case \"exactTokensForETH\":\n      return \"swapExactTokensForETH\";\n    case \"tokensForExactETH\":\n      return \"swapTokensForExactETH\";\n  }\n}\n\nfunction getSwapArgs(\n  swapData: SwapParams\n): SwapFunctionArgs[RouterFunctionName] {\n  const path = swapData.params.path as readonly `0x${string}`[];\n  const to = swapData.params.to as `0x${string}`;\n  const deadline = swapData.params.deadline;\n\n  switch (swapData.type) {\n    case \"exactTokensForTokens\":\n    case \"exactTokensForETH\":\n      return [\n        swapData.params.amountIn,\n        swapData.params.amountOutMin,\n        path,\n        to,\n        deadline,\n      ] as const;\n\n    case \"tokensForExactTokens\":\n    case \"tokensForExactETH\":\n      return [\n        swapData.params.amountOut,\n        swapData.params.amountInMax,\n        path,\n        to,\n        deadline,\n      ] as const;\n\n    case \"exactETHForTokens\":\n      return [swapData.params.amountOutMin, path, to, deadline] as const;\n\n    case \"ETHForExactTokens\":\n      return [swapData.params.amountOut, path, to, deadline] as const;\n  }\n}\n\nfunction getSimulateParams(\n  sdk: any,\n  swapData: SwapParams,\n  functionName: RouterFunctionName,\n  args: SwapFunctionArgs[RouterFunctionName]\n): SimulateContractParameters {\n  const baseParams = {\n    address: sdk.router.address as `0x${string}`,\n    abi: ROUTER_ABI,\n    account: sdk.walletClient.account.address,\n  };\n\n  if (\n    functionName === \"swapExactETHForTokens\" ||\n    functionName === \"swapETHForExactTokens\"\n  ) {\n    return {\n      ...baseParams,\n      functionName,\n      args: args as readonly [\n        bigint,\n        readonly `0x${string}`[],\n        `0x${string}`,\n        bigint\n      ],\n      value: \"value\" in swapData ? swapData.value : 0n,\n    };\n  }\n\n  return {\n    ...baseParams,\n    functionName,\n    args: args as readonly [\n      bigint,\n      bigint,\n      readonly `0x${string}`[],\n      `0x${string}`,\n      bigint\n    ],\n  };\n}\n\nfunction calculateAmounts(\n  swapData: SwapParams,\n  transfers: Array<{ from: Address; to: Address; value: bigint }>\n) {\n  const isETHIn =\n    swapData.type === \"exactETHForTokens\" ||\n    swapData.type === \"ETHForExactTokens\";\n  const isETHOut =\n    swapData.type === \"exactTokensForETH\" ||\n    swapData.type === \"tokensForExactETH\";\n\n  let amountIn: bigint;\n  let amountOut: bigint;\n\n  if (isETHIn) {\n    amountIn = \"value\" in swapData ? swapData.value : 0n;\n    amountOut = transfers[transfers.length - 1]?.value || 0n;\n  } else if (isETHOut) {\n    const firstTransfer = transfers.find(\n      (t) => t.from.toLowerCase() === swapData.params.path[0].toLowerCase()\n    );\n    amountIn = firstTransfer?.value || 0n;\n    amountOut = transfers[transfers.length - 2]?.value || 0n;\n  } else {\n    const firstTransfer = transfers.find(\n      (t) => t.from.toLowerCase() === swapData.params.path[0].toLowerCase()\n    );\n    const lastTransfer = transfers.find(\n      (t) => t.to.toLowerCase() === swapData.params.to.toLowerCase()\n    );\n    amountIn = firstTransfer?.value || 0n;\n    amountOut = lastTransfer?.value || 0n;\n  }\n\n  return { amountIn, amountOut };\n}\n\nexport function useSwap(): UseMutationResult<SwapResult, Error, SwapParams> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (swapData: SwapParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      if (swapData.params.path.length < 2) {\n        throw new Error(\"Invalid swap path\");\n      }\n\n      // Validate first pair exists\n      const firstPairAddress = await sdk.factory.getPair(\n        swapData.params.path[0],\n        swapData.params.path[1]\n      );\n\n      if (\n        !firstPairAddress ||\n        firstPairAddress === \"0x0000000000000000000000000000000000000000\"\n      ) {\n        throw new Error(\"Pair does not exist\");\n      }\n\n      // Check for launch token fees if applicable\n      let isLaunchToken = false;\n      let creator: Address | undefined;\n\n      const isETHInput =\n        swapData.type === \"exactETHForTokens\" ||\n        swapData.type === \"ETHForExactTokens\";\n\n      if (!isETHInput) {\n        try {\n          const launchLauncher = await sdk\n            .getLaunchToken(swapData.params.path[0])\n            .launcher();\n          if (launchLauncher === sdk.launcher.address) {\n            isLaunchToken = true;\n            creator = await sdk\n              .getLaunchToken(swapData.params.path[0])\n              .creator();\n          }\n        } catch {\n          // Not a launch token\n        }\n      }\n\n      // Prepare and simulate transaction\n      const functionName = getFunctionName(swapData.type);\n      const args = getSwapArgs(swapData);\n      const simulationParams = getSimulateParams(\n        sdk,\n        swapData,\n        functionName,\n        args\n      );\n\n      const { request } = await sdk.publicClient.simulateContract(\n        simulationParams\n      );\n\n      // Execute swap\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      // Wait for confirmation and decode events\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n        confirmations: 1,\n      });\n\n      const transfers: Array<{ from: Address; to: Address; value: bigint }> =\n        [];\n      let finalSwapEvent;\n      let creatorFeeTransfer;\n\n      // Process transaction events\n      for (const log of receipt.logs) {\n        try {\n          if (\n            log.topics[0] ===\n            \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\"\n          ) {\n            // Transfer event\n            const decoded = decodeEventLog({\n              abi: PAIR_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"Transfer\",\n            });\n\n            if (creator && decoded.args.to === creator) {\n              creatorFeeTransfer = {\n                from: decoded.args.from,\n                to: decoded.args.to,\n                value: decoded.args.value,\n              };\n            }\n\n            transfers.push({\n              from: decoded.args.from,\n              to: decoded.args.to,\n              value: decoded.args.value,\n            });\n          } else if (\n            log.topics[0] ===\n            \"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822\"\n          ) {\n            // Swap event\n            const decoded = decodeEventLog({\n              abi: PAIR_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"Swap\",\n            });\n\n            finalSwapEvent = decoded.args;\n          }\n        } catch (error) {\n          console.warn(\"Failed to decode log:\", error);\n        }\n      }\n\n      // Calculate final amounts and fees\n      const { amountIn, amountOut } = calculateAmounts(swapData, transfers);\n      const lpFee = (amountIn * (isLaunchToken ? 20n : 30n)) / 10000n;\n\n      return {\n        hash,\n        amounts: {\n          amountIn,\n          amountOut,\n        },\n        fees: {\n          lp: lpFee,\n          creator: creatorFeeTransfer?.value,\n          recipient: creator,\n        },\n        events: {\n          swap: finalSwapEvent,\n          transfers,\n        },\n      };\n    },\n  });\n}\n","import { useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { type Address, encodeFunctionData } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { type SwapRoute } from \"@/hooks\";\nimport { ROUTER_ABI } from \"@/abis\";\n\n// Constants for calculations\nconst BASIS_POINTS = 10000n;\n\ninterface SwapCallbackParams {\n  route?: SwapRoute;\n  recipient?: Address;\n  slippageBps?: number; // e.g., 50 = 0.5%\n  deadline?: bigint;\n  exactIn?: boolean;\n}\n\ninterface SwapCalldata {\n  to: Address;\n  data: `0x${string}`;\n  value: bigint;\n  gasLimit: bigint;\n}\n\ntype RouterFunction =\n  | \"swapExactETHForTokens\"\n  | \"swapETHForExactTokens\"\n  | \"swapExactTokensForETH\"\n  | \"swapTokensForExactETH\"\n  | \"swapExactTokensForTokens\"\n  | \"swapTokensForExactTokens\";\n\nexport function useSwapCallback(params: SwapCallbackParams): {\n  calldata: SwapCalldata | null;\n  error?: string;\n} {\n  const sdk = usePonderSDK();\n\n  // Fetch WETH address\n  const { data: wethAddress } = useQuery({\n    queryKey: [\"ponder\", \"router\", \"weth\"],\n    queryFn: () => sdk.router.KKUB(),\n    enabled: !!params.route,\n  });\n\n  return useMemo(() => {\n    if (!params.route || !sdk.walletClient?.account || !wethAddress) {\n      return { calldata: null };\n    }\n\n    try {\n      const {\n        route,\n        recipient = sdk.walletClient.account.address,\n        slippageBps = 50,\n        deadline = BigInt(Math.floor(Date.now() / 1000) + 1200), // 20 minutes\n        exactIn = true,\n      } = params;\n\n      // Determine token paths and check ETH involvement\n      const isETHIn = route.path[0].toLowerCase() === wethAddress.toLowerCase();\n      const isETHOut =\n        route.path[route.path.length - 1].toLowerCase() ===\n        wethAddress.toLowerCase();\n\n      // Calculate amounts with slippage\n      const amountOutMin = exactIn\n        ? (route.amountOut * BigInt(10000 - slippageBps)) / BigInt(10000)\n        : route.amountOut;\n      const amountInMax = !exactIn\n        ? (route.amountIn * BigInt(10000 + slippageBps)) / BigInt(10000)\n        : route.amountIn;\n\n      let functionName: RouterFunction;\n      let args: unknown[];\n      let value = 0n;\n\n      // Determine function and arguments based on swap type\n      if (isETHIn) {\n        if (exactIn) {\n          functionName = \"swapExactETHForTokens\";\n          args = [amountOutMin, route.path, recipient, deadline];\n          value = route.amountIn; // Full ETH amount - fees taken in contract\n        } else {\n          functionName = \"swapETHForExactTokens\";\n          args = [route.amountOut, route.path, recipient, deadline];\n          value = amountInMax;\n        }\n      } else if (isETHOut) {\n        if (exactIn) {\n          functionName = \"swapExactTokensForETH\";\n          args = [\n            route.amountIn, // Full token amount - fees taken in contract\n            amountOutMin,\n            route.path,\n            recipient,\n            deadline,\n          ];\n        } else {\n          functionName = \"swapTokensForExactETH\";\n          args = [\n            route.amountOut,\n            amountInMax,\n            route.path,\n            recipient,\n            deadline,\n          ];\n        }\n      } else {\n        if (exactIn) {\n          functionName = \"swapExactTokensForTokens\";\n          args = [\n            route.amountIn, // Full token amount - fees taken in contract\n            amountOutMin,\n            route.path,\n            recipient,\n            deadline,\n          ];\n        } else {\n          functionName = \"swapTokensForExactTokens\";\n          args = [\n            route.amountOut,\n            amountInMax,\n            route.path,\n            recipient,\n            deadline,\n          ];\n        }\n      }\n\n      // Encode function call\n      const data = encodeFunctionData({\n        abi: ROUTER_ABI,\n        functionName,\n        args: args as any, // Type assertion needed due to complex ABI types\n      });\n\n      // Calculate gas limit based on path length and swap type\n      const baseGas = 150000n;\n      const hopGas = 100000n;\n      const gasLimit = baseGas + BigInt(route.hops.length) * hopGas;\n\n      // Return formatted calldata\n      return {\n        calldata: {\n          to: sdk.router.address,\n          data,\n          value,\n          gasLimit,\n        },\n      };\n    } catch (error) {\n      return {\n        calldata: null,\n        error:\n          error instanceof Error\n            ? error.message\n            : \"Failed to generate swap calldata\",\n      };\n    }\n  }, [params, sdk.walletClient?.account, wethAddress, sdk.router.address]);\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\n// Constants from PonderPair.sol\nconst BASIS_POINTS = 10000n;\nconst STANDARD_FEE = 30n; // 0.3% (30/10000)\nconst KUB_LP_FEE = 20n; // 0.2% (20/10000)\nconst KUB_CREATOR_FEE = 10n; // 0.1% (10/10000)\nconst PONDER_LP_FEE = 15n; // 0.15% (15/10000)\nconst PONDER_CREATOR_FEE = 15n; // 0.15% (15/10000)\n\nexport interface SwapRoute {\n  path: Address[];\n  pairs: Address[];\n  amountIn: bigint;\n  amountOut: bigint;\n  priceImpact: number;\n  totalFee: bigint;\n  hops: Array<{\n    pair: Address;\n    tokenIn: Address;\n    tokenOut: Address;\n    amountIn: bigint;\n    amountOut: bigint;\n    fee: bigint;\n    priceImpact: number;\n  }>;\n}\n\ninterface SwapRouteParams {\n  tokenIn: Address;\n  tokenOut: Address;\n  amountIn?: bigint;\n  amountOut?: bigint;\n  maxHops?: number;\n}\n\nexport function useSwapRoute(\n  params: SwapRouteParams | undefined,\n  enabled = true\n): UseQueryResult<SwapRoute | null> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"route\",\n      {\n        ...params,\n        amountIn: params?.amountIn?.toString(),\n        amountOut: params?.amountOut?.toString(),\n      },\n    ],\n    queryFn: async () => {\n      if (!params) return null;\n      const { tokenIn, tokenOut, amountIn, amountOut, maxHops = 3 } = params;\n\n      if (!amountIn && !amountOut) return null;\n\n      try {\n        // Check direct pair first\n        const directPair = await sdk.factory.getPair(tokenIn, tokenOut);\n\n        if (directPair !== \"0x0000000000000000000000000000000000000000\") {\n          const pair = sdk.getPair(directPair);\n          const [token0, reserves] = await Promise.all([\n            pair.token0(),\n            pair.getReserves(),\n          ]);\n\n          const isToken0In = tokenIn.toLowerCase() === token0.toLowerCase();\n          const [reserveIn, reserveOut] = isToken0In\n            ? [reserves.reserve0, reserves.reserve1]\n            : [reserves.reserve1, reserves.reserve0];\n\n          // Determine pair type and fees for display purposes\n          const isLaunchToken = await isTokenLaunchToken(sdk, tokenIn);\n          const isPonderPair = await isPonderTokenPair(sdk, tokenIn, tokenOut);\n\n          let protocolFee: bigint;\n          let creatorFee: bigint;\n\n          if (isLaunchToken) {\n            if (isPonderPair) {\n              protocolFee = PONDER_LP_FEE;\n              creatorFee = PONDER_CREATOR_FEE;\n            } else {\n              protocolFee = KUB_LP_FEE;\n              creatorFee = KUB_CREATOR_FEE;\n            }\n          } else {\n            protocolFee = STANDARD_FEE;\n            creatorFee = 0n;\n          }\n\n          const totalFee = protocolFee + creatorFee;\n          let amountOutWithFees: bigint;\n          let actualAmountIn: bigint;\n\n          if (amountIn) {\n            // For exact input, let router handle the fee\n            const path: `0x${string}`[] = [tokenIn, tokenOut];\n            const amounts = await sdk.router.getAmountsOut(amountIn, path);\n            amountOutWithFees = amounts[1]; // Get the output amount\n            actualAmountIn = amountIn;\n          } else if (amountOut) {\n            // For exact output, let router calculate required input\n            const path: `0x${string}`[] = [tokenIn, tokenOut];\n            const amounts = await sdk.router.getAmountsIn(amountOut, path);\n            actualAmountIn = amounts[0]; // Get the input amount\n            amountOutWithFees = amountOut;\n          } else {\n            throw new Error(\"Either amountIn or amountOut must be provided\");\n          }\n          // Calculate fee amount for display - separate from swap calculations\n          const feeAmount = (actualAmountIn * totalFee) / BASIS_POINTS;\n\n          // Calculate price impact\n          const priceImpact = calculatePriceImpact(\n            actualAmountIn,\n            amountOutWithFees,\n            reserveIn,\n            reserveOut\n          );\n\n          return {\n            path: [tokenIn, tokenOut],\n            pairs: [directPair],\n            amountIn: actualAmountIn,\n            amountOut: amountOutWithFees,\n            priceImpact,\n            totalFee: feeAmount, // This is just for display\n            hops: [\n              {\n                pair: directPair,\n                tokenIn,\n                tokenOut,\n                amountIn: actualAmountIn,\n                amountOut: amountOutWithFees,\n                fee: feeAmount,\n                priceImpact,\n              },\n            ],\n          };\n        }\n\n        // Find multi-hop route if no direct pair exists\n        const allPairs = await getAllPairs(sdk);\n        const routes = await findAllRoutes(\n          sdk,\n          allPairs,\n          tokenIn,\n          tokenOut,\n          maxHops\n        );\n\n        if (routes.length === 0) return null;\n\n        // Calculate amounts for each route\n        const routeDetails = await Promise.all(\n          routes.map(async (route) => {\n            try {\n              // Let router handle all fees for multi-hop routes\n              const amounts = amountIn\n                ? await sdk.router.getAmountsOut(amountIn, route)\n                : await sdk.router.getAmountsIn(amountOut!, route);\n\n              let totalPriceImpact = 0;\n              let totalFees = 0n;\n              const hops: SwapRoute[\"hops\"] = [];\n\n              for (let i = 0; i < route.length - 1; i++) {\n                const hopTokenIn = route[i];\n                const hopTokenOut = route[i + 1];\n                const pair = await sdk.factory.getPair(hopTokenIn, hopTokenOut);\n                const pairContract = sdk.getPair(pair);\n                const [token0, reserves] = await Promise.all([\n                  pairContract.token0(),\n                  pairContract.getReserves(),\n                ]);\n\n                const isToken0In =\n                  hopTokenIn.toLowerCase() === token0.toLowerCase();\n                const [reserveIn, reserveOut] = isToken0In\n                  ? [reserves.reserve0, reserves.reserve1]\n                  : [reserves.reserve1, reserves.reserve0];\n\n                const hopAmountIn = amounts[i];\n                const hopAmountOut = amounts[i + 1];\n\n                // Calculate fees for display only\n                const isLaunchToken = await isTokenLaunchToken(sdk, hopTokenIn);\n                const isPonderPair = await isPonderTokenPair(\n                  sdk,\n                  hopTokenIn,\n                  hopTokenOut\n                );\n\n                let hopFee: bigint;\n                if (isLaunchToken) {\n                  if (isPonderPair) {\n                    hopFee =\n                      (hopAmountIn * (PONDER_LP_FEE + PONDER_CREATOR_FEE)) /\n                      BASIS_POINTS;\n                  } else {\n                    hopFee =\n                      (hopAmountIn * (KUB_LP_FEE + KUB_CREATOR_FEE)) /\n                      BASIS_POINTS;\n                  }\n                } else {\n                  hopFee = (hopAmountIn * STANDARD_FEE) / BASIS_POINTS;\n                }\n\n                const hopImpact = calculatePriceImpact(\n                  hopAmountIn,\n                  hopAmountOut,\n                  reserveIn,\n                  reserveOut\n                );\n\n                totalPriceImpact += hopImpact;\n                totalFees += hopFee;\n\n                hops.push({\n                  pair,\n                  tokenIn: hopTokenIn,\n                  tokenOut: hopTokenOut,\n                  amountIn: hopAmountIn,\n                  amountOut: hopAmountOut,\n                  fee: hopFee,\n                  priceImpact: hopImpact,\n                });\n              }\n\n              return {\n                path: route,\n                pairs: hops.map((h) => h.pair),\n                amountIn: amounts[0],\n                amountOut: amounts[amounts.length - 1],\n                priceImpact: totalPriceImpact,\n                totalFee: totalFees,\n                hops,\n              };\n            } catch (error) {\n              console.error(\"Error calculating route:\", error);\n              return null;\n            }\n          })\n        );\n\n        const validRoutes = routeDetails.filter(\n          (route): route is SwapRoute => route !== null\n        );\n        if (validRoutes.length === 0) return null;\n\n        // Return best route based on output amount\n        return validRoutes.reduce((best, current) => {\n          if (!best) return current;\n          return amountIn\n            ? current.amountOut > best.amountOut\n              ? current\n              : best\n            : current.amountIn < best.amountIn\n            ? current\n            : best;\n        });\n      } catch (error) {\n        console.error(\"Error in useSwapRoute:\", error);\n        return null;\n      }\n    },\n    enabled: enabled && !!params && (!!params.amountIn || !!params.amountOut),\n    staleTime: 10_000,\n  });\n}\n\n// Helper function to check if a token is a launch token\nasync function isTokenLaunchToken(sdk: any, token: Address): Promise<boolean> {\n  try {\n    const launcher = await sdk.getLaunchToken(token).launcher();\n    return launcher === sdk.launcher.address;\n  } catch {\n    return false;\n  }\n}\n\n// Helper function to check if pair involves PONDER token\nasync function isPonderTokenPair(\n  sdk: any,\n  token0: Address,\n  token1: Address\n): Promise<boolean> {\n  try {\n    const ponderAddress = await sdk.getPonderToken().getAddress();\n    return (\n      token0.toLowerCase() === ponderAddress.toLowerCase() ||\n      token1.toLowerCase() === ponderAddress.toLowerCase()\n    );\n  } catch {\n    return false;\n  }\n}\n\n// Helper function to get all pairs\nasync function getAllPairs(sdk: any) {\n  try {\n    const length = await sdk.factory.allPairsLength();\n    const pairs: Address[] = [];\n    for (let i = 0; i < Number(length); i++) {\n      const pair = await sdk.factory.allPairs(i);\n      if (pair && pair !== \"0x0000000000000000000000000000000000000000\") {\n        pairs.push(pair);\n      }\n    }\n    return pairs;\n  } catch (error) {\n    console.error(\"Error getting all pairs:\", error);\n    return [];\n  }\n}\n\n// Completely rewritten findAllRoutes function\nasync function findAllRoutes(\n  sdk: any,\n  allPairs: Address[],\n  tokenIn: Address,\n  tokenOut: Address,\n  maxHops: number\n): Promise<Address[][]> {\n  const routes: Address[][] = [];\n  const queue: Array<{\n    path: Address[];\n    visited: Set<string>;\n  }> = [];\n\n  // Initialize queue with starting token\n  queue.push({\n    path: [tokenIn],\n    visited: new Set(),\n  });\n\n  while (queue.length > 0) {\n    const { path, visited } = queue.shift()!;\n    const currentToken = path[path.length - 1];\n\n    // Skip if we've exceeded max hops\n    if (path.length > maxHops + 1) continue;\n\n    // Try each pair\n    for (const pair of allPairs) {\n      if (visited.has(pair)) continue;\n\n      try {\n        const pairContract = sdk.getPair(pair);\n        const [token0, token1] = await Promise.all([\n          pairContract.token0(),\n          pairContract.token1(),\n        ]);\n\n        let nextToken: Address | null = null;\n\n        if (token0.toLowerCase() === currentToken.toLowerCase()) {\n          nextToken = token1;\n        } else if (token1.toLowerCase() === currentToken.toLowerCase()) {\n          nextToken = token0;\n        }\n\n        if (nextToken) {\n          // Found destination\n          if (nextToken.toLowerCase() === tokenOut.toLowerCase()) {\n            routes.push([...path, tokenOut]);\n          }\n          // Continue searching if under max hops\n          else if (path.length < maxHops + 1) {\n            const newVisited = new Set(visited);\n            newVisited.add(pair);\n            queue.push({\n              path: [...path, nextToken],\n              visited: newVisited,\n            });\n          }\n        }\n      } catch (error) {\n        console.error(`Error processing pair ${pair}:`, error);\n      }\n    }\n  }\n\n  return routes;\n}\n\n// Helper function to calculate price impact\nfunction calculatePriceImpact(\n  amountIn: bigint,\n  amountOut: bigint,\n  reserveIn: bigint,\n  reserveOut: bigint\n): number {\n  if (amountIn === 0n) return 0;\n  const exactQuote = (amountIn * reserveOut) / reserveIn;\n  const slippage = ((exactQuote - amountOut) * 10000n) / exactQuote;\n  return Number(slippage) / 100;\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n  ContractFunctionExecutionError,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { erc20Abi } from \"viem\";\n\ninterface SwapApprovalParams {\n  tokenIn: Address;\n  amountIn: bigint;\n  useUnlimited?: boolean;\n}\n\ninterface ApprovalState {\n  state: \"unknown\" | \"required\" | \"approved\";\n  isUnlimited: boolean;\n  currentAllowance: bigint;\n}\n\ninterface SwapApprovalResult {\n  hash: Hash;\n  state: ApprovalState;\n}\n\n// Simple ABI for allowances function\nconst allowancesAbi = [\n  {\n    name: \"allowances\",\n    type: \"function\",\n    stateMutability: \"view\",\n    inputs: [\n      { name: \"owner\", type: \"address\" },\n      { name: \"spender\", type: \"address\" },\n    ],\n    outputs: [{ name: \"\", type: \"uint256\" }],\n  },\n] as const;\n\nexport function useSwapApproval(): UseMutationResult<\n  SwapApprovalResult,\n  Error,\n  SwapApprovalParams\n> {\n  const sdk = usePonderSDK();\n  const MAX_UINT256 = 2n ** 256n - 1n;\n\n  // Get router address for approvals\n  const spender = sdk.router.address;\n\n  return useMutation({\n    mutationFn: async ({\n      tokenIn,\n      amountIn,\n      useUnlimited = false,\n    }: SwapApprovalParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Check current allowance with fallback to allowances function\n      let currentAllowance: bigint;\n      try {\n        // Try standard allowance first\n        currentAllowance = (await sdk.publicClient.readContract({\n          address: tokenIn,\n          abi: erc20Abi,\n          functionName: \"allowance\",\n          args: [sdk.walletClient.account.address, spender],\n        })) as bigint;\n      } catch (err) {\n        // If standard allowance fails, try allowances function\n        console.log(\"Standard allowance function failed, trying 'allowances'\");\n        try {\n          currentAllowance = (await sdk.publicClient.readContract({\n            address: tokenIn,\n            abi: allowancesAbi,\n            functionName: \"allowances\",\n            args: [sdk.walletClient.account.address, spender],\n          })) as bigint;\n        } catch (allowancesErr) {\n          console.error(\"Both allowance and allowances functions failed\");\n          throw err; // Re-throw original error if both fail\n        }\n      }\n\n      // Determine initial state\n      const state: ApprovalState = {\n        state: currentAllowance >= amountIn ? \"approved\" : \"required\",\n        isUnlimited: currentAllowance === MAX_UINT256,\n        currentAllowance,\n      };\n\n      // Return early if already approved\n      if (state.state === \"approved\" && (!useUnlimited || state.isUnlimited)) {\n        throw new Error(\"Already approved\");\n      }\n\n      // If we have an existing allowance but want unlimited, or need to reset, clear first\n      if (\n        currentAllowance > 0n &&\n        (useUnlimited || currentAllowance < amountIn)\n      ) {\n        const { request } = await sdk.publicClient.simulateContract({\n          address: tokenIn,\n          abi: erc20Abi,\n          functionName: \"approve\",\n          args: [spender, 0n],\n          account: sdk.walletClient.account.address,\n          chain: sdk.walletClient.chain,\n        });\n\n        const resetHash = await sdk.walletClient.writeContract(\n          request as WriteContractParameters\n        );\n        await sdk.publicClient.waitForTransactionReceipt({ hash: resetHash });\n      }\n\n      // Approve new amount\n      const approvalAmount = useUnlimited ? MAX_UINT256 : amountIn;\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: tokenIn,\n        abi: erc20Abi,\n        functionName: \"approve\",\n        args: [spender, approvalAmount],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      // Wait for confirmation\n      await sdk.publicClient.waitForTransactionReceipt({ hash });\n\n      return {\n        hash,\n        state: {\n          state: \"approved\",\n          isUnlimited: useUnlimited,\n          currentAllowance: approvalAmount,\n        },\n      };\n    },\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { erc20Abi } from \"viem\";\nimport { type SupportedChainId } from \"@/constants/chains\";\nimport { Pair } from \"@/contracts/pair\";\n\nexport interface PairInfo {\n  // Basic pair data\n  address: Address;\n  token0: Address;\n  token1: Address;\n  token0Symbol: string;\n  token1Symbol: string;\n  token0Decimals: number;\n  token1Decimals: number;\n  reserve0: bigint;\n  reserve1: bigint;\n  totalSupply: bigint;\n  kLast: bigint;\n\n  // Fee configuration\n  fee: {\n    LP: bigint; // 30 = 0.3% by default\n    creator: bigint; // 10 = 0.1% if launch token\n    recipient?: Address; // Creator address if launch token\n  };\n\n  // Launch token specific info\n  launch?: {\n    token: Address; // Which token is the launch token\n    creator: Address; // Creator address\n    launcher: Address; // Launcher contract\n    isPair0Launch: boolean; // Whether token0 is launch token\n  };\n}\n\nexport function usePairInfo(\n  pairAddress: Address | undefined,\n  enabled = true\n): UseQueryResult<PairInfo & { asPair: () => Pair }> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"pair\", \"info\", pairAddress],\n    queryFn: async () => {\n      if (!pairAddress) throw new Error(\"Pair address required\");\n\n      const pair = sdk.getPair(pairAddress);\n\n      // Fetch basic pair data\n      const [token0, token1, reserves, totalSupply, kLast] = await Promise.all([\n        pair.token0(),\n        pair.token1(),\n        pair.getReserves(),\n        pair.totalSupply(),\n        pair.kLast(),\n      ]);\n\n      async function getTokenInfo(tokenAddress: Address) {\n        const [symbol, decimals] = await Promise.all([\n          sdk.publicClient.readContract({\n            address: tokenAddress,\n            abi: erc20Abi,\n            functionName: \"symbol\",\n          }),\n          sdk.publicClient.readContract({\n            address: tokenAddress,\n            abi: erc20Abi,\n            functionName: \"decimals\",\n          }),\n        ]);\n\n        return { symbol: symbol as string, decimals: decimals as number };\n      }\n\n      const [token0Info, token1Info] = await Promise.all([\n        getTokenInfo(token0),\n        getTokenInfo(token1),\n      ]);\n\n      const pairInfo: PairInfo = {\n        address: pairAddress,\n        token0,\n        token1,\n        token0Symbol: token0Info.symbol,\n        token1Symbol: token1Info.symbol,\n        token0Decimals: token0Info.decimals,\n        token1Decimals: token1Info.decimals,\n        reserve0: reserves.reserve0,\n        reserve1: reserves.reserve1,\n        totalSupply,\n        kLast,\n        fee: {\n          LP: 30n,\n          creator: 0n,\n        },\n      };\n\n      return {\n        ...pairInfo,\n        asPair: () =>\n          new Pair(1 as SupportedChainId, pairInfo.address, sdk.publicClient),\n      };\n    },\n    enabled: enabled && !!pairAddress,\n    staleTime: 30_000, // 30 seconds\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface PairExistsResult {\n  exists: boolean;\n  pairAddress: Address | null;\n  canCreate: boolean;\n  token0: Address | null;\n  token1: Address | null;\n}\n\nexport function usePairExists(\n  tokenA: Address | undefined,\n  tokenB: Address | undefined,\n  enabled = true\n): UseQueryResult<PairExistsResult> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"pair\", \"exists\", tokenA, tokenB],\n    queryFn: async () => {\n      if (!tokenA || !tokenB) {\n        throw new Error(\"Both token addresses required\");\n      }\n\n      // Check if tokens are the same\n      if (tokenA.toLowerCase() === tokenB.toLowerCase()) {\n        return {\n          exists: false,\n          pairAddress: null,\n          canCreate: false,\n          token0: null,\n          token1: null,\n        };\n      }\n\n      // Sort tokens to get canonical ordering\n      const [token0, token1] =\n        tokenA.toLowerCase() < tokenB.toLowerCase()\n          ? [tokenA, tokenB]\n          : [tokenB, tokenA];\n\n      // Check if pair exists\n      const pairAddress = await sdk.factory.getPair(token0, token1);\n      const exists =\n        pairAddress !== \"0x0000000000000000000000000000000000000000\";\n\n      // A pair can be created if it doesn't exist and tokens are valid\n      const canCreate =\n        !exists &&\n        token0 !== \"0x0000000000000000000000000000000000000000\" &&\n        token1 !== \"0x0000000000000000000000000000000000000000\";\n\n      return {\n        exists,\n        pairAddress: exists ? pairAddress : null,\n        canCreate,\n        token0: token0,\n        token1: token1,\n      };\n    },\n    enabled: enabled && !!tokenA && !!tokenB,\n    staleTime: 30_000, // 30 seconds\n  });\n}\n","import {\n  useMutation,\n  useQuery,\n  type UseMutationResult,\n  type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  decodeEventLog,\n  type WriteContractParameters,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { FACTORY_ABI } from \"@/abis\";\n\ninterface PairCreationParams {\n  token0: Address;\n  token1: Address;\n}\n\ninterface PairCreationResult {\n  hash: Hash;\n  pair: Address;\n  events: {\n    pairCreated?: {\n      token0: Address;\n      token1: Address;\n      pair: Address;\n    };\n  };\n}\n\nexport interface PairCreationData {\n  canCreate: boolean;\n  error?: string;\n  existingPair?: Address;\n  sortedTokens: Address[];\n  estimatedGas?: bigint;\n}\n\n// Define the PairCreated event type\ntype PairCreatedEvent = {\n  eventName: \"PairCreated\";\n  args: {\n    token0: Address;\n    token1: Address;\n    pair: Address;\n    allPairsLength: bigint;\n  };\n};\n\nexport function usePairCreation(tokens?: [Address, Address]): {\n  data: UseQueryResult<PairCreationData>;\n  createPair: UseMutationResult<PairCreationResult, Error, PairCreationParams>;\n} {\n  const sdk = usePonderSDK();\n\n  // Query to check if pair can be created\n  const data = useQuery({\n    queryKey: [\"ponder\", \"pair\", \"creation\", tokens],\n    queryFn: async () => {\n      if (!tokens) throw new Error(\"Tokens required\");\n      const [tokenA, tokenB] = tokens;\n\n      // Basic validation\n      if (tokenA.toLowerCase() === tokenB.toLowerCase()) {\n        return {\n          canCreate: false,\n          error: \"Identical tokens\",\n          sortedTokens: [tokenA, tokenB],\n        };\n      }\n\n      // Sort tokens\n      const [token0, token1] =\n        tokenA.toLowerCase() < tokenB.toLowerCase()\n          ? [tokenA, tokenB]\n          : [tokenB, tokenA];\n\n      // Check if pair exists\n      const existingPair = await sdk.factory.getPair(token0, token1);\n      if (existingPair !== \"0x0000000000000000000000000000000000000000\") {\n        return {\n          canCreate: false,\n          error: \"Pair exists\",\n          existingPair,\n          sortedTokens: [token0, token1],\n        };\n      }\n\n      // Estimate gas for creation\n      let estimatedGas: bigint | undefined;\n      try {\n        const { request } = await sdk.publicClient.simulateContract({\n          address: sdk.factory.address,\n          abi: FACTORY_ABI,\n          functionName: \"createPair\",\n          args: [token0, token1],\n          account: sdk.walletClient?.account?.address,\n          chain: sdk.walletClient?.chain,\n        });\n        estimatedGas = request.gas;\n      } catch {\n        // Gas estimation failed\n      }\n\n      return {\n        canCreate: true,\n        sortedTokens: [token0, token1],\n        estimatedGas,\n      };\n    },\n    enabled: !!tokens,\n  });\n\n  // Mutation to create pair\n  const createPair = useMutation({\n    mutationFn: async ({ token0, token1 }: PairCreationParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Simulate the pair creation\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.factory.address,\n        abi: FACTORY_ABI,\n        functionName: \"createPair\",\n        args: [token0, token1],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient?.chain,\n      });\n\n      // Execute the pair creation\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      // Wait for confirmation and parse events\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n        confirmations: 1,\n      });\n\n      // Find PairCreated event\n      const pairCreatedLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9\"\n      );\n\n      let pairCreated;\n      if (pairCreatedLog) {\n        try {\n          const decoded = decodeEventLog({\n            abi: FACTORY_ABI,\n            data: pairCreatedLog.data,\n            topics: pairCreatedLog.topics,\n            eventName: \"PairCreated\",\n          }) as unknown as PairCreatedEvent;\n\n          pairCreated = {\n            token0: decoded.args.token0,\n            token1: decoded.args.token1,\n            pair: decoded.args.pair,\n          };\n        } catch (error) {\n          console.error(\"Failed to decode PairCreated event:\", error);\n        }\n      }\n\n      return {\n        hash,\n        pair:\n          pairCreated?.pair ||\n          (\"0x0000000000000000000000000000000000000000\" as Address),\n        events: {\n          pairCreated,\n        },\n      };\n    },\n    onError: (error) => {\n      console.error(\"Pair creation error:\", error);\n      throw error;\n    },\n  });\n\n  return {\n    data,\n    createPair,\n  };\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { usePairInfo } from \"./usePairInfo\";\n\ninterface QuoteParams {\n  tokenA: Address;\n  tokenB: Address;\n  amountADesired?: bigint;\n  amountBDesired?: bigint;\n}\n\nexport interface PairQuote {\n  amountA: bigint;\n  amountB: bigint;\n  share: number;\n  amountAMin: bigint;\n  amountBMin: bigint;\n  priceImpact: number;\n}\n\nexport function usePairQuote(\n  params: QuoteParams | undefined,\n  slippageBps = 50, // 0.5% default slippage\n  enabled = true\n): UseQueryResult<PairQuote> {\n  const sdk = usePonderSDK();\n  const { data: pairAddress } = useQuery({\n    queryKey: [\"ponder\", \"factory\", \"pair\", params?.tokenA, params?.tokenB],\n    queryFn: async () => {\n      if (!params) return undefined;\n      return await sdk.factory.getPair(params.tokenA, params.tokenB);\n    },\n    enabled: enabled && !!params,\n  });\n\n  const { data: pairInfo } = usePairInfo(pairAddress, enabled && !!pairAddress);\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"pair\",\n      \"quote\",\n      {\n        ...params,\n        amountADesired: params?.amountADesired?.toString(),\n        amountBDesired: params?.amountBDesired?.toString(),\n      },\n      slippageBps,\n    ],\n    queryFn: async () => {\n      if (!params || !pairInfo) {\n        throw new Error(\"Params and pair info required\");\n      }\n\n      const { tokenA, tokenB, amountADesired, amountBDesired } = params;\n\n      // Handle first liquidity provision\n      if (BigInt(pairInfo.reserve0)=== 0n && BigInt(pairInfo.reserve1)=== 0n) {\n        if (!amountADesired || !amountBDesired) {\n          throw new Error(\"Both amounts required for first liquidity\");\n        }\n\n        return {\n          amountA: amountADesired,\n          amountB: amountBDesired,\n          share: 100, // First LP gets 100% share\n          amountAMin: (amountADesired * BigInt(10000 - slippageBps)) / 10000n,\n          amountBMin: (amountBDesired * BigInt(10000 - slippageBps)) / 10000n,\n          priceImpact: 0, // No price impact for first liquidity\n        };\n      }\n\n      // Calculate amounts based on reserves\n      const calculateQuote = (\n        amountIn: bigint,\n        reserveIn: bigint,\n        reserveOut: bigint\n      ): bigint => {\n        if (amountIn === 0n || reserveIn === 0n || reserveOut === 0n) return 0n;\n        return (amountIn * reserveOut) / reserveIn;\n      };\n\n      let amountA: bigint;\n      let amountB: bigint;\n\n      const [reserve0, reserve1] = [pairInfo.reserve0, pairInfo.reserve1];\n      const isAToken0 = tokenA.toLowerCase() < tokenB.toLowerCase();\n\n      if (amountADesired && !amountBDesired) {\n        // Quote B amount based on A\n        amountA = amountADesired;\n        amountB = calculateQuote(\n          amountA,\n          isAToken0 ? reserve0 : reserve1,\n          isAToken0 ? reserve1 : reserve0\n        );\n      } else if (!amountADesired && amountBDesired) {\n        // Quote A amount based on B\n        amountB = amountBDesired;\n        amountA = calculateQuote(\n          amountB,\n          isAToken0 ? reserve1 : reserve0,\n          isAToken0 ? reserve0 : reserve1\n        );\n      } else if (amountADesired && amountBDesired) {\n        // Use optimal ratio\n        const optimalB = calculateQuote(\n          amountADesired,\n          isAToken0 ? reserve0 : reserve1,\n          isAToken0 ? reserve1 : reserve0\n        );\n\n        if (optimalB <= amountBDesired) {\n          amountA = amountADesired;\n          amountB = optimalB;\n        } else {\n          amountB = amountBDesired;\n          amountA = calculateQuote(\n            amountB,\n            isAToken0 ? reserve1 : reserve0,\n            isAToken0 ? reserve0 : reserve1\n          );\n        }\n      } else {\n        throw new Error(\"At least one amount required\");\n      }\n\n      // Calculate share of pool\n      const share =\n        Number(\n          (amountA * amountB * 10000n) /\n            ((reserve0 + amountA) * (reserve1 + amountB))\n        ) / 100;\n\n      // Calculate minimum amounts with slippage\n      const amountAMin = (amountA * BigInt(10000 - slippageBps)) / 10000n;\n      const amountBMin = (amountB * BigInt(10000 - slippageBps)) / 10000n;\n\n      // Calculate price impact\n      const priceRatioBefore = Number(reserve0) / Number(reserve1);\n      const priceRatioAfter =\n        Number(reserve0 + amountA) / Number(reserve1 + amountB);\n      const priceImpact = Math.abs(\n        ((priceRatioAfter - priceRatioBefore) / priceRatioBefore) * 100\n      );\n\n      return {\n        amountA,\n        amountB,\n        share,\n        amountAMin,\n        amountBMin,\n        priceImpact,\n      };\n    },\n    enabled: enabled && !!params && !!pairInfo,\n    staleTime: 10_000, // 10 seconds\n  });\n}\n","import {\n  useMutation,\n  useQuery,\n  type UseMutationResult,\n  type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport { type Address, type Hash } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { usePairInfo } from \"./usePairInfo\";\nimport { useTokenAllowance } from \"../token/useTokenAllowance\";\n\ninterface AddLiquidityParams {\n  tokenA: Address;\n  tokenB: Address;\n  amountADesired: bigint;\n  amountBDesired: bigint;\n  amountAMin: bigint;\n  amountBMin: bigint;\n  deadline?: bigint;\n}\n\ninterface RemoveLiquidityParams {\n  tokenA: Address;\n  tokenB: Address;\n  liquidity: bigint;\n  amountAMin: bigint;\n  amountBMin: bigint;\n  deadline?: bigint;\n}\n\ninterface LiquidityResult {\n  hash: Hash;\n  amounts: {\n    amountA: bigint;\n    amountB: bigint;\n    liquidity: bigint;\n  };\n}\n\nexport interface PairLiquidity {\n  tokenA: Address;\n  tokenB: Address;\n  balance: bigint; // LP token balance\n  totalSupply: bigint;\n  token0Amount: bigint;\n  token1Amount: bigint;\n  poolShare: number;\n  approvals: {\n    tokenA: bigint;\n    tokenB: bigint;\n    pair: bigint;\n  };\n}\n\nexport function usePairLiquidity(\n  pair: Address | undefined,\n  account: Address | undefined,\n  enabled = true\n): {\n  data: UseQueryResult<PairLiquidity>;\n  addLiquidity: UseMutationResult<LiquidityResult, Error, AddLiquidityParams>;\n  removeLiquidity: UseMutationResult<\n    LiquidityResult,\n    Error,\n    RemoveLiquidityParams\n  >;\n} {\n  const sdk = usePonderSDK();\n  const { data: pairInfo } = usePairInfo(pair, enabled);\n\n  // Get necessary allowances\n  const { data: token0Allowance } = useTokenAllowance(\n    pairInfo?.token0,\n    sdk.router.address,\n    account,\n    enabled && !!pairInfo\n  );\n\n  const { data: token1Allowance } = useTokenAllowance(\n    pairInfo?.token1,\n    sdk.router.address,\n    account,\n    enabled && !!pairInfo\n  );\n\n  const { data: pairAllowance } = useTokenAllowance(\n    pair,\n    sdk.router.address,\n    account,\n    enabled\n  );\n\n  // Query current liquidity position\n  const data = useQuery({\n    queryKey: [\"ponder\", \"pair\", \"liquidity\", pair, account],\n    queryFn: async () => {\n      if (!pair || !account || !pairInfo)\n        throw new Error(\"Pair and account required\");\n\n      const pairContract = sdk.getPair(pair);\n      const [balance, totalSupply] = await Promise.all([\n        pairContract.balanceOf(account),\n        pairContract.totalSupply(),\n      ]);\n\n      // Calculate token amounts based on share\n      const share = (balance * 10000n) / totalSupply;\n      const token0Amount = (BigInt(pairInfo.reserve0)* share) / 10000n;\n      const token1Amount = (BigInt(pairInfo.reserve1)* share) / 10000n;\n\n      return {\n        tokenA: pairInfo.token0,\n        tokenB: pairInfo.token1,\n        balance,\n        totalSupply,\n        token0Amount,\n        token1Amount,\n        poolShare: Number(share) / 100,\n        approvals: {\n          tokenA: token0Allowance?.amount || 0n,\n          tokenB: token1Allowance?.amount || 0n,\n          pair: pairAllowance?.amount || 0n,\n        },\n      } satisfies PairLiquidity;\n    },\n    enabled:\n      enabled &&\n      !!pair &&\n      !!account &&\n      !!pairInfo &&\n      !!token0Allowance &&\n      !!token1Allowance &&\n      !!pairAllowance,\n  });\n\n  // Add liquidity mutation\n  const addLiquidity = useMutation({\n    mutationFn: async (params: AddLiquidityParams) => {\n      if (!sdk.walletClient?.account) throw new Error(\"Wallet not connected\");\n\n      const defaultDeadline = BigInt(Math.floor(Date.now() / 1000) + 1200); // 20 minutes\n\n      const hash = await sdk.router.addLiquidity({\n        tokenA: params.tokenA,\n        tokenB: params.tokenB,\n        amountADesired: params.amountADesired,\n        amountBDesired: params.amountBDesired,\n        amountAMin: params.amountAMin,\n        amountBMin: params.amountBMin,\n        to: sdk.walletClient.account.address,\n        deadline: params.deadline || defaultDeadline,\n      });\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      // Find Mint event\n      const mintLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0x4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f\"\n      );\n\n      let amountA = 0n,\n        amountB = 0n,\n        liquidity = 0n;\n\n      if (mintLog) {\n        // Parse amounts from event data\n        const data = mintLog.data.slice(2);\n        amountA = BigInt(`0x${data.slice(0, 64)}`);\n        amountB = BigInt(`0x${data.slice(64, 128)}`);\n        liquidity = BigInt(`0x${data.slice(128, 192)}`);\n      }\n\n      return {\n        hash,\n        amounts: {\n          amountA,\n          amountB,\n          liquidity,\n        },\n      };\n    },\n  });\n\n  // Remove liquidity mutation\n  const removeLiquidity = useMutation({\n    mutationFn: async (params: RemoveLiquidityParams) => {\n      if (!sdk.walletClient?.account) throw new Error(\"Wallet not connected\");\n\n      const defaultDeadline = BigInt(Math.floor(Date.now() / 1000) + 1200); // 20 minutes\n\n      const hash = await sdk.router.removeLiquidity({\n        tokenA: params.tokenA,\n        tokenB: params.tokenB,\n        liquidity: params.liquidity,\n        amountAMin: params.amountAMin,\n        amountBMin: params.amountBMin,\n        to: sdk.walletClient.account.address,\n        deadline: params.deadline || defaultDeadline,\n      });\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      // Find Burn event\n      const burnLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0xdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496\"\n      );\n\n      let amountA = 0n,\n        amountB = 0n;\n\n      if (burnLog) {\n        // Parse amounts from event data\n        const data = burnLog.data.slice(2);\n        amountA = BigInt(`0x${data.slice(0, 64)}`);\n        amountB = BigInt(`0x${data.slice(64, 128)}`);\n      }\n\n      return {\n        hash,\n        amounts: {\n          amountA,\n          amountB,\n          liquidity: params.liquidity,\n        },\n      };\n    },\n  });\n\n  return {\n    data,\n    addLiquidity,\n    removeLiquidity,\n  };\n}\n","import {\n  useMutation,\n  type UseMutationResult,\n  useQuery,\n} from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  decodeEventLog,\n  type WriteContractParameters,\n  zeroAddress,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { PAIR_ABI, ROUTER_ABI } from \"@/abis\";\n\ninterface AddLiquidityParams {\n  tokenA: Address;\n  tokenB: Address;\n  amountADesired: bigint;\n  amountBDesired: bigint;\n  amountAMin: bigint;\n  amountBMin: bigint;\n  to: Address;\n  deadline: bigint;\n}\n\ninterface AddLiquidityResult {\n  hash: Hash;\n  amounts: {\n    amountA: bigint;\n    amountB: bigint;\n    liquidity: bigint;\n  };\n  events: {\n    transfer?: {\n      from: Address;\n      to: Address;\n      value: bigint;\n    };\n    mint?: {\n      sender: Address;\n      amount0: bigint;\n      amount1: bigint;\n    };\n  };\n}\n\n// Define event types\ntype TransferEvent = {\n  eventName: \"Transfer\";\n  args: {\n    from: Address;\n    to: Address;\n    value: bigint;\n  };\n};\n\ntype MintEvent = {\n  eventName: \"Mint\";\n  args: {\n    sender: Address;\n    amount0: bigint;\n    amount1: bigint;\n  };\n};\n\nexport function useAddLiquidity(): UseMutationResult<\n  AddLiquidityResult,\n  Error,\n  AddLiquidityParams\n> {\n  const sdk = usePonderSDK();\n\n  // Get KKUB (WETH) address to compare\n  const { data: wethAddress } = useQuery({\n    queryKey: [\"router\", \"KKUB\"],\n    queryFn: async () => {\n      if (!sdk.router) return null;\n      return sdk.router.KKUB();\n    },\n    enabled: !!sdk.router,\n  });\n\n  return useMutation({\n    mutationFn: async (params: AddLiquidityParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Get WKUB/KKUB address for comparisons\n      const wkubAddress = await sdk.router.KKUB();\n\n      // Check if this is a native KUB pair by seeing if tokenB is KKUB AND we have a zero address\n      // We need both conditions to distinguish between native KUB and regular KKUB token pairs\n      const hasZeroAddress =\n        params.tokenA.toLowerCase() === zeroAddress.toLowerCase() ||\n        params.tokenB.toLowerCase() === zeroAddress.toLowerCase();\n      const isNativeKUBPair =\n        hasZeroAddress &&\n        (params.tokenB.toLowerCase() === wkubAddress.toLowerCase() ||\n          params.tokenA.toLowerCase() === wkubAddress.toLowerCase());\n\n      // First, determine the real pair address for checking existence\n      let pairAddress;\n      let createPair = false;\n\n      if (isNativeKUBPair) {\n        // For native KUB pairs, check for KKUB/token pair\n        const nonZeroToken =\n          params.tokenA.toLowerCase() === zeroAddress.toLowerCase()\n            ? params.tokenB\n            : params.tokenA;\n        pairAddress = await sdk.factory.getPair(nonZeroToken, wkubAddress);\n      } else {\n        // Regular token pairs\n        pairAddress = await sdk.factory.getPair(params.tokenA, params.tokenB);\n      }\n\n      // Check if pair needs to be created\n      createPair =\n        !pairAddress ||\n        pairAddress === \"0x0000000000000000000000000000000000000000\";\n\n      let hash: Hash;\n\n      // Use addLiquidityETH for native KUB pairs\n      if (isNativeKUBPair) {\n        // Determine which token is the ERC20 token and which is native KUB\n        const isTokenANative =\n          params.tokenA.toLowerCase() === zeroAddress.toLowerCase();\n        const token = isTokenANative ? params.tokenB : params.tokenA;\n        const amountToken = isTokenANative\n          ? params.amountBDesired\n          : params.amountADesired;\n        const amountTokenMin = isTokenANative\n          ? params.amountBMin\n          : params.amountAMin;\n        const amountETH = isTokenANative\n          ? params.amountADesired\n          : params.amountBDesired;\n        const amountETHMin = isTokenANative\n          ? params.amountAMin\n          : params.amountBMin;\n\n        try {\n          const { request } = await sdk.publicClient.simulateContract({\n            address: sdk.router.address,\n            abi: ROUTER_ABI,\n            functionName: \"addLiquidityETH\",\n            args: [\n              token,\n              amountToken,\n              amountTokenMin,\n              amountETHMin,\n              params.to,\n              params.deadline,\n            ],\n            account: sdk.walletClient.account.address,\n            chain: sdk.walletClient.chain,\n            value: amountETH,\n          });\n\n          hash = await sdk.walletClient.writeContract(\n            request as WriteContractParameters\n          );\n\n          // After the transaction, get the correct pair address (token/WKUB)\n          if (createPair) {\n            const newPairAddress = await sdk.factory.getPair(\n              token,\n              wkubAddress\n            );\n            if (\n              !newPairAddress ||\n              newPairAddress === \"0x0000000000000000000000000000000000000000\"\n            ) {\n              throw new Error(\"Failed to create ETH pair\");\n            }\n            pairAddress = newPairAddress;\n          }\n        } catch (error) {\n          console.error(\"Error in addLiquidityETH:\", error);\n          throw error;\n        }\n      } else {\n\n        const { request } = await sdk.publicClient.simulateContract({\n          address: sdk.router.address,\n          abi: ROUTER_ABI,\n          functionName: \"addLiquidity\",\n          args: [\n            params.tokenA,\n            params.tokenB,\n            params.amountADesired,\n            params.amountBDesired,\n            params.amountAMin,\n            params.amountBMin,\n            params.to,\n            params.deadline,\n          ],\n          account: sdk.walletClient.account.address,\n          chain: sdk.walletClient.chain,\n        });\n\n        hash = await sdk.walletClient.writeContract(\n          request as WriteContractParameters\n        );\n      }\n\n      // Wait for transaction receipt\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n        confirmations: 1,\n      });\n\n      // For pair checking after transaction\n      let finalPairAddress = pairAddress;\n      if (createPair) {\n        if (isNativeKUBPair) {\n          finalPairAddress = await sdk.factory.getPair(\n            params.tokenA,\n            wkubAddress\n          );\n        } else {\n          finalPairAddress = await sdk.factory.getPair(\n            params.tokenA,\n            params.tokenB\n          );\n        }\n\n        if (\n          !finalPairAddress ||\n          finalPairAddress === \"0x0000000000000000000000000000000000000000\"\n        ) {\n          throw new Error(\"Failed to find or create pair\");\n        }\n      }\n\n      // Decode Mint event\n      const mintLog = receipt.logs.find(\n        (log) =>\n          log.address.toLowerCase() === finalPairAddress.toLowerCase() &&\n          log.topics[0] ===\n            \"0x4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f\"\n      );\n\n      let mintEvent;\n      if (mintLog) {\n        try {\n          const decoded = decodeEventLog({\n            abi: PAIR_ABI,\n            data: mintLog.data,\n            topics: mintLog.topics,\n            eventName: \"Mint\",\n          }) as MintEvent;\n\n          mintEvent = {\n            sender: decoded.args.sender,\n            amount0: decoded.args.amount0,\n            amount1: decoded.args.amount1,\n          };\n        } catch (error) {\n          console.error(\"Failed to decode Mint event:\", error);\n        }\n      }\n\n      // Decode Transfer event for LP tokens\n      const transferLog = receipt.logs.find(\n        (log) =>\n          log.address.toLowerCase() === finalPairAddress.toLowerCase() &&\n          log.topics[0] ===\n            \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\" &&\n          log.topics[2]?.toLowerCase() ===\n            params.to.toLowerCase().padStart(66, \"0\")\n      );\n\n      let transferEvent;\n      if (transferLog) {\n        try {\n          const decoded = decodeEventLog({\n            abi: PAIR_ABI,\n            data: transferLog.data,\n            topics: transferLog.topics,\n            eventName: \"Transfer\",\n          }) as TransferEvent;\n\n          transferEvent = {\n            from: decoded.args.from,\n            to: decoded.args.to,\n            value: decoded.args.value,\n          };\n        } catch (error) {\n          console.error(\"Failed to decode Transfer event:\", error);\n        }\n      }\n\n      return {\n        hash,\n        amounts: {\n          amountA: mintEvent?.amount0 || 0n,\n          amountB: mintEvent?.amount1 || 0n,\n          liquidity: transferEvent?.value || 0n,\n        },\n        events: {\n          transfer: transferEvent,\n          mint: mintEvent,\n        },\n      };\n    },\n    onError: (error) => {\n      console.error(\"Add liquidity error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  decodeEventLog,\n  type WriteContractParameters,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { ROUTER_ABI, PAIR_ABI } from \"@/abis\";\n\n// Interface for standard token-token pair removal\ninterface RemoveLiquidityParams {\n  pairAddress: Address;\n  liquidity: bigint;\n  token0Min: bigint;\n  token1Min: bigint;\n  deadline?: bigint; // Optional deadline, defaults to 20 minutes\n  toAddress?: Address; // Optional recipient, defaults to connected wallet\n  // For ETH pairs\n  isETHPair?: boolean;\n  tokenAddress?: Address; // The non-ETH token in an ETH pair\n  amountTokenMin?: bigint; // For ETH pairs: minimum token amount\n  amountETHMin?: bigint; // For ETH pairs: minimum ETH amount\n  // For fee-on-transfer tokens\n  supportsFeeOnTransfer?: boolean; // Flag to use fee-on-transfer function\n}\n\ninterface RemoveLiquidityResult {\n  hash: Hash;\n  amounts: {\n    token0: bigint;\n    token1: bigint;\n  };\n}\n\n// Define event types\ntype BurnEvent = {\n  eventName: \"Burn\";\n  args: {\n    sender: Address;\n    amount0: bigint;\n    amount1: bigint;\n    to: Address;\n  };\n};\n\nexport function useRemoveLiquidity(): UseMutationResult<\n  RemoveLiquidityResult,\n  unknown,\n  RemoveLiquidityParams,\n  unknown\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({\n      pairAddress,\n      liquidity,\n      token0Min,\n      token1Min,\n      deadline = BigInt(Math.floor(Date.now() / 1000) + 1200), // 20 minutes from now\n      toAddress,\n      // ETH pair specific parameters\n      isETHPair = false,\n      tokenAddress,\n      amountTokenMin,\n      amountETHMin,\n      // Fee-on-transfer support\n      supportsFeeOnTransfer = false,\n    }: RemoveLiquidityParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Get the tokens for this pair\n      const pair = sdk.getPair(pairAddress);\n      const [token0, token1] = await Promise.all([\n        pair.token0(),\n        pair.token1(),\n      ]);\n\n      // Determine the recipient address (default to connected wallet)\n      const recipient = toAddress || sdk.walletClient.account.address;\n\n      // Get KKUB address\n      const kkubAddress = await sdk.router.KKUB();\n\n      // Check if this is a KKUB pair\n      const isKKUBPair =\n        token0.toLowerCase() === kkubAddress.toLowerCase() ||\n        token1.toLowerCase() === kkubAddress.toLowerCase();\n\n      // Use the explicit flag if provided, otherwise use the detected value\n      const finalIsKKUBPair = isETHPair !== undefined ? isETHPair : isKKUBPair;\n\n\n      let hash: Hash;\n\n      if (finalIsKKUBPair) {\n        // Handle ETH/KKUB pair\n        let nonKKUBToken: Address;\n        let tokenMin: bigint;\n        let ethMin: bigint;\n\n        // Determine which token is KKUB and which is not\n        const isToken0KKUB = token0.toLowerCase() === kkubAddress.toLowerCase();\n\n        if (tokenAddress) {\n          // If tokenAddress is explicitly provided, use it\n          nonKKUBToken = tokenAddress;\n          tokenMin = amountTokenMin || (isToken0KKUB ? token1Min : token0Min);\n          ethMin = amountETHMin || (isToken0KKUB ? token0Min : token1Min);\n        } else {\n          // Otherwise determine based on token0/token1\n          nonKKUBToken = isToken0KKUB ? token1 : token0;\n          tokenMin = isToken0KKUB ? token1Min : token0Min;\n          ethMin = isToken0KKUB ? token0Min : token1Min;\n        }\n\n        console.log(\"Final ETH pair removal params:\", {\n          nonKKUBToken,\n          tokenMin: tokenMin.toString(),\n          ethMin: ethMin.toString(),\n          recipient,\n          deadline: deadline.toString(),\n          supportsFeeOnTransfer,\n        });\n\n        // Choose appropriate function based on fee-on-transfer support\n        const functionName = supportsFeeOnTransfer\n          ? \"removeLiquidityETHSupportingFeeOnTransferTokens\"\n          : \"removeLiquidityETH\";\n\n        try {\n          // Simulate removeLiquidity for ETH pairs\n          const { request } = await sdk.publicClient.simulateContract({\n            address: sdk.router.address,\n            abi: ROUTER_ABI,\n            functionName: functionName,\n            args: [\n              nonKKUBToken,\n              liquidity,\n              tokenMin,\n              ethMin,\n              recipient,\n              deadline,\n            ],\n            account: sdk.walletClient.account.address,\n            chain: sdk.walletClient.chain,\n          });\n\n          hash = await sdk.walletClient.writeContract(\n            request as WriteContractParameters\n          );\n        } catch (error) {\n          console.error(\"ETH pair removal simulation error:\", error);\n          throw error; // Propagate error instead of using fallback\n        }\n      } else {\n        // Handle regular token pair\n        console.log(\"Regular pair removal params:\", {\n          token0,\n          token1,\n          token0Min: token0Min.toString(),\n          token1Min: token1Min.toString(),\n          recipient,\n          deadline: deadline.toString(),\n        });\n\n        try {\n          // Simulate removeLiquidity\n          const { request } = await sdk.publicClient.simulateContract({\n            address: sdk.router.address,\n            abi: ROUTER_ABI,\n            functionName: \"removeLiquidity\",\n            args: [\n              token0,\n              token1,\n              liquidity,\n              token0Min,\n              token1Min,\n              recipient,\n              deadline,\n            ],\n            account: sdk.walletClient.account.address,\n            chain: sdk.walletClient.chain,\n          });\n\n          hash = await sdk.walletClient.writeContract(\n            request as WriteContractParameters\n          );\n        } catch (error) {\n          console.error(\"Standard pair removal error:\", error);\n          throw error; // Propagate error instead of using fallback\n        }\n      }\n\n      // Wait for transaction and get removed amounts\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n        confirmations: 1,\n      });\n\n      // Find Burn event from the pair contract\n      const burnLog = receipt.logs.find(\n        (log) =>\n          log.address.toLowerCase() === pairAddress.toLowerCase() &&\n          log.topics[0] ===\n            \"0xdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496\" // Burn event signature\n      );\n\n      let token0Amount = 0n;\n      let token1Amount = 0n;\n\n      if (burnLog) {\n        try {\n          const decoded = decodeEventLog({\n            abi: PAIR_ABI,\n            data: burnLog.data,\n            topics: burnLog.topics,\n            eventName: \"Burn\",\n          }) as BurnEvent;\n\n          token0Amount = decoded.args.amount0;\n          token1Amount = decoded.args.amount1;\n        } catch (error) {\n          console.error(\"Failed to decode Burn event:\", error);\n        }\n      } else {\n        console.warn(\"Burn event not found in transaction logs\");\n      }\n\n      return {\n        hash,\n        amounts: {\n          token0: token0Amount,\n          token1: token1Amount,\n        },\n      };\n    },\n    onError: (error: unknown) => {\n      // Enhanced error handling\n      const errorMsg = error instanceof Error ? error.message : String(error);\n      console.error(\"Full error:\", error);\n\n      // Map error messages to more user-friendly versions based on contract errors\n      if (errorMsg.includes(\"ExpiredDeadline\")) {\n        throw new Error(\"Transaction deadline has expired\");\n      } else if (\n        errorMsg.includes(\"InsufficientAAmount\") ||\n        errorMsg.includes(\"InsufficientBAmount\")\n      ) {\n        throw new Error(\n          \"Slippage too high - try increasing your slippage tolerance\"\n        );\n      } else if (errorMsg.includes(\"TransferFailed\")) {\n        throw new Error(\"Token transfer failed - check your token approvals\");\n      } else if (errorMsg.includes(\"ApprovalFailed\")) {\n        throw new Error(\"KKUB approval failed\");\n      } else if (errorMsg.includes(\"UnwrapFailed\")) {\n        throw new Error(\"Failed to unwrap KKUB to native ETH\");\n      } else {\n        throw new Error(`Remove liquidity failed: ${errorMsg}`);\n      }\n    },\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { usePairInfo } from \"./usePairInfo\";\n\nexport interface PositionValue {\n  // Token amounts\n  token0Amount: bigint;\n  token1Amount: bigint;\n  token0Symbol: string;\n  token1Symbol: string;\n\n  // Share info\n  lpBalance: bigint;\n  sharePercent: number;\n\n  // USD Values (optional if oracle available)\n  token0ValueUSD?: number;\n  token1ValueUSD?: number;\n  totalValueUSD?: number;\n\n  // Additional metrics\n  impermanentLoss?: {\n    percent: number;\n    valueUSD?: number;\n  };\n  feesEarned?: {\n    token0Amount: bigint;\n    token1Amount: bigint;\n    valueUSD?: number;\n  };\n}\n\nexport function usePositionValue(\n  pairAddress: Address | undefined,\n  account: Address | undefined,\n  enabled = true\n): UseQueryResult<PositionValue> {\n  const sdk = usePonderSDK();\n  const { data: pairInfo } = usePairInfo(pairAddress, enabled);\n\n  return useQuery({\n    queryKey: [\"ponder\", \"position\", \"value\", pairAddress, account],\n    queryFn: async () => {\n      if (!pairAddress || !account || !pairInfo) {\n        throw new Error(\"Pair address, account, and pair info required\");\n      }\n\n      const pair = sdk.getPair(pairAddress);\n\n      // Get LP token data\n      const [lpBalance, totalSupply] = await Promise.all([\n        pair.balanceOf(account),\n        pair.totalSupply(),\n      ]);\n\n      if (lpBalance === 0n) {\n        return {\n          token0Amount: 0n,\n          token1Amount: 0n,\n          token0Symbol: pairInfo.token0Symbol,\n          token1Symbol: pairInfo.token1Symbol,\n          lpBalance: 0n,\n          sharePercent: 0,\n        };\n      }\n\n      // Calculate share of pool\n      const sharePercent = Number((lpBalance * 10000n) / totalSupply) / 100;\n\n      // Calculate token amounts\n      const token0Amount = (BigInt(pairInfo.reserve0)* lpBalance) / totalSupply;\n      const token1Amount = (BigInt(pairInfo.reserve1)* lpBalance) / totalSupply;\n\n      // Try to get USD values if oracle is available\n      let token0ValueUSD: number | undefined;\n      let token1ValueUSD: number | undefined;\n      let totalValueUSD: number | undefined;\n      let token0PriceUSD: bigint | undefined;\n      let token1PriceUSD: bigint | undefined;\n\n      try {\n        // Get oracle prices\n        [token0PriceUSD, token1PriceUSD] = await Promise.all([\n          sdk.oracle.consult(\n            pairAddress,\n            pairInfo.token0,\n            10n ** 18n, // 1 token\n            1800 // 30 min average\n          ),\n          sdk.oracle.consult(\n            pairAddress,\n            pairInfo.token1,\n            10n ** 18n, // 1 token\n            1800 // 30 min average\n          ),\n        ]);\n\n        // Calculate USD values\n        token0ValueUSD = Number(token0PriceUSD * token0Amount) / 1e18;\n        token1ValueUSD = Number(token1PriceUSD * token1Amount) / 1e18;\n        totalValueUSD = token0ValueUSD + token1ValueUSD;\n      } catch {\n        // Oracle not available or error calculating USD value\n      }\n\n      // Calculate impermanent loss if we have price data\n      let impermanentLoss: { percent: number; valueUSD?: number } | undefined;\n      if (token0PriceUSD && token1PriceUSD) {\n        try {\n          // Get initial deposit ratio from first Mint event\n          const mintFilter = await sdk.publicClient.createEventFilter({\n            address: pairAddress,\n            event: {\n              type: \"event\",\n              name: \"Mint\",\n              inputs: [\n                { type: \"address\", name: \"sender\", indexed: true },\n                { type: \"uint256\", name: \"amount0\" },\n                { type: \"uint256\", name: \"amount1\" },\n              ],\n            },\n            fromBlock: \"earliest\",\n          });\n\n          const mintLogs = await sdk.publicClient.getFilterLogs({\n            filter: mintFilter,\n          });\n          const firstMint = mintLogs[0];\n\n          if (firstMint) {\n            const initialAmount0 = BigInt(firstMint.args.amount0 || 0);\n            const initialAmount1 = BigInt(firstMint.args.amount1 || 0);\n\n            // Calculate IL using standard formula\n            const initialValue =\n              Number(\n                initialAmount0 * token0PriceUSD +\n                  initialAmount1 * token1PriceUSD\n              ) / 1e18;\n            const currentValue = totalValueUSD || 0;\n            const ilPercent = (currentValue / initialValue - 1) * 100;\n            const ilUSD = currentValue - initialValue;\n\n            impermanentLoss = {\n              percent: ilPercent,\n              valueUSD: ilUSD,\n            };\n          }\n        } catch {\n          // Error calculating IL\n        }\n      }\n\n      // Calculate fees earned if possible\n      let feesEarned:\n        | { token0Amount: bigint; token1Amount: bigint; valueUSD?: number }\n        | undefined;\n      try {\n        const events = await sdk.publicClient.getContractEvents({\n          address: pairAddress,\n          abi: [\n            {\n              type: \"event\",\n              name: \"Mint\",\n              inputs: [\n                { type: \"address\", name: \"sender\", indexed: true },\n                { type: \"uint256\", name: \"amount0\" },\n                { type: \"uint256\", name: \"amount1\" },\n              ],\n            },\n          ],\n          fromBlock: \"earliest\",\n        });\n\n        // Sum up fees from events\n        const token0Fees = events.reduce(\n          (acc, event) => acc + (BigInt(event.args.amount0 || 0) * 3n) / 1000n,\n          0n\n        );\n        const token1Fees = events.reduce(\n          (acc, event) => acc + (BigInt(event.args.amount1 || 0) * 3n) / 1000n,\n          0n\n        );\n\n        feesEarned = {\n          token0Amount: token0Fees,\n          token1Amount: token1Fees,\n          valueUSD:\n            token0PriceUSD && token1PriceUSD\n              ? Number(\n                  token0Fees * token0PriceUSD + token1Fees * token1PriceUSD\n                ) / 1e18\n              : undefined,\n        };\n      } catch {\n        // Error calculating fees\n      }\n\n      return {\n        token0Amount,\n        token1Amount,\n        token0Symbol: pairInfo.token0Symbol,\n        token1Symbol: pairInfo.token1Symbol,\n        lpBalance,\n        sharePercent,\n        token0ValueUSD,\n        token1ValueUSD,\n        totalValueUSD,\n        impermanentLoss,\n        feesEarned,\n      };\n    },\n    enabled: enabled && !!pairAddress && !!account && !!pairInfo,\n    staleTime: 30_000, // 30 seconds\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { usePairInfo } from \"./usePairInfo\";\n\nexport interface LiquidityPosition {\n  pairAddress: Address;\n  balance: bigint;\n  totalSupply: bigint;\n  sharePercentage: number;\n  token0Amount: bigint;\n  token1Amount: bigint;\n  token0Symbol: string;\n  token1Symbol: string;\n  usdValue?: bigint; // Optional USD value if price oracle available\n}\n\nexport function useLPTokenBalance(\n  pairAddress: Address | undefined,\n  account: Address | undefined,\n  enabled = true\n): UseQueryResult<LiquidityPosition> {\n  const sdk = usePonderSDK();\n  const { data: pairInfo } = usePairInfo(pairAddress, enabled);\n\n  return useQuery({\n    queryKey: [\"ponder\", \"lp\", \"balance\", pairAddress, account],\n    queryFn: async () => {\n      if (!pairAddress || !account || !pairInfo) {\n        throw new Error(\"Pair address, account, and pair info required\");\n      }\n\n      const pair = sdk.getPair(pairAddress);\n      const balance = await pair.balanceOf(account);\n\n      // Calculate share of pool\n      const sharePercentage =\n        Number((balance * 10000n) / pairInfo.totalSupply) / 100;\n\n      // Calculate token amounts based on reserves and share\n      const token0Amount = (BigInt(pairInfo.reserve0)* balance) / pairInfo.totalSupply;\n      const token1Amount = (BigInt(pairInfo.reserve1)* balance) / pairInfo.totalSupply;\n\n      // Optional: Get USD value if oracle is available\n      let usdValue: bigint | undefined;\n      try {\n        const token0Value = await sdk.oracle.consult(\n          pairAddress,\n          pairInfo.token0,\n          token0Amount,\n          3600 // 1 hour average\n        );\n        const token1Value = await sdk.oracle.consult(\n          pairAddress,\n          pairInfo.token1,\n          token1Amount,\n          3600\n        );\n        usdValue = token0Value + token1Value;\n      } catch {\n        // Oracle not available or error calculating USD value\n      }\n\n      return {\n        pairAddress,\n        balance,\n        totalSupply: pairInfo.totalSupply,\n        sharePercentage,\n        token0Amount,\n        token1Amount,\n        token0Symbol: pairInfo.token0Symbol,\n        token1Symbol: pairInfo.token1Symbol,\n        usdValue,\n      };\n    },\n    enabled: enabled && !!pairAddress && !!account && !!pairInfo,\n    staleTime: 10_000, // 10 seconds\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { erc20Abi } from \"viem\";\nimport { ponderfactoryAbi } from \"@ponderfinance/dex\";\n\nexport interface PairSummary {\n  // Basic pair data\n  address: Address;\n  token0: Address;\n  token1: Address;\n  token0Symbol: string;\n  token1Symbol: string;\n  token0Decimals: number;\n  token1Decimals: number;\n  reserve0: bigint;\n  reserve1: bigint;\n  totalSupply: bigint;\n}\n\n/**\n * Hook to fetch all existing pairs from the factory\n * @param options.enabled Whether the query should execute\n * @param options.includeTotalSupply Whether to fetch total supply for each pair (slightly more gas)\n * @param options.includeReserves Whether to fetch reserves for each pair (slightly more gas)\n * @returns UseQueryResult with array of all pair information\n */\nexport function useAllPairs(\n  options: {\n    enabled?: boolean;\n    includeTotalSupply?: boolean;\n    includeReserves?: boolean;\n  } = {}\n): UseQueryResult<PairSummary[]> {\n  const {\n    enabled = true,\n    includeTotalSupply = true,\n    includeReserves = true,\n  } = options;\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"factory\",\n      \"allPairs\",\n      includeTotalSupply,\n      includeReserves,\n    ],\n    queryFn: async () => {\n      if (!sdk) {\n        throw new Error(\"SDK not initialized\");\n      }\n\n      // Get the factory contract information\n      const factory = sdk.factory;\n\n      // Get the total number of pairs from the factory\n      const pairsLength = (await sdk.publicClient.readContract({\n        address: factory.address,\n        abi: ponderfactoryAbi,\n        functionName: \"allPairsLength\",\n      })) as bigint;\n\n      // If there are no pairs, return empty array\n      if (pairsLength === 0n) return [];\n\n      // Create an array of indices from 0 to pairsLength-1\n      const indices = Array.from({ length: Number(pairsLength) }, (_, i) => i);\n\n      // Get all pair addresses in batches\n      const chunkSize = 100;\n      const allPairAddresses: Address[] = [];\n\n      for (let i = 0; i < indices.length; i += chunkSize) {\n        const chunk = indices.slice(i, i + chunkSize);\n        const pairAddresses = await Promise.all(\n          chunk.map(\n            (index) =>\n              sdk.publicClient.readContract({\n                address: factory.address,\n                abi: ponderfactoryAbi,\n                functionName: \"allPairs\",\n                args: [BigInt(index)],\n              }) as Promise<Address>\n          )\n        );\n\n        allPairAddresses.push(...pairAddresses);\n      }\n\n      // Now process pair data in smaller chunks\n      const pairSummaries: PairSummary[] = [];\n      const pairDataChunkSize = 10;\n\n      for (let i = 0; i < allPairAddresses.length; i += pairDataChunkSize) {\n        const chunk = allPairAddresses.slice(i, i + pairDataChunkSize);\n        const chunkPromises = chunk.map(async (pairAddress) => {\n          const pair = sdk.getPair(pairAddress);\n\n          // Batch the basic pair data queries\n          const [token0, token1] = await Promise.all([\n            pair.token0(),\n            pair.token1(),\n          ]);\n\n          // Fetch token metadata\n          const [token0Symbol, token1Symbol, token0Decimals, token1Decimals] =\n            await Promise.all([\n              sdk.publicClient.readContract({\n                address: token0,\n                abi: erc20Abi,\n                functionName: \"symbol\",\n              }) as Promise<string>,\n              sdk.publicClient.readContract({\n                address: token1,\n                abi: erc20Abi,\n                functionName: \"symbol\",\n              }) as Promise<string>,\n              sdk.publicClient.readContract({\n                address: token0,\n                abi: erc20Abi,\n                functionName: \"decimals\",\n              }) as Promise<number>,\n              sdk.publicClient.readContract({\n                address: token1,\n                abi: erc20Abi,\n                functionName: \"decimals\",\n              }) as Promise<number>,\n            ]);\n\n          // Conditionally fetch reserves and total supply based on options\n          let reserve0 = 0n;\n          let reserve1 = 0n;\n          let totalSupply = 0n;\n\n          if (includeReserves) {\n            const reserves = await pair.getReserves();\n            reserve0 = reserves.reserve0;\n            reserve1 = reserves.reserve1;\n          }\n\n          if (includeTotalSupply) {\n            totalSupply = await pair.totalSupply();\n          }\n\n          return {\n            address: pairAddress,\n            token0,\n            token1,\n            token0Symbol,\n            token1Symbol,\n            token0Decimals,\n            token1Decimals,\n            reserve0,\n            reserve1,\n            totalSupply,\n          };\n        });\n\n        const chunkResults = await Promise.all(chunkPromises);\n        pairSummaries.push(...chunkResults);\n\n        // Add a small delay between chunks to reduce likelihood of rate limiting\n        if (i + pairDataChunkSize < allPairAddresses.length) {\n          await new Promise((resolve) => setTimeout(resolve, 100));\n        }\n      }\n\n      return pairSummaries;\n    },\n    enabled: enabled && !!sdk,\n    staleTime: 60_000, // 1 minute, longer than usePairInfo since this is more expensive\n    refetchOnWindowFocus: false, // Prevent refetching when user switches tabs\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { type PoolInfo } from \"@/contracts/masterchef\";\n\nexport interface DetailedPoolInfo extends PoolInfo {\n  poolId: number;\n  totalStakedUSD: bigint;\n  apr: number;\n  rewardsPerDay: bigint;\n}\n\nexport function usePoolInfo(\n  poolId: number,\n  enabled = true\n): UseQueryResult<DetailedPoolInfo> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"farm\", \"pool\", poolId],\n    queryFn: async () => {\n\n      const poolInfo = await sdk.masterChef.poolInfo(BigInt(poolId));\n\n      const ponderPerSecond = await sdk.masterChef.ponderPerSecond();\n\n      const totalAllocPoint = await sdk.masterChef.totalAllocPoint();\n\n      // Calculate rewards per day for this pool\n      const poolRewardsPerSecond =\n        totalAllocPoint === 0n\n          ? 0n\n          : (ponderPerSecond * poolInfo.allocPoint) / totalAllocPoint;\n\n      const rewardsPerDay = poolRewardsPerSecond * 86400n;\n\n      // Get total staked value in USD\n      const pair = sdk.getPair(poolInfo.lpToken);\n\n      const [token0, token1, reserves] = await Promise.all([\n        pair.token0(),\n        pair.token1(),\n        pair.getReserves(),\n      ]);\n\n      // This should be expanded to get actual USD value using price oracle\n      const totalStakedUSD =\n        poolInfo.totalStaked === 0n ? 1n : poolInfo.totalStaked;\n\n      // Calculate APR (this is simplified - should use actual token prices)\n      const apr = Number((rewardsPerDay * 36500n) / totalStakedUSD) / 100;\n\n      const result = {\n        ...poolInfo,\n        poolId,\n        totalStakedUSD,\n        apr,\n        rewardsPerDay,\n      };\n      return result;\n    },\n    enabled,\n    staleTime: 30_000,\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { type UserInfo } from \"@/contracts/masterchef\";\n\nexport interface DetailedStakeInfo extends UserInfo {\n  poolId: number;\n  pendingRewards: bigint;\n  lpToken: Address;\n  boost: {\n    multiplier: number;\n    ponderRequired: bigint;\n    additionalRewards: bigint;\n  };\n}\n\nexport function useStakeInfo(\n  poolId: number,\n  account: Address | undefined,\n  enabled = true\n): UseQueryResult<DetailedStakeInfo> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"farm\", \"stake\", poolId.toString(), account],\n    queryFn: async () => {\n      if (!account) throw new Error(\"No account provided\");\n\n      const [userInfo, poolInfo, pendingRewards] = await Promise.all([\n        sdk.masterChef.userInfo(BigInt(poolId), account),\n        sdk.masterChef.poolInfo(BigInt(poolId)),\n        sdk.masterChef.pendingPonder(BigInt(poolId), account),\n      ]);\n\n      // Calculate boost requirements and rewards\n      const baseRewards = pendingRewards;\n      const boostMultiplier = poolInfo.boostMultiplier;\n      const maxBoostRewards = (baseRewards * BigInt(boostMultiplier)) / 10000n;\n      const additionalRewards = maxBoostRewards - baseRewards;\n\n      // Calculate PONDER required for max boost (this is a simplified example)\n      const ponderRequired = userInfo.amount / 10n; // 10% of staked amount for max boost\n\n      return {\n        ...userInfo,\n        poolId,\n        pendingRewards,\n        lpToken: poolInfo.lpToken,\n        boost: {\n          multiplier: boostMultiplier,\n          ponderRequired,\n          additionalRewards,\n        },\n      };\n    },\n    enabled: enabled && !!account,\n    staleTime: 10_000, // 10 seconds\n  });\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n  decodeEventLog,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { MASTERCHEF_ABI } from \"@/abis\";\n\ninterface StakeParams {\n  poolId: number;\n  amount: bigint;\n}\n\ninterface StakeResult {\n  hash: Hash;\n  amount: bigint;\n  events: {\n    deposit?: {\n      user: Address;\n      pid: bigint;\n      amount: bigint;\n    };\n  };\n}\n\nexport function useStake(): UseMutationResult<StakeResult, Error, StakeParams> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (params: StakeParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.masterChef.address,\n        abi: MASTERCHEF_ABI,\n        functionName: \"deposit\",\n        args: [BigInt(params.poolId), params.amount],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      let depositEvent;\n      const depositLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0x90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15\"\n      );\n\n      if (depositLog) {\n        const decoded = decodeEventLog({\n          abi: MASTERCHEF_ABI,\n          data: depositLog.data,\n          topics: depositLog.topics,\n          eventName: \"Deposit\",\n        });\n        depositEvent = {\n          user: decoded.args.user,\n          pid: decoded.args.pid,\n          amount: decoded.args.amount,\n        };\n      }\n\n      return {\n        hash,\n        amount: depositEvent?.amount || params.amount,\n        events: {\n          deposit: depositEvent,\n        },\n      };\n    },\n    onError: (error) => {\n      console.error(\"Stake error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n  decodeEventLog,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { MASTERCHEF_ABI } from \"@/abis\";\n\ninterface UnstakeParams {\n  poolId: number;\n  amount: bigint;\n}\n\ninterface UnstakeResult {\n  hash: Hash;\n  amount: bigint;\n  events: {\n    withdraw?: {\n      user: Address;\n      pid: bigint;\n      amount: bigint;\n    };\n  };\n}\n\nexport function useUnstake(): UseMutationResult<\n  UnstakeResult,\n  Error,\n  UnstakeParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (params: UnstakeParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.masterChef.address,\n        abi: MASTERCHEF_ABI,\n        functionName: \"withdraw\",\n        args: [BigInt(params.poolId), params.amount],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      let withdrawEvent;\n      const withdrawLog = receipt.logs.find(\n        (log) =>\n          log.address.toLowerCase() === sdk.masterChef.address.toLowerCase() &&\n          log.topics[0] ===\n            \"0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568\"\n      );\n\n      if (withdrawLog) {\n        const decoded = decodeEventLog({\n          abi: MASTERCHEF_ABI,\n          data: withdrawLog.data,\n          topics: withdrawLog.topics,\n          eventName: \"Withdraw\",\n        });\n        withdrawEvent = {\n          user: decoded.args.user,\n          pid: decoded.args.pid,\n          amount: decoded.args.amount,\n        };\n      }\n\n      return {\n        hash,\n        amount: withdrawEvent?.amount || params.amount,\n        events: {\n          withdraw: withdrawEvent,\n        },\n      };\n    },\n    onError: (error) => {\n      console.error(\"Unstake error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n  decodeEventLog,\n  erc20Abi,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { MASTERCHEF_ABI } from \"@/abis\";\n\ninterface HarvestParams {\n  poolId: number;\n}\n\ninterface HarvestResult {\n  hash: Hash;\n  rewards: bigint;\n  events: {\n    deposit?: {\n      user: Address;\n      pid: bigint;\n      amount: bigint;\n    };\n    transfer?: {\n      from: Address;\n      to: Address;\n      value: bigint;\n    };\n  };\n}\n\n// Type guards for event decoding\ninterface DepositEvent {\n  eventName: \"Deposit\";\n  args: {\n    user: Address;\n    pid: bigint;\n    amount: bigint;\n  };\n}\n\ninterface TransferEvent {\n  eventName: \"Transfer\";\n  args: {\n    from: Address;\n    to: Address;\n    value: bigint;\n  };\n}\n\n// Type guard functions\nfunction isDepositEvent(event: any): event is DepositEvent {\n  return (\n    event?.eventName === \"Deposit\" &&\n    \"user\" in event.args &&\n    \"pid\" in event.args &&\n    \"amount\" in event.args\n  );\n}\n\nfunction isTransferEvent(event: any): event is TransferEvent {\n  return (\n    event?.eventName === \"Transfer\" &&\n    \"from\" in event.args &&\n    \"to\" in event.args &&\n    \"value\" in event.args\n  );\n}\n\nexport function useHarvest(): UseMutationResult<\n  HarvestResult,\n  Error,\n  HarvestParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (params: HarvestParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.masterChef.address,\n        abi: MASTERCHEF_ABI,\n        functionName: \"deposit\",\n        args: [BigInt(params.poolId), 0n],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      let rewards = 0n;\n      const events: HarvestResult[\"events\"] = {};\n\n      for (const log of receipt.logs) {\n        try {\n          if (\n            log.topics[0] ===\n            \"0x90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15\"\n          ) {\n            // Deposit event\n            const decoded = decodeEventLog({\n              abi: MASTERCHEF_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"Deposit\",\n            } as const);\n\n            if (isDepositEvent(decoded)) {\n              events.deposit = {\n                user: decoded.args.user,\n                pid: decoded.args.pid,\n                amount: decoded.args.amount,\n              };\n            }\n          } else if (\n            log.topics[0] ===\n            \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\"\n          ) {\n            // Transfer event of PONDER tokens\n            const decoded = decodeEventLog({\n              abi: erc20Abi,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"Transfer\",\n            } as const);\n\n            if (isTransferEvent(decoded)) {\n              events.transfer = {\n                from: decoded.args.from,\n                to: decoded.args.to,\n                value: decoded.args.value,\n              };\n\n              // Sum up all transfers to user\n              if (\n                decoded.args.to.toLowerCase() ===\n                sdk.walletClient.account.address.toLowerCase()\n              ) {\n                rewards += decoded.args.value;\n              }\n            }\n          }\n        } catch (error) {\n          console.warn(\"Failed to decode log:\", error);\n          continue;\n        }\n      }\n\n      return {\n        hash,\n        rewards,\n        events,\n      };\n    },\n    onError: (error) => {\n      console.error(\"Harvest error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  decodeEventLog,\n  type Hash,\n  type WriteContractParameters,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { MASTERCHEF_ABI } from \"@/abis\";\n\ninterface BoostStakeParams {\n  poolId: number;\n  amount: bigint;\n}\n\ninterface BoostUnstakeParams extends BoostStakeParams {}\n\ninterface BoostResult {\n  hash: Hash;\n  amount: bigint;\n  events: {\n    boostStake?: {\n      user: Address;\n      pid: bigint;\n      amount: bigint;\n    };\n    boostUnstake?: {\n      user: Address;\n      pid: bigint;\n      amount: bigint;\n    };\n  };\n}\n\nexport function useBoostStake(): UseMutationResult<\n  BoostResult,\n  Error,\n  BoostStakeParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (params: BoostStakeParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.masterChef.address,\n        abi: MASTERCHEF_ABI,\n        functionName: \"boostStake\",\n        args: [BigInt(params.poolId), params.amount],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      let boostStakeEvent;\n      const boostStakeLog = receipt.logs.find(\n        (log) =>\n          log.address.toLowerCase() === sdk.masterChef.address.toLowerCase() &&\n          log.topics[0] ===\n            \"0x4ed4c68f13abf9c0a138434c6d868b44a80834f36c55b9fb945c7672ff919ea0\"\n      );\n\n      if (boostStakeLog) {\n        const decoded = decodeEventLog({\n          abi: MASTERCHEF_ABI,\n          data: boostStakeLog.data,\n          topics: boostStakeLog.topics,\n          eventName: \"BoostStake\",\n        });\n        boostStakeEvent = {\n          user: decoded.args.user,\n          pid: decoded.args.pid,\n          amount: decoded.args.amount,\n        };\n      }\n\n      return {\n        hash,\n        amount: boostStakeEvent?.amount || params.amount,\n        events: {\n          boostStake: boostStakeEvent,\n        },\n      };\n    },\n  });\n}\n\nexport function useBoostUnstake(): UseMutationResult<\n  BoostResult,\n  Error,\n  BoostUnstakeParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (params: BoostUnstakeParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.masterChef.address,\n        abi: MASTERCHEF_ABI,\n        functionName: \"boostUnstake\",\n        args: [BigInt(params.poolId), params.amount],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      let boostUnstakeEvent;\n      const boostUnstakeLog = receipt.logs.find(\n        (log) =>\n          log.address.toLowerCase() === sdk.masterChef.address.toLowerCase() &&\n          log.topics[0] ===\n            \"0x6f498a6d2e0937b2d3ab5c89c4d3981571a77e3359c503c5080c75b9c847a0e2\"\n      );\n\n      if (boostUnstakeLog) {\n        const decoded = decodeEventLog({\n          abi: MASTERCHEF_ABI,\n          data: boostUnstakeLog.data,\n          topics: boostUnstakeLog.topics,\n          eventName: \"BoostUnstake\",\n        });\n        boostUnstakeEvent = {\n          user: decoded.args.user,\n          pid: decoded.args.pid,\n          amount: decoded.args.amount,\n        };\n      }\n\n      return {\n        hash,\n        amount: boostUnstakeEvent?.amount || params.amount,\n        events: {\n          boostUnstake: boostUnstakeEvent,\n        },\n      };\n    },\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface PendingRewards {\n  base: bigint;\n  boosted: bigint;\n  total: bigint;\n  usdValue: number;\n}\n\nexport function usePendingRewards(\n  poolId: number,\n  account: Address | undefined,\n  enabled = true\n): UseQueryResult<PendingRewards> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"farm\", \"pendingRewards\", poolId.toString(), account],\n    queryFn: async () => {\n      if (!account) throw new Error(\"No account provided\");\n\n      const [pending, poolInfo, userInfo] = await Promise.all([\n        sdk.masterChef.pendingPonder(BigInt(poolId), account),\n        sdk.masterChef.poolInfo(BigInt(poolId)),\n        sdk.masterChef.userInfo(BigInt(poolId), account),\n      ]);\n\n      // Calculate base and boosted rewards\n      const boostMultiplier = poolInfo.boostMultiplier;\n      const base = pending;\n      const boosted =\n        userInfo.ponderStaked > 0n\n          ? (pending * (BigInt(boostMultiplier) - 10000n)) / 10000n\n          : 0n;\n      const total = base + boosted;\n\n      // TODO: Get actual USD value from oracle\n      const usdValue = 0;\n\n      return {\n        base,\n        boosted,\n        total,\n        usdValue,\n      };\n    },\n    enabled: enabled && !!account,\n    staleTime: 10_000, // 10 seconds\n    refetchInterval: 10_000, // Poll every 10 seconds\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface FarmMetrics {\n  totalValueLocked: bigint;\n  rewardsPerDay: bigint;\n  totalStakers: number;\n  averageApr: number;\n  activePools: number;\n}\n\nexport function useFarmMetrics(enabled = true): UseQueryResult<FarmMetrics> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"farm\", \"metrics\"],\n    queryFn: async () => {\n      const poolLength = await sdk.masterChef.poolLength();\n      let totalValueLocked = 0n;\n      let totalStakers = 0;\n      let totalApr = 0;\n      let activePools = 0;\n\n      const ponderPerSecond = await sdk.masterChef.ponderPerSecond();\n      const totalRewardsPerDay = ponderPerSecond * 86400n;\n\n      // Aggregate data from all pools\n      for (let i = 0; i < Number(poolLength); i++) {\n        const poolInfo = await sdk.masterChef.poolInfo(BigInt(i));\n        if (poolInfo.allocPoint > 0n) {\n          activePools++;\n          totalValueLocked += poolInfo.totalStaked;\n\n          // Get stakers count (this is an example - implement based on your data availability)\n          // You might need to track this through events or a separate mapping\n          totalStakers += 1;\n\n          // Calculate pool APR and add to total\n          const poolApr =\n            Number((totalRewardsPerDay * 36500n) / poolInfo.totalStaked) / 100;\n          totalApr += poolApr;\n        }\n      }\n\n      return {\n        totalValueLocked,\n        rewardsPerDay: totalRewardsPerDay,\n        totalStakers,\n        averageApr: activePools > 0 ? totalApr / activePools : 0,\n        activePools,\n      };\n    },\n    enabled,\n    staleTime: 60_000, // 1 minute\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { type LaunchInfo } from \"@/contracts/launcher\";\n\nexport interface DetailedLaunchInfo extends LaunchInfo {\n  progress: number;\n  timeRemaining?: number;\n  status: \"upcoming\" | \"active\" | \"completed\" | \"failed\";\n  metrics: {\n    participantsCount: number;\n    averageContribution: bigint;\n    remainingAllocation: bigint;\n  };\n}\n\nexport function useLaunchInfo(\n    launchId: bigint,\n    enabled = true\n): UseQueryResult<DetailedLaunchInfo> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"launch\", \"info\", launchId.toString()],\n    queryFn: async () => {\n      const [launchInfo, contributionInfo] = await Promise.all([\n        sdk.launcher.getLaunchInfo(launchId),\n        sdk.launcher.getContributionInfo(launchId),\n      ]);\n\n      // Calculate progress percentage using total value\n      const progress =\n          Number((contributionInfo.totalValue * 10000n) / sdk.launcher.TARGET_RAISE) / 100;\n\n      // Determine launch status\n      let status: DetailedLaunchInfo[\"status\"];\n      if (!launchInfo.launched) {\n        status = progress === 100 ? \"completed\" : \"active\";\n      } else {\n        status = contributionInfo.totalValue >= sdk.launcher.TARGET_RAISE ? \"completed\" : \"failed\";\n      }\n\n      // Calculate metrics\n      const averageContribution =\n          contributionInfo.totalValue /\n          (launchInfo.tokensSold > 0n ? launchInfo.tokensSold : 1n);\n      const remainingAllocation = launchInfo.tokensForSale - launchInfo.tokensSold;\n\n      return {\n        ...launchInfo,\n        progress,\n        status,\n        metrics: {\n          participantsCount: 0, // Would need event tracking to get actual count\n          averageContribution,\n          remainingAllocation,\n        },\n      };\n    },\n    enabled,\n    staleTime: 30_000, // 30 seconds\n  });\n}\n\nconst TARGET_RAISE = 5555n * 10n ** 18n; // 5,555 ETH\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  decodeEventLog,\n  type WriteContractParameters,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { LAUNCHER_ABI, TOKEN_ABI } from \"@/abis\";\n\ninterface CreateLaunchParams {\n  name: string;\n  symbol: string;\n  imageURI: string;\n}\n\ninterface CreateLaunchResult {\n  hash: Hash;\n  launchId: bigint;\n  token: {\n    address: Address;\n    name: string;\n    symbol: string;\n  };\n  ponderMetrics: {\n    required: bigint;\n    lpAllocation: bigint;\n    protocolLPAmount: bigint;\n    burnAmount: bigint;\n  };\n  events: {\n    launchCreated?: {\n      launchId: bigint;\n      token: Address;\n      creator: Address;\n      imageURI: string;\n    };\n    dualPoolsCreated?: {\n      launchId: bigint;\n      memeKubPair: Address;\n      memePonderPair: Address;\n      kubLiquidity: bigint;\n      ponderLiquidity: bigint;\n    };\n  };\n}\n\n// Validation types\ninterface ValidationResult {\n  isValid: boolean;\n  errors: string[];\n}\n\ninterface LaunchRequirements {\n  ponderBalance: bigint;\n  ponderRequired: bigint;\n  canCreate: boolean;\n  errors: string[];\n}\n\n\nexport function useCreateLaunch(): UseMutationResult<\n  CreateLaunchResult,\n  Error,\n  CreateLaunchParams\n> {\n  const sdk = usePonderSDK();\n\n  // Helper to validate launch parameters\n  const validateLaunchParams = (\n    params: CreateLaunchParams\n  ): ValidationResult => {\n    const errors: string[] = [];\n\n    // Name validation\n    if (!params.name) errors.push(\"Name is required\");\n    if (params.name.length > 32)\n      errors.push(\"Name too long (max 32 characters)\");\n\n    // Symbol validation\n    if (!params.symbol) errors.push(\"Symbol is required\");\n    if (params.symbol.length > 8)\n      errors.push(\"Symbol too long (max 8 characters)\");\n\n    // Image URI validation\n    if (!params.imageURI) errors.push(\"Image URI is required\");\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n    };\n  };\n\n  // Query hook to check launch requirements\n  const useLaunchRequirements = async (): Promise<LaunchRequirements> => {\n    if (!sdk.walletClient?.account) {\n      return {\n        ponderBalance: 0n,\n        ponderRequired: 0n,\n        canCreate: false,\n        errors: [\"Wallet not connected\"],\n      };\n    }\n\n    const [ponderBalance, launchCount] = await Promise.all([\n      sdk.ponder.balanceOf(sdk.walletClient.account.address),\n      sdk.launcher.launchCount(),\n    ]);\n\n    // Calculate PONDER requirement based on launch mechanics\n    const ponderRequired = sdk.launcher.TARGET_RAISE;\n    const errors: string[] = [];\n\n    if (ponderBalance < ponderRequired) {\n      errors.push(\n        `Insufficient PONDER balance. Required: ${ponderRequired.toString()}`\n      );\n    }\n\n    return {\n      ponderBalance,\n      ponderRequired,\n      canCreate: errors.length === 0,\n      errors,\n    };\n  };\n\n  return useMutation({\n    mutationFn: async (params: CreateLaunchParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Validate parameters\n      const validation = validateLaunchParams(params);\n      if (!validation.isValid) {\n        throw new Error(\n          `Invalid launch parameters: ${validation.errors.join(\", \")}`\n        );\n      }\n\n      // Check requirements\n      const requirements = await useLaunchRequirements();\n      if (!requirements.canCreate) {\n        throw new Error(\n          `Cannot create launch: ${requirements.errors.join(\", \")}`\n        );\n      }\n\n      // Check and update PONDER allowance if needed\n      const ponderAllowance = await sdk.ponder.allowance(\n        sdk.walletClient.account.address,\n        sdk.launcher.address\n      );\n\n      if (ponderAllowance < requirements.ponderRequired) {\n        const { request: approvalRequest } =\n          await sdk.publicClient.simulateContract({\n            address: sdk.ponder.address,\n            abi: TOKEN_ABI,\n            functionName: \"approve\",\n            args: [sdk.launcher.address, requirements.ponderRequired],\n            account: sdk.walletClient.account.address,\n            chain: sdk.walletClient.chain,\n          });\n\n        const approvalTx = await sdk.walletClient.writeContract(\n          approvalRequest as WriteContractParameters\n        );\n\n        await sdk.publicClient.waitForTransactionReceipt({ hash: approvalTx });\n      }\n\n      // Create launch\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.launcher.address,\n        abi: LAUNCHER_ABI,\n        functionName: \"createLaunch\",\n        args: [\n          {\n            name: params.name,\n            symbol: params.symbol,\n            imageURI: params.imageURI,\n          },\n        ],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      // Process receipt and decode events\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n        confirmations: 1,\n      });\n\n      const events: CreateLaunchResult[\"events\"] = {};\n\n      for (const log of receipt.logs) {\n        try {\n          const eventId = log?.topics[0]?.toLowerCase();\n\n          // LaunchCreated event\n          if (\n            eventId ===\n            \"0x21a4dad170a6bf476c31bbf74b1e6416c50bb31c38fba37cb54387f2d88af654\"\n          ) {\n            const decoded = decodeEventLog({\n              abi: LAUNCHER_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"LaunchCreated\",\n            });\n            events.launchCreated = {\n              launchId: decoded.args.launchId,\n              token: decoded.args.token,\n              creator: decoded.args.creator,\n              imageURI: decoded.args.imageURI,\n            };\n          }\n          // DualPoolsCreated event\n          else if (\n            eventId ===\n            \"0x8d7c3c56f4e7f949b483f37118c9b7d56c947690b5ff3db6757b7c634c23a4b9\"\n          ) {\n            const decoded = decodeEventLog({\n              abi: LAUNCHER_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"DualPoolsCreated\",\n            });\n            events.dualPoolsCreated = {\n              launchId: decoded.args.launchId,\n              memeKubPair: decoded.args.memeKubPair,\n              memePonderPair: decoded.args.memePonderPair,\n              kubLiquidity: decoded.args.kubLiquidity,\n              ponderLiquidity: decoded.args.ponderLiquidity,\n            };\n          }\n        } catch (error) {\n          console.warn(\"Failed to decode event:\", error);\n        }\n      }\n\n      if (!events.launchCreated) {\n        throw new Error(\"Launch creation failed: no LaunchCreated event found\");\n      }\n\n      // Calculate PONDER metrics\n      const ponderMetrics = {\n        required: requirements.ponderRequired,\n        lpAllocation:\n          (requirements.ponderRequired * sdk.launcher.PONDER_LP_ALLOCATION) /\n          100n,\n        protocolLPAmount:\n          (requirements.ponderRequired * sdk.launcher.PONDER_PROTOCOL_LP) /\n          100n,\n        burnAmount:\n          (requirements.ponderRequired * sdk.launcher.PONDER_BURN) / 100n,\n      };\n\n      return {\n        hash,\n        launchId: events.launchCreated.launchId,\n        token: {\n          address: events.launchCreated.token,\n          name: params.name,\n          symbol: params.symbol,\n        },\n        ponderMetrics,\n        events,\n      };\n    },\n    onError: (error) => {\n      console.error(\"Launch creation error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n  decodeEventLog,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { LAUNCHER_ABI, TOKEN_ABI } from \"@/abis\";\n\ntype ContributeType = \"KUB\" | \"PONDER\";\n\ninterface BaseContributeParams {\n  launchId: bigint;\n  amount: bigint;\n  type: ContributeType;\n}\n\ninterface ContributeResult {\n  hash: Hash;\n  contribution: {\n    amount: bigint;\n    kubValue: bigint;\n  };\n  ponderMetrics?: {\n    lpAllocation: bigint;\n    protocolLPAllocation: bigint;\n    burnAmount: bigint;\n  };\n  events: {\n    kubContributed?: {\n      launchId: bigint;\n      contributor: Address;\n      amount: bigint;\n    };\n    ponderContributed?: {\n      launchId: bigint;\n      contributor: Address;\n      amount: bigint;\n      kubValue: bigint;\n    };\n    dualPoolsCreated?: {\n      launchId: bigint;\n      memeKubPair: Address;\n      memePonderPair: Address;\n      kubLiquidity: bigint;\n      ponderLiquidity: bigint;\n    };\n    ponderBurned?: {\n      launchId: bigint;\n      amount: bigint;\n    };\n  };\n}\n\nexport function useContribute(): UseMutationResult<\n  ContributeResult,\n  Error,\n  BaseContributeParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({ launchId, amount, type }: BaseContributeParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Get launch info and contribution info\n      const [launchInfo, contributionInfo] = await Promise.all([\n        sdk.launcher.getLaunchInfo(launchId),\n        sdk.launcher.getContributionInfo(launchId),\n      ]);\n\n      // Validate contribution based on type\n      if (type === \"PONDER\") {\n        // Check PONDER balance\n        const ponderBalance = await sdk.ponder.balanceOf(\n          sdk.walletClient.account.address\n        );\n\n        if (ponderBalance < amount) {\n          throw new Error(\"Insufficient PONDER balance\");\n        }\n\n        // Check allowance and approve if needed\n        const allowance = await sdk.ponder.allowance(\n          sdk.walletClient.account.address,\n          sdk.launcher.address\n        );\n\n        if (allowance < amount) {\n          const { request: approvalRequest } =\n            await sdk.publicClient.simulateContract({\n              address: sdk.ponder.address,\n              abi: TOKEN_ABI,\n              functionName: \"approve\",\n              args: [sdk.launcher.address, amount],\n              account: sdk.walletClient.account.address,\n              chain: sdk.walletClient.chain,\n            });\n\n          const approvalTx = await sdk.walletClient.writeContract(\n            approvalRequest as WriteContractParameters\n          );\n          await sdk.publicClient.waitForTransactionReceipt({\n            hash: approvalTx,\n          });\n        }\n      }\n\n      // Prepare contract call based on type\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.launcher.address,\n        abi: LAUNCHER_ABI,\n        functionName: type === \"KUB\" ? \"contributeKUB\" : \"contributePONDER\",\n        args: type === \"KUB\" ? [launchId] : [launchId, amount],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n        ...(type === \"KUB\" ? { value: amount } : {}),\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n        confirmations: 1,\n      });\n\n      // Process events\n      const events: ContributeResult[\"events\"] = {};\n\n      for (const log of receipt.logs) {\n        try {\n          const eventId = log?.topics[0]?.toLowerCase();\n\n          if (\n            eventId ===\n            \"0xe893c2681d327421d89e1cb54e44586c36d9a0a37c1bca6cd4e93ac234db355e\"\n          ) {\n            const decoded = decodeEventLog({\n              abi: LAUNCHER_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"KUBContributed\",\n            });\n            events.kubContributed = {\n              launchId: decoded.args.launchId,\n              contributor: decoded.args.contributor,\n              amount: decoded.args.amount,\n            };\n          } else if (\n            eventId ===\n            \"0x74357e3e382064e1dfe9b2793e87ec9f6cd7459544e2c85c1c72e3a97591c91\"\n          ) {\n            const decoded = decodeEventLog({\n              abi: LAUNCHER_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"PonderContributed\",\n            });\n            events.ponderContributed = {\n              launchId: decoded.args.launchId,\n              contributor: decoded.args.contributor,\n              amount: decoded.args.amount,\n              kubValue: decoded.args.kubValue,\n            };\n          } else if (\n            eventId ===\n            \"0x8d7c3c56f4e7f949b483f37118c9b7d56c947690b5ff3db6757b7c634c23a4b9\"\n          ) {\n            const decoded = decodeEventLog({\n              abi: LAUNCHER_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"DualPoolsCreated\",\n            });\n            events.dualPoolsCreated = {\n              launchId: decoded.args.launchId,\n              memeKubPair: decoded.args.memeKubPair,\n              memePonderPair: decoded.args.memePonderPair,\n              kubLiquidity: decoded.args.kubLiquidity,\n              ponderLiquidity: decoded.args.ponderLiquidity,\n            };\n          } else if (\n            eventId ===\n            \"0x4859432e4c6ddb3d7e54959edea5b348d16bb60da60673621d49c2689874539c\"\n          ) {\n            const decoded = decodeEventLog({\n              abi: LAUNCHER_ABI,\n              data: log.data,\n              topics: log.topics,\n              eventName: \"PonderBurned\",\n            });\n            events.ponderBurned = {\n              launchId: decoded.args.launchId,\n              amount: decoded.args.amount,\n            };\n          }\n        } catch (error) {\n          console.warn(\"Failed to decode log:\", error);\n        }\n      }\n\n      // Calculate metrics if it's a PONDER contribution\n      let ponderMetrics;\n      if (type === \"PONDER\") {\n        const metrics = await sdk.launcher.calculatePonderRequirements();\n        ponderMetrics = {\n          lpAllocation: metrics.lpAllocation,\n          protocolLPAllocation: metrics.protocolLPAllocation,\n          burnAmount: metrics.burnAmount,\n        };\n      }\n\n      return {\n        hash,\n        contribution: {\n          amount:\n            type === \"KUB\"\n              ? events.kubContributed?.amount || 0n\n              : events.ponderContributed?.amount || 0n,\n          kubValue:\n            type === \"KUB\"\n              ? events.kubContributed?.amount || 0n\n              : events.ponderContributed?.kubValue || 0n,\n        },\n        ponderMetrics,\n        events,\n      };\n    },\n    onError: (error) => {\n      console.error(\"Contribution error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { type PonderToken } from \"@/contracts/pondertoken\";\nimport { type LaunchToken } from \"@/contracts/launchtoken\";\n\nexport interface VestingSchedule {\n  total: bigint;\n  claimed: bigint;\n  available: bigint;\n  start: bigint;\n  end: bigint;\n  dailyVesting: bigint;\n}\n\nexport interface DetailedVestingInfo {\n  // General vesting metrics\n  totalVested: bigint;\n  vestedAmount: bigint;\n  claimedAmount: bigint;\n  availableToClaim: bigint;\n  // Time info\n  vestingStart: bigint;\n  vestingEnd: bigint;\n  nextClaimDate?: bigint;\n  // Progress metrics\n  percentageVested: number;\n  percentageClaimed: number;\n  // Status\n  isFullyVested: boolean;\n  isFullyClaimed: boolean;\n  // Rate metrics\n  dailyVestingRate: bigint;\n  // Token specific (for launch tokens)\n  creator?: Address;\n  creatorFees?: bigint;\n  // Team vesting (for PONDER token)\n  teamAllocation?: bigint;\n  teamClaimed?: bigint;\n}\n\ninterface VestingParams {\n  token: Address;\n  type: \"launch\" | \"ponder\";\n  account?: Address;\n}\n\nexport function useVestingInfo(\n  params: VestingParams,\n  enabled = true\n): UseQueryResult<DetailedVestingInfo> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"vesting\",\n      \"info\",\n      params.token,\n      params.type,\n      params.account,\n    ],\n    queryFn: async () => {\n      if (params.type === \"launch\") {\n        return getLaunchTokenVesting(params.token, params.account, sdk);\n      } else {\n        return getPonderTokenVesting(params.token, params.account, sdk);\n      }\n    },\n    enabled:\n      enabled &&\n      !!params.token &&\n      (params.type === \"ponder\" || !!params.account),\n    staleTime: 30_000, // 30 seconds\n  });\n}\n\nasync function getLaunchTokenVesting(\n  tokenAddress: Address,\n  account: Address | undefined,\n  sdk: ReturnType<typeof usePonderSDK>\n): Promise<DetailedVestingInfo> {\n  const token = sdk.getLaunchToken(tokenAddress);\n  const vestingInfo = await token.getVestingInfo();\n\n  // Calculate daily vesting amount\n  const totalSeconds = vestingInfo.end - vestingInfo.start;\n  const dailyRate = (vestingInfo.total * 86400n) / totalSeconds;\n\n  // Calculate next claim time if not fully vested\n  const now = BigInt(Math.floor(Date.now() / 1000));\n  const nextClaimDate =\n    now >= vestingInfo.end\n      ? undefined\n      : vestingInfo.start + ((now - vestingInfo.start) / 86400n + 1n) * 86400n;\n\n  const [creator] = await Promise.all([token.creator()]);\n\n  return {\n    totalVested: vestingInfo.total,\n    vestedAmount: vestingInfo.claimed + vestingInfo.available,\n    claimedAmount: vestingInfo.claimed,\n    availableToClaim: vestingInfo.available,\n    vestingStart: vestingInfo.start,\n    vestingEnd: vestingInfo.end,\n    nextClaimDate,\n    percentageVested:\n      Number(\n        ((vestingInfo.claimed + vestingInfo.available) * 10000n) /\n          vestingInfo.total\n      ) / 100,\n    percentageClaimed:\n      Number((vestingInfo.claimed * 10000n) / vestingInfo.total) / 100,\n    isFullyVested: now >= vestingInfo.end,\n    isFullyClaimed: vestingInfo.claimed >= vestingInfo.total,\n    dailyVestingRate: dailyRate,\n    creator,\n  };\n}\n\nasync function getPonderTokenVesting(\n  tokenAddress: Address,\n  account: Address | undefined,\n  sdk: ReturnType<typeof usePonderSDK>\n): Promise<DetailedVestingInfo> {\n  const ponder = sdk.ponder;\n\n  const [deploymentTime, teamTokensClaimed] = await Promise.all([\n    ponder.deploymentTime(),\n    ponder.teamTokensClaimed(),\n  ]);\n\n  const now = BigInt(Math.floor(Date.now() / 1000));\n  const vestingStart = deploymentTime;\n  const vestingEnd = vestingStart + ponder.VESTING_DURATION;\n  const timeElapsed = now - vestingStart;\n\n  // Calculate team vesting\n  const teamAllocation = ponder.TEAM_ALLOCATION;\n  const vestedAmount =\n    timeElapsed >= ponder.VESTING_DURATION\n      ? teamAllocation\n      : (teamAllocation * timeElapsed) / ponder.VESTING_DURATION;\n\n  const availableToClaim =\n    vestedAmount > teamTokensClaimed ? vestedAmount - teamTokensClaimed : 0n;\n\n  const dailyRate = (teamAllocation * 86400n) / ponder.VESTING_DURATION;\n\n  const nextClaimDate =\n    now >= vestingEnd\n      ? undefined\n      : vestingStart + (timeElapsed / 86400n + 1n) * 86400n;\n\n  return {\n    totalVested: teamAllocation,\n    vestedAmount,\n    claimedAmount: teamTokensClaimed,\n    availableToClaim,\n    vestingStart,\n    vestingEnd,\n    nextClaimDate,\n    percentageVested: Number((vestedAmount * 10000n) / teamAllocation) / 100,\n    percentageClaimed:\n      Number((teamTokensClaimed * 10000n) / teamAllocation) / 100,\n    isFullyVested: now >= vestingEnd,\n    isFullyClaimed: teamTokensClaimed >= teamAllocation,\n    dailyVestingRate: dailyRate,\n    teamAllocation,\n    teamClaimed: teamTokensClaimed,\n  };\n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n  decodeEventLog,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { LAUNCH_TOKEN_ABI } from \"@/abis\";\n\ninterface ClaimTokensParams {\n  tokenAddress: Address;\n}\n\ninterface ClaimTokensResult {\n  hash: Hash;\n  amount: bigint;\n  events: {\n    tokensClaimed?: {\n      creator: Address;\n      amount: bigint;\n    };\n  };\n}\n\nexport function useClaimTokens(): UseMutationResult<\n  ClaimTokensResult,\n  Error,\n  ClaimTokensParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({ tokenAddress }: ClaimTokensParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: tokenAddress,\n        abi: LAUNCH_TOKEN_ABI,\n        functionName: \"claimVestedTokens\",\n        args: [],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      let claimedEvent;\n      const claimedLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0x21e127d1db6adff787adddf58c5c02e8fd5d51abca071510431632aa82deadf7\"\n      );\n\n      if (claimedLog) {\n        const decoded = decodeEventLog({\n          abi: LAUNCH_TOKEN_ABI,\n          data: claimedLog.data,\n          topics: claimedLog.topics,\n          eventName: \"TokensClaimed\",\n        });\n        claimedEvent = {\n          creator: decoded.args.creator,\n          amount: decoded.args.amount,\n        };\n      }\n\n      return {\n        hash,\n        amount: claimedEvent?.amount || 0n,\n        events: {\n          tokensClaimed: claimedEvent,\n        },\n      };\n    },\n    onError: (error) => {\n      console.error(\"Token claim error:\", error);\n      throw error;\n    },\n  });\n}\n","import {\n  useMutation,\n  useQuery,\n  type UseMutationResult,\n  type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport {\n  type Address,\n  type Hash,\n  type WriteContractParameters,\n  decodeEventLog,\n} from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { LAUNCHER_ABI } from \"@/abis\";\n\ninterface LPWithdrawParams {\n  launchId: bigint;\n}\n\ninterface LPWithdrawResult {\n  hash: Hash;\n  events: {\n    lpWithdrawn?: {\n      launchId: bigint;\n      creator: Address;\n    };\n  };\n}\n\nexport interface LPInfo {\n  // Basic LP info\n  amount: bigint;\n  unlockTime: number;\n  canWithdraw: boolean;\n  timeRemaining?: number;\n  // Token addresses\n  token0: Address;\n  token1: Address;\n  // Pair info\n  pairAddress: Address;\n  // Value metrics\n  totalValue?: bigint;\n  token0Amount?: bigint;\n  token1Amount?: bigint;\n  // PONDER metrics\n  ponderAmount?: bigint;\n  ponderLPAmount?: bigint;\n  protocolLPAmount?: bigint;\n}\n\n// Hook for checking LP withdrawal status\nexport function useLPInfo(\n  launchId: bigint,\n  enabled = true\n): UseQueryResult<LPInfo> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"launch\", \"lp\", launchId.toString()],\n    queryFn: async () => {\n      // Get basic launch info\n      const launchInfo = await sdk.launcher.getLaunchInfo(launchId);\n\n      // Get WETH address for pair lookup\n      const wethAddress = await sdk.router.KKUB();\n\n      // Get pair address and contract\n      const pairAddress = await sdk.factory.getPair(\n        launchInfo.tokenAddress,\n        wethAddress\n      );\n      const pair = sdk.getPair(pairAddress);\n\n      // Get token addresses and verify order\n      const [token0, token1] = await Promise.all([\n        pair.token0(),\n        pair.token1(),\n      ]);\n\n      // Get current LP balance\n      const lpBalance = await pair.balanceOf(sdk.launcher.address);\n\n      // Get current time and calculate status\n      const now = Math.floor(Date.now() / 1000);\n      const canWithdraw = now >= Number(launchInfo.lpUnlockTime);\n      const timeRemaining = canWithdraw\n        ? undefined\n        : Number(launchInfo.lpUnlockTime) - now;\n\n      // Get reserves to calculate token amounts\n      const reserves = await pair.getReserves();\n      const totalSupply = await pair.totalSupply();\n\n      // Calculate token amounts based on LP share\n      const token0Amount =\n        lpBalance > 0n ? (reserves.reserve0 * lpBalance) / totalSupply : 0n;\n      const token1Amount =\n        lpBalance > 0n ? (reserves.reserve1 * lpBalance) / totalSupply : 0n;\n\n      // Get PONDER metrics if one of the tokens is PONDER\n      let ponderAmount, ponderLPAmount, protocolLPAmount;\n      const ponderAddress = sdk.ponder.address;\n      if (token0 === ponderAddress || token1 === ponderAddress) {\n        // Calculate PONDER amounts from LP\n        const ponderReserve =\n          token0 === ponderAddress ? reserves.reserve0 : reserves.reserve1;\n        ponderAmount =\n          lpBalance > 0n ? (ponderReserve * lpBalance) / totalSupply : 0n;\n\n        // Get launch allocation metrics\n        const ponderMetrics = await sdk.launcher.calculatePonderRequirements();\n        ponderLPAmount = ponderMetrics.lpAllocation;\n        protocolLPAmount = ponderMetrics.protocolLPAllocation;\n      }\n\n      return {\n        amount: lpBalance,\n        unlockTime: Number(launchInfo.lpUnlockTime),\n        canWithdraw,\n        timeRemaining,\n        token0,\n        token1,\n        pairAddress,\n        totalValue: lpBalance,\n        token0Amount,\n        token1Amount,\n        ponderAmount,\n        ponderLPAmount,\n        protocolLPAmount,\n      };\n    },\n    enabled,\n    staleTime: 30_000, // 30 seconds\n  });\n}\n\n// Hook for withdrawing LP tokens\nexport function useLPWithdraw(): UseMutationResult<\n  LPWithdrawResult,\n  Error,\n  LPWithdrawParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({ launchId }: LPWithdrawParams) => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Verify we can withdraw\n      const lpInfo = await sdk.launcher.getLaunchInfo(launchId);\n      const now = Math.floor(Date.now() / 1000);\n      if (now < Number(lpInfo.lpUnlockTime)) {\n        throw new Error(\"LP tokens still locked\");\n      }\n\n      // Simulate withdrawal\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.launcher.address,\n        abi: LAUNCHER_ABI,\n        functionName: \"withdrawLP\",\n        args: [launchId],\n        account: sdk.walletClient.account.address,\n        chain: sdk.walletClient.chain,\n      });\n\n      // Execute withdrawal\n      const hash = await sdk.walletClient.writeContract(\n        request as WriteContractParameters\n      );\n\n      // Wait for confirmation and decode events\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      const events: LPWithdrawResult[\"events\"] = {};\n\n      // Look for LP withdrawal event\n      const withdrawalLog = receipt.logs.find(\n        (log) =>\n          log.topics[0] ===\n          \"0x8d7c3c56f4e7f949b483f37118c9b7d56c947690b5ff3db6757b7c634c23a4b9\"\n      );\n\n      if (withdrawalLog) {\n        const decoded = decodeEventLog({\n          abi: LAUNCHER_ABI,\n          data: withdrawalLog.data,\n          topics: withdrawalLog.topics,\n          eventName: \"LPTokensWithdrawn\",\n        });\n\n        events.lpWithdrawn = {\n          launchId: decoded.args.launchId,\n          creator: decoded.args.creator,\n        };\n      }\n\n      return {\n        hash,\n        events,\n      };\n    },\n    onError: (error) => {\n      console.error(\"LP withdrawal error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface RemainingToRaise {\n  remainingKub: bigint;\n  remainingPonder: bigint;\n  totalRemaining: bigint;\n}\n\nexport function useRemainingToRaise(\n  launchId: bigint,\n  enabled = true\n): UseQueryResult<RemainingToRaise> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"launch\", \"remaining\", launchId.toString()],\n    queryFn: async () => {\n      const [remainingKub, remainingPonder] = await sdk.launcher.getRemainingToRaise(launchId);\n      return {\n        remainingKub,\n        remainingPonder,\n        totalRemaining: remainingKub + remainingPonder,\n      };\n    },\n    enabled,\n    staleTime: 30_000, // 30 seconds\n  });\n} ","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface TokenPrice {\n  current: number;\n  change24h: number;\n  change7d: number;\n  lastUpdate: number;\n  baseAmount: bigint;\n  quoteAmount: bigint;\n}\n\nexport function usePriceInfo(\n  pairAddress: Address | undefined,\n  tokenIn: Address | undefined,\n  enabled = true\n): UseQueryResult<TokenPrice> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"price\", pairAddress, tokenIn],\n    queryFn: async () => {\n      if (!pairAddress || !tokenIn) {\n        throw new Error(\"Pair address and tokenIn are required\");\n      }\n\n      // Get current TWAP price (30 min)\n      const baseAmount = 10n ** 18n; // 1 token\n\n      try {\n        const [amount30min, amount24h, amount7d] = await Promise.all([\n          // Current price (30 min TWAP)\n          sdk.oracle.consult(\n            pairAddress,\n            tokenIn,\n            baseAmount,\n            1800 // 30 minutes\n          ),\n          // 24h price\n          sdk.oracle\n            .consult(\n              pairAddress,\n              tokenIn,\n              baseAmount,\n              86400 // 24 hours\n            )\n            .catch(() => undefined),\n          // 7d price\n          sdk.oracle\n            .consult(\n              pairAddress,\n              tokenIn,\n              baseAmount,\n              604800 // 7 days\n            )\n            .catch(() => undefined),\n        ]);\n\n        if (!amount30min) {\n          throw new Error(\"Failed to fetch current price\");\n        }\n\n        // Calculate price changes\n        const currentPrice = Number(amount30min) / Number(baseAmount);\n        const price24h = amount24h\n          ? Number(amount24h) / Number(baseAmount)\n          : currentPrice;\n        const price7d = amount7d\n          ? Number(amount7d) / Number(baseAmount)\n          : currentPrice;\n\n        // Calculate changes (default to 0 if historical prices unavailable)\n        const change24h =\n          price24h !== currentPrice\n            ? ((currentPrice - price24h) / price24h) * 100\n            : 0;\n        const change7d =\n          price7d !== currentPrice\n            ? ((currentPrice - price7d) / price7d) * 100\n            : 0;\n\n        return {\n          current: currentPrice,\n          change24h,\n          change7d,\n          lastUpdate: Math.floor(Date.now() / 1000),\n          baseAmount,\n          quoteAmount: amount30min,\n        };\n      } catch (error) {\n        console.error(\"Error fetching price info:\", error);\n        throw error;\n      }\n    },\n    enabled: enabled && !!pairAddress && !!tokenIn,\n    staleTime: 30_000, // 30 seconds\n    retry: 2, // Retry failed requests twice\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface PricePoint {\n  timestamp: number;\n  price: number;\n  priceUSD: number;\n  volume: bigint;\n}\n\nexport interface PriceHistory {\n  points: PricePoint[];\n  minPrice: number;\n  maxPrice: number;\n  averagePrice: number;\n  totalVolume: bigint;\n  percentChange: number;\n  currentPrice: number;\n}\n\ninterface UsePriceHistoryParams {\n  pairAddress: Address | undefined;\n  tokenIn: Address | undefined;\n  period: \"1h\" | \"24h\" | \"7d\" | \"30d\";\n  enabled?: boolean;\n  refetchInterval?: number;\n}\n\nexport function usePriceHistory({\n  pairAddress,\n  tokenIn,\n  period,\n  enabled = true,\n  refetchInterval,\n}: UsePriceHistoryParams): UseQueryResult<PriceHistory> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"priceHistory\", pairAddress, tokenIn, period],\n    queryFn: async () => {\n      if (!pairAddress || !tokenIn) {\n        throw new Error(\"Pair address and tokenIn are required\");\n      }\n\n      try {\n        const observations = await sdk.oracle.getPriceHistory(pairAddress);\n        const baseAmount = 10n ** 18n;\n\n        const periodSeconds = {\n          \"1h\": 3600,\n          \"24h\": 86400,\n          \"7d\": 604800,\n          \"30d\": 2592000,\n        }[period];\n\n        const now = Math.floor(Date.now() / 1000);\n        const startTime = now - periodSeconds;\n\n        // Filter and validate observations\n        const relevantObs = observations\n          .filter((obs) => Number(obs.timestamp) >= startTime)\n          .filter(\n            (obs) =>\n              obs.price0Cumulative !== undefined &&\n              obs.price0Cumulative !== null\n          );\n\n        if (relevantObs.length === 0) {\n          return {\n            points: [],\n            minPrice: 0,\n            maxPrice: 0,\n            averagePrice: 0,\n            totalVolume: 0n,\n            percentChange: 0,\n            currentPrice: 0,\n          };\n        }\n\n        const points: PricePoint[] = relevantObs\n          .map((obs) => ({\n            timestamp: Number(obs.timestamp),\n            price: Number(obs.price0Cumulative) / Number(baseAmount),\n            priceUSD: Number(obs.price0Cumulative) / Number(baseAmount),\n            volume: 0n,\n          }))\n          .sort((a, b) => a.timestamp - b.timestamp);\n\n        // Calculate statistics safely\n        const prices = points.map((p) => p.price);\n        const minPrice = Math.min(...prices);\n        const maxPrice = Math.max(...prices);\n        const averagePrice =\n          prices.reduce((a, b) => a + b, 0) / prices.length || 0;\n        const totalVolume = points.reduce((a, b) => a + b.volume, 0n);\n\n        // Calculate percent change safely\n        const firstPrice = prices[0] || 0;\n        const lastPrice = prices[prices.length - 1] || 0;\n        const percentChange =\n          firstPrice === 0 ? 0 : ((lastPrice - firstPrice) / firstPrice) * 100;\n\n        return {\n          points,\n          minPrice,\n          maxPrice,\n          averagePrice,\n          totalVolume,\n          percentChange,\n          currentPrice: lastPrice,\n        };\n      } catch (error) {\n        console.error(\"Error fetching price history:\", error);\n        throw error;\n      }\n    },\n    enabled: enabled && !!pairAddress && !!tokenIn,\n    refetchInterval,\n    staleTime: 60_000, // 1 minute stale time\n    retry: 2,\n  });\n}\n","import {\n  useMutation,\n  useQuery,\n  type UseMutationResult,\n  type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport { type Address, type Hash } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { type PonderPair } from \"@/contracts/pair\";\n\nexport interface OracleStatus {\n  lastUpdate: number;\n  observationsCount: bigint;\n  needsUpdate: boolean;\n  nextUpdateTime: number;\n}\n\n// For useUpdateOracle\ninterface UpdateOracleParams {\n  pair: PonderPair;\n}\n\ninterface UpdateOracleResult {\n  hash: Hash;\n  timestamp: number;\n}\n\n// Hook for checking oracle status\nexport function useOracleStatus(\n  pairAddress: Address | undefined,\n  enabled = true\n): UseQueryResult<OracleStatus> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"oracle\", \"status\", pairAddress],\n    queryFn: async () => {\n      if (!pairAddress) {\n        throw new Error(\"Pair address is required\");\n      }\n\n      try {\n        // Get data in parallel for better performance\n        const [observationsCount, latest] = await Promise.all([\n          // Get the observation count\n          sdk.oracle.observationLength(pairAddress),\n          // Get the latest observation\n          sdk.oracle.getLatestObservation(pairAddress).catch(() => null),\n        ]);\n\n        const lastUpdate = latest ? Number(latest.timestamp) : 0;\n        const now = Math.floor(Date.now() / 1000);\n        const timeSinceUpdate = now - lastUpdate;\n\n        // Oracle needs update if:\n        // 1. No observations yet\n        // 2. More than 30 minutes since last update\n        const needsUpdate = observationsCount === 0n || timeSinceUpdate > 1800;\n\n        // Calculate next update time (30 min intervals)\n        const nextUpdateTime = lastUpdate + 1800;\n\n        return {\n          lastUpdate,\n          observationsCount,\n          needsUpdate,\n          nextUpdateTime,\n        };\n      } catch (error) {\n        console.error(\"Error fetching oracle status:\", error);\n        throw new Error(\"Failed to fetch oracle status\");\n      }\n    },\n    enabled: enabled && !!pairAddress,\n    staleTime: 60_000, // 1 minute\n    retry: 2, // Retry failed requests twice\n    refetchInterval: 30_000, // Refetch every 30 seconds\n  });\n}\n\n// Hook for updating oracle\nexport function useUpdateOracle(): UseMutationResult<\n  UpdateOracleResult,\n  Error,\n  UpdateOracleParams\n> {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({ pair }: UpdateOracleParams) => {\n      const hash = await sdk.oracle.update(pair.address);\n\n      const receipt = await sdk.publicClient.waitForTransactionReceipt({\n        hash,\n        confirmations: 1,\n      });\n\n      return {\n        hash,\n        timestamp: Math.floor(Date.now() / 1000),\n      };\n    },\n    onError: (error) => {\n      console.error(\"Oracle update error:\", error);\n      throw error;\n    },\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { type PonderPair } from \"@/contracts/pair\";\n\nexport interface AggregatedPrice {\n  token: Address;\n  price: number;\n  confidence: number;\n  sources: {\n    twap: number;\n    spot: number;\n    impact: number;\n  };\n}\n\nexport function usePriceFeeds(\n  pairs: PonderPair[],\n  quoteToken: Address,\n  enabled = true\n): UseQueryResult<Record<string, AggregatedPrice>> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"prices\", pairs.map((p) => p.address), quoteToken],\n    queryFn: async () => {\n      const prices: Record<string, AggregatedPrice> = {};\n      const baseAmount = 10n ** 18n;\n\n      for (const pair of pairs) {\n        const [token0, token1] = await Promise.all([\n          pair.token0(),\n          pair.token1(),\n        ]);\n\n        const tokenIn =\n          token0.toLowerCase() === quoteToken.toLowerCase() ? token1 : token0;\n\n        try {\n          // Get TWAP price\n          const twapAmount = await sdk.oracle.consult(\n            pair.address,\n            tokenIn,\n            baseAmount,\n            1800 // 30 minutes\n          );\n          const twapPrice = Number(twapAmount) / Number(baseAmount);\n\n          // Get spot price from reserves\n          const { reserve0, reserve1 } = await pair.getReserves();\n          const spotPrice =\n            token0.toLowerCase() === quoteToken.toLowerCase()\n              ? Number(reserve0) / Number(reserve1)\n              : Number(reserve1) / Number(reserve0);\n\n          // Calculate price impact for 1% of liquidity\n          const impact = Math.abs((twapPrice - spotPrice) / spotPrice) * 100;\n\n          // Confidence score based on price deviation\n          const confidence = Math.max(0, 100 - impact * 10); // Reduce confidence as impact increases\n\n          prices[tokenIn] = {\n            token: tokenIn,\n            price: twapPrice,\n            confidence,\n            sources: {\n              twap: twapPrice,\n              spot: spotPrice,\n              impact,\n            },\n          };\n        } catch (error) {\n          console.warn(`Failed to get price for ${tokenIn}:`, error);\n        }\n      }\n\n      return prices;\n    },\n    enabled,\n    staleTime: 30_000, // 30 seconds\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface PoolYield {\n  poolId: number;\n  pair: Address;\n  apr: number;\n  apy: number;\n  rewardsPerDay: bigint;\n  tvl: bigint;\n  boostedApr?: number;\n  ponderRequired: bigint;\n}\n\nexport interface YieldAnalytics {\n  pools: PoolYield[];\n  aggregatedMetrics: {\n    totalStaked: bigint;\n    totalPonderStaked: bigint;\n    averageApr: number;\n    totalRewardsPerDay: bigint;\n    stakerCount: number;\n    averageBoostMultiplier: number;\n  };\n}\n\nexport function useYieldAnalytics(\n  enabled = true\n): UseQueryResult<YieldAnalytics> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"analytics\", \"yield\"],\n    queryFn: async () => {\n      const poolLength = await sdk.masterChef.poolLength();\n      const pools: PoolYield[] = [];\n\n      let totalStaked = 0n;\n      let totalPonderStaked = 0n;\n      let totalApr = 0;\n      let totalMultiplier = 0;\n      let activePoolCount = 0;\n      const stakers = new Set<string>();\n\n      for (let i = 0; i < Number(poolLength); i++) {\n        const pool = await sdk.masterChef.poolInfo(BigInt(i));\n\n        if (pool.allocPoint > 0n) {\n          activePoolCount++;\n          const pair = sdk.getPair(pool.lpToken);\n          const [reserves] = await Promise.all([pair.getReserves()]);\n\n          // Calculate pool TVL (simplified)\n          const tvl = (reserves.reserve0 + reserves.reserve1) * 2n;\n          totalStaked += pool.totalStaked;\n\n          // Calculate rewards\n          const ponderPerSecond = await sdk.masterChef.ponderPerSecond();\n          const totalAllocPoint = await sdk.masterChef.totalAllocPoint();\n          const poolRewardsPerDay =\n            (ponderPerSecond * 86400n * pool.allocPoint) / totalAllocPoint;\n\n          // Calculate APR\n          const yearlyRewards = poolRewardsPerDay * 365n;\n          const apr =\n            Number((yearlyRewards * 10000n) / (pool.totalStaked || 1n)) / 100;\n\n          // Calculate APY (compounded daily)\n          const dailyRate = apr / 365;\n          const apy = (Math.pow(1 + dailyRate, 365) - 1) * 100;\n\n          // Calculate boost requirements\n          const ponderRequired = pool.totalStaked / 10n; // 10% of staked for max boost\n\n          // Track stakers\n          const stakerFilter = await sdk.publicClient.createEventFilter({\n            address: sdk.masterChef.address,\n            event: {\n              type: \"event\",\n              name: \"Deposit\",\n              inputs: [\n                { type: \"address\", name: \"user\", indexed: true },\n                { type: \"uint256\", name: \"pid\", indexed: true },\n                { type: \"uint256\", name: \"amount\" },\n              ],\n            },\n            fromBlock: -200000n,\n          });\n\n          const stakeEvents = await sdk.publicClient.getFilterLogs({\n            filter: stakerFilter,\n          });\n          stakeEvents.forEach((event) => {\n            if (event.args.user) {\n              stakers.add(event.args.user.toLowerCase());\n              if (event.args.pid === BigInt(i)) {\n                totalPonderStaked += event.args.amount as bigint;\n              }\n            }\n          });\n\n          // Calculate boosted APR\n          const boostedApr = (apr * Number(pool.boostMultiplier)) / 10000;\n          totalMultiplier += Number(pool.boostMultiplier);\n\n          pools.push({\n            poolId: i,\n            pair: pool.lpToken,\n            apr,\n            apy,\n            rewardsPerDay: poolRewardsPerDay,\n            tvl,\n            boostedApr,\n            ponderRequired,\n          });\n\n          totalApr += apr;\n        }\n      }\n\n      return {\n        pools: pools.sort((a, b) => b.apr - a.apr),\n        aggregatedMetrics: {\n          totalStaked,\n          totalPonderStaked,\n          averageApr: activePoolCount > 0 ? totalApr / activePoolCount : 0,\n          totalRewardsPerDay: pools.reduce(\n            (acc, pool) => acc + pool.rewardsPerDay,\n            0n\n          ),\n          stakerCount: stakers.size,\n          averageBoostMultiplier:\n            activePoolCount > 0 ? totalMultiplier / activePoolCount : 0,\n        },\n      };\n    },\n    enabled,\n    staleTime: 60_000, // 1 minute\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address, type Hash } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\nimport { usePairInfo } from \"@/hooks\";\n\nexport interface Swap {\n  hash: Hash;\n  timestamp: number;\n  pair: Address;\n  sender: Address;\n  recipient: Address;\n  // Token amounts\n  amountIn: bigint;\n  amountOut: bigint;\n  tokenIn: Address;\n  tokenOut: Address;\n  // Derived data\n  priceImpact: number;\n  valueUSD?: number;\n  // Optional token info if available\n  tokenInSymbol?: string;\n  tokenOutSymbol?: string;\n}\n\ninterface UseRecentSwapsParams {\n  pair?: Address;\n  account?: Address; // Optional - filter by trader\n  limit?: number;\n  fromBlock?: bigint;\n}\n\nexport function useRecentSwaps(\n  params?: UseRecentSwapsParams,\n  enabled = true\n): UseQueryResult<Swap[]> {\n  const sdk = usePonderSDK();\n  const { data: pairInfo } = usePairInfo(\n    params?.pair,\n    enabled && !!params?.pair\n  );\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"swaps\",\n      \"recent\",\n      {\n        ...params,\n        fromBlock: params?.fromBlock?.toString(),\n      },\n    ],\n    queryFn: async () => {\n      const limit = params?.limit || 100;\n      const fromBlock = params?.fromBlock || -3000n; // ~1 day of blocks by default\n\n      // Create event filter\n      const swapFilter = await sdk.publicClient.createEventFilter({\n        address: params?.pair,\n        event: {\n          type: \"event\",\n          name: \"Swap\",\n          inputs: [\n            { type: \"address\", name: \"sender\", indexed: true },\n            { type: \"uint256\", name: \"amount0In\" },\n            { type: \"uint256\", name: \"amount1In\" },\n            { type: \"uint256\", name: \"amount0Out\" },\n            { type: \"uint256\", name: \"amount1Out\" },\n            { type: \"address\", name: \"to\", indexed: true },\n          ],\n        },\n        fromBlock,\n      });\n\n      // Get logs\n      let swapLogs = await sdk.publicClient.getFilterLogs({\n        filter: swapFilter,\n      });\n\n      // Filter by account if specified\n      if (params?.account) {\n        swapLogs = swapLogs.filter((log) => {\n          const sender = log.args.sender as Address;\n          const to = log.args.to as Address;\n          return (\n            sender.toLowerCase() === params.account?.toLowerCase() ||\n            to.toLowerCase() === params.account?.toLowerCase()\n          );\n        });\n      }\n\n      // Sort by timestamp desc\n      swapLogs.sort((a, b) => Number(b.blockNumber) - Number(a.blockNumber));\n\n      // Limit results\n      swapLogs = swapLogs.slice(0, limit);\n\n      // Get blocks for timestamps\n      const blockPromises = swapLogs.map((log) =>\n        sdk.publicClient.getBlock({ blockNumber: log.blockNumber })\n      );\n      const blocks = await Promise.all(blockPromises);\n\n      // Process logs into Swap objects\n      const swaps: Swap[] = await Promise.all(\n        swapLogs.map(async (log, i) => {\n          const amount0In = log.args.amount0In as bigint;\n          const amount1In = log.args.amount1In as bigint;\n          const amount0Out = log.args.amount0Out as bigint;\n          const amount1Out = log.args.amount1Out as bigint;\n\n          // Determine which token is being swapped in/out\n          const isToken0In = amount0In > 0n;\n          let tokenIn: Address,\n            tokenOut: Address,\n            amountIn: bigint,\n            amountOut: bigint;\n\n          if (pairInfo) {\n            tokenIn = isToken0In ? pairInfo.token0 : pairInfo.token1;\n            tokenOut = isToken0In ? pairInfo.token1 : pairInfo.token0;\n            amountIn = isToken0In ? amount0In : amount1In;\n            amountOut = isToken0In ? amount1Out : amount0Out;\n          } else if (params?.pair) {\n            // If no pair info, get tokens directly\n            const pair = sdk.getPair(params.pair);\n            [tokenIn, tokenOut] = isToken0In\n              ? await Promise.all([pair.token0(), pair.token1()])\n              : await Promise.all([pair.token1(), pair.token0()]);\n            amountIn = isToken0In ? amount0In : amount1In;\n            amountOut = isToken0In ? amount1Out : amount0Out;\n          } else {\n            throw new Error(\"Either pair info or pair address required\");\n          }\n\n          // Calculate price impact\n          const priceImpact = await calculatePriceImpact(\n            sdk,\n            params?.pair || log.address,\n            amountIn,\n            tokenIn\n          );\n\n          // Try to get USD value if oracle available\n          let valueUSD: number | undefined;\n          try {\n            if (params?.pair) {\n              const amountUSD = await sdk.oracle.consult(\n                params.pair,\n                tokenIn,\n                amountIn,\n                1800 // 30 min average\n              );\n              valueUSD = Number(amountUSD) / 1e18;\n            }\n          } catch {\n            // Oracle not available or error\n          }\n\n          // Try to get token symbols\n          let tokenInSymbol: string | undefined;\n          let tokenOutSymbol: string | undefined;\n          try {\n            if (pairInfo) {\n              tokenInSymbol = isToken0In\n                ? pairInfo.token0Symbol\n                : pairInfo.token1Symbol;\n              tokenOutSymbol = isToken0In\n                ? pairInfo.token1Symbol\n                : pairInfo.token0Symbol;\n            }\n          } catch {\n            // Token info not available\n          }\n\n          return {\n            hash: log.transactionHash,\n            timestamp: Number(blocks[i].timestamp),\n            pair: log.address,\n            sender: log.args.sender as Address,\n            recipient: log.args.to as Address,\n            amountIn,\n            amountOut,\n            tokenIn,\n            tokenOut,\n            priceImpact,\n            valueUSD,\n            tokenInSymbol,\n            tokenOutSymbol,\n          };\n        })\n      );\n\n      return swaps;\n    },\n    enabled: enabled,\n    staleTime: 10_000, // 10 seconds\n  });\n}\n\n// Helper function to calculate price impact\nasync function calculatePriceImpact(\n  sdk: any,\n  pairAddress: Address,\n  amountIn: bigint,\n  tokenIn: Address\n): Promise<number> {\n  try {\n    const pair = sdk.getPair(pairAddress);\n    const reserves = await pair.getReserves();\n    const token0 = await pair.token0();\n\n    const [reserveIn, reserveOut] =\n      tokenIn === token0\n        ? [reserves.reserve0, reserves.reserve1]\n        : [reserves.reserve1, reserves.reserve0];\n\n    // Calculate price impact using AMM formula\n    const amountInWithFee = amountIn * 997n; // 0.3% fee\n    const numerator = amountInWithFee * reserveOut;\n    const denominator = reserveIn * 1000n + amountInWithFee;\n    const amountOut = numerator / denominator;\n\n    const priceImpact =\n      Number(\n        ((amountOut * reserveIn) / (amountIn * reserveOut) - 1n) * 10000n\n      ) / 100;\n\n    return priceImpact;\n  } catch {\n    return 0;\n  }\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Hash, type TransactionReceipt } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport type TransactionState = \"pending\" | \"confirmed\" | \"failed\";\n\nexport interface TransactionStatus {\n  state: TransactionState;\n  receipt?: TransactionReceipt;\n  confirmations: number;\n  error?: Error;\n  isLoading: boolean;\n  isError: boolean;\n  isSuccess: boolean;\n}\n\nexport function useTransaction(\n  hash: Hash | undefined,\n  confirmations = 1,\n  enabled = true\n): UseQueryResult<TransactionStatus> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"ponder\", \"transaction\", hash],\n    queryFn: async () => {\n      if (!hash) throw new Error(\"Transaction hash required\");\n\n      try {\n        // First check if transaction is already included\n        const receipt = await sdk.publicClient.waitForTransactionReceipt({\n          hash,\n          confirmations,\n        });\n\n        // In viem, the receipt doesn't have a status property directly\n        // We need to check if the transaction was successful\n        const succeeded = receipt.status === 'success';\n\n        return {\n          state: succeeded ? \"confirmed\" : \"failed\",\n          receipt,\n          confirmations,\n          isLoading: false,\n          isError: !succeeded,\n          isSuccess: succeeded,\n        } satisfies TransactionStatus;\n      } catch (error) {\n        return {\n          state: \"failed\",\n          confirmations: 0,\n          error:\n            error instanceof Error ? error : new Error(\"Transaction failed\"),\n          isLoading: false,\n          isError: true,\n          isSuccess: false,\n        } satisfies TransactionStatus;\n      }\n    },\n    enabled: enabled && !!hash,\n    retry: (failureCount, error) => {\n      // Only retry for network errors, not for failed transactions\n      return failureCount < 3 && error.message.includes(\"network\");\n    },\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\ninterface GasEstimateParams {\n  to: Address;\n  data: `0x${string}`;\n  value?: bigint;\n}\n\nexport interface GasEstimate {\n  estimate: bigint;\n  estimateInKUB: string;\n  maxFeePerGas: bigint | null;\n  maxPriorityFeePerGas: bigint | null;\n  gasPrice: bigint | null;\n  isHighPriority?: boolean;\n}\n\nexport function useGasEstimate(\n  params: GasEstimateParams | undefined,\n  enabled = true\n): UseQueryResult<GasEstimate> {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"gas\",\n      \"estimate\",\n      {\n        ...params,\n        value: params?.value?.toString(),\n      },\n    ],\n    queryFn: async () => {\n      if (!params || !sdk.walletClient?.account) {\n        throw new Error(\"Transaction params and connected wallet required\");\n      }\n\n      const { to, data, value = 0n } = params;\n\n      // Get gas price data\n      const [gasEstimate, feeData] = await Promise.all([\n        // Estimate gas\n        sdk.publicClient.estimateGas({\n          account: sdk.walletClient.account.address,\n          to,\n          data,\n          value,\n        }),\n        // Get fee data\n        sdk.publicClient.getFeeHistory({\n          blockCount: 4,\n          rewardPercentiles: [10, 50, 90],\n        }),\n      ]);\n\n      // Get latest block's fees\n      const latest = feeData.baseFeePerGas[feeData.baseFeePerGas.length - 1];\n      const reward = feeData.reward?.[feeData.reward.length - 1];\n\n      // Calculate max fees\n      const maxPriorityFeePerGas = reward ? reward[1] : null; // Use 50th percentile\n      const maxFeePerGas =\n        latest && maxPriorityFeePerGas ? latest + maxPriorityFeePerGas : null;\n\n      // Get regular gas price as fallback\n      const gasPrice = latest ? latest : await sdk.publicClient.getGasPrice();\n\n      // Calculate KUB cost (using either gas price or max fee)\n      const gasCost = gasEstimate * (maxFeePerGas || gasPrice || 0n);\n      const kubCost = Number(gasCost) / 1e18;\n\n      // Determine if this is high priority (90th percentile of recent fees)\n      const isHighPriority =\n        maxPriorityFeePerGas && reward\n          ? maxPriorityFeePerGas >= reward[2]\n          : false;\n\n      return {\n        estimate: gasEstimate,\n        estimateInKUB: kubCost.toFixed(6),\n        maxFeePerGas,\n        maxPriorityFeePerGas,\n        gasPrice,\n        isHighPriority,\n      };\n    },\n    enabled: enabled && !!params && !!sdk.walletClient?.account,\n    staleTime: 10_000, // 10 seconds\n  });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { type PonderPair } from \"@/contracts/pair\";\nimport { usePairFees } from \"@/hooks\";\n\ninterface TradeInfo {\n  priceImpact: number;\n  minimumReceived: bigint;\n  fee: {\n    lp: bigint;\n    creator: bigint;\n    total: bigint;\n  };\n}\n\nexport function useTradeInfo(\n  pair: PonderPair,\n  tokenIn: Address,\n  amountIn: bigint,\n  slippageTolerance = 0.5,\n  enabled = true\n): UseQueryResult<TradeInfo> {\n  const { data: feeInfo, isLoading: isLoadingFees } = usePairFees(\n    pair,\n    tokenIn\n  );\n\n  return useQuery({\n    queryKey: [\n      \"ponder\",\n      \"tradeInfo\",\n      pair.address,\n      tokenIn,\n      amountIn.toString(),\n      slippageTolerance,\n    ],\n    queryFn: async () => {\n      if (!feeInfo) throw new Error(\"Fee info not loaded\");\n\n      const reserves = await pair.getReserves();\n      const token0 = await pair.token0();\n      const [reserveIn, reserveOut] =\n        tokenIn === token0\n          ? [reserves.reserve0, reserves.reserve1]\n          : [reserves.reserve1, reserves.reserve0];\n\n      // Calculate fees\n      const totalFee = feeInfo.lpFee + feeInfo.creatorFee;\n      const feeAmount = (amountIn * totalFee) / 1000n;\n      const lpFee = (amountIn * feeInfo.lpFee) / 1000n;\n      const creatorFee = (amountIn * feeInfo.creatorFee) / 1000n;\n\n      // Calculate price impact\n      const amountInAfterFee = amountIn - feeAmount;\n      const newReserveIn = reserveIn + amountInAfterFee;\n      const newReserveOut = (reserveIn * reserveOut) / newReserveIn;\n      const amountOut = reserveOut - newReserveOut;\n\n      const priceImpact =\n        Number((amountOut * 10000n) / reserveOut - 10000n) / 100;\n\n      // Calculate minimum received with slippage\n      const minimumReceived =\n        amountOut -\n        (amountOut * BigInt(Math.floor(slippageTolerance * 10))) / 1000n;\n\n      return {\n        priceImpact,\n        minimumReceived,\n        fee: {\n          lp: lpFee,\n          creator: creatorFee,\n          total: feeAmount,\n        },\n      };\n    },\n    enabled: enabled && !isLoadingFees && !!feeInfo && amountIn > 0n,\n    staleTime: 5_000,\n  });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface StakingInfo {\n  totalStaked: bigint;\n  exchangeRate: number;\n  lastRebaseTime: bigint;\n  nextRebaseTime: bigint;\n  minimumFirstStake: bigint;\n  userBalance: bigint;\n  userShares: bigint;\n  pendingFees: bigint;\n  effectiveRate: number;\n  owner: Address;\n  pendingOwner: Address | undefined;\n}\n\nexport function useStakingInfo(address?: Address) {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"stakingInfo\", address],\n    queryFn: async (): Promise<StakingInfo> => {\n      if (!address) throw new Error(\"No address provided\");\n\n      const [\n        totalSupply,\n        ponderBalance,\n        lastRebase,\n        userShares,\n        minimumFirstStake,\n        owner,\n        pendingOwner,\n        pendingFees,\n      ] = await Promise.all([\n        sdk.staking.totalSupply(),\n        sdk.ponder.balanceOf(sdk.staking.address),\n        sdk.staking.lastRebaseTime(),\n        sdk.staking.balanceOf(address),\n        sdk.staking.minimumFirstStake(),\n        sdk.staking.owner(),\n        sdk.staking.pendingOwner(),\n        sdk.staking.getPendingFees(address)\n      ]);\n\n      // Calculate base exchange rate\n      const exchangeRate =\n          totalSupply > 0n\n              ? Number(totalSupply * BigInt(1e18) / ponderBalance) / 1e18\n              : 1;\n\n      // Calculate user's equivalent base KOI balance\n      const userBalance =\n          (userShares * BigInt(Math.floor(exchangeRate * 1e18))) / BigInt(1e18);\n\n      // Calculate effective rate including fees\n      const effectiveRate = userShares > 0n\n          ? Number((userBalance + pendingFees) * BigInt(1e18) / userShares) / 1e18\n          : exchangeRate;\n\n      const REBASE_DELAY = BigInt(24 * 60 * 60);\n\n\n      return {\n        totalStaked: ponderBalance,\n        exchangeRate,\n        effectiveRate,\n        lastRebaseTime: lastRebase,\n        nextRebaseTime: lastRebase + REBASE_DELAY,\n        minimumFirstStake,\n        userBalance,\n        userShares,\n        pendingFees,\n        owner,\n        pendingOwner:\n          pendingOwner === \"0x0000000000000000000000000000000000000000\"\n            ? undefined\n            : pendingOwner,\n      };\n    },\n    enabled: !!address && !!sdk.staking,\n  });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { type Hash, type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\ninterface StakeParams {\n  amount: bigint;\n  recipient?: Address;\n}\n\nexport function useStakePonder() {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({ amount, recipient }: StakeParams): Promise<Hash> => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      // Check minimum first stake if total supply is 0\n      const [totalSupply, minimumFirstStake] = await Promise.all([\n        sdk.staking.totalSupply(),\n        sdk.staking.minimumFirstStake(),\n      ]);\n\n      if (totalSupply === 0n && amount < minimumFirstStake) {\n        throw new Error(\"First stake must be at least \" + minimumFirstStake.toString());\n      }\n\n      // First approve staking contract\n      const allowance = await sdk.ponder.allowance(\n          sdk.walletClient.account.address,\n          sdk.staking.address\n      );\n\n      if (allowance < amount) {\n        const approvalTx = await sdk.ponder.approve(\n            sdk.staking.address,\n            amount\n        );\n        await sdk.publicClient.waitForTransactionReceipt({ hash: approvalTx });\n      }\n\n      // Then stake, using recipient or sender address\n      return await sdk.staking.enter(\n          amount,\n          recipient || sdk.walletClient.account.address\n      );\n    },\n  });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { type Hash } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\ninterface UnstakeParams {\n  shares: bigint;\n}\n\nexport function useUnstakePonder() {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({ shares }: UnstakeParams): Promise<Hash> => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      return await sdk.staking.leave(shares);\n    },\n  });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface StakingStats {\n  // Total stats\n  totalStaked: bigint;\n  totalStakers: number;\n  averageStakeSize: bigint;\n  minimumFirstStake: bigint;\n\n  // Distribution stats\n  lastRebase: bigint;\n  nextRebase: bigint;\n  averageRebaseAmount: bigint;\n\n  // Historical performance\n  valueGrowth24h: number;\n  valueGrowth7d: number;\n  valueGrowth30d: number;\n\n  // Top stakers\n  topStakers: Array<{\n    address: Address;\n    stakedAmount: bigint;\n    percentageOfTotal: number;\n  }>;\n}\n\nexport function useStakingStats() {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"stakingStats\"],\n    queryFn: async (): Promise<StakingStats> => {\n      // Get contract state\n      const [totalSupply, ponderBalance, lastRebaseTime, minimumFirstStake] = await Promise.all([\n        sdk.staking.totalSupply(),\n        sdk.ponder.balanceOf(sdk.staking.address),\n        sdk.staking.lastRebaseTime(),\n        sdk.staking.minimumFirstStake()\n      ]);\n\n      // Next rebase is 24 hours after last rebase\n      const nextRebase = lastRebaseTime + BigInt(86400);\n\n      // Get historical rebase events\n      const rebaseEvents = await sdk.publicClient.getContractEvents({\n        address: sdk.staking.address,\n        abi: sdk.staking.abi,\n        eventName: \"RebasePerformed\",\n        fromBlock: BigInt(Math.floor(Date.now() / 1000 - 2592000)), // 30 days\n      });\n\n      // Calculate average rebase amount\n      const rebaseAmounts = rebaseEvents.map(event => {\n        const totalPonderBalance = event.args?.totalPonderBalance as bigint;\n        const totalSupply = event.args?.totalSupply as bigint;\n        return totalPonderBalance > totalSupply ? totalPonderBalance - totalSupply : 0n;\n      }).filter(amount => amount > 0n);\n\n      const averageRebaseAmount = rebaseAmounts.length > 0\n          ? rebaseAmounts.reduce((a, b) => a + b, 0n) / BigInt(rebaseAmounts.length)\n          : 0n;\n\n      // Get value growth periods\n      const day = BigInt(86400);\n      const [valueGrowth24h, valueGrowth7d, valueGrowth30d] = await Promise.all([\n        getValueGrowth(sdk, day),\n        getValueGrowth(sdk, day * BigInt(7)),\n        getValueGrowth(sdk, day * BigInt(30))\n      ]);\n\n      // Get top stakers from Staked events\n      const uniqueStakers = new Set<Address>();\n      const stakeEvents = await sdk.publicClient.getContractEvents({\n        address: sdk.staking.address,\n        abi: sdk.staking.abi,\n        eventName: \"Staked\",\n        fromBlock: BigInt(Math.floor(Date.now() / 1000 - 2592000)), // 30 days\n      });\n\n      for (const event of stakeEvents) {\n        const user = event.args?.user as Address;\n        if (user) {\n          uniqueStakers.add(user);\n        }\n      }\n\n      // Get current balances for all stakers\n      const stakerBalances = await Promise.all(\n          Array.from(uniqueStakers).map(async (address) => {\n            const balance = await sdk.staking.balanceOf(address);\n            return { address, balance };\n          })\n      );\n\n      // Filter out zero balances and sort by amount\n      const topStakers = stakerBalances\n          .filter(({ balance }) => balance > 0n)\n          .sort((a, b) => Number(b.balance - a.balance))\n          .slice(0, 10)\n          .map(({ address, balance }) => ({\n            address,\n            stakedAmount: balance,\n            percentageOfTotal:\n                totalSupply > 0n\n                    ? Number((balance * BigInt(10000)) / totalSupply) / 100\n                    : 0\n          }));\n\n      return {\n        totalStaked: ponderBalance,\n        totalStakers: stakerBalances.filter(s => s.balance > 0n).length,\n        averageStakeSize: ponderBalance / BigInt(Math.max(1, stakerBalances.length)),\n        minimumFirstStake,\n        lastRebase: lastRebaseTime,\n        nextRebase,\n        averageRebaseAmount,\n        valueGrowth24h,\n        valueGrowth7d,\n        valueGrowth30d,\n        topStakers,\n      };\n    },\n    enabled: !!sdk.staking && !!sdk.publicClient,\n    refetchInterval: 60000, // 1 minute\n  });\n}\n\n// Helper function to calculate value growth over a period\nasync function getValueGrowth(\n    sdk: ReturnType<typeof usePonderSDK>,\n    period: bigint\n): Promise<number> {\n  const now = BigInt(Math.floor(Date.now() / 1000));\n  const periodStart = now - period;\n\n  const events = await sdk.publicClient.getContractEvents({\n    address: sdk.staking.address,\n    abi: sdk.staking.abi,\n    eventName: \"RebasePerformed\",\n    fromBlock: periodStart,\n  });\n\n  if (events.length < 2) return 0;\n\n  const firstEvent = events[0];\n  const lastEvent = events[events.length - 1];\n\n  const startBalance = firstEvent.args?.totalPonderBalance as bigint;\n  const endBalance = lastEvent.args?.totalPonderBalance as bigint;\n\n  if (!startBalance || !endBalance || startBalance === 0n) return 0;\n\n  return Number(((endBalance - startBalance) * BigInt(10000)) / startBalance) / 100;\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { type Hash, type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport function useClaimFees() {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (): Promise<Hash> => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      const { request } = await sdk.publicClient.simulateContract({\n        address: sdk.staking.address,\n        abi: sdk.staking.abi,\n        functionName: \"claimFees\",\n        args: [],\n        account: sdk.walletClient.account.address,\n      });\n\n      return sdk.walletClient.writeContract(request);\n    },\n  });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface TokenFeesInfo {\n  token: Address;\n  symbol: string;\n  balance: bigint;\n  valueInKUB?: bigint;\n}\n\nexport interface FeeDistributorInfo {\n  pendingFees: {\n    ponder: bigint;\n    otherTokens: TokenFeesInfo[];\n  };\n  lastDistribution: bigint;\n  nextDistribution: bigint;\n  minimumAmount: bigint;\n  owner: Address;\n  totalDistributed24h?: bigint;\n  distributionCount24h?: number;\n}\n\nexport function useFeeDistributorInfo(enabled = true) {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"feeDistributorInfo\"],\n    queryFn: async (): Promise<FeeDistributorInfo> => {\n      // Get current timestamp and 24h ago\n      const now = BigInt(Math.floor(Date.now() / 1000));\n      const dayAgo = now - BigInt(86400);\n\n      // Fetch basic contract info\n      const [owner, minimumAmount, lastDistribution] = await Promise.all([\n        sdk.feeDistributor.owner(),\n        sdk.feeDistributor.minimumAmount(),\n        sdk.feeDistributor.lastDistributionTimestamp(),\n      ]);\n\n      // Calculate next distribution time\n      const cooldownPeriod = BigInt(3600); // 1 hour from contract\n      const nextDistribution = lastDistribution + cooldownPeriod;\n\n      // Get PONDER balance\n      const ponderBalance = await sdk.ponder.balanceOf(\n        sdk.feeDistributor.address\n      );\n\n      // Get fee collection events from last 24h\n      const feeEvents = await sdk.publicClient.getContractEvents({\n        address: sdk.feeDistributor.address,\n        abi: sdk.feeDistributor.abi,\n        eventName: \"FeesCollected\",\n        fromBlock: dayAgo,\n      });\n\n      // Track unique tokens and their balances\n      const tokenSet = new Set<Address>();\n      for (const event of feeEvents) {\n        const token = event.args?.token as Address;\n        if (token && token !== sdk.ponder.address) {\n          tokenSet.add(token);\n        }\n      }\n\n      // Get token metrics\n      const otherTokens: TokenFeesInfo[] = await Promise.all(\n        Array.from(tokenSet).map(async (token) => {\n          try {\n            const [balance, symbol] = await Promise.all([\n              sdk.publicClient.readContract({\n                address: token,\n                abi: [\n                  \"function balanceOf(address) view returns (uint256)\",\n                ] as const,\n                functionName: \"balanceOf\",\n                args: [sdk.feeDistributor.address],\n              }),\n              sdk.publicClient.readContract({\n                address: token,\n                abi: [\"function symbol() view returns (string)\"] as const,\n                functionName: \"symbol\",\n              }),\n            ]);\n\n            // Calculate KUB value\n            let valueInKUB: bigint | undefined;\n            try {\n              const weth = await sdk.router.KKUB();\n              const pair = await sdk.factory.getPair(token, weth);\n              if (pair) {\n                const pairContract = sdk.getPair(pair);\n                const [token0, reserves] = await Promise.all([\n                  pairContract.token0(),\n                  pairContract.getReserves(),\n                ]);\n\n                const isToken0 = token.toLowerCase() === token0.toLowerCase();\n                const tokenReserve = isToken0\n                  ? reserves.reserve0\n                  : reserves.reserve1;\n                const kubReserve = isToken0\n                  ? reserves.reserve1\n                  : reserves.reserve0;\n\n                if (tokenReserve > 0n) {\n                  valueInKUB =\n                    ((balance as bigint) * kubReserve) / tokenReserve;\n                }\n              }\n            } catch (err) {\n              console.warn(`Failed to get KUB value for ${symbol}:`, err);\n            }\n\n            return {\n              token,\n              symbol: symbol as string,\n              balance: balance as bigint,\n              valueInKUB,\n            };\n          } catch (error) {\n            console.error(`Error fetching info for token ${token}:`, error);\n            return {\n              token,\n              symbol: \"UNKNOWN\",\n              balance: 0n,\n            };\n          }\n        })\n      );\n\n      // Get distribution metrics for last 24h\n      const distributionEvents = await sdk.publicClient.getContractEvents({\n        address: sdk.feeDistributor.address,\n        abi: sdk.feeDistributor.abi,\n        eventName: \"FeesDistributed\",\n        fromBlock: dayAgo,\n      });\n\n      const totalDistributed24h = distributionEvents.reduce(\n        (sum, event) => sum + ((event.args?.totalAmount as bigint) || 0n),\n        0n\n      );\n\n      return {\n        pendingFees: {\n          ponder: ponderBalance,\n          otherTokens: otherTokens.filter((t) => t.balance > 0n),\n        },\n        lastDistribution,\n        nextDistribution,\n        minimumAmount,\n        owner,\n        totalDistributed24h,\n        distributionCount24h: distributionEvents.length,\n      };\n    },\n    enabled: enabled && !!sdk.feeDistributor && !!sdk.publicClient,\n    refetchInterval: 30000, // 30 seconds\n  });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { type Hash } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport function useDistributeFees() {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async (): Promise<Hash> => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      return await sdk.feeDistributor.distribute();\n    },\n  });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { type Hash, type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\ninterface CollectFeesParams {\n  pair: Address;\n}\n\nexport function useCollectFees() {\n  const sdk = usePonderSDK();\n\n  return useMutation({\n    mutationFn: async ({ pair }: CollectFeesParams): Promise<Hash> => {\n      if (!sdk.walletClient?.account) {\n        throw new Error(\"Wallet not connected\");\n      }\n\n      return await sdk.feeDistributor.collectFeesFromPair(pair);\n    },\n  });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { type Address } from \"viem\";\nimport { usePonderSDK } from \"@/context/PonderContext\";\n\nexport interface TokenMetrics {\n  token: Address;\n  symbol: string;\n  totalCollected: bigint;\n  totalConverted: bigint;\n  valueInKUB: bigint;\n}\n\nexport interface FeeMetrics {\n  // Overall metrics\n  totalDistributed: bigint;\n  // Time-based metrics\n  daily: {\n    distributions: number;\n    volume: bigint;\n    avgDistributionSize: bigint;\n  };\n  weekly: {\n    distributions: number;\n    volume: bigint;\n    avgDistributionSize: bigint;\n  };\n  monthly: {\n    distributions: number;\n    volume: bigint;\n    avgDistributionSize: bigint;\n  };\n  // Token specific metrics\n  tokenMetrics: TokenMetrics[];\n  // Performance metrics\n  projectedAnnualFees: bigint;\n  averageDistributionTime: bigint;\n  revenueGrowth: {\n    daily: number; // Percentage change\n    weekly: number; // Percentage change\n    monthly: number; // Percentage change\n  };\n}\n\nasync function getTimeRangeMetrics(\n  sdk: ReturnType<typeof usePonderSDK>,\n  startTime: bigint\n) {\n  try {\n    const events = await sdk.publicClient.getContractEvents({\n      address: sdk.feeDistributor.address,\n      abi: sdk.feeDistributor.abi,\n      eventName: \"FeesDistributed\",\n      fromBlock: startTime,\n    });\n\n    let totalVolume = 0n;\n    const distributions = events.length;\n\n    for (const event of events) {\n      const amount = (event.args?.totalAmount as bigint) || 0n;\n      totalVolume += amount;\n    }\n\n    return {\n      distributions,\n      volume: totalVolume,\n      avgDistributionSize:\n        distributions > 0 ? totalVolume / BigInt(distributions) : 0n,\n    };\n  } catch (error) {\n    console.error(\"Error fetching time range metrics:\", error);\n    return {\n      distributions: 0,\n      volume: 0n,\n      avgDistributionSize: 0n,\n    };\n  }\n}\n\nasync function getTokenMetrics(\n  sdk: ReturnType<typeof usePonderSDK>,\n  fromBlock: bigint\n): Promise<TokenMetrics[]> {\n  try {\n    // Get all fee collection events\n    const collectionEvents = await sdk.publicClient.getContractEvents({\n      address: sdk.feeDistributor.address,\n      abi: sdk.feeDistributor.abi,\n      eventName: \"FeesCollected\",\n      fromBlock,\n    });\n\n    // Get all conversion events\n    const conversionEvents = await sdk.publicClient.getContractEvents({\n      address: sdk.feeDistributor.address,\n      abi: sdk.feeDistributor.abi,\n      eventName: \"FeesConverted\",\n      fromBlock,\n    });\n\n    // Track unique tokens\n    const tokenMap = new Map<Address, TokenMetrics>();\n\n    // Process collection events\n    for (const event of collectionEvents) {\n      const token = event.args?.token as Address;\n      const amount = (event.args?.amount as bigint) || 0n;\n\n      if (!tokenMap.has(token)) {\n        const symbol = await sdk.publicClient.readContract({\n          address: token,\n          abi: [\"function symbol() view returns (string)\"] as const,\n          functionName: \"symbol\",\n        });\n\n        tokenMap.set(token, {\n          token,\n          symbol: symbol as string,\n          totalCollected: 0n,\n          totalConverted: 0n,\n          valueInKUB: 0n,\n        });\n      }\n\n      const metrics = tokenMap.get(token)!;\n      metrics.totalCollected += amount;\n    }\n\n    // Process conversion events\n    for (const event of conversionEvents) {\n      const token = event.args?.token as Address;\n      const amount = (event.args?.tokenAmount as bigint) || 0n;\n\n      if (tokenMap.has(token)) {\n        const metrics = tokenMap.get(token)!;\n        metrics.totalConverted += amount;\n      }\n    }\n\n    // Calculate KUB values\n    const weth = await sdk.router.KKUB();\n    const promises = Array.from(tokenMap.values()).map(async (metrics) => {\n      try {\n        const pair = await sdk.factory.getPair(metrics.token, weth);\n        if (pair) {\n          const pairContract = sdk.getPair(pair);\n          const [token0, reserves] = await Promise.all([\n            pairContract.token0(),\n            pairContract.getReserves(),\n          ]);\n\n          const isToken0 = metrics.token.toLowerCase() === token0.toLowerCase();\n          const tokenReserve = isToken0 ? reserves.reserve0 : reserves.reserve1;\n          const kubReserve = isToken0 ? reserves.reserve1 : reserves.reserve0;\n\n          if (tokenReserve > 0n) {\n            metrics.valueInKUB =\n              (metrics.totalCollected * kubReserve) / tokenReserve;\n          }\n        }\n      } catch (error) {\n        console.warn(`Failed to get KUB value for ${metrics.symbol}:`, error);\n      }\n      return metrics;\n    });\n\n    return Promise.all(promises);\n  } catch (error) {\n    console.error(\"Error fetching token metrics:\", error);\n    return [];\n  }\n}\n\nexport function useFeeMetrics(enabled = true) {\n  const sdk = usePonderSDK();\n\n  return useQuery({\n    queryKey: [\"feeMetrics\"],\n    queryFn: async (): Promise<FeeMetrics> => {\n      const now = BigInt(Math.floor(Date.now() / 1000));\n      const dayAgo = now - BigInt(86400);\n      const weekAgo = now - BigInt(604800);\n      const monthAgo = now - BigInt(2592000);\n\n      // Get metrics for different time periods\n      const [dailyMetrics, weeklyMetrics, monthlyMetrics] = await Promise.all([\n        getTimeRangeMetrics(sdk, dayAgo),\n        getTimeRangeMetrics(sdk, weekAgo),\n        getTimeRangeMetrics(sdk, monthAgo),\n      ]);\n\n      // Get token-specific metrics\n      const tokenMetrics = await getTokenMetrics(sdk, monthAgo);\n\n      return {\n        totalDistributed: monthlyMetrics.volume,\n        daily: dailyMetrics,\n        weekly: weeklyMetrics,\n        monthly: monthlyMetrics,\n        tokenMetrics,\n        projectedAnnualFees: monthlyMetrics.volume * 12n,\n        averageDistributionTime: BigInt(86400), // 24 hours, as per contract\n        revenueGrowth: {\n          daily:\n            dailyMetrics.volume > 0n\n              ? Number((dailyMetrics.volume * 10000n) / monthlyMetrics.volume) /\n                  100 -\n                100\n              : 0,\n          weekly:\n            weeklyMetrics.volume > 0n\n              ? Number(\n                  (weeklyMetrics.volume * 10000n) / monthlyMetrics.volume\n                ) /\n                  100 -\n                100\n              : 0,\n          monthly:\n            monthlyMetrics.volume > 0n\n              ? Number(\n                  (monthlyMetrics.volume * 10000n) /\n                    (monthlyMetrics.volume + dailyMetrics.volume)\n                ) /\n                  100 -\n                100\n              : 0,\n        },\n      };\n    },\n    enabled: enabled && !!sdk.feeDistributor && !!sdk.publicClient,\n    refetchInterval: 300000, // 5 minutes\n  });\n}\n","import {\n  type PublicClient,\n  type WalletClient,\n  type Address,\n  createPublicClient,\n  http,\n  Hash,\n} from \"viem\";\nimport {\n  type SupportedChainId,\n  SUPPORTED_CHAINS,\n  getChainFromId,\n} from \"./constants/chains\";\nimport { Factory, type PonderFactory } from \"./contracts/factory\";\nimport { Pair, type PonderPair } from \"./contracts/pair\";\nimport { Router, type PonderRouter } from \"./contracts/router\";\nimport {\n  MasterChef,\n  type PonderMasterChef,\n  type PoolInfo,\n  type UserInfo,\n} from \"./contracts/masterchef\";\nimport { LaunchToken, type PonderLaunchToken } from \"./contracts/launchtoken\";\nimport { Pondertoken } from \"./contracts/pondertoken\";\nimport {\n  FiveFiveFiveLauncher,\n  type PonderLauncher,\n  type LaunchInfo,\n  type SaleInfo,\n  type CreateLaunchParams,\n} from \"./contracts/launcher\";\nimport {\n  PriceOracle,\n  type PonderPriceOracle,\n  type Observation,\n} from \"./contracts/oracle\";\nimport {\n  KKUBUnwrapper,\n  type PonderKKUBUnwrapper,\n} from \"./contracts/kkubunwrapper\";\nimport { Staking, type PonderStaking } from \"./contracts/staking\";\nimport {\n  FeeDistributor,\n  type PonderFeeDistributor,\n} from \"./contracts/feedistributor\";\nimport {\n  BRIDGE_ADDRESSES,\n  KKUB_ADDRESS,\n  PONDER_ADDRESSES,\n} from \"@/constants/addresses\";\nimport { Bridge } from \"@/contracts/bridge\";\n\ninterface SDKConfig {\n  chainId: SupportedChainId;\n  publicClient?: PublicClient;\n  walletClient?: WalletClient;\n}\n\nexport class PonderSDK {\n  public readonly chainId: SupportedChainId;\n  public readonly chain: ReturnType<typeof getChainFromId>;\n  public readonly publicClient: PublicClient;\n  private _walletClient?: WalletClient;\n  private _factory: Factory;\n  private _router: Router;\n  private _masterChef: MasterChef;\n  private _launcher: FiveFiveFiveLauncher;\n  private _oracle: PriceOracle;\n  private _kkubUnwrapper: KKUBUnwrapper;\n  private _pairs: Map<Address, Pair>;\n  private _launchTokens: Map<Address, LaunchToken>;\n  private _ponder: Pondertoken;\n  private _staking: Staking;\n  private _feeDistributor: FeeDistributor;\n  private _bridge: Bridge;\n\n  constructor({ chainId, publicClient, walletClient }: SDKConfig) {\n    this.chainId = chainId;\n    this.chain = getChainFromId(chainId);\n\n    this.publicClient =\n      publicClient ??\n      createPublicClient({\n        chain: this.chain,\n        transport: http(),\n      });\n\n    this._walletClient = walletClient;\n    this._factory = new Factory(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._router = new Router(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._masterChef = new MasterChef(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._launcher = new FiveFiveFiveLauncher(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._oracle = new PriceOracle(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._kkubUnwrapper = new KKUBUnwrapper(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._ponder = new Pondertoken(\n      this.chainId,\n      PONDER_ADDRESSES[chainId].ponderToken,\n      this.publicClient,\n      this._walletClient\n    );\n    this._staking = new Staking(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._feeDistributor = new FeeDistributor(\n      this.chainId,\n      this.publicClient,\n      this._walletClient\n    );\n    this._bridge = new Bridge(\n      this.chainId,\n      BRIDGE_ADDRESSES[chainId]?.bridge,\n      this.publicClient,\n      this._walletClient\n    );\n    this._pairs = new Map();\n    this._launchTokens = new Map();\n  }\n\n  get factory(): Factory {\n    return this._factory;\n  }\n\n  get router(): Router {\n    return this._router;\n  }\n\n  get masterChef(): MasterChef {\n    return this._masterChef;\n  }\n\n  get launcher(): FiveFiveFiveLauncher {\n    return this._launcher;\n  }\n\n  get oracle(): PriceOracle {\n    return this._oracle;\n  }\n\n  get kkubUnwrapper(): KKUBUnwrapper {\n    return this._kkubUnwrapper;\n  }\n\n  get ponder(): Pondertoken {\n    return this._ponder;\n  }\n\n  get staking(): Staking {\n    return this._staking;\n  }\n\n  get feeDistributor(): FeeDistributor {\n    return this._feeDistributor;\n  }\n\n  get bridge(): Bridge {\n    return this._bridge;\n  }\n\n  get walletClient(): WalletClient | undefined {\n    return this._walletClient;\n  }\n\n  public getPair(pairAddress: Address): Pair {\n    const existingPair = this._pairs.get(pairAddress);\n    if (existingPair) return existingPair;\n\n    const pair = new Pair(\n      this.chainId,\n      pairAddress,\n      this.publicClient,\n      this._walletClient\n    );\n    this._pairs.set(pairAddress, pair);\n    return pair;\n  }\n\n  public getLaunchToken(tokenAddress: Address): LaunchToken {\n    const existingToken = this._launchTokens.get(tokenAddress);\n    if (existingToken) return existingToken;\n\n    const token = new LaunchToken(\n      this.chainId,\n      tokenAddress,\n      this.publicClient,\n      this._walletClient\n    );\n    this._launchTokens.set(tokenAddress, token);\n    return token;\n  }\n\n  public updateWalletClient(walletClient?: WalletClient): void {\n    this._walletClient = walletClient;\n    this._factory = new Factory(this.chainId, this.publicClient, walletClient);\n    this._router = new Router(this.chainId, this.publicClient, walletClient);\n    this._masterChef = new MasterChef(\n      this.chainId,\n      this.publicClient,\n      walletClient\n    );\n    this._launcher = new FiveFiveFiveLauncher(\n      this.chainId,\n      this.publicClient,\n      walletClient\n    );\n    this._oracle = new PriceOracle(\n      this.chainId,\n      this.publicClient,\n      walletClient\n    );\n    this._kkubUnwrapper = new KKUBUnwrapper(\n      this.chainId,\n      this.publicClient,\n      walletClient\n    );\n    this._ponder = new Pondertoken(\n      this.chainId,\n      PONDER_ADDRESSES[this.chainId].ponderToken,\n      this.publicClient,\n      walletClient\n    );\n    this._staking = new Staking(this.chainId, this.publicClient, walletClient);\n    this._feeDistributor = new FeeDistributor(\n      this.chainId,\n      this.publicClient,\n      walletClient\n    );\n    this._bridge = new Bridge(\n      this.chainId,\n      BRIDGE_ADDRESSES[this.chainId]?.bridge,\n      this.publicClient,\n      walletClient\n    );\n\n    // Update existing instances\n    for (const [address, _] of this._pairs) {\n      this._pairs.set(\n        address,\n        new Pair(this.chainId, address, this.publicClient, walletClient)\n      );\n    }\n\n    for (const [address, _] of this._launchTokens) {\n      this._launchTokens.set(\n        address,\n        new LaunchToken(this.chainId, address, this.publicClient, walletClient)\n      );\n    }\n  }\n\n  public async getPairByTokens(\n    tokenA: Address,\n    tokenB: Address\n  ): Promise<Pair> {\n    const pairAddress = await this.factory.getPair(tokenA, tokenB);\n    return this.getPair(pairAddress);\n  }\n\n  public async unwrapKKUB(amount: bigint, recipient: Address): Promise<Hash> {\n    return this._kkubUnwrapper.unwrapKKUB(amount, recipient);\n  }\n}\n\n// Re-export everything that should be available to SDK users\nexport { SUPPORTED_CHAINS, type SupportedChainId };\n\nexport { KKUB_ADDRESS };\n// Contract exports\nexport { Factory, type PonderFactory };\nexport { Pair, type PonderPair };\nexport { Router, type PonderRouter };\nexport { MasterChef, type PonderMasterChef };\nexport { LaunchToken, type PonderLaunchToken };\nexport { FiveFiveFiveLauncher, type PonderLauncher };\nexport { PriceOracle, type PonderPriceOracle };\nexport { KKUBUnwrapper, type PonderKKUBUnwrapper };\nexport { Pondertoken };\nexport type { PonderToken } from \"./contracts/pondertoken\";\nexport { Staking, type PonderStaking };\nexport { FeeDistributor, type PonderFeeDistributor };\n\n// Type exports\nexport type { SDKConfig as PonderSDKConfig };\nexport type { Reserves } from \"./contracts/pair\";\nexport type { VestingInfo } from \"./contracts/launchtoken\";\nexport type {\n  AddLiquidityParams,\n  AddLiquidityETHParams,\n  RemoveLiquidityParams,\n  RemoveLiquidityETHParams,\n  SwapExactTokensForTokensParams,\n  SwapTokensForExactTokensParams,\n} from \"./contracts/router\";\nexport type { PoolInfo, UserInfo, AddPoolParams } from \"./contracts/masterchef\";\nexport type {\n  LaunchInfo,\n  SaleInfo,\n  CreateLaunchParams,\n} from \"./contracts/launcher\";\nexport type { Observation } from \"./contracts/oracle\";\n\nexport { Bridge };\nexport type { PonderBridge } from \"./contracts/bridge\";\n\nexport {\n  DEST_TOKEN_TYPE,\n  FEE_TYPE,\n  TOKEN_STRATEGY,\n  type BridgeInfo,\n  type ChainIDAndAllowedDestTokenTypes,\n  type BridgeParams,\n  type NativeBridgeParams,\n} from \"./contracts/bridge\";\n\n// Context provider\nexport { usePonderSDK, PonderProvider } from \"./context/PonderContext\";\n\n// Hook exports\nexport { type FeeInfo } from \"./utils/fees\";\n\n// Token Hooks\nexport { useTokenInfo, type TokenInfo } from \"./hooks/token/useTokenInfo\";\nexport { useTokenBalance } from \"./hooks/token/useTokenBalance\";\nexport { useTokenApproval } from \"./hooks/token/useTokenApproval\";\nexport {\n  useTokenAllowance,\n  type AllowanceData,\n} from \"./hooks/token/useTokenAllowance\";\n\n// Trading Hooks\nexport { usePairFees } from \"./hooks/trade/usePairFees\";\nexport { useAmountIn, useAmountOut } from \"./hooks/trade/useSwapAmounts\";\nexport { useTradeInfo } from \"./hooks/trade/useTradeInfo\";\nexport { useSwap, type SwapResult } from \"./hooks/pair/useSwap\";\nexport { useSwapCallback } from \"./hooks/pair/useSwapCallback\";\nexport { useSwapRoute, type SwapRoute } from \"./hooks/pair/useSwapRoute\";\nexport { useSwapApproval } from \"./hooks/token/useSwapApproval\";\n\n// Pair & Liquidity Hooks\nexport { usePairInfo, type PairInfo } from \"./hooks/pair/usePairInfo\";\nexport { useAllPairs, type PairSummary } from \"./hooks/pair/useAllPairs\";\n\nexport {\n  usePairExists,\n  type PairExistsResult,\n} from \"./hooks/pair/usePairExists\";\nexport {\n  usePairCreation,\n  type PairCreationData,\n} from \"./hooks/pair/usePairCreation\";\nexport { usePairQuote, type PairQuote } from \"./hooks/pair/usePairQuote\";\nexport {\n  usePairLiquidity,\n  type PairLiquidity,\n} from \"./hooks/pair/usePairLiquidity\";\nexport { useAddLiquidity } from \"./hooks/liquidity/useAddLiquidity\";\nexport { useRemoveLiquidity } from \"./hooks/liquidity/useRemoveLiquidity\";\nexport {\n  usePositionValue,\n  type PositionValue,\n} from \"./hooks/pair/usePositionValue\";\nexport {\n  useLPTokenBalance,\n  type LiquidityPosition,\n} from \"./hooks/pair/useLPTokenBalance\";\n\n// Farm Hooks\nexport { usePoolInfo, type DetailedPoolInfo } from \"./hooks/farm/usePoolInfo\";\nexport {\n  useStakeInfo,\n  type DetailedStakeInfo,\n} from \"./hooks/farm/useStakeInfo\";\nexport { useStake } from \"./hooks/farm/useStake\";\nexport { useUnstake } from \"./hooks/farm/useUnstake\";\nexport { useHarvest } from \"./hooks/farm/useHarvest\";\nexport { useBoostStake, useBoostUnstake } from \"./hooks/farm/useBoost\";\nexport {\n  usePendingRewards,\n  type PendingRewards,\n} from \"./hooks/farm/usePendingRewards\";\nexport { useFarmMetrics, type FarmMetrics } from \"./hooks/farm/useFarmMetrics\";\n\n// Launch Platform Hooks\nexport {\n  useLaunchInfo,\n  type DetailedLaunchInfo,\n} from \"./hooks/launch/useLaunchInfo\";\nexport { useCreateLaunch } from \"./hooks/launch/useCreateLaunch\";\nexport { useContribute } from \"./hooks/launch/useContribute\";\nexport {\n  useVestingInfo,\n  type DetailedVestingInfo,\n} from \"./hooks/launch/useVestingInfo\";\nexport { useClaimTokens } from \"./hooks/launch/useClaimTokens\";\nexport { useLPInfo, useLPWithdraw } from \"./hooks/launch/useLPWithdraw\";\n\n// Oracle & Price Hooks\nexport { usePriceInfo, type TokenPrice } from \"./hooks/oracle/usePriceInfo\";\nexport {\n  usePriceHistory,\n  type PriceHistory,\n} from \"./hooks/oracle/usePriceHistory\";\nexport {\n  useOracleStatus,\n  useUpdateOracle,\n} from \"./hooks/oracle/useOracleUpdates\";\nexport {\n  usePriceFeeds,\n  type AggregatedPrice,\n} from \"./hooks/oracle/usePriceFeeds\";\n\n// Analytics Hooks\nexport {\n  useYieldAnalytics,\n  type YieldAnalytics,\n} from \"./hooks/analytics/useYieldAnalytics\";\nexport { useRecentSwaps, type Swap } from \"./hooks/pair/useRecentSwaps\";\n\n// Transaction & Gas Hooks\nexport {\n  useTransaction,\n  type TransactionStatus,\n} from \"./hooks/token/useTransaction\";\nexport { useGasEstimate, type GasEstimate } from \"./hooks/trade/useGasEstimate\";\n\n// Add new Staking hooks exports\nexport {\n  useStakingInfo,\n  type StakingInfo,\n} from \"./hooks/staking/useStakingInfo\";\nexport { useStakePonder } from \"./hooks/staking/useStakePonder\";\nexport { useUnstakePonder } from \"./hooks/staking/useUnstakePonder\";\nexport {\n  useStakingStats,\n  type StakingStats,\n} from \"./hooks/staking/useStakingStats\";\nexport { useClaimFees } from \"./hooks/staking/useClaimFees\";\n\n// Add new Fee Distributor hooks exports\nexport {\n  useFeeDistributorInfo,\n  type FeeDistributorInfo,\n} from \"./hooks/fees/useFeeDistributorInfo\";\nexport { useDistributeFees } from \"./hooks/fees/useDistributeFees\";\nexport { useCollectFees } from \"./hooks/fees/useCollectFees\";\nexport { useFeeMetrics, type FeeMetrics } from \"./hooks/fees/useFeeMetrics\";\n\nexport * from './hooks/launch/useRemainingToRaise'\n"]}